From b037591652301d4eb1667b796dc1ca7da8969e7f Mon Sep 17 00:00:00 2001 From: azzyr Date: Fri, 12 Jun 2026 20:06:24 +0300 Subject: [PATCH 1/2] Squirrel 3.2 --- src/vscript/squirrel/COMPILE | 2 +- src/vscript/squirrel/COPYRIGHT | 2 +- src/vscript/squirrel/HISTORY | 6 +- src/vscript/squirrel/README | 2 +- src/vscript/squirrel/include/squirrel.h | 10 ++-- src/vscript/squirrel/sqstdlib/sqstdblob.cpp | 10 ++-- src/vscript/squirrel/sqstdlib/sqstdio.cpp | 4 +- src/vscript/squirrel/sqstdlib/sqstdstream.cpp | 2 +- src/vscript/squirrel/sqstdlib/sqstdstring.cpp | 4 +- src/vscript/squirrel/squirrel/sqapi.cpp | 30 +++++----- src/vscript/squirrel/squirrel/sqbaselib.cpp | 27 +++++++++ src/vscript/squirrel/squirrel/sqcompiler.cpp | 60 ++++++++++++++----- src/vscript/squirrel/squirrel/sqstring.h | 11 ++-- src/vscript/squirrel/squirrel/sqvm.cpp | 19 +++++- src/vscript/squirrel/squirrel/sqvm.h | 2 +- 15 files changed, 132 insertions(+), 59 deletions(-) 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); From 094a8206875acec290ea3085cbda0eee94268ac8 Mon Sep 17 00:00:00 2001 From: azzyr Date: Fri, 12 Jun 2026 20:41:07 +0300 Subject: [PATCH 2/2] Update calls to sq_getinstanceup to match new signature --- src/vscript/vscript_squirrel.cpp | 156 +++++++++++++++---------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/src/vscript/vscript_squirrel.cpp b/src/vscript/vscript_squirrel.cpp index 49dc6b79454..3bad604ca2a 100644 --- a/src/vscript/vscript_squirrel.cpp +++ b/src/vscript/vscript_squirrel.cpp @@ -335,7 +335,7 @@ namespace SQVector } SQUserPointer p; - if (SQ_FAILED(sq_getinstanceup(vm, 1, &p, 0))) + if (SQ_FAILED(sq_getinstanceup(vm, 1, &p, 0, SQFalse))) { return SQ_ERROR; } @@ -366,7 +366,7 @@ namespace SQVector } Vector* v = nullptr; - if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v, TYPETAG_VECTOR))) + if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Unable to get Vector"); } @@ -392,7 +392,7 @@ namespace SQVector } Vector* v = nullptr; - if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v, TYPETAG_VECTOR))) + if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Unable to get Vector"); } @@ -414,8 +414,8 @@ namespace SQVector Vector* v2 = nullptr; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR)) || - SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse)) || + SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector, Vector)"); } @@ -423,7 +423,7 @@ namespace SQVector sq_getclass(vm, 1); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector((*v1) + (*v2)); sq_remove(vm, -2); @@ -436,8 +436,8 @@ namespace SQVector Vector* v2 = nullptr; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR)) || - SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse)) || + SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector, Vector)"); } @@ -445,7 +445,7 @@ namespace SQVector sq_getclass(vm, 1); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector((*v1) - (*v2)); sq_remove(vm, -2); @@ -457,7 +457,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector, Vector|float)"); } @@ -470,18 +470,18 @@ namespace SQVector sq_getclass(vm, 1); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector((*v1) * s); sq_remove(vm, -2); return 1; } - else if ( SQ_SUCCEEDED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v2, TYPETAG_VECTOR)) ) + else if ( SQ_SUCCEEDED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse)) ) { sq_getclass(vm, 1); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector((*v1) * (*v2)); sq_remove(vm, -2); @@ -498,7 +498,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector, Vector|float)"); } @@ -511,18 +511,18 @@ namespace SQVector sq_getclass(vm, 1); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector((*v1) / s); sq_remove(vm, -2); return 1; } - else if ( SQ_SUCCEEDED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v2, TYPETAG_VECTOR)) ) + else if ( SQ_SUCCEEDED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse)) ) { sq_getclass(vm, 1); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector((*v1) / (*v2)); sq_remove(vm, -2); @@ -539,7 +539,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -547,7 +547,7 @@ namespace SQVector sq_getclass(vm, 1); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector(-v1->x, -v1->y, -v1->z); sq_remove(vm, -2); @@ -573,14 +573,14 @@ namespace SQVector SQInteger top = sq_gettop(vm); Vector* v1 = nullptr; - if ( top < 2 || SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR)) ) + if ( top < 2 || SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse)) ) { return sq_throwerror(vm, "Expected (Vector, Vector)"); } Vector* v2 = nullptr; - if ( SQ_SUCCEEDED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR)) ) + if ( SQ_SUCCEEDED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse)) ) { if ( top != 2 ) return sq_throwerror(vm, "Expected (Vector, Vector)"); @@ -613,8 +613,8 @@ namespace SQVector Vector* v2 = nullptr; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR)) || - SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse)) || + SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector, Vector)"); } @@ -631,8 +631,8 @@ namespace SQVector Vector* v2 = nullptr; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR)) || - SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse)) || + SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector, Vector)"); } @@ -648,14 +648,14 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector, Vector|float)"); } Vector* v2 = nullptr; - if ( SQ_SUCCEEDED(sq_getinstanceup( vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR )) ) + if ( SQ_SUCCEEDED(sq_getinstanceup( vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse )) ) { VectorMultiply( *v1, *v2, *v1 ); sq_remove( vm, -1 ); @@ -681,14 +681,14 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector, Vector|float)"); } Vector* v2 = nullptr; - if ( SQ_SUCCEEDED(sq_getinstanceup( vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR )) ) + if ( SQ_SUCCEEDED(sq_getinstanceup( vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse )) ) { VectorDivide( *v1, *v2, *v1 ); sq_remove( vm, -1 ); @@ -715,8 +715,8 @@ namespace SQVector Vector* v2 = nullptr; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR)) || - SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse)) || + SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector, Vector)"); } @@ -732,8 +732,8 @@ namespace SQVector Vector* v2 = nullptr; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR)) || - SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse)) || + SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector, Vector)"); } @@ -749,8 +749,8 @@ namespace SQVector Vector* v2 = nullptr; if (sq_gettop(vm) < 2 || // bother checking > 3? - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR)) || - SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR)) ) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse)) || + SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse)) ) { return sq_throwerror(vm, "Expected (Vector, Vector, float)"); } @@ -768,7 +768,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -782,7 +782,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -796,7 +796,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -810,7 +810,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -824,7 +824,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -832,7 +832,7 @@ namespace SQVector sq_getclass(vm, 1); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector((*v1).Normalized()); sq_remove(vm, -2); @@ -844,7 +844,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -861,7 +861,7 @@ namespace SQVector float s = 0.0f; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR)) || + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse)) || SQ_SUCCEEDED(sq_getfloat(vm, 2, &s))) { return sq_throwerror(vm, "Expected (Vector, float)"); @@ -870,7 +870,7 @@ namespace SQVector sq_getclass(vm, 1); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector((*v1) * s); sq_remove(vm, -2); @@ -883,8 +883,8 @@ namespace SQVector Vector* v2 = nullptr; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR)) || - SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse)) || + SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector, Vector)"); } @@ -898,7 +898,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -913,7 +913,7 @@ namespace SQVector const char* szInput; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR)) || + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse)) || SQ_FAILED(sq_getstring(vm, 2, &szInput)) ) { return sq_throwerror(vm, "Expected (Vector, string)"); @@ -948,8 +948,8 @@ namespace SQVector Vector* v2 = nullptr; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR)) || - SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse)) || + SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&v2, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector, Vector)"); } @@ -957,7 +957,7 @@ namespace SQVector sq_getclass(vm, 1); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector((*v1).Cross(*v2)); sq_remove(vm, -2); @@ -971,9 +971,9 @@ namespace SQVector Vector* maxs = nullptr; if (sq_gettop(vm) != 3 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR)) || - SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&mins, TYPETAG_VECTOR)) || - SQ_FAILED(sq_getinstanceup(vm, 3, (SQUserPointer*)&maxs, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse)) || + SQ_FAILED(sq_getinstanceup(vm, 2, (SQUserPointer*)&mins, TYPETAG_VECTOR, SQFalse)) || + SQ_FAILED(sq_getinstanceup(vm, 3, (SQUserPointer*)&maxs, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector, Vector, Vector)"); } @@ -988,7 +988,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -996,7 +996,7 @@ namespace SQVector sq_getclass(vm, 1); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector(); AngleVectors( *((QAngle*)v1), (Vector*)p ); sq_remove(vm, -2); @@ -1009,7 +1009,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -1017,7 +1017,7 @@ namespace SQVector sq_getclass(vm, 1); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector(); AngleVectors( *((QAngle*)v1), NULL, (Vector*)p, NULL ); // Despite being named "Left", docs suggest this returns right vector in live TF2 sq_remove(vm, -2); @@ -1030,7 +1030,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -1038,7 +1038,7 @@ namespace SQVector sq_getclass(vm, 1); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector(); AngleVectors( *((QAngle*)v1), NULL, NULL, (Vector*)p ); sq_remove(vm, -2); @@ -1051,7 +1051,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -1065,7 +1065,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -1079,7 +1079,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -1099,7 +1099,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 1 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -1119,7 +1119,7 @@ namespace SQVector Vector* v1 = nullptr; if (sq_gettop(vm) != 2 || - SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR))) + SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&v1, TYPETAG_VECTOR, SQFalse))) { return sq_throwerror(vm, "Expected (Vector)"); } @@ -1314,7 +1314,7 @@ void PushVariant(HSQUIRRELVM vm, const ScriptVariant_t& value) sq_pushobject(vm, pSquirrelVM->vectorClass_); sq_createinstance(vm, -1); SQUserPointer p; - sq_getinstanceup(vm, -1, &p, 0); + sq_getinstanceup(vm, -1, &p, 0, SQFalse); new(p) Vector(static_cast(value)); sq_remove(vm, -2); break; @@ -1453,7 +1453,7 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant) case OT_INSTANCE: { Vector* v = nullptr; - if (SQ_SUCCEEDED(sq_getinstanceup(vm, idx, (SQUserPointer*)&v, TYPETAG_VECTOR))) + if (SQ_SUCCEEDED(sq_getinstanceup(vm, idx, (SQUserPointer*)&v, TYPETAG_VECTOR, SQFalse))) { variant = *v; return true; @@ -1520,7 +1520,7 @@ SQInteger function_stub(HSQUIRRELVM vm) case FIELD_QANGLE: { Vector* val; - if (SQ_FAILED(sq_getinstanceup(vm, i + 2, (SQUserPointer*)&val, TYPETAG_VECTOR))) + if (SQ_FAILED(sq_getinstanceup(vm, i + 2, (SQUserPointer*)&val, TYPETAG_VECTOR, SQFalse))) return sq_throwerror(vm, "Expected Vector"); params[i] = *val; break; @@ -1586,7 +1586,7 @@ SQInteger function_stub(HSQUIRRELVM vm) if (pFunc->m_flags & SF_MEMBER_FUNC) { ClassInstanceData* classInstanceData; - if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0))) + if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0, SQFalse))) { return SQ_ERROR; } @@ -1712,7 +1712,7 @@ SQInteger constructor_stub(HSQUIRRELVM vm) } SQUserPointer p; - if (SQ_FAILED(sq_getinstanceup(vm, 1, &p, 0))) + if (SQ_FAILED(sq_getinstanceup(vm, 1, &p, 0, SQFalse))) { return SQ_ERROR; } @@ -1741,7 +1741,7 @@ SQInteger constructor_stub(HSQUIRRELVM vm) SQInteger tostring_stub(HSQUIRRELVM vm) { ClassInstanceData* classInstanceData = nullptr; - if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0))) + if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0, SQFalse))) { return SQ_ERROR; } @@ -1774,7 +1774,7 @@ SQInteger tostring_stub(HSQUIRRELVM vm) SQInteger get_stub(HSQUIRRELVM vm) { ClassInstanceData* classInstanceData = nullptr; - if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0))) + if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0, SQFalse))) { return SQ_ERROR; } @@ -1821,7 +1821,7 @@ SQInteger get_stub(HSQUIRRELVM vm) SQInteger set_stub(HSQUIRRELVM vm) { ClassInstanceData* classInstanceData = nullptr; - if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0))) + if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0, SQFalse))) { return SQ_ERROR; } @@ -1869,7 +1869,7 @@ SQInteger set_stub(HSQUIRRELVM vm) SQInteger IsValid_stub(HSQUIRRELVM vm) { ClassInstanceData* classInstanceData = nullptr; - sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0); + sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0, SQFalse); sq_pushbool(vm, classInstanceData != nullptr); return 1; } @@ -2894,7 +2894,7 @@ HSCRIPT SquirrelVM::RegisterInstance(ScriptClassDesc_t* pDesc, void* pInstance, { ClassInstanceData *self; - sq_getinstanceup(vm_, -1, (SQUserPointer*)&self, 0); + sq_getinstanceup(vm_, -1, (SQUserPointer*)&self, 0, SQFalse); new(self) ClassInstanceData(pInstance, pDesc, nullptr, bRefCounted); // can't delete the instance if it doesn't have a destructor @@ -2922,7 +2922,7 @@ void SquirrelVM::SetInstanceUniqeId(HSCRIPT hInstance, const char* pszId) sq_pushobject(vm_, *obj); ClassInstanceData* classInstanceData; - sq_getinstanceup(vm_, -1, (SQUserPointer*)&classInstanceData, nullptr); + sq_getinstanceup(vm_, -1, (SQUserPointer*)&classInstanceData, nullptr, SQFalse); classInstanceData->instanceId = pszId; @@ -2940,7 +2940,7 @@ void SquirrelVM::RemoveInstance(HSCRIPT hInstance) ClassInstanceData *self; sq_pushobject(vm_, *obj); - sq_getinstanceup(vm_, -1, (SQUserPointer*)&self, nullptr); + sq_getinstanceup(vm_, -1, (SQUserPointer*)&self, nullptr, SQFalse); sq_setinstanceup(vm_, -1, nullptr); sq_setreleasehook(vm_, -1, nullptr); sq_pop(vm_, 1); @@ -2981,7 +2981,7 @@ void* SquirrelVM::GetInstanceValue(HSCRIPT hInstance, ScriptClassDesc_t* pExpect sq_pushobject(vm_, *obj); ClassInstanceData* classInstanceData; - sq_getinstanceup(vm_, -1, (SQUserPointer*)&classInstanceData, nullptr); + sq_getinstanceup(vm_, -1, (SQUserPointer*)&classInstanceData, nullptr, SQFalse); sq_pop(vm_, 1);