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; }