New grow and skid sounds from remaxim
[supertux.git] / src / squirrel / squirrel / sqvm.h
index 80bc594..c073fb4 100644 (file)
@@ -37,11 +37,11 @@ struct SQVM : public CHAINABLE_OBJ
        };
 
        struct CallInfo{
-               CallInfo() { _generator._type = OT_NULL;}
+               //CallInfo() { _generator._type = OT_NULL;}
                SQInstruction *_ip;
                SQObjectPtr *_literals;
-               SQObject _closure;
-               SQObject _generator;
+               SQObjectPtr _closure;
+               SQGenerator *_generator;
                SQInt32 _etraps;
                SQInt32 _prevstkbase;
                SQInt32 _prevtop;
@@ -53,7 +53,7 @@ struct SQVM : public CHAINABLE_OBJ
        
 typedef sqvector<CallInfo> CallInfoVec;
 public:
-       enum ExecutionType { ET_CALL, ET_RESUME_GENERATOR, ET_RESUME_VM };
+       enum ExecutionType { ET_CALL, ET_RESUME_GENERATOR, ET_RESUME_VM, ET_RESUME_THROW_VM };
        SQVM(SQSharedState *ss);
        ~SQVM();
        bool Init(SQVM *friendvm, SQInteger stacksize);
@@ -108,6 +108,7 @@ public:
        _INLINE bool PLOCAL_INC(SQInteger op,SQObjectPtr &target, SQObjectPtr &a, SQObjectPtr &incr);
        _INLINE bool DerefInc(SQInteger op,SQObjectPtr &target, SQObjectPtr &self, SQObjectPtr &key, SQObjectPtr &incr, bool postfix);
        void PopVarArgs(VarArgs &vargs);
+       void ClearStack(SQInteger last_top);
 #ifdef _DEBUG_DUMP
        void dumpstack(SQInteger stackbase=-1, bool dumpall = false);
 #endif
@@ -118,7 +119,8 @@ public:
        void Finalize();
        void GrowCallStack() {
                SQInteger newsize = _alloccallsstacksize*2;
-               _callsstack = (CallInfo*)sq_realloc(_callsstack,_alloccallsstacksize*sizeof(CallInfo),newsize*sizeof(CallInfo));
+               _callstackdata.resize(newsize);
+               _callsstack = &_callstackdata[0];
                _alloccallsstacksize = newsize;
        }
        void Release(){ sq_delete(this,SQVM); } //does nothing
@@ -151,6 +153,7 @@ public:
        CallInfo* _callsstack;
        SQInteger _callsstacksize;
        SQInteger _alloccallsstacksize;
+       sqvector<CallInfo>  _callstackdata;
 
        ExceptionsTraps _etraps;
        CallInfo *ci;
@@ -193,6 +196,7 @@ inline SQObjectPtr &stack_get(HSQUIRRELVM v,SQInteger idx){return ((idx>=0)?(v->
 
 #define POP_CALLINFO(v){ \
        v->_callsstacksize--; \
+       v->ci->_closure.Null(); \
        if(v->_callsstacksize)  \
                v->ci = &v->_callsstack[v->_callsstacksize-1] ; \
        else    \