Update to Squirrel 3.0.7 stable
authorTobias Markus <tobbi@mozilla-uk.org>
Wed, 21 Jan 2015 18:07:46 +0000 (19:07 +0100)
committerTobias Markus <tobbi@mozilla-uk.org>
Wed, 21 Jan 2015 18:07:46 +0000 (19:07 +0100)
external/squirrel/COPYRIGHT
external/squirrel/HISTORY
external/squirrel/include/squirrel.h
external/squirrel/sqstdlib/sqstdrex.cpp
external/squirrel/squirrel/sqbaselib.cpp
external/squirrel/squirrel/sqcompiler.cpp
external/squirrel/squirrel/sqdebug.cpp
external/squirrel/squirrel/sqvm.cpp
external/squirrel/squirrel/sqvm.h

index 8e0c12f..0c67223 100644 (file)
@@ -1,4 +1,4 @@
-Copyright (c) 2003-2014 Alberto Demichelis\r
+Copyright (c) 2003-2015 Alberto Demichelis\r
 \r
 Permission is hereby granted, free of charge, to any person obtaining a copy\r
 of this software and associated documentation files (the "Software"), to deal\r
index 53c09bd..d5d3232 100644 (file)
@@ -1,3 +1,11 @@
+***version 3.0.7 stable***\r
+-newthread and sq_newthread() no longer resets the base lib function in the root table(thx Lucas Cardellini)\r
+-exceptions in the _inherited metamethod are propagated(thx Lucas Cardellini)\r
+-'in' operator performance improvement(thx unagipai and mingodad)\r
+-fixed bug in print()(thx Lucas Cardellini)\r
+-fixed some documentation bug\r
+\r
+***2014-04-02             ***\r
 ***version 3.0.6 stable***\r
 -fixed compiler bug that can cause memory corruption, the bug was introduced in 3.0.5(thx Alex95)\r
 \r
index d4fc8fb..2532c5b 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-Copyright (c) 2003-2014 Alberto Demichelis\r
+Copyright (c) 2003-2015 Alberto Demichelis\r
 \r
 Permission is hereby granted, free of charge, to any person obtaining a copy\r
 of this software and associated documentation files (the "Software"), to deal\r
@@ -162,7 +162,7 @@ typedef char SQChar;
 #endif\r
 #define scatoi         atoi\r
 #define scstrtoul      strtoul\r
-#define scvsprintf     vsprintf\r
+#define scvsprintf     vsnprintf\r
 #define scstrstr       strstr\r
 #define scisspace      isspace\r
 #define scisdigit      isdigit\r
@@ -181,10 +181,10 @@ typedef char SQChar;
 #define _PRINT_INT_FMT _SC("%d")\r
 #endif\r
 \r
-#define SQUIRREL_VERSION       _SC("Squirrel 3.0.6 stable")\r
-#define SQUIRREL_COPYRIGHT     _SC("Copyright (C) 2003-2014 Alberto Demichelis")\r
+#define SQUIRREL_VERSION       _SC("Squirrel 3.0.7 stable")\r
+#define SQUIRREL_COPYRIGHT     _SC("Copyright (C) 2003-2015 Alberto Demichelis")\r
 #define SQUIRREL_AUTHOR                _SC("Alberto Demichelis")\r
-#define SQUIRREL_VERSION_NUMBER        306\r
+#define SQUIRREL_VERSION_NUMBER        307\r
 \r
 #define SQ_VMSTATE_IDLE                        0\r
 #define SQ_VMSTATE_RUNNING             1\r
index 20aa57d..5444d27 100644 (file)
@@ -459,7 +459,7 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar
                                exp->_matches[capture].begin = cur;\r
                                exp->_currsubexp++;\r
                        }\r
-                       int tempcap = exp->_currsubexp;\r
+                       SQInteger tempcap = exp->_currsubexp;\r
                        do {\r
                                SQRexNode *subnext = NULL;\r
                                if(n->next != -1) {\r
index 4a7d39d..e5520bb 100644 (file)
@@ -185,19 +185,27 @@ static SQInteger get_slice_params(HSQUIRRELVM v,SQInteger &sidx,SQInteger &eidx,
 static SQInteger base_print(HSQUIRRELVM v)\r
 {\r
        const SQChar *str;\r
-       sq_tostring(v,2);\r
-       sq_getstring(v,-1,&str);\r
-       if(_ss(v)->_printfunc) _ss(v)->_printfunc(v,_SC("%s"),str);\r
-       return 0;\r
+       if(SQ_SUCCEEDED(sq_tostring(v,2)))\r
+       {\r
+               if(SQ_SUCCEEDED(sq_getstring(v,-1,&str))) {\r
+                       if(_ss(v)->_printfunc) _ss(v)->_printfunc(v,_SC("%s"),str);\r
+                       return 0;\r
+               }\r
+       }\r
+       return SQ_ERROR;\r
 }\r
 \r
 static SQInteger base_error(HSQUIRRELVM v)\r
 {\r
        const SQChar *str;\r
-       sq_tostring(v,2);\r
-       sq_getstring(v,-1,&str);\r
-       if(_ss(v)->_errorfunc) _ss(v)->_errorfunc(v,_SC("%s"),str);\r
-       return 0;\r
+       if(SQ_SUCCEEDED(sq_tostring(v,2)))\r
+       {\r
+               if(SQ_SUCCEEDED(sq_getstring(v,-1,&str))) {\r
+                       if(_ss(v)->_errorfunc) _ss(v)->_errorfunc(v,_SC("%s"),str);\r
+                       return 0;\r
+               }\r
+       }\r
+       return SQ_ERROR;\r
 }\r
 \r
 static SQInteger base_compilestring(HSQUIRRELVM v)\r
@@ -378,7 +386,8 @@ static SQInteger default_delegate_tointeger(HSQUIRRELVM v)
 \r
 static SQInteger default_delegate_tostring(HSQUIRRELVM v)\r
 {\r
-       sq_tostring(v,1);\r
+       if(SQ_FAILED(sq_tostring(v,1))) \r
+               return SQ_ERROR;\r
        return 1;\r
 }\r
 \r
index fbd2993..add1a28 100644 (file)
@@ -80,7 +80,7 @@ public:
                _lineinfo = lineinfo;_raiseerror = raiseerror;\r
                _scope.outers = 0;\r
                _scope.stacksize = 0;\r
-               _compilererror[0] = '\0';\r
+               _compilererror[0] = _SC('\0');\r
        }\r
        static void ThrowError(void *ud, const SQChar *s) {\r
                SQCompiler *c = (SQCompiler *)ud;\r
@@ -90,7 +90,7 @@ public:
        {\r
                va_list vl;\r
                va_start(vl, s);\r
-               scvsprintf(_compilererror, s, vl);\r
+               scvsprintf(_compilererror, MAX_COMPILER_ERROR_LEN, s, vl);\r
                va_end(vl);\r
                longjmp(_errorjmp,1);\r
        }\r
index 6f39231..ef82dd6 100644 (file)
@@ -59,7 +59,8 @@ void SQVM::Raise_Error(const SQChar *s, ...)
 {\r
        va_list vl;\r
        va_start(vl, s);\r
-       scvsprintf(_sp(rsl((SQInteger)scstrlen(s)+(NUMBER_MAX_CHAR*2))), s, vl);\r
+       SQInteger buffersize = (SQInteger)scstrlen(s)+(NUMBER_MAX_CHAR*2);\r
+       scvsprintf(_sp(rsl(buffersize)),buffersize, s, vl);\r
        va_end(vl);\r
        _lasterror = SQString::Create(_ss(this),_spval,-1);\r
 }\r
index 77e5eef..de0927f 100644 (file)
@@ -349,8 +349,10 @@ bool SQVM::Init(SQVM *friendvm, SQInteger stacksize)
        _callsstack = &_callstackdata[0];\r
        _stackbase = 0;\r
        _top = 0;\r
-       if(!friendvm) \r
+       if(!friendvm) {\r
                _roottable = SQTable::Create(_ss(this), 0);\r
+               sq_base_register(this);\r
+       }\r
        else {\r
                _roottable = friendvm->_roottable;\r
                _errorhandler = friendvm->_errorhandler;\r
@@ -358,8 +360,6 @@ bool SQVM::Init(SQVM *friendvm, SQInteger stacksize)
                _debughook_native = friendvm->_debughook_native;\r
                _debughook_closure = friendvm->_debughook_closure;\r
        }\r
-       \r
-       sq_base_register(this);\r
        return true;\r
 }\r
 \r
@@ -619,7 +619,10 @@ bool SQVM::CLASS_OP(SQObjectPtr &target,SQInteger baseclass,SQInteger attributes
                int nparams = 2;\r
                SQObjectPtr ret;\r
                Push(target); Push(attrs);\r
-               Call(_class(target)->_metamethods[MT_INHERITED],nparams,_top - nparams, ret, false);\r
+               if(!Call(_class(target)->_metamethods[MT_INHERITED],nparams,_top - nparams, ret, false)) {\r
+                       Pop(nparams);\r
+                       return false;\r
+               }\r
                Pop(nparams);\r
        }\r
        _class(target)->_attributes = attrs;\r
@@ -1190,7 +1193,7 @@ bool SQVM::Get(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest,
                if(_table(self)->Get(key,dest))return true;\r
                break;\r
        case OT_ARRAY:\r
-               if(sq_isnumeric(key)) { if(_array(self)->Get(tointeger(key),dest)) { return true; } Raise_IdxError(key); return false; }\r
+               if(sq_isnumeric(key)) { if(_array(self)->Get(tointeger(key),dest)) { return true; } if(selfidx != EXISTS_FALL_BACK) Raise_IdxError(key); return false; }\r
                break;\r
        case OT_INSTANCE:\r
                if(_instance(self)->Get(key,dest)) return true;\r
@@ -1206,7 +1209,7 @@ bool SQVM::Get(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest,
                                dest = SQInteger(_stringval(self)[n]);\r
                                return true;\r
                        }\r
-                       Raise_IdxError(key);\r
+                       if(selfidx != EXISTS_FALL_BACK) Raise_IdxError(key);\r
                        return false;\r
                }\r
                break;\r
@@ -1227,7 +1230,7 @@ bool SQVM::Get(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest,
                if(_table(_roottable)->Get(key,dest)) return true;\r
        }\r
 //#endif\r
-       Raise_IdxError(key);\r
+       if(selfidx != EXISTS_FALL_BACK) Raise_IdxError(key);\r
        return false;\r
 }\r
 \r
index 13b3706..011a24d 100644 (file)
@@ -9,6 +9,7 @@
 \r
 #define SQ_SUSPEND_FLAG -666\r
 #define DONT_FALL_BACK 666\r
+#define EXISTS_FALL_BACK -1\r
 //base lib\r
 void sq_base_register(HSQUIRRELVM v);\r
 \r