All pastes #834998 Raw Edit

Squirrel Patch

public diff v1 · immutable
#834998 ·published 2007-12-28 16:58 UTC
rendered paste body
--- ../orig/include/squirrel.h	2007-03-11 21:30:10.000000000 +0300+++ ./include/squirrel.h	2007-12-28 19:01:59.875000000 +0300@@ -248,6 +248,7 @@ 	const SQChar *name; 	SQFUNCTION f; 	SQInteger nparamscheck;+	SQInteger maxparams; 	const SQChar *typemask; }SQRegFunction; @@ -288,6 +289,7 @@ SQUIRREL_API void sq_newarray(HSQUIRRELVM v,SQInteger size); SQUIRREL_API void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars); SQUIRREL_API SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask);+SQUIRREL_API SQRESULT sq_setmaxparams(HSQUIRRELVM v,SQInteger maxparams); SQUIRREL_API SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx); SQUIRREL_API void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len); SQUIRREL_API void sq_pushfloat(HSQUIRRELVM v,SQFloat f);--- ../orig/squirrel/sqapi.cpp	2007-06-23 14:20:54.000000000 +0400+++ ./squirrel/sqapi.cpp	2007-12-28 19:17:48.968750000 +0300@@ -320,6 +320,7 @@ { 	SQNativeClosure *nc = SQNativeClosure::Create(_ss(v), func); 	nc->_nparamscheck = 0;+	nc->_maxparams = 0; 	for(SQUnsignedInteger i = 0; i < nfreevars; i++) { 		nc->_outervalues.push_back(v->Top()); 		v->Pop();@@ -373,6 +374,18 @@ 	return SQ_OK; } +SQRESULT sq_setmaxparams(HSQUIRRELVM v,SQInteger maxparams)+{+	SQObject o = stack_get(v, -1);+	if(!sq_isnativeclosure(o))+		return sq_throwerror(v, _SC("native closure expected"));+	if(maxparams < 0)+		return sq_throwerror(v, _SC("argument must not be negative"));+	SQNativeClosure *nc = _nativeclosure(o);+	nc->_maxparams = (maxparams == SQ_MATCHTYPEMASKSTRING) ? nc->_typecheck.size() : maxparams;+	return SQ_OK;+}+ SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx) { 	SQObjectPtr &o = stack_get(v,idx);--- ../orig/squirrel/sqbaselib.cpp	2007-01-18 16:41:18.000000000 +0300+++ ./squirrel/sqbaselib.cpp	2007-12-28 19:29:53.156250000 +0300@@ -209,22 +209,22 @@  static SQRegFunction base_funcs[]={ 	//generic-	{_SC("seterrorhandler"),base_seterrorhandler,2, NULL},-	{_SC("setdebughook"),base_setdebughook,2, NULL},-	{_SC("enabledebuginfo"),base_enabledebuginfo,2, NULL},-	{_SC("getstackinfos"),base_getstackinfos,2, _SC(".n")},-	{_SC("getroottable"),base_getroottable,1, NULL},-	{_SC("setroottable"),base_setroottable,2, NULL},-	{_SC("assert"),base_assert,2, NULL},-	{_SC("print"),base_print,2, NULL},-	{_SC("compilestring"),base_compilestring,-2, _SC(".ss")},-	{_SC("newthread"),base_newthread,2, _SC(".c")},-	{_SC("suspend"),base_suspend,-1, NULL},-	{_SC("array"),base_array,-2, _SC(".n")},-	{_SC("type"),base_type,2, NULL},-	{_SC("dummy"),base_dummy,0,NULL},+	{_SC("seterrorhandler"),base_seterrorhandler,2, 0, NULL},+	{_SC("setdebughook"),base_setdebughook,2, 0, NULL},+	{_SC("enabledebuginfo"),base_enabledebuginfo,2, 0, NULL},+	{_SC("getstackinfos"),base_getstackinfos,2, 0, _SC(".n")},+	{_SC("getroottable"),base_getroottable,1, 0, NULL},+	{_SC("setroottable"),base_setroottable,2, 0, NULL},+	{_SC("assert"),base_assert,2, 0, NULL},+	{_SC("print"),base_print,2, 0, NULL},+	{_SC("compilestring"),base_compilestring,-2, 3, _SC(".ss")},+	{_SC("newthread"),base_newthread,2, 0, _SC(".c")},+	{_SC("suspend"),base_suspend,-1, 0, NULL},+	{_SC("array"),base_array,-2, 3, _SC(".n")},+	{_SC("type"),base_type,2, 0, NULL},+	{_SC("dummy"),base_dummy,0,0,NULL}, #ifndef NO_GARBAGE_COLLECTOR-	{_SC("collectgarbage"),base_collectgarbage,1, _SC("t")},+	{_SC("collectgarbage"),base_collectgarbage,1, 0, _SC("t")}, #endif 	{0,0} };@@ -370,14 +370,14 @@   SQRegFunction SQSharedState::_table_default_delegate_funcz[]={-	{_SC("len"),default_delegate_len,1, _SC("t")},-	{_SC("rawget"),table_rawget,2, _SC("t")},-	{_SC("rawset"),table_rawset,3, _SC("t")},-	{_SC("rawdelete"),table_rawdelete,2, _SC("t")},-	{_SC("rawin"),container_rawexists,2, _SC("t")},-	{_SC("weakref"),obj_delegate_weakref,1, NULL },-	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},-	{_SC("clear"),obj_clear,1, _SC(".")},+	{_SC("len"),default_delegate_len,1, 0, _SC("t")},+	{_SC("rawget"),table_rawget,2, 0, _SC("t")},+	{_SC("rawset"),table_rawset,3, 0, _SC("t")},+	{_SC("rawdelete"),table_rawdelete,2, 0, _SC("t")},+	{_SC("rawin"),container_rawexists,2, 0, _SC("t")},+	{_SC("weakref"),obj_delegate_weakref,1, 0, NULL },+	{_SC("tostring"),default_delegate_tostring,1, 0, _SC(".")},+	{_SC("clear"),obj_clear,1, 0, _SC(".")}, 	{0,0} }; @@ -541,21 +541,21 @@ }  SQRegFunction SQSharedState::_array_default_delegate_funcz[]={-	{_SC("len"),default_delegate_len,1, _SC("a")},-	{_SC("append"),array_append,2, _SC("a")},-	{_SC("extend"),array_extend,2, _SC("aa")},-	{_SC("push"),array_append,2, _SC("a")},-	{_SC("pop"),array_pop,1, _SC("a")},-	{_SC("top"),array_top,1, _SC("a")},-	{_SC("insert"),array_insert,3, _SC("an")},-	{_SC("remove"),array_remove,2, _SC("an")},-	{_SC("resize"),array_resize,-2, _SC("an")},-	{_SC("reverse"),array_reverse,1, _SC("a")},-	{_SC("sort"),array_sort,-1, _SC("ac")},-	{_SC("slice"),array_slice,-1, _SC("ann")},-	{_SC("weakref"),obj_delegate_weakref,1, NULL },-	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},-	{_SC("clear"),obj_clear,1, _SC(".")},+	{_SC("len"),default_delegate_len,1, 0, _SC("a")},+	{_SC("append"),array_append,2, 0, _SC("a")},+	{_SC("extend"),array_extend,2, 0, _SC("aa")},+	{_SC("push"),array_append,2, 0, _SC("a")},+	{_SC("pop"),array_pop,1, 0, _SC("a")},+	{_SC("top"),array_top,1, 0, _SC("a")},+	{_SC("insert"),array_insert,3, 0, _SC("an")},+	{_SC("remove"),array_remove,2, 0, _SC("an")},+	{_SC("resize"),array_resize,-2, 3, _SC("an")},+	{_SC("reverse"),array_reverse,1, 0, _SC("a")},+	{_SC("sort"),array_sort,-1, 2, _SC("ac")},+	{_SC("slice"),array_slice,-1, 3, _SC("ann")},+	{_SC("weakref"),obj_delegate_weakref,1, 0, NULL },+	{_SC("tostring"),default_delegate_tostring,1, 0, _SC(".")},+	{_SC("clear"),obj_clear,1, 0, _SC(".")}, 	{0,0} }; @@ -607,25 +607,25 @@ STRING_TOFUNCZ(toupper)  SQRegFunction SQSharedState::_string_default_delegate_funcz[]={-	{_SC("len"),default_delegate_len,1, _SC("s")},-	{_SC("tointeger"),default_delegate_tointeger,1, _SC("s")},-	{_SC("tofloat"),default_delegate_tofloat,1, _SC("s")},-	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},-	{_SC("slice"),string_slice,-1, _SC(" s n  n")},-	{_SC("find"),string_find,-2, _SC("s s n ")},-	{_SC("tolower"),string_tolower,1, _SC("s")},-	{_SC("toupper"),string_toupper,1, _SC("s")},-	{_SC("weakref"),obj_delegate_weakref,1, NULL },+	{_SC("len"),default_delegate_len,1, 0, _SC("s")},+	{_SC("tointeger"),default_delegate_tointeger,1, 0, _SC("s")},+	{_SC("tofloat"),default_delegate_tofloat,1, 0, _SC("s")},+	{_SC("tostring"),default_delegate_tostring,1, 0, _SC(".")},+	{_SC("slice"),string_slice,-1, 3, _SC("snn")},+	{_SC("find"),string_find,-2, 3, _SC("ssn")},+	{_SC("tolower"),string_tolower,1, 0, _SC("s")},+	{_SC("toupper"),string_toupper,1, 0, _SC("s")},+	{_SC("weakref"),obj_delegate_weakref,1, 0, NULL }, 	{0,0} };  //INTEGER DEFAULT DELEGATE////////////////////////// SQRegFunction SQSharedState::_number_default_delegate_funcz[]={-	{_SC("tointeger"),default_delegate_tointeger,1, _SC("n|b")},-	{_SC("tofloat"),default_delegate_tofloat,1, _SC("n|b")},-	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},-	{_SC("tochar"),number_delegate_tochar,1, _SC("n|b")},-	{_SC("weakref"),obj_delegate_weakref,1, NULL },+	{_SC("tointeger"),default_delegate_tointeger,1, 0, _SC("n|b")},+	{_SC("tofloat"),default_delegate_tofloat,1, 0, _SC("n|b")},+	{_SC("tostring"),default_delegate_tostring,1, 0, _SC(".")},+	{_SC("tochar"),number_delegate_tochar,1, 0, _SC("n|b")},+	{_SC("weakref"),obj_delegate_weakref,1, 0, NULL }, 	{0,0} }; @@ -706,14 +706,14 @@   SQRegFunction SQSharedState::_closure_default_delegate_funcz[]={-	{_SC("call"),closure_call,-1, _SC("c")},-	{_SC("pcall"),closure_pcall,-1, _SC("c")},-	{_SC("acall"),closure_acall,2, _SC("ca")},-	{_SC("pacall"),closure_pacall,2, _SC("ca")},-	{_SC("weakref"),obj_delegate_weakref,1, NULL },-	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},-	{_SC("bindenv"),closure_bindenv,2, _SC("c x|y|t")},-	{_SC("getinfos"),closure_getinfos,1, _SC("c")},+	{_SC("call"),closure_call,-1, 0, _SC("c")},+	{_SC("pcall"),closure_pcall,-1, 0, _SC("c")},+	{_SC("acall"),closure_acall,2, 0, _SC("ca")},+	{_SC("pacall"),closure_pacall,2, 0, _SC("ca")},+	{_SC("weakref"),obj_delegate_weakref,1, 0, NULL },+	{_SC("tostring"),default_delegate_tostring,1, 0, _SC(".")},+	{_SC("bindenv"),closure_bindenv,2, 0, _SC("c x|y|t")},+	{_SC("getinfos"),closure_getinfos,1, 0, _SC("c")}, 	{0,0} }; @@ -730,9 +730,9 @@ }  SQRegFunction SQSharedState::_generator_default_delegate_funcz[]={-	{_SC("getstatus"),generator_getstatus,1, _SC("g")},-	{_SC("weakref"),obj_delegate_weakref,1, NULL },-	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},+	{_SC("getstatus"),generator_getstatus,1, 0, _SC("g")},+	{_SC("weakref"),obj_delegate_weakref,1, 0, NULL },+	{_SC("tostring"),default_delegate_tostring,1, 0, _SC(".")}, 	{0,0} }; @@ -809,11 +809,11 @@ }  SQRegFunction SQSharedState::_thread_default_delegate_funcz[] = {-	{_SC("call"), thread_call, -1, _SC("v")},-	{_SC("wakeup"), thread_wakeup, -1, _SC("v")},-	{_SC("getstatus"), thread_getstatus, 1, _SC("v")},-	{_SC("weakref"),obj_delegate_weakref,1, NULL },-	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},+	{_SC("call"), thread_call, -1, 0, _SC("v")},+	{_SC("wakeup"), thread_wakeup, -1, 2, _SC("v")},+	{_SC("getstatus"), thread_getstatus, 1, 0, _SC("v")},+	{_SC("weakref"),obj_delegate_weakref,1, 0, NULL },+	{_SC("tostring"),default_delegate_tostring,1, 0, _SC(".")}, 	{0,0}, }; @@ -839,12 +839,12 @@ }  SQRegFunction SQSharedState::_class_default_delegate_funcz[] = {-	{_SC("getattributes"), class_getattributes, 2, _SC("y.")},-	{_SC("setattributes"), class_setattributes, 3, _SC("y..")},-	{_SC("rawin"),container_rawexists,2, _SC("y")},-	{_SC("weakref"),obj_delegate_weakref,1, NULL },-	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},-	{_SC("instance"),class_instance,1, _SC("y")},+	{_SC("getattributes"), class_getattributes, 2, 0, _SC("y.")},+	{_SC("setattributes"), class_setattributes, 3, 0, _SC("y..")},+	{_SC("rawin"),container_rawexists,2, 0, _SC("y")},+	{_SC("weakref"),obj_delegate_weakref,1, 0, NULL },+	{_SC("tostring"),default_delegate_tostring,1, 0, _SC(".")},+	{_SC("instance"),class_instance,1, 0, _SC("y")}, 	{0,0} }; @@ -856,10 +856,10 @@ }  SQRegFunction SQSharedState::_instance_default_delegate_funcz[] = {-	{_SC("getclass"), instance_getclass, 1, _SC("x")},-	{_SC("rawin"),container_rawexists,2, _SC("x")},-	{_SC("weakref"),obj_delegate_weakref,1, NULL },-	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},+	{_SC("getclass"), instance_getclass, 1, 0, _SC("x")},+	{_SC("rawin"),container_rawexists,2, 0, _SC("x")},+	{_SC("weakref"),obj_delegate_weakref,1, 0, NULL },+	{_SC("tostring"),default_delegate_tostring,1, 0, _SC(".")}, 	{0,0} }; @@ -871,9 +871,9 @@ }  SQRegFunction SQSharedState::_weakref_default_delegate_funcz[] = {-	{_SC("ref"),weakref_ref,1, _SC("r")},-	{_SC("weakref"),obj_delegate_weakref,1, NULL },-	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},+	{_SC("ref"),weakref_ref,1, 0, _SC("r")},+	{_SC("weakref"),obj_delegate_weakref,1, 0, NULL },+	{_SC("tostring"),default_delegate_tostring,1, 0, _SC(".")}, 	{0,0} }; --- ../orig/squirrel/sqclosure.h	2006-10-19 20:54:08.000000000 +0400+++ ./squirrel/sqclosure.h	2006-12-24 12:28:27.000000000 +0300@@ -92,7 +92,7 @@ 		ret->_env = _env; 		ret->_name = _name; 		ret->_outervalues.copy(_outervalues);-		ret->_typecheck.copy(_typecheck);+		ret->_typecheck = _typecheck; 		ret->_nparamscheck = _nparamscheck; 		return ret; 	}@@ -107,12 +107,13 @@ 	void Mark(SQCollectable **chain); 	void Finalize(){_outervalues.resize(0);} #endif-	SQInteger _nparamscheck;-	SQIntVec _typecheck;-	SQObjectPtrVec _outervalues; 	SQObjectPtr _env; 	SQFUNCTION _function; 	SQObjectPtr _name;+	SQObjectPtrVec _outervalues;+	SQIntVec _typecheck;+	SQInteger _nparamscheck;+	SQInteger _maxparams; };  --- ../orig/squirrel/sqlexer.cpp	2007-05-04 19:46:12.000000000 +0400+++ ./squirrel/sqlexer.cpp	2007-12-28 19:13:12.250000000 +0300@@ -352,17 +352,30 @@ 	return TK_STRING_LITERAL; } -void LexHexadecimal(const SQChar *s,SQUnsignedInteger *res)+SQInteger scisodigit(SQInteger c) { return c >= _SC('0') && c <= _SC('7'); }++void LexOctal(const SQChar *s,SQUnsignedInteger *res) { 	*res = 0; 	while(*s != 0) 	{-		if(scisdigit(*s)) *res = (*res)*16+((*s++)-'0');-		else if(scisxdigit(*s)) *res = (*res)*16+(toupper(*s++)-'A'+10);+		if(scisodigit(*s)) *res = (*res)*8+((*s++)-'0'); 		else { assert(0); } 	} } +void LexHexadecimal(const SQChar *s,SQUnsignedInteger *res)+{+	*res = 0;+	while(*s != 0)+	{+		if(scisdigit(*s))+			*res = (*res)*16+((*s++)-'0');+		else+			*res = (*res)*16+(toupper(*s++)-'A'+10);+	}+}+ void LexInteger(const SQChar *s,SQUnsignedInteger *res) { 	*res = 0;@@ -380,6 +393,7 @@ #define TFLOAT 2 #define THEX 3 #define TSCIENTIFIC 4+#define TOCTAL 5 	SQInteger type = TINT, firstchar = CUR_CHAR; 	SQChar *sTemp; 	INIT_TEMP_STRING();@@ -414,6 +428,8 @@ 		} 	} 	TERMINATE_BUFFER();+	if (type == TINT && firstchar == _SC('0'))+		type = TOCTAL; 	switch(type) { 	case TSCIENTIFIC: 	case TFLOAT:@@ -422,6 +438,9 @@ 	case TINT: 		LexInteger(&_longstr[0],(SQUnsignedInteger *)&_nvalue); 		return TK_INTEGER;+	case TOCTAL:+		LexOctal(&_longstr[0],(SQUnsignedInteger *)&_nvalue);+		return TK_INTEGER; 	case THEX: 		LexHexadecimal(&_longstr[0],(SQUnsignedInteger *)&_nvalue); 		return TK_INTEGER;--- ../orig/squirrel/sqstate.cpp	2007-03-11 21:25:24.000000000 +0300+++ ./squirrel/sqstate.cpp	2007-12-28 19:05:25.046875000 +0300@@ -85,6 +85,7 @@ 	while(funcz[i].name!=0){ 		SQNativeClosure *nc = SQNativeClosure::Create(ss,funcz[i].f); 		nc->_nparamscheck = funcz[i].nparamscheck;+		nc->_maxparams = funcz[i].maxparams; 		nc->_name = SQString::Create(ss,funcz[i].name); 		if(funcz[i].typemask && !CompileTypemask(nc->_typecheck,funcz[i].typemask)) 			return NULL;--- ../orig/squirrel/sqvm.cpp	2007-05-04 20:10:58.000000000 +0400+++ ./squirrel/sqvm.cpp	2007-12-28 19:07:09.531250000 +0300@@ -1076,8 +1076,10 @@ { 	if (_nnativecalls + 1 > MAX_NATIVE_CALLS) { Raise_Error(_SC("Native stack overflow")); return false; } 	SQInteger nparamscheck = nclosure->_nparamscheck;+	SQInteger maxparams = nclosure->_maxparams; 	if(((nparamscheck > 0) && (nparamscheck != nargs))-		|| ((nparamscheck < 0) && (nargs < (-nparamscheck)))) {+		|| ((nparamscheck < 0) && (nargs < (-nparamscheck)))+		|| (maxparams && (nargs > maxparams))) { 		Raise_Error(_SC("wrong number of parameters")); 		return false; 		}