diff --git a/src/vscript/squirrel/COMPILE b/src/vscript/squirrel/COMPILE index 375a92096fe..53881db7270 100644 --- a/src/vscript/squirrel/COMPILE +++ b/src/vscript/squirrel/COMPILE @@ -1,4 +1,4 @@ -Squirrel 3.1 stable +Squirrel 3.2 stable -------------------------------------------------------- What is in this distribution? diff --git a/src/vscript/squirrel/COPYRIGHT b/src/vscript/squirrel/COPYRIGHT index 17d13ac161c..4a8e5815d3a 100644 --- a/src/vscript/squirrel/COPYRIGHT +++ b/src/vscript/squirrel/COPYRIGHT @@ -1,4 +1,4 @@ -Copyright (c) 2003-2017 Alberto Demichelis +Copyright (c) 2003-2022 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 diff --git a/src/vscript/squirrel/HISTORY b/src/vscript/squirrel/HISTORY index f8c29e6bbbf..d09d9eea928 100644 --- a/src/vscript/squirrel/HISTORY +++ b/src/vscript/squirrel/HISTORY @@ -1,22 +1,24 @@ ***version 3.2 stable*** +-added new inline bind env syntax for closures -added sq_tailcall -added rawcall keyword -added post call initializer syntax -added table.keys() and table.values() -added table.filter() +-added skipempty in split() -additional parameters in array.map() and array.apply() -additional optional initializer in array.reduce() +-added sqstd_pushstringf and sqstd_throwerrorf -closure.call() is now a "native tailcall" and the invoked function can now be suspended -fixed sq_newmember and sq_rawnewmember properly pop parameters -fixed capturing free variable on for loop counter before a break statement -fixed \u in lexer -various bugfixes - -***version 3.1.1 stable*** -sq_gettypetag doesn't set last error(it's treated as SQBool function but keeps a SQRESULT for backward compatibility) -fixed _set method in userdata delegates -fixed some warnings +***2016-03-27 *** ***version 3.1 stable*** -added slice range for tolower and toupper -added startswith() and endswith() in string lib diff --git a/src/vscript/squirrel/README b/src/vscript/squirrel/README index 298aec75aec..de37cad0047 100644 --- a/src/vscript/squirrel/README +++ b/src/vscript/squirrel/README @@ -1,4 +1,4 @@ -The programming language SQUIRREL 3.1 stable +The programming language SQUIRREL 3.2 stable -------------------------------------------------- This project has successfully been compiled and run on diff --git a/src/vscript/squirrel/include/squirrel.h b/src/vscript/squirrel/include/squirrel.h index 19ed82fd9ef..fe9d4d11fa4 100644 --- a/src/vscript/squirrel/include/squirrel.h +++ b/src/vscript/squirrel/include/squirrel.h @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2017 Alberto Demichelis +Copyright (c) 2003-2022 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 @@ -65,10 +65,10 @@ struct SQOuter; #include "sqconfig.h" -#define SQUIRREL_VERSION _SC("Squirrel 3.1 stable") -#define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2017 Alberto Demichelis") +#define SQUIRREL_VERSION _SC("Squirrel 3.2 stable") +#define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2022 Alberto Demichelis") #define SQUIRREL_AUTHOR _SC("Alberto Demichelis") -#define SQUIRREL_VERSION_NUMBER 310 +#define SQUIRREL_VERSION_NUMBER 320 #define SQ_VMSTATE_IDLE 0 #define SQ_VMSTATE_RUNNING 1 @@ -280,7 +280,7 @@ SQUIRREL_API SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQInteger *n 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); -SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag); +SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag,SQBool throwerror); SQUIRREL_API SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize); SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase); SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx); diff --git a/src/vscript/squirrel/sqstdlib/sqstdblob.cpp b/src/vscript/squirrel/sqstdlib/sqstdblob.cpp index 776a96807e6..22df0cf957b 100644 --- a/src/vscript/squirrel/sqstdlib/sqstdblob.cpp +++ b/src/vscript/squirrel/sqstdlib/sqstdblob.cpp @@ -14,7 +14,7 @@ #define SETUP_BLOB(v) \ SQBlob *self = NULL; \ - { if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) \ + { if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_BLOB_TYPE_TAG,SQFalse))) \ return sq_throwerror(v,_SC("invalid type tag")); } \ if(!self || !self->IsValid()) \ return sq_throwerror(v,_SC("the blob is invalid")); @@ -152,7 +152,7 @@ static SQInteger _blob__cloned(HSQUIRRELVM v) { SQBlob *other = NULL; { - if(SQ_FAILED(sq_getinstanceup(v,2,(SQUserPointer*)&other,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) + if(SQ_FAILED(sq_getinstanceup(v,2,(SQUserPointer*)&other,(SQUserPointer)SQSTD_BLOB_TYPE_TAG,SQFalse))) return SQ_ERROR; } //SQBlob *thisone = new SQBlob(other->Len()); @@ -242,7 +242,7 @@ static const SQRegFunction bloblib_funcs[]={ SQRESULT sqstd_getblob(HSQUIRRELVM v,SQInteger idx,SQUserPointer *ptr) { SQBlob *blob; - if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) + if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG,SQTrue))) return -1; *ptr = blob->GetBuf(); return SQ_OK; @@ -251,7 +251,7 @@ SQRESULT sqstd_getblob(HSQUIRRELVM v,SQInteger idx,SQUserPointer *ptr) SQInteger sqstd_getblobsize(HSQUIRRELVM v,SQInteger idx) { SQBlob *blob; - if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) + if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG,SQTrue))) return -1; return blob->Len(); } @@ -267,7 +267,7 @@ SQUserPointer sqstd_createblob(HSQUIRRELVM v, SQInteger size) sq_pushinteger(v,size); //size SQBlob *blob = NULL; if(SQ_SUCCEEDED(sq_call(v,2,SQTrue,SQFalse)) - && SQ_SUCCEEDED(sq_getinstanceup(v,-1,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) { + && SQ_SUCCEEDED(sq_getinstanceup(v,-1,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG,SQTrue))) { sq_remove(v,-2); return blob->GetBuf(); } diff --git a/src/vscript/squirrel/sqstdlib/sqstdio.cpp b/src/vscript/squirrel/sqstdlib/sqstdio.cpp index 52cd5158528..ec6ee07ed87 100644 --- a/src/vscript/squirrel/sqstdlib/sqstdio.cpp +++ b/src/vscript/squirrel/sqstdlib/sqstdio.cpp @@ -154,7 +154,7 @@ static SQInteger _file_constructor(HSQUIRRELVM v) static SQInteger _file_close(HSQUIRRELVM v) { SQFile *self = NULL; - if(SQ_SUCCEEDED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_FILE_TYPE_TAG)) + if(SQ_SUCCEEDED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_FILE_TYPE_TAG, SQTrue)) && self != NULL) { self->Close(); @@ -200,7 +200,7 @@ SQRESULT sqstd_createfile(HSQUIRRELVM v, SQFILE file,SQBool own) SQRESULT sqstd_getfile(HSQUIRRELVM v, SQInteger idx, SQFILE *file) { SQFile *fileobj = NULL; - if(SQ_SUCCEEDED(sq_getinstanceup(v,idx,(SQUserPointer*)&fileobj,(SQUserPointer)SQSTD_FILE_TYPE_TAG))) { + if(SQ_SUCCEEDED(sq_getinstanceup(v,idx,(SQUserPointer*)&fileobj,(SQUserPointer)SQSTD_FILE_TYPE_TAG,SQFalse))) { *file = fileobj->GetHandle(); return SQ_OK; } diff --git a/src/vscript/squirrel/sqstdlib/sqstdstream.cpp b/src/vscript/squirrel/sqstdlib/sqstdstream.cpp index b5c47cfbb2b..605a56c5eef 100644 --- a/src/vscript/squirrel/sqstdlib/sqstdstream.cpp +++ b/src/vscript/squirrel/sqstdlib/sqstdstream.cpp @@ -11,7 +11,7 @@ #define SETUP_STREAM(v) \ SQStream *self = NULL; \ - if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)((SQUnsignedInteger)SQSTD_STREAM_TYPE_TAG)))) \ + if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)((SQUnsignedInteger)SQSTD_STREAM_TYPE_TAG),SQFalse))) \ return sq_throwerror(v,_SC("invalid type tag")); \ if(!self || !self->IsValid()) \ return sq_throwerror(v,_SC("the stream is invalid")); diff --git a/src/vscript/squirrel/sqstdlib/sqstdstring.cpp b/src/vscript/squirrel/sqstdlib/sqstdstring.cpp index 5747d8edfe7..ca3df3ed86b 100644 --- a/src/vscript/squirrel/sqstdlib/sqstdstring.cpp +++ b/src/vscript/squirrel/sqstdlib/sqstdstring.cpp @@ -387,7 +387,7 @@ static SQInteger _string_endswith(HSQUIRRELVM v) #define SETUP_REX(v) \ SQRex *self = NULL; \ - if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer *)&self,rex_typetag))) { \ + if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer *)&self,rex_typetag,SQFalse))) { \ return sq_throwerror(v,_SC("invalid type tag")); \ } @@ -471,7 +471,7 @@ static SQInteger _regexp_subexpcount(HSQUIRRELVM v) static SQInteger _regexp_constructor(HSQUIRRELVM v) { SQRex *self = NULL; - if (SQ_FAILED(sq_getinstanceup(v, 1, (SQUserPointer *)&self, rex_typetag))) { + if (SQ_FAILED(sq_getinstanceup(v, 1, (SQUserPointer *)&self, rex_typetag, SQFalse))) { return sq_throwerror(v, _SC("invalid type tag")); } if (self != NULL) { diff --git a/src/vscript/squirrel/squirrel/sqapi.cpp b/src/vscript/squirrel/squirrel/sqapi.cpp index a3221503da5..54eecac4de9 100644 --- a/src/vscript/squirrel/squirrel/sqapi.cpp +++ b/src/vscript/squirrel/squirrel/sqapi.cpp @@ -807,21 +807,21 @@ 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(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; - do{ - if(cl->_typetag == typetag) - return SQ_OK; - cl = cl->_base; - }while(cl != NULL); - return sq_throwerror(v,_SC("invalid type tag")); - } - return SQ_OK; +SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p, SQUserPointer typetag, SQBool throwerror) +{ + SQObjectPtr &o = stack_get(v, idx); + if (sq_type(o) != OT_INSTANCE) return throwerror ? sq_throwerror(v, _SC("the object is not a class instance")) : SQ_ERROR; + (*p) = _instance(o)->_userpointer; + if (typetag != 0) { + SQClass *cl = _instance(o)->_class; + do { + if (cl->_typetag == typetag) + return SQ_OK; + cl = cl->_base; + } while (cl != NULL); + return throwerror ? sq_throwerror(v, _SC("invalid type tag")) : SQ_ERROR; + } + return SQ_OK; } SQInteger sq_gettop(HSQUIRRELVM v) diff --git a/src/vscript/squirrel/squirrel/sqbaselib.cpp b/src/vscript/squirrel/squirrel/sqbaselib.cpp index 5c03e8393bb..8eff97ce020 100644 --- a/src/vscript/squirrel/squirrel/sqbaselib.cpp +++ b/src/vscript/squirrel/squirrel/sqbaselib.cpp @@ -499,6 +499,32 @@ static SQInteger table_filter(HSQUIRRELVM v) return 1; } +static SQInteger table_map(HSQUIRRELVM v) +{ + SQObject &o = stack_get(v, 1); + SQTable *tbl = _table(o); + SQInteger nitr, n = 0; + SQInteger nitems = tbl->CountUsed(); + SQObjectPtr ret = SQArray::Create(_ss(v), nitems); + SQObjectPtr itr, key, val; + 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; + } + _array(ret)->Set(n, v->GetUp(-1)); + v->Pop(); + n++; + } + + v->Push(ret); + return 1; +} + #define TABLE_TO_ARRAY_FUNC(_funcname_,_valname_) static SQInteger _funcname_(HSQUIRRELVM v) \ { \ SQObject &o = stack_get(v, 1); \ @@ -536,6 +562,7 @@ const SQRegFunction SQSharedState::_table_default_delegate_funcz[]={ {_SC("setdelegate"),table_setdelegate,2, _SC(".t|o")}, {_SC("getdelegate"),table_getdelegate,1, _SC(".")}, {_SC("filter"),table_filter,2, _SC("tc")}, + {_SC("map"),table_map,2, _SC("tc") }, {_SC("keys"),table_keys,1, _SC("t") }, {_SC("values"),table_values,1, _SC("t") }, {NULL,(SQFUNCTION)0,0,NULL} diff --git a/src/vscript/squirrel/squirrel/sqcompiler.cpp b/src/vscript/squirrel/squirrel/sqcompiler.cpp index 095edd71c69..0b177057693 100644 --- a/src/vscript/squirrel/squirrel/sqcompiler.cpp +++ b/src/vscript/squirrel/squirrel/sqcompiler.cpp @@ -842,8 +842,8 @@ class SQCompiler _fs->AddInstruction(_OP_NEWOBJ, _fs->PushTarget(),0,NOT_TABLE); Lex();ParseTableOrClass(_SC(','),_SC('}')); break; - case TK_FUNCTION: FunctionExp(_token);break; - case _SC('@'): FunctionExp(_token,true);break; + case TK_FUNCTION: FunctionExp();break; + case _SC('@'): FunctionExp(true);break; case TK_CLASS: Lex(); ClassExp();break; case _SC('-'): Lex(); @@ -989,10 +989,15 @@ class SQCompiler SQInteger tk = _token; Lex(); SQObject id = tk == TK_FUNCTION ? Expect(TK_IDENTIFIER) : _fs->CreateString(_SC("constructor")); + _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(id)); + SQInteger boundtarget = 0xFF; + if (_token == _SC('[')) { + boundtarget = ParseBindEnv(); + } Expect(_SC('(')); - _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(id)); - CreateFunction(id); - _fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, 0); + + CreateFunction(id, boundtarget); + _fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, boundtarget); } break; case _SC('['): @@ -1034,11 +1039,15 @@ class SQCompiler SQObject varname; Lex(); if( _token == TK_FUNCTION) { + SQInteger boundtarget = 0xFF; Lex(); - varname = Expect(TK_IDENTIFIER); + varname = Expect(TK_IDENTIFIER); + if (_token == _SC('[')) { + boundtarget = ParseBindEnv(); + } Expect(_SC('(')); - CreateFunction(varname,false); - _fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, 0); + CreateFunction(varname,0xFF,false); + _fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, boundtarget); _fs->PopTarget(); _fs->PushLocalVariable(varname); return; @@ -1310,9 +1319,13 @@ class SQCompiler _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(id)); if(_token == TK_DOUBLE_COLON) Emit2ArgsOP(_OP_GET); } + SQInteger boundtarget = 0xFF; + if (_token == _SC('[')) { + boundtarget = ParseBindEnv(); + } Expect(_SC('(')); - CreateFunction(id); - _fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, 0); + CreateFunction(id, boundtarget); + _fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, boundtarget); EmitDerefOp(_OP_NEWSLOT); _fs->PopTarget(); } @@ -1438,12 +1451,26 @@ class SQCompiler END_SCOPE(); } } - void FunctionExp(SQInteger ftype,bool lambda = false) + SQInteger ParseBindEnv() + { + SQInteger boundtarget; + Lex(); + Expression(); + boundtarget = _fs->TopTarget(); + Expect(_SC(']')); + return boundtarget; + } + void FunctionExp(bool lambda = false) { - Lex(); Expect(_SC('(')); + Lex(); + SQInteger boundtarget = 0xFF; + if (_token == _SC('[')) { + boundtarget = ParseBindEnv(); + } + Expect(_SC('(')); SQObjectPtr dummy; - CreateFunction(dummy,lambda); - _fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, ftype == TK_FUNCTION?0:1); + CreateFunction(dummy, boundtarget, lambda); + _fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, boundtarget); } void ClassExp() { @@ -1508,7 +1535,7 @@ class SQCompiler } _es = es; } - void CreateFunction(SQObject &name,bool lambda = false) + void CreateFunction(SQObject &name,SQInteger boundtarget,bool lambda = false) { SQFuncState *funcstate = _fs->PushChildState(_ss(_vm)); funcstate->_name = name; @@ -1542,6 +1569,9 @@ class SQCompiler } } Expect(_SC(')')); + if (boundtarget != 0xFF) { + _fs->PopTarget(); + } for(SQInteger n = 0; n < defparams; n++) { _fs->PopTarget(); } diff --git a/src/vscript/squirrel/squirrel/sqstring.h b/src/vscript/squirrel/squirrel/sqstring.h index 82f1cdf46e3..0099f3b426e 100644 --- a/src/vscript/squirrel/squirrel/sqstring.h +++ b/src/vscript/squirrel/squirrel/sqstring.h @@ -4,11 +4,12 @@ inline SQHash _hashstr (const SQChar *s, size_t l) { - SQHash h = (SQHash)l; /* seed */ - size_t step = (l>>5)|1; /* if string is too long, don't hash all its chars */ - for (; l>=step; l-=step) - h = h ^ ((h<<5)+(h>>2)+(unsigned short)*(s++)); - return h; + SQHash h = (SQHash)l; /* seed */ + size_t step = (l >> 5) + 1; /* if string is too long, don't hash all its chars */ + size_t l1; + for (l1 = l; l1 >= step; l1 -= step) + h = h ^ ((h << 5) + (h >> 2) + ((unsigned short)s[l1 - 1])); + return h; } struct SQString : public SQRefCounted diff --git a/src/vscript/squirrel/squirrel/sqvm.cpp b/src/vscript/squirrel/squirrel/sqvm.cpp index dcf823d735e..051b94f91a3 100644 --- a/src/vscript/squirrel/squirrel/sqvm.cpp +++ b/src/vscript/squirrel/squirrel/sqvm.cpp @@ -586,7 +586,7 @@ bool SQVM::FOREACH_OP(SQObjectPtr &o1,SQObjectPtr &o2,SQObjectPtr #define _GUARD(exp) { if(!exp) { SQ_THROW();} } -bool SQVM::CLOSURE_OP(SQObjectPtr &target, SQFunctionProto *func) +bool SQVM::CLOSURE_OP(SQObjectPtr &target, SQFunctionProto *func,SQInteger boundtarget) { SQInteger nouters; SQClosure *closure = SQClosure::Create(_ss(this), func,_table(_roottable)->GetWeakRef(OT_TABLE)); @@ -610,6 +610,19 @@ bool SQVM::CLOSURE_OP(SQObjectPtr &target, SQFunctionProto *func) closure->_defaultparams[i] = _stack._vals[_stackbase + spos]; } } + if (boundtarget != 0xFF) { + SQObjectPtr &val = _stack._vals[_stackbase + boundtarget]; + SQObjectType t = sq_type(val); + if (t == OT_TABLE || t == OT_CLASS || t == OT_INSTANCE || t == OT_ARRAY) { + closure->_env = _refcounted(val)->GetWeakRef(t); + __ObjAddRef(closure->_env); + } + else { + Raise_Error(_SC("cannot bind a %s as environment object"), IdType2Name(t)); + closure->Release(); + return false; + } + } target = closure; return true; @@ -1003,7 +1016,7 @@ bool SQVM::Execute(SQObjectPtr &closure, SQInteger nargs, SQInteger stackbase,SQ case _OP_CLOSURE: { SQClosure *c = ci->_closure._unVal.pClosure; SQFunctionProto *fp = c->_function; - if(!CLOSURE_OP(TARGET,fp->_functions[arg1]._unVal.pFunctionProto)) { SQ_THROW(); } + if(!CLOSURE_OP(TARGET,fp->_functions[arg1]._unVal.pFunctionProto,arg2)) { SQ_THROW(); } continue; } case _OP_YIELD:{ @@ -1323,7 +1336,7 @@ SQInteger SQVM::FallBackGet(const SQObjectPtr &self,const SQObjectPtr &key,SQObj case OT_USERDATA: //delegation if(_delegable(self)->_delegate) { - if(Get(SQObjectPtr(_delegable(self)->_delegate),key,dest,0,DONT_FALL_BACK)) return FALLBACK_OK; + if(Get(SQObjectPtr(_delegable(self)->_delegate),key,dest, GET_FLAG_DO_NOT_RAISE_ERROR,DONT_FALL_BACK)) return FALLBACK_OK; } else { return FALLBACK_NO_MATCH; diff --git a/src/vscript/squirrel/squirrel/sqvm.h b/src/vscript/squirrel/squirrel/sqvm.h index a75524daeec..50927507e5a 100644 --- a/src/vscript/squirrel/squirrel/sqvm.h +++ b/src/vscript/squirrel/squirrel/sqvm.h @@ -103,7 +103,7 @@ typedef sqvector CallInfoVec; _INLINE bool BW_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,const SQObjectPtr &o2); _INLINE bool NEG_OP(SQObjectPtr &trg,const SQObjectPtr &o1); _INLINE bool CMP_OP(CmpOP op, const SQObjectPtr &o1,const SQObjectPtr &o2,SQObjectPtr &res); - bool CLOSURE_OP(SQObjectPtr &target, SQFunctionProto *func); + bool CLOSURE_OP(SQObjectPtr &target, SQFunctionProto *func, SQInteger boundtarget); bool CLASS_OP(SQObjectPtr &target,SQInteger base,SQInteger attrs); //return true if the loop is finished bool FOREACH_OP(SQObjectPtr &o1,SQObjectPtr &o2,SQObjectPtr &o3,SQObjectPtr &o4,SQInteger arg_2,int exitpos,int &jump); diff --git a/src/vscript/vscript_squirrel.cpp b/src/vscript/vscript_squirrel.cpp index 49dc6b79454..1a31114d549 100644 --- a/src/vscript/vscript_squirrel.cpp +++ b/src/vscript/vscript_squirrel.cpp @@ -45,6 +45,12 @@ extern ConVar developer; +#if SQUIRREL_VERSION_NUMBER >= 320 +inline SQRESULT sq_getinstanceup( HSQUIRRELVM v, SQInteger idx, SQUserPointer *p, SQUserPointer typetag ) +{ + return sq_getinstanceup( v, idx, p, typetag, SQFalse ); +} +#endif struct WriteStateMap {