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