Update to Squirrel 3.0.7 stable
[supertux.git] / external / squirrel / squirrel / sqvm.cpp
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