From 7cdca09d5028e519946da3fa6c7c8b5c23e22938 Mon Sep 17 00:00:00 2001 From: Sandu Liviu Catalin Date: Thu, 25 Oct 2018 20:04:52 +0300 Subject: [PATCH] Backported latest fixes and improvements from the Squirrel repository. --- external/Squirrel/Lib/sqstdblob.cpp | 8 +- external/Squirrel/Lib/sqstdblobimpl.h | 2 +- external/Squirrel/sqapi.cpp | 159 +++++++++++++------------ external/Squirrel/sqbaselib.cpp | 94 +++++++++++---- external/Squirrel/sqclass.cpp | 10 +- external/Squirrel/sqcompiler.cpp | 57 ++++----- external/Squirrel/sqdebug.cpp | 14 +-- external/Squirrel/sqfuncstate.cpp | 16 +-- external/Squirrel/sqfuncstate.h | 4 +- external/Squirrel/sqlexer.cpp | 2 +- external/Squirrel/sqobject.cpp | 16 +-- external/Squirrel/sqobject.h | 9 +- external/Squirrel/sqstate.cpp | 10 +- external/Squirrel/sqtable.cpp | 12 +- external/Squirrel/sqtable.h | 6 +- external/Squirrel/sqvm.cpp | 160 +++++++++++++++----------- external/Squirrel/sqvm.h | 4 +- include/squirrel.h | 9 +- 18 files changed, 347 insertions(+), 245 deletions(-) diff --git a/external/Squirrel/Lib/sqstdblob.cpp b/external/Squirrel/Lib/sqstdblob.cpp index 67e5f3c3..261b938b 100644 --- a/external/Squirrel/Lib/sqstdblob.cpp +++ b/external/Squirrel/Lib/sqstdblob.cpp @@ -82,6 +82,12 @@ static SQInteger _blob__get(HSQUIRRELVM v) { SETUP_BLOB(v); SQInteger idx; + + if ((sq_gettype(v, 2) & SQOBJECT_NUMERIC) == 0) + { + sq_pushnull(v); + return sq_throwobject(v); + } sq_getinteger(v,2,&idx); if(idx < 0 || idx >= self->Len()) return sq_throwerror(v,_SC("index out of range")); @@ -168,7 +174,7 @@ static const SQRegFunction _blob_methods[] = { _DECL_BLOB_FUNC(swap2,1,_SC("x")), _DECL_BLOB_FUNC(swap4,1,_SC("x")), _DECL_BLOB_FUNC(_set,3,_SC("xnn")), - _DECL_BLOB_FUNC(_get,2,_SC("xn")), + _DECL_BLOB_FUNC(_get,2,_SC("x.")), _DECL_BLOB_FUNC(_typeof,1,_SC("x")), _DECL_BLOB_FUNC(_nexti,2,_SC("x")), _DECL_BLOB_FUNC(_cloned,2,_SC("xx")), diff --git a/external/Squirrel/Lib/sqstdblobimpl.h b/external/Squirrel/Lib/sqstdblobimpl.h index 4320e888..bfdaddc2 100644 --- a/external/Squirrel/Lib/sqstdblobimpl.h +++ b/external/Squirrel/Lib/sqstdblobimpl.h @@ -88,7 +88,7 @@ struct SQBlob : public SQStream return 0; } bool IsValid() { - return _buf?true:false; + return _size == 0 || _buf?true:false; } bool EOS() { return _ptr == _size; diff --git a/external/Squirrel/sqapi.cpp b/external/Squirrel/sqapi.cpp index 21039fc5..7af6a1e5 100644 --- a/external/Squirrel/sqapi.cpp +++ b/external/Squirrel/sqapi.cpp @@ -16,7 +16,7 @@ static bool sq_aux_gettypedarg(HSQUIRRELVM v,SQInteger idx,SQObjectType type,SQObjectPtr **o) { *o = &stack_get(v,idx); - if(type(**o) != type){ + if(sq_type(**o) != type){ SQObjectPtr oval = v->PrintObjVal(**o); v->Raise_Error(_SC("wrong argument type, expected '%s' got '%.50s'"),IdType2Name(type),_stringval(oval)); return false; @@ -150,7 +150,7 @@ void sq_notifyallexceptions(HSQUIRRELVM v, SQBool enable) void sq_addref(HSQUIRRELVM v,HSQOBJECT *po) { - if(!ISREFCOUNTED(type(*po))) return; + if(!ISREFCOUNTED(sq_type(*po))) return; #ifdef NO_GARBAGE_COLLECTOR __AddRef(po->_type,po->_unVal); #else @@ -160,7 +160,7 @@ void sq_addref(HSQUIRRELVM v,HSQOBJECT *po) SQUnsignedInteger sq_getrefcount(HSQUIRRELVM v,HSQOBJECT *po) { - if(!ISREFCOUNTED(type(*po))) return 0; + if(!ISREFCOUNTED(sq_type(*po))) return 0; #ifdef NO_GARBAGE_COLLECTOR return po->_unVal.pRefCounted->_uiRef; #else @@ -170,7 +170,7 @@ SQUnsignedInteger sq_getrefcount(HSQUIRRELVM v,HSQOBJECT *po) SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po) { - if(!ISREFCOUNTED(type(*po))) return SQTrue; + if(!ISREFCOUNTED(sq_type(*po))) return SQTrue; #ifdef NO_GARBAGE_COLLECTOR bool ret = (po->_unVal.pRefCounted->_uiRef <= 1) ? SQTrue : SQFalse; __Release(po->_type,po->_unVal); @@ -182,7 +182,7 @@ SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po) SQUnsignedInteger sq_getvmrefcount(HSQUIRRELVM SQ_UNUSED_ARG(v), const HSQOBJECT *po) { - if (!ISREFCOUNTED(type(*po))) return 0; + if (!ISREFCOUNTED(sq_type(*po))) return 0; return po->_unVal.pRefCounted->_uiRef; } @@ -290,7 +290,7 @@ SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase) SQClass *baseclass = NULL; if(hasbase) { SQObjectPtr &base = stack_get(v,-1); - if(type(base) != OT_CLASS) + if(sq_type(base) != OT_CLASS) return sq_throwerror(v,_SC("invalid base type")); baseclass = _class(base); } @@ -304,7 +304,7 @@ SQBool sq_instanceof(HSQUIRRELVM v) { SQObjectPtr &inst = stack_get(v,-1); SQObjectPtr &cl = stack_get(v,-2); - if(type(inst) != OT_INSTANCE || type(cl) != OT_CLASS) + if(sq_type(inst) != OT_INSTANCE || sq_type(cl) != OT_CLASS) return sq_throwerror(v,_SC("invalid param type")); return _instance(inst)->InstanceOf(_class(cl))?SQTrue:SQFalse; } @@ -394,21 +394,21 @@ void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars) v->Push(SQObjectPtr(nc)); } -SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars) +SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQInteger *nparams,SQInteger *nfreevars) { SQObject o = stack_get(v, idx); - if(type(o) == OT_CLOSURE) { + if(sq_type(o) == OT_CLOSURE) { SQClosure *c = _closure(o); SQFunctionProto *proto = c->_function; - *nparams = (SQUnsignedInteger)proto->_nparameters; - *nfreevars = (SQUnsignedInteger)proto->_noutervalues; + *nparams = proto->_nparameters; + *nfreevars = proto->_noutervalues; return SQ_OK; } - else if(type(o) == OT_NATIVECLOSURE) + else if(sq_type(o) == OT_NATIVECLOSURE) { SQNativeClosure *c = _nativeclosure(o); - *nparams = (SQUnsignedInteger)c->_nparamscheck; - *nfreevars = c->_noutervalues; + *nparams = c->_nparamscheck; + *nfreevars = (SQInteger)c->_noutervalues; return SQ_OK; } return sq_throwerror(v,_SC("the object is not a closure")); @@ -459,7 +459,7 @@ SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx) !sq_isclass(env) && !sq_isinstance(env)) return sq_throwerror(v,_SC("invalid environment")); - SQWeakRef *w = _refcounted(env)->GetWeakRef(type(env)); + SQWeakRef *w = _refcounted(env)->GetWeakRef(sq_type(env)); SQObjectPtr ret; if(sq_isclosure(o)) { SQClosure *c = _closure(o)->Clone(); @@ -524,7 +524,7 @@ SQRESULT sq_getclosureroot(HSQUIRRELVM v,SQInteger idx) SQRESULT sq_clear(HSQUIRRELVM v,SQInteger idx) { SQObject &o=stack_get(v,idx); - switch(type(o)) { + switch(sq_type(o)) { case OT_TABLE: _table(o)->Clear(); break; case OT_ARRAY: _array(o)->Resize(0); break; default: @@ -619,7 +619,7 @@ void sq_push(HSQUIRRELVM v,SQInteger idx) SQObjectType sq_gettype(HSQUIRRELVM v,SQInteger idx) { - return type(stack_get(v, idx)); + return sq_type(stack_get(v, idx)); } SQRESULT sq_typeof(HSQUIRRELVM v,SQInteger idx) @@ -723,7 +723,7 @@ SQRESULT sq_clone(HSQUIRRELVM v,SQInteger idx) SQInteger sq_getsize(HSQUIRRELVM v, SQInteger idx) { SQObjectPtr &o = stack_get(v, idx); - SQObjectType type = type(o); + SQObjectType type = sq_type(o); switch(type) { case OT_STRING: return _string(o)->_len; case OT_TABLE: return _table(o)->CountUsed(); @@ -754,7 +754,7 @@ SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPoint SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag) { SQObjectPtr &o = stack_get(v,idx); - switch(type(o)) { + switch(sq_type(o)) { case OT_USERDATA: _userdata(o)->_typetag = typetag; break; case OT_CLASS: _class(o)->_typetag = typetag; break; default: return sq_throwerror(v,_SC("invalid object type")); @@ -764,7 +764,7 @@ SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag) SQRESULT sq_getobjtypetag(const HSQOBJECT *o,SQUserPointer * typetag) { - switch(type(*o)) { + switch(sq_type(*o)) { case OT_INSTANCE: *typetag = _instance(*o)->_class->_typetag; break; case OT_USERDATA: *typetag = _userdata(*o)->_typetag; break; case OT_CLASS: *typetag = _class(*o)->_typetag; break; @@ -776,8 +776,8 @@ SQRESULT sq_getobjtypetag(const HSQOBJECT *o,SQUserPointer * typetag) SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag) { SQObjectPtr &o = stack_get(v,idx); - if (SQ_FAILED(sq_getobjtypetag(&o, typetag))) - return SQ_ERROR;// this is not an error it should be a bool but would break backward compatibility + if (SQ_FAILED(sq_getobjtypetag(&o, typetag))) + return SQ_ERROR;// this is not an error it should be a bool but would break backward compatibility return SQ_OK; } @@ -792,7 +792,7 @@ SQRESULT sq_getuserpointer(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p) SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p) { SQObjectPtr &o = stack_get(v,idx); - if(type(o) != OT_INSTANCE) return sq_throwerror(v,_SC("the object is not a class instance")); + if(sq_type(o) != OT_INSTANCE) return sq_throwerror(v,_SC("the object is not a class instance")); _instance(o)->_userpointer = p; return SQ_OK; } @@ -800,7 +800,7 @@ SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p) SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize) { SQObjectPtr &o = stack_get(v,idx); - if(type(o) != OT_CLASS) return sq_throwerror(v,_SC("the object is not a class")); + if(sq_type(o) != OT_CLASS) return sq_throwerror(v,_SC("the object is not a class")); if(_class(o)->_locked) return sq_throwerror(v,_SC("the class is locked")); _class(o)->_udsize = udsize; return SQ_OK; @@ -810,7 +810,7 @@ SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize) SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag) { SQObjectPtr &o = stack_get(v,idx); - if(type(o) != OT_INSTANCE) return sq_throwerror(v,_SC("the object is not a class instance")); + if(sq_type(o) != OT_INSTANCE) return sq_throwerror(v,_SC("the object is not a class instance")); (*p) = _instance(o)->_userpointer; if(typetag != 0) { SQClass *cl = _instance(o)->_class; @@ -867,9 +867,9 @@ SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx, SQBool bstatic) { sq_aux_paramscheck(v, 3); SQObjectPtr &self = stack_get(v, idx); - if(type(self) == OT_TABLE || type(self) == OT_CLASS) { + if(sq_type(self) == OT_TABLE || sq_type(self) == OT_CLASS) { SQObjectPtr &key = v->GetUp(-2); - if(type(key) == OT_NULL) return sq_throwerror(v, _SC("null is not a valid key")); + if(sq_type(key) == OT_NULL) return sq_throwerror(v, _SC("null is not a valid key")); v->NewSlot(self, key, v->GetUp(-1),bstatic?true:false); v->Pop(2); } @@ -882,7 +882,7 @@ SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval) SQObjectPtr *self; _GETSAFE_OBJ(v, idx, OT_TABLE,self); SQObjectPtr &key = v->GetUp(-1); - if(type(key) == OT_NULL) return sq_throwerror(v, _SC("null is not a valid key")); + if(sq_type(key) == OT_NULL) return sq_throwerror(v, _SC("null is not a valid key")); SQObjectPtr res; if(!v->DeleteSlot(*self, key, res)){ v->Pop(); @@ -907,11 +907,11 @@ SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx) { SQObjectPtr &self = stack_get(v, idx); SQObjectPtr &key = v->GetUp(-2); - if(type(key) == OT_NULL) { + if(sq_type(key) == OT_NULL) { v->Pop(2); return sq_throwerror(v, _SC("null key")); } - switch(type(self)) { + switch(sq_type(self)) { case OT_TABLE: _table(self)->NewSlot(key, v->GetUp(-1)); v->Pop(2); @@ -944,22 +944,28 @@ SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx) SQRESULT sq_newmember(HSQUIRRELVM v,SQInteger idx,SQBool bstatic) { SQObjectPtr &self = stack_get(v, idx); - if(type(self) != OT_CLASS) return sq_throwerror(v, _SC("new member only works with classes")); + if(sq_type(self) != OT_CLASS) return sq_throwerror(v, _SC("new member only works with classes")); SQObjectPtr &key = v->GetUp(-3); - if(type(key) == OT_NULL) return sq_throwerror(v, _SC("null key")); - if(!v->NewSlotA(self,key,v->GetUp(-2),v->GetUp(-1),bstatic?true:false,false)) + if(sq_type(key) == OT_NULL) return sq_throwerror(v, _SC("null key")); + if(!v->NewSlotA(self,key,v->GetUp(-2),v->GetUp(-1),bstatic?true:false,false)) { + v->Pop(3); return SQ_ERROR; + } + v->Pop(3); return SQ_OK; } SQRESULT sq_rawnewmember(HSQUIRRELVM v,SQInteger idx,SQBool bstatic) { SQObjectPtr &self = stack_get(v, idx); - if(type(self) != OT_CLASS) return sq_throwerror(v, _SC("new member only works with classes")); + if(sq_type(self) != OT_CLASS) return sq_throwerror(v, _SC("new member only works with classes")); SQObjectPtr &key = v->GetUp(-3); - if(type(key) == OT_NULL) return sq_throwerror(v, _SC("null key")); - if(!v->NewSlotA(self,key,v->GetUp(-2),v->GetUp(-1),bstatic?true:false,true)) + if(sq_type(key) == OT_NULL) return sq_throwerror(v, _SC("null key")); + if(!v->NewSlotA(self,key,v->GetUp(-2),v->GetUp(-1),bstatic?true:false,true)) { + v->Pop(3); return SQ_ERROR; + } + v->Pop(3); return SQ_OK; } @@ -967,23 +973,23 @@ SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx) { SQObjectPtr &self = stack_get(v, idx); SQObjectPtr &mt = v->GetUp(-1); - SQObjectType type = type(self); + SQObjectType type = sq_type(self); switch(type) { case OT_TABLE: - if(type(mt) == OT_TABLE) { + if(sq_type(mt) == OT_TABLE) { if(!_table(self)->SetDelegate(_table(mt))) { return sq_throwerror(v, _SC("delagate cycle")); } v->Pop(); } - else if(type(mt)==OT_NULL) { + else if(sq_type(mt)==OT_NULL) { _table(self)->SetDelegate(NULL); v->Pop(); } else return sq_aux_invalidtype(v,type); break; case OT_USERDATA: - if(type(mt)==OT_TABLE) { + if(sq_type(mt)==OT_TABLE) { _userdata(self)->SetDelegate(_table(mt)); v->Pop(); } - else if(type(mt)==OT_NULL) { + else if(sq_type(mt)==OT_NULL) { _userdata(self)->SetDelegate(NULL); v->Pop(); } else return sq_aux_invalidtype(v, type); break; @@ -1014,7 +1020,7 @@ SQRESULT sq_rawdeleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval) SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx) { SQObjectPtr &self=stack_get(v,idx); - switch(type(self)){ + switch(sq_type(self)){ case OT_TABLE: case OT_USERDATA: if(!_delegable(self)->_delegate){ @@ -1043,7 +1049,7 @@ SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx) { SQObjectPtr &self=stack_get(v,idx); SQObjectPtr &obj = v->GetUp(-1); - switch(type(self)) { + switch(sq_type(self)) { case OT_TABLE: if(_table(self)->Get(obj,obj)) return SQ_OK; @@ -1093,7 +1099,7 @@ const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedIntege stackbase-=ci._prevstkbase; } SQVM::CallInfo &ci=v->_callsstack[lvl]; - if(type(ci._closure)!=OT_CLOSURE) + if(sq_type(ci._closure)!=OT_CLOSURE) return NULL; SQClosure *c=_closure(ci._closure); SQFunctionProto *func=c->_function; @@ -1154,7 +1160,7 @@ SQRESULT sq_reservestack(HSQUIRRELVM v,SQInteger nsize) SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror) { - if (type(v->GetUp(-1)) == OT_GENERATOR) + if (sq_type(v->GetUp(-1)) == OT_GENERATOR) { v->PushNull(); //retval if (!v->Execute(v->GetUp(-2), 0, v->_top, v->GetUp(-1), raiseerror, SQVM::ET_RESUME_GENERATOR)) @@ -1169,23 +1175,34 @@ SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror) SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror) { SQObjectPtr res; - if(v->Call(v->GetUp(-(params+1)),params,v->_top-params,res,raiseerror?true:false)){ - - if(!v->_suspended) { - v->Pop(params);//pop args - } - if(retval){ - v->Push(res); return SQ_OK; - } - return SQ_OK; - } - else { - v->Pop(params); + if(!v->Call(v->GetUp(-(params+1)),params,v->_top-params,res,raiseerror?true:false)){ + v->Pop(params); //pop args return SQ_ERROR; } if(!v->_suspended) - v->Pop(params); - return sq_throwerror(v,_SC("call failed")); + v->Pop(params); //pop args + if(retval) + v->Push(res); // push result + return SQ_OK; +} + +SQRESULT sq_tailcall(HSQUIRRELVM v, SQInteger nparams) +{ + SQObjectPtr &res = v->GetUp(-(nparams + 1)); + if (sq_type(res) != OT_CLOSURE) { + return sq_throwerror(v, _SC("only closure can be tail called")); + } + SQClosure *clo = _closure(res); + if (clo->_function->_bgenerator) + { + return sq_throwerror(v, _SC("generators cannot be tail called")); + } + + SQInteger stackbase = (v->_top - nparams) - v->_stackbase; + if (!v->TailCall(clo, stackbase, nparams)) { + return SQ_ERROR; + } + return SQ_TAILCALL_FLAG; } SQRESULT sq_suspendvm(HSQUIRRELVM v) @@ -1217,7 +1234,7 @@ SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool wakeupret,SQBool retval,SQBool raiseer void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook) { SQObjectPtr &ud=stack_get(v,idx); - switch( type(ud) ) { + switch(sq_type(ud) ) { case OT_USERDATA: _userdata(ud)->_hook = hook; break; case OT_INSTANCE: _instance(ud)->_hook = hook; break; case OT_CLASS: _class(ud)->_hook = hook; break; @@ -1228,7 +1245,7 @@ void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook) SQRELEASEHOOK sq_getreleasehook(HSQUIRRELVM v,SQInteger idx) { SQObjectPtr &ud=stack_get(v,idx); - switch( type(ud) ) { + switch(sq_type(ud) ) { case OT_USERDATA: return _userdata(ud)->_hook; break; case OT_INSTANCE: return _instance(ud)->_hook; break; case OT_CLASS: return _class(ud)->_hook; break; @@ -1308,7 +1325,7 @@ const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger n { SQObjectPtr &self=stack_get(v,idx); const SQChar *name = NULL; - switch(type(self)) + switch(sq_type(self)) { case OT_CLOSURE:{ SQClosure *clo = _closure(self); @@ -1336,7 +1353,7 @@ const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger n SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval) { SQObjectPtr &self=stack_get(v,idx); - switch(type(self)) + switch(sq_type(self)) { case OT_CLOSURE:{ SQFunctionProto *fp = _closure(self)->_function; @@ -1353,7 +1370,7 @@ SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval) else return sq_throwerror(v,_SC("invalid free var index")); break; default: - return sq_aux_invalidtype(v,type(self)); + return sq_aux_invalidtype(v, sq_type(self)); } v->Pop(); return SQ_OK; @@ -1366,7 +1383,7 @@ SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx) SQObjectPtr &key = stack_get(v,-2); SQObjectPtr &val = stack_get(v,-1); SQObjectPtr attrs; - if(type(key) == OT_NULL) { + if(sq_type(key) == OT_NULL) { attrs = _class(*o)->_attributes; _class(*o)->_attributes = val; v->Pop(2); @@ -1387,7 +1404,7 @@ SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx) _GETSAFE_OBJ(v, idx, OT_CLASS,o); SQObjectPtr &key = stack_get(v,-1); SQObjectPtr attrs; - if(type(key) == OT_NULL) { + if(sq_type(key) == OT_NULL) { attrs = _class(*o)->_attributes; v->Pop(); v->Push(attrs); @@ -1419,7 +1436,7 @@ SQRESULT sq_getmemberhandle(HSQUIRRELVM v,SQInteger idx,HSQMEMBERHANDLE *handle) SQRESULT _getmemberbyhandle(HSQUIRRELVM v,SQObjectPtr &self,const HSQMEMBERHANDLE *handle,SQObjectPtr *&val) { - switch(type(self)) { + switch(sq_type(self)) { case OT_INSTANCE: { SQInstance *i = _instance(self); if(handle->_static) { @@ -1502,8 +1519,8 @@ SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx) void sq_weakref(HSQUIRRELVM v,SQInteger idx) { SQObject &o=stack_get(v,idx); - if(ISREFCOUNTED(type(o))) { - v->Push(_refcounted(o)->GetWeakRef(type(o))); + if(ISREFCOUNTED(sq_type(o))) { + v->Push(_refcounted(o)->GetWeakRef(sq_type(o))); return; } v->Push(o); @@ -1512,7 +1529,7 @@ void sq_weakref(HSQUIRRELVM v,SQInteger idx) SQRESULT sq_getweakrefval(HSQUIRRELVM v,SQInteger idx) { SQObjectPtr &o = stack_get(v,idx); - if(type(o) != OT_WEAKREF) { + if(sq_type(o) != OT_WEAKREF) { return sq_throwerror(v,_SC("the object must be a weakref")); } v->Push(_weakref(o)->_obj); @@ -1541,7 +1558,7 @@ SQRESULT sq_getdefaultdelegate(HSQUIRRELVM v,SQObjectType t) SQRESULT sq_next(HSQUIRRELVM v,SQInteger idx) { SQObjectPtr o=stack_get(v,idx),&refpos = stack_get(v,-1),realkey,val; - if(type(o) == OT_GENERATOR) { + if(sq_type(o) == OT_GENERATOR) { return sq_throwerror(v,_SC("cannot iterate a generator")); } int faketojump; diff --git a/external/Squirrel/sqbaselib.cpp b/external/Squirrel/sqbaselib.cpp index 662aeac8..f835cbf1 100644 --- a/external/Squirrel/sqbaselib.cpp +++ b/external/Squirrel/sqbaselib.cpp @@ -156,7 +156,14 @@ static SQInteger base_getstackinfos(HSQUIRRELVM v) static SQInteger base_assert(HSQUIRRELVM v) { if(SQVM::IsFalse(stack_get(v,2))){ - return sq_throwerror(v,_SC("assertion failed")); + SQInteger top = sq_gettop(v); + if (top>2 && SQ_SUCCEEDED(sq_tostring(v,3))) { + const SQChar *str = 0; + if (SQ_SUCCEEDED(sq_getstring(v,-1,&str))) { + return sq_throwerror(v, str); + } + } + return sq_throwerror(v, _SC("assertion failed")); } return 0; } @@ -169,7 +176,7 @@ static SQInteger get_slice_params(HSQUIRRELVM v,SQInteger &sidx,SQInteger &eidx, o=stack_get(v,1); if(top>1){ SQObjectPtr &start=stack_get(v,2); - if(type(start)!=OT_NULL && sq_isnumeric(start)){ + if(sq_type(start)!=OT_NULL && sq_isnumeric(start)){ sidx=tointeger(start); } } @@ -283,7 +290,7 @@ static const SQRegFunction base_funcs[]={ {_SC("setroottable"),base_setroottable,2, NULL}, {_SC("getconsttable"),base_getconsttable,1, NULL}, {_SC("setconsttable"),base_setconsttable,2, NULL}, - {_SC("assert"),base_assert,2, NULL}, + {_SC("assert"),base_assert,-2, NULL}, {_SC("print"),base_print,2, NULL}, {_SC("error"),base_error,2, NULL}, {_SC("compilestring"),base_compilestring,-2, _SC(".ss")}, @@ -340,7 +347,7 @@ static SQInteger default_delegate_len(HSQUIRRELVM v) static SQInteger default_delegate_tofloat(HSQUIRRELVM v) { SQObjectPtr &o=stack_get(v,1); - switch(type(o)){ + switch(sq_type(o)){ case OT_STRING:{ SQObjectPtr res; if(str2num(_stringval(o),res,10)){ @@ -369,7 +376,7 @@ static SQInteger default_delegate_tointeger(HSQUIRRELVM v) if(sq_gettop(v) > 1) { sq_getinteger(v,2,&base); } - switch(type(o)){ + switch(sq_type(o)){ case OT_STRING:{ SQObjectPtr res; if(str2num(_stringval(o),res,base)){ @@ -406,7 +413,7 @@ static SQInteger obj_delegate_weakref(HSQUIRRELVM v) static SQInteger obj_clear(HSQUIRRELVM v) { - return sq_clear(v,-1); + return SQ_SUCCEEDED(sq_clear(v,-1)) ? 1 : SQ_ERROR; } @@ -443,7 +450,7 @@ static SQInteger container_rawexists(HSQUIRRELVM v) static SQInteger container_rawset(HSQUIRRELVM v) { - return sq_rawset(v,-3); + return SQ_SUCCEEDED(sq_rawset(v,-3)) ? 1 : SQ_ERROR; } @@ -465,6 +472,34 @@ static SQInteger table_getdelegate(HSQUIRRELVM v) return SQ_SUCCEEDED(sq_getdelegate(v,-1))?1:SQ_ERROR; } +static SQInteger table_filter(HSQUIRRELVM v) +{ + SQObject &o = stack_get(v,1); + SQTable *tbl = _table(o); + SQObjectPtr ret = SQTable::Create(_ss(v),0); + + SQObjectPtr itr, key, val; + SQInteger nitr; + while((nitr = tbl->Next(false, itr, key, val)) != -1) { + itr = (SQInteger)nitr; + + v->Push(o); + v->Push(key); + v->Push(val); + if(SQ_FAILED(sq_call(v,3,SQTrue,SQFalse))) { + return SQ_ERROR; + } + if(!SQVM::IsFalse(v->GetUp(-1))) { + _table(ret)->NewSlot(key, val); + } + v->Pop(); + } + + v->Push(ret); + return 1; +} + + const SQRegFunction SQSharedState::_table_default_delegate_funcz[]={ {_SC("len"),default_delegate_len,1, _SC("t")}, {_SC("rawget"),container_rawget,2, _SC("t")}, @@ -476,6 +511,7 @@ const SQRegFunction SQSharedState::_table_default_delegate_funcz[]={ {_SC("clear"),obj_clear,1, _SC(".")}, {_SC("setdelegate"),table_setdelegate,2, _SC(".t|o")}, {_SC("getdelegate"),table_getdelegate,1, _SC(".")}, + {_SC("filter"),table_filter,2, _SC("tc")}, {NULL,(SQFUNCTION)0,0,NULL} }; @@ -483,18 +519,19 @@ const SQRegFunction SQSharedState::_table_default_delegate_funcz[]={ static SQInteger array_append(HSQUIRRELVM v) { - return sq_arrayappend(v,-2); + return SQ_SUCCEEDED(sq_arrayappend(v,-2)) ? 1 : SQ_ERROR; } static SQInteger array_extend(HSQUIRRELVM v) { _array(stack_get(v,1))->Extend(_array(stack_get(v,2))); - return 0; + sq_pop(v,1); + return 1; } static SQInteger array_reverse(HSQUIRRELVM v) { - return sq_arrayreverse(v,-1); + return SQ_SUCCEEDED(sq_arrayreverse(v,-1)) ? 1 : SQ_ERROR; } static SQInteger array_pop(HSQUIRRELVM v) @@ -519,7 +556,8 @@ static SQInteger array_insert(HSQUIRRELVM v) SQObject &val=stack_get(v,3); if(!_array(o)->Insert(tointeger(idx),val)) return sq_throwerror(v,_SC("index out of range")); - return 0; + sq_pop(v,2); + return 1; } static SQInteger array_remove(HSQUIRRELVM v) @@ -542,10 +580,15 @@ static SQInteger array_resize(HSQUIRRELVM v) SQObject &nsize = stack_get(v, 2); SQObjectPtr fill; if(sq_isnumeric(nsize)) { + SQInteger sz = tointeger(nsize); + if (sz<0) + return sq_throwerror(v, _SC("resizing to negative length")); + if(sq_gettop(v) > 2) fill = stack_get(v, 3); - _array(o)->Resize(tointeger(nsize),fill); - return 0; + _array(o)->Resize(sz,fill); + sq_settop(v, 1); + return 1; } return sq_throwerror(v, _SC("size must be a number")); } @@ -582,7 +625,8 @@ static SQInteger array_apply(HSQUIRRELVM v) SQObject &o = stack_get(v,1); if(SQ_FAILED(__map_array(_array(o),_array(o),v))) return SQ_ERROR; - return 0; + sq_pop(v,1); + return 1; } static SQInteger array_reduce(HSQUIRRELVM v) @@ -749,7 +793,8 @@ static SQInteger array_sort(HSQUIRRELVM v) return SQ_ERROR; } - return 0; + sq_settop(v,1); + return 1; } static SQInteger array_slice(HSQUIRRELVM v) @@ -885,7 +930,12 @@ static SQInteger closure_pcall(HSQUIRRELVM v) static SQInteger closure_call(HSQUIRRELVM v) { - return SQ_SUCCEEDED(sq_call(v,sq_gettop(v)-1,SQTrue,SQTrue))?1:SQ_ERROR; + SQObjectPtr &c = stack_get(v, -1); + if (sq_type(c) == OT_CLOSURE && (_closure(c)->_function->_bgenerator == false)) + { + return sq_tailcall(v, sq_gettop(v) - 1); + } + return SQ_SUCCEEDED(sq_call(v, sq_gettop(v) - 1, SQTrue, SQTrue)) ? 1 : SQ_ERROR; } static SQInteger _closure_acall(HSQUIRRELVM v,SQBool raiseerror) @@ -931,7 +981,7 @@ static SQInteger closure_setroot(HSQUIRRELVM v) static SQInteger closure_getinfos(HSQUIRRELVM v) { SQObject o = stack_get(v,1); SQTable *res = SQTable::Create(_ss(v),4); - if(type(o) == OT_CLOSURE) { + if(sq_type(o) == OT_CLOSURE) { SQFunctionProto *f = _closure(o)->_function; SQInteger nparams = f->_nparameters + (f->_varparams?1:0); SQObjectPtr params = SQArray::Create(_ss(v),nparams); @@ -1010,7 +1060,7 @@ const SQRegFunction SQSharedState::_generator_default_delegate_funcz[]={ static SQInteger thread_call(HSQUIRRELVM v) { SQObjectPtr o = stack_get(v,1); - if(type(o) == OT_THREAD) { + if(sq_type(o) == OT_THREAD) { SQInteger nparams = sq_gettop(v); _thread(o)->Push(_thread(o)->_roottable); for(SQInteger i = 2; i<(nparams+1); i++) @@ -1029,7 +1079,7 @@ static SQInteger thread_call(HSQUIRRELVM v) static SQInteger thread_wakeup(HSQUIRRELVM v) { SQObjectPtr o = stack_get(v,1); - if(type(o) == OT_THREAD) { + if(sq_type(o) == OT_THREAD) { SQVM *thread = _thread(o); SQInteger state = sq_getvmstate(thread); if(state != SQ_VMSTATE_SUSPENDED) { @@ -1065,7 +1115,7 @@ static SQInteger thread_wakeup(HSQUIRRELVM v) static SQInteger thread_wakeupthrow(HSQUIRRELVM v) { SQObjectPtr o = stack_get(v,1); - if(type(o) == OT_THREAD) { + if(sq_type(o) == OT_THREAD) { SQVM *thread = _thread(o); SQInteger state = sq_getvmstate(thread); if(state != SQ_VMSTATE_SUSPENDED) { @@ -1125,7 +1175,7 @@ static SQInteger thread_getstatus(HSQUIRRELVM v) static SQInteger thread_getstackinfos(HSQUIRRELVM v) { SQObjectPtr o = stack_get(v,1); - if(type(o) == OT_THREAD) { + if(sq_type(o) == OT_THREAD) { SQVM *thread = _thread(o); SQInteger threadtop = sq_gettop(thread); SQInteger level; @@ -1134,7 +1184,7 @@ static SQInteger thread_getstackinfos(HSQUIRRELVM v) if(SQ_FAILED(res)) { sq_settop(thread,threadtop); - if(type(thread->_lasterror) == OT_STRING) { + if(sq_type(thread->_lasterror) == OT_STRING) { sq_throwerror(v,_stringval(thread->_lasterror)); } else { diff --git a/external/Squirrel/sqclass.cpp b/external/Squirrel/sqclass.cpp index 81e66a24..fc619616 100644 --- a/external/Squirrel/sqclass.cpp +++ b/external/Squirrel/sqclass.cpp @@ -53,7 +53,7 @@ SQClass::~SQClass() bool SQClass::NewSlot(SQSharedState *ss,const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic) { SQObjectPtr temp; - bool belongs_to_static_table = type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE || bstatic; + bool belongs_to_static_table = sq_type(val) == OT_CLOSURE || sq_type(val) == OT_NATIVECLOSURE || bstatic; if(_locked && !belongs_to_static_table) return false; //the class already has an instance so cannot be modified if(_members->Get(key,temp) && _isfield(temp)) //overrides the default value @@ -63,18 +63,18 @@ bool SQClass::NewSlot(SQSharedState *ss,const SQObjectPtr &key,const SQObjectPtr } if(belongs_to_static_table) { SQInteger mmidx; - if((type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE) && + if((sq_type(val) == OT_CLOSURE || sq_type(val) == OT_NATIVECLOSURE) && (mmidx = ss->GetMetaMethodIdxByName(key)) != -1) { _metamethods[mmidx] = val; } else { SQObjectPtr theval = val; - if(_base && type(val) == OT_CLOSURE) { + if(_base && sq_type(val) == OT_CLOSURE) { theval = _closure(val)->Clone(); _closure(theval)->_base = _base; __ObjAddRef(_base); //ref for the closure } - if(type(temp) == OT_NULL) { + if(sq_type(temp) == OT_NULL) { bool isconstructor; SQVM::IsEqual(ss->_constructoridx, key, isconstructor); if(isconstructor) { @@ -191,7 +191,7 @@ SQInstance::~SQInstance() bool SQInstance::GetMetaMethod(SQVM* SQ_UNUSED_ARG(v),SQMetaMethod mm,SQObjectPtr &res) { - if(type(_class->_metamethods[mm]) != OT_NULL) { + if(sq_type(_class->_metamethods[mm]) != OT_NULL) { res = _class->_metamethods[mm]; return true; } diff --git a/external/Squirrel/sqcompiler.cpp b/external/Squirrel/sqcompiler.cpp index b5805888..967c3bb5 100644 --- a/external/Squirrel/sqcompiler.cpp +++ b/external/Squirrel/sqcompiler.cpp @@ -191,7 +191,7 @@ public: } else { if(_raiseerror && _ss(_vm)->_compilererrorhandler) { - _ss(_vm)->_compilererrorhandler(_vm, _compilererror, type(_sourcename) == OT_STRING?_stringval(_sourcename):_SC("unknown"), + _ss(_vm)->_compilererrorhandler(_vm, _compilererror, sq_type(_sourcename) == OT_STRING?_stringval(_sourcename):_SC("unknown"), _lex._currentline, _lex._currentcolumn); } _vm->_lasterror = SQString::Create(_ss(_vm), _compilererror, -1); @@ -443,8 +443,8 @@ public: Expression(); SQInteger second_exp = _fs->PopTarget(); if(trg != second_exp) _fs->AddInstruction(_OP_MOVE, trg, second_exp); - _fs->SetIntructionParam(jmppos, 1, _fs->GetCurrentPos() - jmppos); - _fs->SetIntructionParam(jzpos, 1, endfirstexp - jzpos + 1); + _fs->SetInstructionParam(jmppos, 1, _fs->GetCurrentPos() - jmppos); + _fs->SetInstructionParam(jzpos, 1, endfirstexp - jzpos + 1); _fs->SnoozeOpt(); } break; @@ -466,7 +466,7 @@ public: INVOKE_EXP(f); SQInteger op1 = _fs->PopTarget();SQInteger op2 = _fs->PopTarget(); _fs->AddInstruction(op, _fs->PushTarget(), op1, op2, op3); - _es.etype = EXPR; + _es.etype = EXPR; } void LogicalOrExp() { @@ -482,8 +482,8 @@ public: SQInteger second_exp = _fs->PopTarget(); if(trg != second_exp) _fs->AddInstruction(_OP_MOVE, trg, second_exp); _fs->SnoozeOpt(); - _fs->SetIntructionParam(jpos, 1, (_fs->GetCurrentPos() - jpos)); - _es.etype = EXPR; + _fs->SetInstructionParam(jpos, 1, (_fs->GetCurrentPos() - jpos)); + _es.etype = EXPR; break; }else return; } @@ -502,8 +502,8 @@ public: SQInteger second_exp = _fs->PopTarget(); if(trg != second_exp) _fs->AddInstruction(_OP_MOVE, trg, second_exp); _fs->SnoozeOpt(); - _fs->SetIntructionParam(jpos, 1, (_fs->GetCurrentPos() - jpos)); - _es.etype = EXPR; + _fs->SetInstructionParam(jpos, 1, (_fs->GetCurrentPos() - jpos)); + _es.etype = EXPR; break; } @@ -765,7 +765,7 @@ public: /* Handle named constant */ SQObjectPtr constval; SQObject constid; - if(type(constant) == OT_TABLE) { + if(sq_type(constant) == OT_TABLE) { Expect('.'); constid = Expect(TK_IDENTIFIER); if(!_table(constant)->Get(constid, constval)) { @@ -779,7 +779,7 @@ public: _es.epos = _fs->PushTarget(); /* generate direct or literal function depending on size */ - SQObjectType ctype = type(constval); + SQObjectType ctype = sq_type(constval); switch(ctype) { case OT_INTEGER: EmitLoadConstInt(_integer(constval),_es.epos); break; case OT_FLOAT: EmitLoadConstFloat(_float(constval),_es.epos); break; @@ -834,7 +834,7 @@ public: _fs->AddInstruction(_OP_APPENDARRAY, array, val, AAT_STACK); key++; } - _fs->SetIntructionParam(apos, 1, key); + _fs->SetInstructionParam(apos, 1, key); Lex(); } break; @@ -1002,7 +1002,7 @@ public: } } if(separator == _SC(',')) //hack recognizes a table from the separator - _fs->SetIntructionParam(tpos, 1, nkeys); + _fs->SetInstructionParam(tpos, 1, nkeys); Lex(); } void LocalDeclStatement() @@ -1092,9 +1092,9 @@ public: //Statement(); if(_lex._prevtoken != _SC('}')) OptionalSemicolon(); IfBlock(); //END_SCOPE(); - _fs->SetIntructionParam(jmppos, 1, _fs->GetCurrentPos() - jmppos); + _fs->SetInstructionParam(jmppos, 1, _fs->GetCurrentPos() - jmppos); } - _fs->SetIntructionParam(jnepos, 1, endifblock - jnepos + (haselse?1:0)); + _fs->SetInstructionParam(jnepos, 1, endifblock - jnepos + (haselse?1:0)); } void WhileStatement() { @@ -1111,7 +1111,7 @@ public: END_SCOPE(); _fs->AddInstruction(_OP_JMP, 0, jmppos - _fs->GetCurrentPos() - 1); - _fs->SetIntructionParam(jzpos, 1, _fs->GetCurrentPos() - jzpos); + _fs->SetInstructionParam(jzpos, 1, _fs->GetCurrentPos() - jzpos); END_BREAKBLE_BLOCK(jmppos); } @@ -1170,10 +1170,11 @@ public: _fs->AddInstruction(exp[i]); } _fs->AddInstruction(_OP_JMP, 0, jmppos - _fs->GetCurrentPos() - 1, 0); - if(jzpos> 0) _fs->SetIntructionParam(jzpos, 1, _fs->GetCurrentPos() - jzpos); - END_SCOPE(); - + if(jzpos> 0) _fs->SetInstructionParam(jzpos, 1, _fs->GetCurrentPos() - jzpos); + END_BREAKBLE_BLOCK(continuetrg); + + END_SCOPE(); } void ForEachStatement() { @@ -1210,8 +1211,8 @@ public: BEGIN_BREAKBLE_BLOCK() Statement(); _fs->AddInstruction(_OP_JMP, 0, jmppos - _fs->GetCurrentPos() - 1); - _fs->SetIntructionParam(foreachpos, 1, _fs->GetCurrentPos() - foreachpos); - _fs->SetIntructionParam(foreachpos + 1, 1, _fs->GetCurrentPos() - foreachpos); + _fs->SetInstructionParam(foreachpos, 1, _fs->GetCurrentPos() - foreachpos); + _fs->SetInstructionParam(foreachpos + 1, 1, _fs->GetCurrentPos() - foreachpos); END_BREAKBLE_BLOCK(foreachpos - 1); //restore the local variable stack(remove index,val and ref idx) _fs->PopTarget(); @@ -1231,7 +1232,7 @@ public: if(!bfirst) { _fs->AddInstruction(_OP_JMP, 0, 0); skipcondjmp = _fs->GetCurrentPos(); - _fs->SetIntructionParam(tonextcondjmp, 1, _fs->GetCurrentPos() - tonextcondjmp); + _fs->SetInstructionParam(tonextcondjmp, 1, _fs->GetCurrentPos() - tonextcondjmp); } //condition Lex(); Expression(); Expect(_SC(':')); @@ -1249,7 +1250,7 @@ public: //end condition if(skipcondjmp != -1) { - _fs->SetIntructionParam(skipcondjmp, 1, (_fs->GetCurrentPos() - skipcondjmp)); + _fs->SetInstructionParam(skipcondjmp, 1, (_fs->GetCurrentPos() - skipcondjmp)); } tonextcondjmp = _fs->GetCurrentPos(); BEGIN_SCOPE(); @@ -1258,7 +1259,7 @@ public: bfirst = false; } if(tonextcondjmp != -1) - _fs->SetIntructionParam(tonextcondjmp, 1, _fs->GetCurrentPos() - tonextcondjmp); + _fs->SetInstructionParam(tonextcondjmp, 1, _fs->GetCurrentPos() - tonextcondjmp); if(_token == TK_DEFAULT) { Lex(); Expect(_SC(':')); BEGIN_SCOPE(); @@ -1402,14 +1403,14 @@ public: if(_fs->_continuetargets.size()) _fs->_continuetargets.top()--; _fs->AddInstruction(_OP_JMP, 0, 0); SQInteger jmppos = _fs->GetCurrentPos(); - _fs->SetIntructionParam(trappos, 1, (_fs->GetCurrentPos() - trappos)); + _fs->SetInstructionParam(trappos, 1, (_fs->GetCurrentPos() - trappos)); Expect(TK_CATCH); Expect(_SC('(')); exid = Expect(TK_IDENTIFIER); Expect(_SC(')')); { BEGIN_SCOPE(); SQInteger ex_target = _fs->PushLocalVariable(exid); - _fs->SetIntructionParam(trappos, 0, ex_target); + _fs->SetInstructionParam(trappos, 0, ex_target); Statement(); - _fs->SetIntructionParams(jmppos, 0, (_fs->GetCurrentPos() - jmppos), 0); + _fs->SetInstructionParams(jmppos, 0, (_fs->GetCurrentPos() - jmppos), 0); END_SCOPE(); } } @@ -1547,7 +1548,7 @@ public: SQInteger pos = funcstate->_unresolvedbreaks.back(); funcstate->_unresolvedbreaks.pop_back(); //set the jmp instruction - funcstate->SetIntructionParams(pos, 0, funcstate->GetCurrentPos() - pos, 0); + funcstate->SetInstructionParams(pos, 0, funcstate->GetCurrentPos() - pos, 0); ntoresolve--; } } @@ -1557,7 +1558,7 @@ public: SQInteger pos = funcstate->_unresolvedcontinues.back(); funcstate->_unresolvedcontinues.pop_back(); //set the jmp instruction - funcstate->SetIntructionParams(pos, 0, targetpos - pos, 0); + funcstate->SetInstructionParams(pos, 0, targetpos - pos, 0); ntoresolve--; } } diff --git a/external/Squirrel/sqdebug.cpp b/external/Squirrel/sqdebug.cpp index 7214a2cb..d55b1b2e 100644 --- a/external/Squirrel/sqdebug.cpp +++ b/external/Squirrel/sqdebug.cpp @@ -17,8 +17,8 @@ SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger level,SQFunctionInfo *fi) SQClosure *c = _closure(ci._closure); SQFunctionProto *proto = c->_function; fi->funcid = proto; - fi->name = type(proto->_name) == OT_STRING?_stringval(proto->_name):_SC("unknown"); - fi->source = type(proto->_sourcename) == OT_STRING?_stringval(proto->_sourcename):_SC("unknown"); + fi->name = sq_type(proto->_name) == OT_STRING?_stringval(proto->_name):_SC("unknown"); + fi->source = sq_type(proto->_sourcename) == OT_STRING?_stringval(proto->_sourcename):_SC("unknown"); fi->line = proto->_lineinfos[0]._line; return SQ_OK; } @@ -32,12 +32,12 @@ SQRESULT sq_stackinfos(HSQUIRRELVM v, SQInteger level, SQStackInfos *si) if (cssize > level) { memset(si, 0, sizeof(SQStackInfos)); SQVM::CallInfo &ci = v->_callsstack[cssize-level-1]; - switch (type(ci._closure)) { + switch (sq_type(ci._closure)) { case OT_CLOSURE:{ SQFunctionProto *func = _closure(ci._closure)->_function; - if (type(func->_name) == OT_STRING) + if (sq_type(func->_name) == OT_STRING) si->funcname = _stringval(func->_name); - if (type(func->_sourcename) == OT_STRING) + if (sq_type(func->_sourcename) == OT_STRING) si->source = _stringval(func->_sourcename); si->line = func->GetLine(ci._ip); } @@ -45,7 +45,7 @@ SQRESULT sq_stackinfos(HSQUIRRELVM v, SQInteger level, SQStackInfos *si) case OT_NATIVECLOSURE: si->source = _SC("NATIVE"); si->funcname = _SC("unknown"); - if(type(_nativeclosure(ci._closure)->_name) == OT_STRING) + if(sq_type(_nativeclosure(ci._closure)->_name) == OT_STRING) si->funcname = _stringval(_nativeclosure(ci._closure)->_name); si->line = -1; break; @@ -73,7 +73,7 @@ void SQVM::Raise_Error(const SQObjectPtr &desc) SQString *SQVM::PrintObjVal(const SQObjectPtr &o) { - switch(type(o)) { + switch(sq_type(o)) { case OT_STRING: return _string(o); case OT_INTEGER: scsprintf(_sp(sq_rsl(NUMBER_MAX_CHAR+1)),sq_rsl(NUMBER_MAX_CHAR), _PRINT_INT_FMT, _integer(o)); diff --git a/external/Squirrel/sqfuncstate.cpp b/external/Squirrel/sqfuncstate.cpp index 022702c9..9d613545 100644 --- a/external/Squirrel/sqfuncstate.cpp +++ b/external/Squirrel/sqfuncstate.cpp @@ -77,7 +77,7 @@ SQInstructionDesc g_InstrDesc[]={ #endif void DumpLiteral(SQObjectPtr &o) { - switch(type(o)){ + switch(sq_type(o)){ case OT_STRING: scprintf(_SC("\"%s\""),_stringval(o));break; case OT_FLOAT: scprintf(_SC("{%f}"),_float(o));break; case OT_INTEGER: scprintf(_SC("{") _PRINT_INT_FMT _SC("}"),_integer(o));break; @@ -120,7 +120,7 @@ void SQFuncState::Dump(SQFunctionProto *func) scprintf(_SC("SQInstruction sizeof %d\n"),(SQInt32)sizeof(SQInstruction)); scprintf(_SC("SQObject sizeof %d\n"), (SQInt32)sizeof(SQObject)); scprintf(_SC("--------------------------------------------------------------------\n")); - scprintf(_SC("*****FUNCTION [%s]\n"),type(func->_name)==OT_STRING?_stringval(func->_name):_SC("unknown")); + scprintf(_SC("*****FUNCTION [%s]\n"),sq_type(func->_name)==OT_STRING?_stringval(func->_name):_SC("unknown")); scprintf(_SC("-----LITERALS\n")); SQObjectPtr refidx,key,val; SQInteger idx; @@ -238,7 +238,7 @@ SQInteger SQFuncState::GetConstant(const SQObject &cons) return _integer(val); } -void SQFuncState::SetIntructionParams(SQInteger pos,SQInteger arg0,SQInteger arg1,SQInteger arg2,SQInteger arg3) +void SQFuncState::SetInstructionParams(SQInteger pos,SQInteger arg0,SQInteger arg1,SQInteger arg2,SQInteger arg3) { _instructions[pos]._arg0=(unsigned char)*((SQUnsignedInteger *)&arg0); _instructions[pos]._arg1=(SQInt32)*((SQUnsignedInteger *)&arg1); @@ -246,7 +246,7 @@ void SQFuncState::SetIntructionParams(SQInteger pos,SQInteger arg0,SQInteger arg _instructions[pos]._arg3=(unsigned char)*((SQUnsignedInteger *)&arg3); } -void SQFuncState::SetIntructionParam(SQInteger pos,SQInteger arg,SQInteger val) +void SQFuncState::SetInstructionParam(SQInteger pos,SQInteger arg,SQInteger val) { switch(arg){ case 0:_instructions[pos]._arg0=(unsigned char)*((SQUnsignedInteger *)&val);break; @@ -290,7 +290,7 @@ SQInteger SQFuncState::PopTarget() SQUnsignedInteger npos=_targetstack.back(); assert(npos < _vlocals.size()); SQLocalVarInfo &t = _vlocals[npos]; - if(type(t._name)==OT_NULL){ + if(sq_type(t._name)==OT_NULL){ _vlocals.pop_back(); } _targetstack.pop_back(); @@ -322,7 +322,7 @@ void SQFuncState::SetStackSize(SQInteger n) while(size>n){ size--; SQLocalVarInfo lvi = _vlocals.back(); - if(type(lvi._name)!=OT_NULL){ + if(sq_type(lvi._name)!=OT_NULL){ if(lvi._end_op == UINT_MINUS_ONE) { //this means is an outer _outers--; } @@ -346,7 +346,7 @@ bool SQFuncState::IsConstant(const SQObject &name,SQObject &e) bool SQFuncState::IsLocal(SQUnsignedInteger stkpos) { if(stkpos>=_vlocals.size())return false; - else if(type(_vlocals[stkpos]._name)!=OT_NULL)return true; + else if(sq_type(_vlocals[stkpos]._name)!=OT_NULL)return true; return false; } @@ -369,7 +369,7 @@ SQInteger SQFuncState::GetLocalVariable(const SQObject &name) SQInteger locals=_vlocals.size(); while(locals>=1){ SQLocalVarInfo &lvi = _vlocals[locals-1]; - if(type(lvi._name)==OT_STRING && _string(lvi._name)==_string(name)){ + if(sq_type(lvi._name)==OT_STRING && _string(lvi._name)==_string(name)){ return locals-1; } locals--; diff --git a/external/Squirrel/sqfuncstate.h b/external/Squirrel/sqfuncstate.h index a693d13a..130aa54f 100644 --- a/external/Squirrel/sqfuncstate.h +++ b/external/Squirrel/sqfuncstate.h @@ -16,8 +16,8 @@ struct SQFuncState void PopChildState(); void AddInstruction(SQOpcode _op,SQInteger arg0=0,SQInteger arg1=0,SQInteger arg2=0,SQInteger arg3=0){SQInstruction i(_op,arg0,arg1,arg2,arg3);AddInstruction(i);} void AddInstruction(SQInstruction &i); - void SetIntructionParams(SQInteger pos,SQInteger arg0,SQInteger arg1,SQInteger arg2=0,SQInteger arg3=0); - void SetIntructionParam(SQInteger pos,SQInteger arg,SQInteger val); + void SetInstructionParams(SQInteger pos,SQInteger arg0,SQInteger arg1,SQInteger arg2=0,SQInteger arg3=0); + void SetInstructionParam(SQInteger pos,SQInteger arg,SQInteger val); SQInstruction &GetInstruction(SQInteger pos){return _instructions[pos];} void PopInstructions(SQInteger size){for(SQInteger i=0;i_stack[v->_stackbase]; - _stack._vals[0] = ISREFCOUNTED(type(_this)) ? SQObjectPtr(_refcounted(_this)->GetWeakRef(type(_this))) : _this; + _stack._vals[0] = ISREFCOUNTED(sq_type(_this)) ? SQObjectPtr(_refcounted(_this)->GetWeakRef(sq_type(_this))) : _this; for(SQInteger n =1; n_stack[v->_stackbase+n]; } @@ -191,7 +191,7 @@ bool SQGenerator::Resume(SQVM *v,SQObjectPtr &dest) et._stacksize += newbase; } SQObject _this = _stack._vals[0]; - v->_stack[v->_stackbase] = type(_this) == OT_WEAKREF ? _weakref(_this)->_obj : _this; + v->_stack[v->_stackbase] = sq_type(_this) == OT_WEAKREF ? _weakref(_this)->_obj : _this; for(SQInteger n = 1; n_stack[v->_stackbase+n] = _stack._vals[n]; @@ -285,7 +285,7 @@ bool SafeWrite(HSQUIRRELVM v,SQWRITEFUNC write,SQUserPointer up,SQUserPointer de return true; } -bool SafeRead(HSQUIRRELVM v,SQWRITEFUNC read,SQUserPointer up,SQUserPointer dest,SQInteger size) +bool SafeRead(HSQUIRRELVM v,SQREADFUNC read,SQUserPointer up,SQUserPointer dest,SQInteger size) { if(size && read(up,dest,size) != size) { v->Raise_Error(_SC("io error, read function failure, the origin stream could be corrupted/trucated")); @@ -299,7 +299,7 @@ bool WriteTag(HSQUIRRELVM v,SQWRITEFUNC write,SQUserPointer up,SQUnsignedInteger return SafeWrite(v,write,up,&tag,sizeof(tag)); } -bool CheckTag(HSQUIRRELVM v,SQWRITEFUNC read,SQUserPointer up,SQUnsignedInteger32 tag) +bool CheckTag(HSQUIRRELVM v,SQREADFUNC read,SQUserPointer up,SQUnsignedInteger32 tag) { SQUnsignedInteger32 t; _CHECK_IO(SafeRead(v,read,up,&t,sizeof(t))); @@ -312,9 +312,9 @@ bool CheckTag(HSQUIRRELVM v,SQWRITEFUNC read,SQUserPointer up,SQUnsignedInteger3 bool WriteObject(HSQUIRRELVM v,SQUserPointer up,SQWRITEFUNC write,SQObjectPtr &o) { - SQUnsignedInteger32 _type = (SQUnsignedInteger32)type(o); + SQUnsignedInteger32 _type = (SQUnsignedInteger32)sq_type(o); _CHECK_IO(SafeWrite(v,write,up,&_type,sizeof(_type))); - switch(type(o)){ + switch(sq_type(o)){ case OT_STRING: _CHECK_IO(SafeWrite(v,write,up,&_string(o)->_len,sizeof(SQInteger))); _CHECK_IO(SafeWrite(v,write,up,_stringval(o),sq_rsl(_string(o)->_len))); diff --git a/external/Squirrel/sqobject.h b/external/Squirrel/sqobject.h index 31d26a02..a2022227 100644 --- a/external/Squirrel/sqobject.h +++ b/external/Squirrel/sqobject.h @@ -101,7 +101,7 @@ struct SQWeakRef : SQRefCounted SQObject _obj; }; -#define _realval(o) (type((o)) != OT_WEAKREF?(SQObject)o:_weakref(o)->_obj) +#define _realval(o) (sq_type((o)) != OT_WEAKREF?(SQObject)o:_weakref(o)->_obj) struct SQObjectPtr; @@ -128,8 +128,7 @@ struct SQObjectPtr; (obj)->_uiRef++; \ } -#define type(obj) ((obj)._type) -#define is_delegable(t) (type(t)&SQOBJECT_DELEGABLE) +#define is_delegable(t) (sq_type(t)&SQOBJECT_DELEGABLE) #define raw_type(obj) _RAW_TYPE((obj)._type) #define _integer(obj) ((obj)._unVal.nInteger) @@ -155,8 +154,8 @@ struct SQObjectPtr; #define _stringval(obj) (obj)._unVal.pString->_val #define _userdataval(obj) ((SQUserPointer)sq_aligning((obj)._unVal.pUserData + 1)) -#define tofloat(num) ((type(num)==OT_INTEGER)?(SQFloat)_integer(num):_float(num)) -#define tointeger(num) ((type(num)==OT_FLOAT)?(SQInteger)_float(num):_integer(num)) +#define tofloat(num) ((sq_type(num)==OT_INTEGER)?(SQFloat)_integer(num):_float(num)) +#define tointeger(num) ((sq_type(num)==OT_FLOAT)?(SQInteger)_float(num):_integer(num)) ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// #if defined(SQUSEDOUBLE) && !defined(_SQ64) || !defined(SQUSEDOUBLE) && defined(_SQ64) diff --git a/external/Squirrel/sqstate.cpp b/external/Squirrel/sqstate.cpp index 8ad74b05..c89bdc4a 100644 --- a/external/Squirrel/sqstate.cpp +++ b/external/Squirrel/sqstate.cpp @@ -212,7 +212,7 @@ SQSharedState::~SQSharedState() SQInteger SQSharedState::GetMetaMethodIdxByName(const SQObjectPtr &name) { - if(type(name) != OT_STRING) + if(sq_type(name) != OT_STRING) return -1; SQObjectPtr ret; if(_table(_metamethodsmap)->Get(name,ret)) { @@ -225,7 +225,7 @@ SQInteger SQSharedState::GetMetaMethodIdxByName(const SQObjectPtr &name) void SQSharedState::MarkObject(SQObjectPtr &o,SQCollectable **chain) { - switch(type(o)){ + switch(sq_type(o)){ case OT_TABLE:_table(o)->Mark(chain);break; case OT_ARRAY:_array(o)->Mark(chain);break; case OT_USERDATA:_userdata(o)->Mark(chain);break; @@ -413,7 +413,7 @@ void RefTable::Mark(SQCollectable **chain) { RefNode *nodes = (RefNode *)_nodes; for(SQUnsignedInteger n = 0; n < _numofslots; n++) { - if(type(nodes->obj) != OT_NULL) { + if(sq_type(nodes->obj) != OT_NULL) { SQSharedState::MarkObject(nodes->obj,chain); } nodes++; @@ -475,7 +475,7 @@ void RefTable::Resize(SQUnsignedInteger size) //rehash SQUnsignedInteger nfound = 0; for(SQUnsignedInteger n = 0; n < oldnumofslots; n++) { - if(type(t->obj) != OT_NULL) { + if(sq_type(t->obj) != OT_NULL) { //add back; assert(t->refs != 0); RefNode *nn = Add(::HashObj(t->obj)&(_numofslots-1),t->obj); @@ -508,7 +508,7 @@ RefTable::RefNode *RefTable::Get(SQObject &obj,SQHash &mainpos,RefNode **prev,bo mainpos = ::HashObj(obj)&(_numofslots-1); *prev = NULL; for (ref = _buckets[mainpos]; ref; ) { - if(_rawval(ref->obj) == _rawval(obj) && type(ref->obj) == type(obj)) + if(_rawval(ref->obj) == _rawval(obj) && sq_type(ref->obj) == sq_type(obj)) break; *prev = ref; ref = ref->next; diff --git a/external/Squirrel/sqtable.cpp b/external/Squirrel/sqtable.cpp index e6c5597f..3a89c459 100644 --- a/external/Squirrel/sqtable.cpp +++ b/external/Squirrel/sqtable.cpp @@ -62,7 +62,7 @@ void SQTable::Rehash(bool force) _usednodes = 0; for (SQInteger i=0; ikey) != OT_NULL) + if (sq_type(old->key) != OT_NULL) NewSlot(old->key,old->val); } for(SQInteger k=0;kkey) != OT_NULL) { + if(sq_type(mp->key) != OT_NULL) { n = _firstfree; /* get a free place */ SQHash mph = HashObj(mp->key) & (_numofnodes - 1); _HashNode *othern; /* main position of colliding node */ @@ -161,7 +161,7 @@ bool SQTable::NewSlot(const SQObjectPtr &key,const SQObjectPtr &val) mp->key = key; for (;;) { /* correct `firstfree' */ - if (type(_firstfree->key) == OT_NULL && _firstfree->next == NULL) { + if (sq_type(_firstfree->key) == OT_NULL && _firstfree->next == NULL) { mp->val = val; _usednodes++; return true; /* OK; table still has a free place */ @@ -177,7 +177,7 @@ SQInteger SQTable::Next(bool getweakrefs,const SQObjectPtr &refpos, SQObjectPtr { SQInteger idx = (SQInteger)TranslateIndex(refpos); while (idx < _numofnodes) { - if(type(_nodes[idx].key) != OT_NULL) { + if(sq_type(_nodes[idx].key) != OT_NULL) { //first found _HashNode &n = _nodes[idx]; outkey = n.key; diff --git a/external/Squirrel/sqtable.h b/external/Squirrel/sqtable.h index 629d09e6..59db3317 100644 --- a/external/Squirrel/sqtable.h +++ b/external/Squirrel/sqtable.h @@ -14,7 +14,7 @@ inline SQHash HashObj(const SQObjectPtr &key) { - switch(type(key)) { + switch(sq_type(key)) { case OT_STRING: return _string(key)->_hash; case OT_FLOAT: return (SQHash)((SQInteger)_float(key)); case OT_BOOL: case OT_INTEGER: return (SQHash)((SQInteger)_integer(key)); @@ -67,7 +67,7 @@ public: { _HashNode *n = &_nodes[hash]; do{ - if(_rawval(n->key) == _rawval(key) && type(n->key) == type(key)){ + if(_rawval(n->key) == _rawval(key) && sq_type(n->key) == sq_type(key)){ return n; } }while((n = n->next)); @@ -80,7 +80,7 @@ public: _HashNode *n = &_nodes[hash & (_numofnodes - 1)]; _HashNode *res = NULL; do{ - if(type(n->key) == OT_STRING && (scstrcmp(_stringval(n->key),key) == 0)){ + if(sq_type(n->key) == OT_STRING && (scstrcmp(_stringval(n->key),key) == 0)){ res = n; break; } diff --git a/external/Squirrel/sqvm.cpp b/external/Squirrel/sqvm.cpp index b20df9a1..ecdcbb7d 100644 --- a/external/Squirrel/sqvm.cpp +++ b/external/Squirrel/sqvm.cpp @@ -21,7 +21,7 @@ bool SQVM::BW_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,const SQObjectPtr &o2) { SQInteger res; - if((type(o1)|type(o2)) == OT_INTEGER) + if((sq_type(o1)| sq_type(o2)) == OT_INTEGER) { SQInteger i1 = _integer(o1), i2 = _integer(o2); switch(op) { @@ -41,7 +41,7 @@ bool SQVM::BW_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,con #define _ARITH_(op,trg,o1,o2) \ { \ - SQInteger tmask = type(o1)|type(o2); \ + SQInteger tmask = sq_type(o1)|sq_type(o2); \ switch(tmask) { \ case OT_INTEGER: trg = _integer(o1) op _integer(o2);break; \ case (OT_FLOAT|OT_INTEGER): \ @@ -52,7 +52,7 @@ bool SQVM::BW_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,con #define _ARITH_NOZERO(op,trg,o1,o2,err) \ { \ - SQInteger tmask = type(o1)|type(o2); \ + SQInteger tmask = sq_type(o1)|sq_type(o2); \ switch(tmask) { \ case OT_INTEGER: { SQInteger i2 = _integer(o2); if(i2 == 0) { Raise_Error(err); SQ_THROW(); } trg = _integer(o1) op i2; } break;\ case (OT_FLOAT|OT_INTEGER): \ @@ -63,7 +63,7 @@ bool SQVM::BW_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,con bool SQVM::ARITH_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,const SQObjectPtr &o2) { - SQInteger tmask = type(o1)|type(o2); + SQInteger tmask = sq_type(o1)| sq_type(o2); switch(tmask) { case OT_INTEGER:{ SQInteger res, i1 = _integer(o1), i2 = _integer(o2); @@ -177,7 +177,7 @@ bool SQVM::ArithMetaMethod(SQInteger op,const SQObjectPtr &o1,const SQObjectPtr bool SQVM::NEG_OP(SQObjectPtr &trg,const SQObjectPtr &o) { - switch(type(o)) { + switch(sq_type(o)) { case OT_INTEGER: trg = -_integer(o); return true; @@ -206,7 +206,7 @@ bool SQVM::NEG_OP(SQObjectPtr &trg,const SQObjectPtr &o) #define _RET_SUCCEED(exp) { result = (exp); return true; } bool SQVM::ObjCmp(const SQObjectPtr &o1,const SQObjectPtr &o2,SQInteger &result) { - SQObjectType t1 = type(o1), t2 = type(o2); + SQObjectType t1 = sq_type(o1), t2 = sq_type(o2); if(t1 == t2) { if(_rawval(o1) == _rawval(o2))_RET_SUCCEED(0); SQObjectPtr res; @@ -225,7 +225,7 @@ bool SQVM::ObjCmp(const SQObjectPtr &o1,const SQObjectPtr &o2,SQInteger &result) if(_delegable(o1)->GetMetaMethod(this, MT_CMP, closure)) { Push(o1);Push(o2); if(CallMetaMethod(closure,MT_CMP,2,res)) { - if(type(res) != OT_INTEGER) { + if(sq_type(res) != OT_INTEGER) { Raise_Error(_SC("_cmp must return an integer")); return false; } @@ -283,7 +283,7 @@ bool SQVM::CMP_OP(CmpOP op, const SQObjectPtr &o1,const SQObjectPtr &o2,SQObject bool SQVM::ToString(const SQObjectPtr &o,SQObjectPtr &res) { - switch(type(o)) { + switch(sq_type(o)) { case OT_STRING: res = o; return true; @@ -304,7 +304,7 @@ bool SQVM::ToString(const SQObjectPtr &o,SQObjectPtr &res) if(_delegable(o)->GetMetaMethod(this, MT_TOSTRING, closure)) { Push(o); if(CallMetaMethod(closure,MT_TOSTRING,1,res)) { - if(type(res) == OT_STRING) + if(sq_type(res) == OT_STRING) return true; } else { @@ -383,7 +383,8 @@ bool SQVM::StartCall(SQClosure *closure,SQInteger target,SQInteger args,SQIntege { paramssize--; if (nargs < paramssize) { - Raise_Error(_SC("wrong number of parameters")); + Raise_Error(_SC("wrong number of parameters (%d passed, at least %d required)"), + (int)nargs, (int)paramssize); return false; } @@ -409,7 +410,8 @@ bool SQVM::StartCall(SQClosure *closure,SQInteger target,SQInteger args,SQIntege } } else { - Raise_Error(_SC("wrong number of parameters")); + Raise_Error(_SC("wrong number of parameters (%d passed, %d required)"), + (int)nargs, (int)paramssize); return false; } } @@ -519,7 +521,7 @@ bool SQVM::FOREACH_OP(SQObjectPtr &o1,SQObjectPtr &o2,SQObjectPtr &o3,SQObjectPtr &o4,SQInteger SQ_UNUSED_ARG(arg_2),int exitpos,int &jump) { SQInteger nrefidx; - switch(type(o1)) { + switch(sq_type(o1)) { case OT_TABLE: if((nrefidx = _table(o1)->Next(false,o4, o2, o3)) == -1) _FINISH(exitpos); o4 = (SQInteger)nrefidx; _FINISH(1); @@ -542,7 +544,7 @@ bool SQVM::FOREACH_OP(SQObjectPtr &o1,SQObjectPtr &o2,SQObjectPtr Push(o4); if(CallMetaMethod(closure, MT_NEXTI, 2, itr)) { o4 = o2 = itr; - if(type(itr) == OT_NULL) _FINISH(exitpos); + if(sq_type(itr) == OT_NULL) _FINISH(exitpos); if(!Get(o1, itr, o3, 0, DONT_FALL_BACK)) { Raise_Error(_SC("_nexti returned an invalid idx")); // cloud be changed return false; @@ -561,7 +563,7 @@ bool SQVM::FOREACH_OP(SQObjectPtr &o1,SQObjectPtr &o2,SQObjectPtr if(_generator(o1)->_state == SQGenerator::eDead) _FINISH(exitpos); if(_generator(o1)->_state == SQGenerator::eSuspended) { SQInteger idx = 0; - if(type(o4) == OT_INTEGER) { + if(sq_type(o4) == OT_INTEGER) { idx = _integer(o4) + 1; } o2 = idx; @@ -616,14 +618,14 @@ bool SQVM::CLASS_OP(SQObjectPtr &target,SQInteger baseclass,SQInteger attributes SQClass *base = NULL; SQObjectPtr attrs; if(baseclass != -1) { - if(type(_stack._vals[_stackbase+baseclass]) != OT_CLASS) { Raise_Error(_SC("trying to inherit from a %s"),GetTypeName(_stack._vals[_stackbase+baseclass])); return false; } + if(sq_type(_stack._vals[_stackbase+baseclass]) != OT_CLASS) { Raise_Error(_SC("trying to inherit from a %s"),GetTypeName(_stack._vals[_stackbase+baseclass])); return false; } base = _class(_stack._vals[_stackbase + baseclass]); } if(attributes != MAX_FUNC_STACKSIZE) { attrs = _stack._vals[_stackbase+attributes]; } target = SQClass::Create(_ss(this),base); - if(type(_class(target)->_metamethods[MT_INHERITED]) != OT_NULL) { + if(sq_type(_class(target)->_metamethods[MT_INHERITED]) != OT_NULL) { int nparams = 2; SQObjectPtr ret; Push(target); Push(attrs); @@ -639,7 +641,7 @@ bool SQVM::CLASS_OP(SQObjectPtr &target,SQInteger baseclass,SQInteger attributes bool SQVM::IsEqual(const SQObjectPtr &o1,const SQObjectPtr &o2,bool &res) { - if(type(o1) == type(o2)) { + if(sq_type(o1) == sq_type(o2)) { res = (_rawval(o1) == _rawval(o2)); } else { @@ -655,8 +657,8 @@ bool SQVM::IsEqual(const SQObjectPtr &o1,const SQObjectPtr &o2,bool &res) bool SQVM::IsFalse(SQObjectPtr &o) { - if(((type(o) & SQOBJECT_CANBEFALSE) - && ( ((type(o) == OT_FLOAT) && (_float(o) == SQFloat(0.0))) )) + if(((sq_type(o) & SQOBJECT_CANBEFALSE) + && ( ((sq_type(o) == OT_FLOAT) && (_float(o) == SQFloat(0.0))) )) #if !defined(SQUSEDOUBLE) || (defined(SQUSEDOUBLE) && defined(_SQ64)) || (_integer(o) == 0) ) //OT_NULL|OT_INTEGER|OT_BOOL #else @@ -723,28 +725,29 @@ exception_restore: case _OP_DLOAD: TARGET = ci->_literals[arg1]; STK(arg2) = ci->_literals[arg3];continue; case _OP_TAILCALL:{ SQObjectPtr &t = STK(arg1); - if (type(t) == OT_CLOSURE + if (sq_type(t) == OT_CLOSURE && (!_closure(t)->_function->_bgenerator)){ SQObjectPtr clo = t; - SQInteger last_top = _top; + SQInteger last_top = _top; if(_openouters) CloseOuters(&(_stack._vals[_stackbase])); for (SQInteger i = 0; i < arg3; i++) STK(i) = STK(arg2 + i); _GUARD(StartCall(_closure(clo), ci->_target, arg3, _stackbase, true)); - if (last_top >= _top) { - _top = last_top; - } + if (last_top >= _top) { + _top = last_top; + } continue; } } case _OP_CALL: { SQObjectPtr clo = STK(arg1); - switch (type(clo)) { + switch (sq_type(clo)) { case OT_CLOSURE: _GUARD(StartCall(_closure(clo), sarg0, arg3, _stackbase+arg2, false)); continue; case OT_NATIVECLOSURE: { bool suspend; - _GUARD(CallNative(_nativeclosure(clo), arg3, _stackbase+arg2, clo,suspend)); + bool tailcall; + _GUARD(CallNative(_nativeclosure(clo), arg3, _stackbase+arg2, clo, (SQInt32)sarg0, suspend, tailcall)); if(suspend){ _suspended = SQTrue; _suspended_target = sarg0; @@ -753,7 +756,7 @@ exception_restore: outres = clo; return true; } - if(sarg0 != -1) { + if(sarg0 != -1 && !tailcall) { STK(arg0) = clo; } } @@ -765,17 +768,17 @@ exception_restore: STK(arg0) = inst; } SQInteger stkbase; - switch(type(clo)) { + switch(sq_type(clo)) { case OT_CLOSURE: stkbase = _stackbase+arg2; _stack._vals[stkbase] = inst; _GUARD(StartCall(_closure(clo), -1, arg3, stkbase, false)); break; case OT_NATIVECLOSURE: - bool suspend; + bool dummy; stkbase = _stackbase+arg2; _stack._vals[stkbase] = inst; - _GUARD(CallNative(_nativeclosure(clo), arg3, stkbase, clo,suspend)); + _GUARD(CallNative(_nativeclosure(clo), arg3, stkbase, clo, -1, dummy, dummy)); break; default: break; //shutup GCC 4.x } @@ -863,7 +866,7 @@ exception_restore: case _OP_LOADNULLS:{ for(SQInt32 n=0; n < arg1; n++) STK(arg0+n).Null(); }continue; case _OP_LOADROOT: { SQWeakRef *w = _closure(ci->_closure)->_root; - if(type(w->_obj) != OT_NULL) { + if(sq_type(w->_obj) != OT_NULL) { TARGET = w->_obj; } else { TARGET = _roottable; //shoud this be like this? or null @@ -939,7 +942,7 @@ exception_restore: case _OP_INC: {SQObjectPtr o(sarg3); _GUARD(DerefInc('+',TARGET, STK(arg1), STK(arg2), o, false, arg1));} continue; case _OP_INCL: { SQObjectPtr &a = STK(arg1); - if(type(a) == OT_INTEGER) { + if(sq_type(a) == OT_INTEGER) { a._unVal.nInteger = _integer(a) + sarg3; } else { @@ -950,7 +953,7 @@ exception_restore: case _OP_PINC: {SQObjectPtr o(sarg3); _GUARD(DerefInc('+',TARGET, STK(arg1), STK(arg2), o, true, arg1));} continue; case _OP_PINCL: { SQObjectPtr &a = STK(arg1); - if(type(a) == OT_INTEGER) { + if(sq_type(a) == OT_INTEGER) { TARGET = a; a._unVal.nInteger = _integer(a) + sarg3; } @@ -962,9 +965,9 @@ exception_restore: case _OP_CMP: _GUARD(CMP_OP((CmpOP)arg3,STK(arg2),STK(arg1),TARGET)) continue; case _OP_EXISTS: TARGET = Get(STK(arg1), STK(arg2), temp_reg, GET_FLAG_DO_NOT_RAISE_ERROR | GET_FLAG_RAW, DONT_FALL_BACK) ? true : false; continue; case _OP_INSTANCEOF: - if(type(STK(arg1)) != OT_CLASS) + if(sq_type(STK(arg1)) != OT_CLASS) {Raise_Error(_SC("cannot apply instanceof between a %s and a %s"),GetTypeName(STK(arg1)),GetTypeName(STK(arg2))); SQ_THROW();} - TARGET = (type(STK(arg2)) == OT_INSTANCE) ? (_instance(STK(arg2))->InstanceOf(_class(STK(arg1)))?true:false) : false; + TARGET = (sq_type(STK(arg2)) == OT_INSTANCE) ? (_instance(STK(arg2))->InstanceOf(_class(STK(arg1)))?true:false) : false; continue; case _OP_AND: if(IsFalse(STK(arg2))) { @@ -981,7 +984,7 @@ exception_restore: case _OP_NEG: _GUARD(NEG_OP(TARGET,STK(arg1))); continue; case _OP_NOT: TARGET = IsFalse(STK(arg1)); continue; case _OP_BWNOT: - if(type(STK(arg1)) == OT_INTEGER) { + if(sq_type(STK(arg1)) == OT_INTEGER) { SQInteger t = _integer(STK(arg1)); TARGET = SQInteger(~t); continue; @@ -1011,7 +1014,7 @@ exception_restore: } continue; case _OP_RESUME: - if(type(STK(arg1)) != OT_GENERATOR){ Raise_Error(_SC("trying to resume a '%s',only genenerator can be resumed"), GetTypeName(STK(arg1))); SQ_THROW();} + if(sq_type(STK(arg1)) != OT_GENERATOR){ Raise_Error(_SC("trying to resume a '%s',only genenerator can be resumed"), GetTypeName(STK(arg1))); SQ_THROW();} _GUARD(_generator(STK(arg1))->Resume(this, TARGET)); traps += ci->_etraps; continue; @@ -1020,7 +1023,7 @@ exception_restore: ci->_ip += tojump; } continue; case _OP_POSTFOREACH: - assert(type(STK(arg0)) == OT_GENERATOR); + assert(sq_type(STK(arg0)) == OT_GENERATOR); if(_generator(STK(arg0))->_state == SQGenerator::eDead) ci->_ip += (sarg1 - 1); continue; @@ -1110,7 +1113,7 @@ bool SQVM::CreateClassInstance(SQClass *theclass, SQObjectPtr &inst, SQObjectPtr void SQVM::CallErrorHandler(SQObjectPtr &error) { - if(type(_errorhandler) != OT_NULL) { + if(sq_type(_errorhandler) != OT_NULL) { SQObjectPtr out; Push(_roottable); Push(error); Call(_errorhandler, 2, _top-2, out,SQFalse); @@ -1124,8 +1127,8 @@ void SQVM::CallDebugHook(SQInteger type,SQInteger forcedline) _debughook = false; SQFunctionProto *func=_closure(ci->_closure)->_function; if(_debughook_native) { - const SQChar *src = type(func->_sourcename) == OT_STRING?_stringval(func->_sourcename):NULL; - const SQChar *fname = type(func->_name) == OT_STRING?_stringval(func->_name):NULL; + const SQChar *src = sq_type(func->_sourcename) == OT_STRING?_stringval(func->_sourcename):NULL; + const SQChar *fname = sq_type(func->_name) == OT_STRING?_stringval(func->_name):NULL; SQInteger line = forcedline?forcedline:func->GetLine(ci->_ip); _debughook_native(this,type,src,line,fname); } @@ -1139,7 +1142,7 @@ void SQVM::CallDebugHook(SQInteger type,SQInteger forcedline) _debughook = true; } -bool SQVM::CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newbase, SQObjectPtr &retval, bool &suspend) +bool SQVM::CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newbase, SQObjectPtr &retval, SQInt32 target,bool &suspend, bool &tailcall) { SQInteger nparamscheck = nclosure->_nparamscheck; SQInteger newtop = newbase + nargs + nclosure->_noutervalues; @@ -1160,8 +1163,8 @@ bool SQVM::CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newb SQIntVec &tc = nclosure->_typecheck; if((tcs = tc.size())) { for(SQInteger i = 0; i < nargs && i < tcs; i++) { - if((tc._vals[i] != -1) && !(type(_stack._vals[newbase+i]) & tc._vals[i])) { - Raise_ParamTypeError(i,tc._vals[i],type(_stack._vals[newbase+i])); + if((tc._vals[i] != -1) && !(sq_type(_stack._vals[newbase+i]) & tc._vals[i])) { + Raise_ParamTypeError(i,tc._vals[i], sq_type(_stack._vals[newbase+i])); return false; } } @@ -1169,6 +1172,7 @@ bool SQVM::CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newb if(!EnterFrame(newbase, newtop, false)) return false; ci->_closure = nclosure; + ci->_target = target; SQInteger outers = nclosure->_noutervalues; for (SQInteger i = 0; i < outers; i++) { @@ -1183,7 +1187,12 @@ bool SQVM::CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newb _nnativecalls--; suspend = false; - if (ret == SQ_SUSPEND_FLAG) { + tailcall = false; + if (ret == SQ_TAILCALL_FLAG) { + tailcall = true; + return true; + } + else if (ret == SQ_SUSPEND_FLAG) { suspend = true; } else if (ret < 0) { @@ -1202,13 +1211,30 @@ bool SQVM::CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newb return true; } +bool SQVM::TailCall(SQClosure *closure, SQInteger parambase,SQInteger nparams) +{ + SQInteger last_top = _top; + SQObjectPtr clo = closure; + if (ci->_root) + { + Raise_Error("root calls cannot invoke tailcalls"); + return false; + } + for (SQInteger i = 0; i < nparams; i++) STK(i) = STK(parambase + i); + bool ret = StartCall(closure, ci->_target, nparams, _stackbase, true); + if (last_top >= _top) { + _top = last_top; + } + return ret; +} + #define FALLBACK_OK 0 #define FALLBACK_NO_MATCH 1 #define FALLBACK_ERROR 2 bool SQVM::Get(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &dest, SQUnsignedInteger getflags, SQInteger selfidx) { - switch(type(self)){ + switch(sq_type(self)){ case OT_TABLE: if(_table(self)->Get(key,dest))return true; break; @@ -1249,7 +1275,7 @@ bool SQVM::Get(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &des //#ifdef ROOT_FALLBACK if(selfidx == 0) { SQWeakRef *w = _closure(ci->_closure)->_root; - if(type(w->_obj) != OT_NULL) + if(sq_type(w->_obj) != OT_NULL) { if(Get(*((const SQObjectPtr *)&w->_obj),key,dest,0,DONT_FALL_BACK)) return true; } @@ -1263,7 +1289,7 @@ bool SQVM::Get(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &des bool SQVM::InvokeDefaultDelegate(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest) { SQTable *ddel = NULL; - switch(type(self)) { + switch(sq_type(self)) { case OT_CLASS: ddel = _class_ddel; break; case OT_TABLE: ddel = _table_ddel; break; case OT_ARRAY: ddel = _array_ddel; break; @@ -1282,7 +1308,7 @@ bool SQVM::InvokeDefaultDelegate(const SQObjectPtr &self,const SQObjectPtr &key, SQInteger SQVM::FallBackGet(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest) { - switch(type(self)){ + switch(sq_type(self)){ case OT_TABLE: case OT_USERDATA: //delegation @@ -1305,7 +1331,7 @@ SQInteger SQVM::FallBackGet(const SQObjectPtr &self,const SQObjectPtr &key,SQObj } else { Pop(2); - if(type(_lasterror) != OT_NULL) { //NULL means "clean failure" (not found) + if(sq_type(_lasterror) != OT_NULL) { //NULL means "clean failure" (not found) return FALLBACK_ERROR; } } @@ -1320,7 +1346,7 @@ SQInteger SQVM::FallBackGet(const SQObjectPtr &self,const SQObjectPtr &key,SQObj bool SQVM::Set(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val,SQInteger selfidx) { - switch(type(self)){ + switch(sq_type(self)){ case OT_TABLE: if(_table(self)->Set(key,val)) return true; break; @@ -1334,7 +1360,7 @@ bool SQVM::Set(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr return false; } return true; - case OT_USERDATA: break; // must fall back + case OT_USERDATA: break; // must fall back default: Raise_Error(_SC("trying to set '%s'"),GetTypeName(self)); return false; @@ -1355,7 +1381,7 @@ bool SQVM::Set(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr SQInteger SQVM::FallBackSet(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val) { - switch(type(self)) { + switch(sq_type(self)) { case OT_TABLE: if(_table(self)->_delegate) { if(Set(_table(self)->_delegate,key,val,DONT_FALL_BACK)) return FALLBACK_OK; @@ -1375,7 +1401,7 @@ SQInteger SQVM::FallBackSet(const SQObjectPtr &self,const SQObjectPtr &key,const } else { Pop(3); - if(type(_lasterror) != OT_NULL) { //NULL means "clean failure" (not found) + if(sq_type(_lasterror) != OT_NULL) { //NULL means "clean failure" (not found) return FALLBACK_ERROR; } } @@ -1392,7 +1418,7 @@ bool SQVM::Clone(const SQObjectPtr &self,SQObjectPtr &target) { SQObjectPtr temp_reg; SQObjectPtr newobj; - switch(type(self)){ + switch(sq_type(self)){ case OT_TABLE: newobj = _table(self)->Clone(); goto cloned_mt; @@ -1420,14 +1446,14 @@ cloned_mt: bool SQVM::NewSlotA(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val,const SQObjectPtr &attrs,bool bstatic,bool raw) { - if(type(self) != OT_CLASS) { + if(sq_type(self) != OT_CLASS) { Raise_Error(_SC("object must be a class")); return false; } SQClass *c = _class(self); if(!raw) { SQObjectPtr &mm = c->_metamethods[MT_NEWMEMBER]; - if(type(mm) != OT_NULL ) { + if(sq_type(mm) != OT_NULL ) { Push(self); Push(key); Push(val); Push(attrs); Push(bstatic); @@ -1436,7 +1462,7 @@ bool SQVM::NewSlotA(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjec } if(!NewSlot(self, key, val,bstatic)) return false; - if(type(attrs) != OT_NULL) { + if(sq_type(attrs) != OT_NULL) { c->SetAttributes(key,attrs); } return true; @@ -1444,8 +1470,8 @@ bool SQVM::NewSlotA(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjec bool SQVM::NewSlot(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic) { - if(type(key) == OT_NULL) { Raise_Error(_SC("null cannot be used as index")); return false; } - switch(type(self)) { + if(sq_type(key) == OT_NULL) { Raise_Error(_SC("null cannot be used as index")); return false; } + switch(sq_type(self)) { case OT_TABLE: { bool rawcall = true; if(_table(self)->_delegate) { @@ -1505,7 +1531,7 @@ bool SQVM::NewSlot(const SQObjectPtr &self,const SQObjectPtr &key,const SQObject bool SQVM::DeleteSlot(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &res) { - switch(type(self)) { + switch(sq_type(self)) { case OT_TABLE: case OT_INSTANCE: case OT_USERDATA: { @@ -1517,7 +1543,7 @@ bool SQVM::DeleteSlot(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr return CallMetaMethod(closure,MT_DELSLOT,2,res); } else { - if(type(self) == OT_TABLE) { + if(sq_type(self) == OT_TABLE) { if(_table(self)->Get(key,t)) { _table(self)->Remove(key); } @@ -1546,13 +1572,13 @@ bool SQVM::Call(SQObjectPtr &closure,SQInteger nparams,SQInteger stackbase,SQObj #ifdef _DEBUG SQInteger prevstackbase = _stackbase; #endif - switch(type(closure)) { + switch(sq_type(closure)) { case OT_CLOSURE: return Execute(closure, nparams, stackbase, outres, raiseerror); break; case OT_NATIVECLOSURE:{ - bool suspend; - return CallNative(_nativeclosure(closure), nparams, stackbase, outres,suspend); + bool dummy; + return CallNative(_nativeclosure(closure), nparams, stackbase, outres, -1, dummy, dummy); } break; @@ -1560,7 +1586,7 @@ SQInteger prevstackbase = _stackbase; SQObjectPtr constr; SQObjectPtr temp; CreateClassInstance(_class(closure),outres,constr); - SQObjectType ctype = type(constr); + SQObjectType ctype = sq_type(constr); if (ctype == OT_NATIVECLOSURE || ctype == OT_CLOSURE) { _stack[stackbase] = outres; return Call(constr,nparams,stackbase,temp,raiseerror); @@ -1723,7 +1749,7 @@ void SQVM::dumpstack(SQInteger stackbase,bool dumpall) SQObjectPtr &obj=_stack[i]; if(stackbase==i)scprintf(_SC(">"));else scprintf(_SC(" ")); scprintf(_SC("[" _PRINT_INT_FMT "]:"),n); - switch(type(obj)){ + switch(sq_type(obj)){ case OT_FLOAT: scprintf(_SC("FLOAT %.3f"),_float(obj));break; case OT_INTEGER: scprintf(_SC("INTEGER " _PRINT_INT_FMT),_integer(obj));break; case OT_BOOL: scprintf(_SC("BOOL %s"),_integer(obj)?"true":"false");break; diff --git a/external/Squirrel/sqvm.h b/external/Squirrel/sqvm.h index 35fef5bd..a75524da 100644 --- a/external/Squirrel/sqvm.h +++ b/external/Squirrel/sqvm.h @@ -8,6 +8,7 @@ #define MIN_STACK_OVERHEAD 15 #define SQ_SUSPEND_FLAG -666 +#define SQ_TAILCALL_FLAG -777 #define DONT_FALL_BACK 666 //#define EXISTS_FALL_BACK -1 @@ -56,7 +57,8 @@ public: bool Init(SQVM *friendvm, SQInteger stacksize); bool Execute(SQObjectPtr &func, SQInteger nargs, SQInteger stackbase, SQObjectPtr &outres, SQBool raiseerror, ExecutionType et = ET_CALL); //starts a native call return when the NATIVE closure returns - bool CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newbase, SQObjectPtr &retval,bool &suspend); + bool CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newbase, SQObjectPtr &retval, SQInt32 target, bool &suspend,bool &tailcall); + bool TailCall(SQClosure *closure, SQInteger firstparam, SQInteger nparams); //starts a SQUIRREL call in the same "Execution loop" bool StartCall(SQClosure *closure, SQInteger target, SQInteger nargs, SQInteger stackbase, bool tailcall); bool CreateClassInstance(SQClass *theclass, SQObjectPtr &inst, SQObjectPtr &constructor); diff --git a/include/squirrel.h b/include/squirrel.h index 5f4bfd9d..1e0944fc 100644 --- a/include/squirrel.h +++ b/include/squirrel.h @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2016 Alberto Demichelis +Copyright (c) 2003-2017 Alberto Demichelis Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -66,7 +66,7 @@ struct SQOuter; #include "sqconfig.h" #define SQUIRREL_VERSION _SC("Squirrel 3.1 stable") -#define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2016 Alberto Demichelis") +#define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2017 Alberto Demichelis") #define SQUIRREL_AUTHOR _SC("Alberto Demichelis") #define SQUIRREL_VERSION_NUMBER 310 @@ -278,7 +278,7 @@ SQUIRREL_API void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK ho SQUIRREL_API SQRELEASEHOOK sq_getreleasehook(HSQUIRRELVM v,SQInteger idx); SQUIRREL_API SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize); SQUIRREL_API SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger level,SQFunctionInfo *fi); -SQUIRREL_API SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars); +SQUIRREL_API SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQInteger *nparams,SQInteger *nfreevars); SQUIRREL_API SQRESULT sq_getclosurename(HSQUIRRELVM v,SQInteger idx); SQUIRREL_API SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name); SQUIRREL_API SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p); @@ -334,6 +334,7 @@ SQUIRREL_API SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err); SQUIRREL_API SQRESULT sq_throwobject(HSQUIRRELVM v); SQUIRREL_API void sq_reseterror(HSQUIRRELVM v); SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v); +SQUIRREL_API SQRESULT sq_tailcall(HSQUIRRELVM v, SQInteger nparams); /*raw object handling*/ SQUIRREL_API SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po); @@ -402,7 +403,7 @@ SQUIRREL_API void sq_setnativedebughook(HSQUIRRELVM v,SQDEBUGHOOK hook); #define SQ_SUCCEEDED(res) (res>=0) #ifdef __GNUC__ -# define SQ_UNUSED_ARG(x) __attribute__((unused)) x +# define SQ_UNUSED_ARG(x) x __attribute__((__unused__)) #else # define SQ_UNUSED_ARG(x) x #endif