Update to Squirrel 3.0.6
[supertux.git] / external / squirrel / squirrel / sqvm.h
old mode 100755 (executable)
new mode 100644 (file)
index 202a7a1..13b3706
@@ -5,9 +5,10 @@
 #include "sqopcodes.h"\r
 #include "sqobject.h"\r
 #define MAX_NATIVE_CALLS 100\r
-#define MIN_STACK_OVERHEAD 10\r
+#define MIN_STACK_OVERHEAD 15\r
 \r
 #define SQ_SUSPEND_FLAG -666\r
+#define DONT_FALL_BACK 666\r
 //base lib\r
 void sq_base_register(HSQUIRRELVM v);\r
 \r
@@ -30,14 +31,8 @@ typedef sqvector<SQExceptionTrap> ExceptionsTraps;
 \r
 struct SQVM : public CHAINABLE_OBJ\r
 {\r
-       struct VarArgs {\r
-               VarArgs() { size = 0; base = 0; }\r
-               unsigned short size;\r
-               unsigned short base;\r
-       };\r
-\r
        struct CallInfo{\r
-               //CallInfo() { _generator._type = OT_NULL;}\r
+               //CallInfo() { _generator = NULL;}\r
                SQInstruction *_ip;\r
                SQObjectPtr *_literals;\r
                SQObjectPtr _closure;\r
@@ -48,18 +43,19 @@ struct SQVM : public CHAINABLE_OBJ
                SQInt32 _target;\r
                SQInt32 _ncalls;\r
                SQBool _root;\r
-               VarArgs _vargs;\r
        };\r
        \r
 typedef sqvector<CallInfo> CallInfoVec;\r
 public:\r
-       enum ExecutionType { ET_CALL, ET_RESUME_GENERATOR, ET_RESUME_VM, ET_RESUME_THROW_VM };\r
+       void DebugHookProxy(SQInteger type, const SQChar * sourcename, SQInteger line, const SQChar * funcname);\r
+       static void _DebugHookProxy(HSQUIRRELVM v, SQInteger type, const SQChar * sourcename, SQInteger line, const SQChar * funcname);\r
+       enum ExecutionType { ET_CALL, ET_RESUME_GENERATOR, ET_RESUME_VM,ET_RESUME_THROW_VM };\r
        SQVM(SQSharedState *ss);\r
        ~SQVM();\r
        bool Init(SQVM *friendvm, SQInteger stacksize);\r
-       bool Execute(SQObjectPtr &func, SQInteger target, SQInteger nargs, SQInteger stackbase, SQObjectPtr &outres, SQBool raiseerror, ExecutionType et = ET_CALL);\r
+       bool Execute(SQObjectPtr &func, SQInteger nargs, SQInteger stackbase, SQObjectPtr &outres, SQBool raiseerror, ExecutionType et = ET_CALL);\r
        //starts a native call return when the NATIVE closure returns\r
-       bool CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger stackbase, SQObjectPtr &retval,bool &suspend);\r
+       bool CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newbase, SQObjectPtr &retval,bool &suspend);\r
        //starts a SQUIRREL call in the same "Execution loop"\r
        bool StartCall(SQClosure *closure, SQInteger target, SQInteger nargs, SQInteger stackbase, bool tailcall);\r
        bool CreateClassInstance(SQClass *theclass, SQObjectPtr &inst, SQObjectPtr &constructor);\r
@@ -69,27 +65,34 @@ public:
 \r
        void CallDebugHook(SQInteger type,SQInteger forcedline=0);\r
        void CallErrorHandler(SQObjectPtr &e);\r
-       bool Get(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &dest, bool raw, bool fetchroot);\r
-       bool FallBackGet(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest,bool raw);\r
-       bool Set(const SQObjectPtr &self, const SQObjectPtr &key, const SQObjectPtr &val, bool fetchroot);\r
+       bool Get(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &dest, bool raw, SQInteger selfidx);\r
+       SQInteger FallBackGet(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest);\r
+       bool InvokeDefaultDelegate(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest);\r
+       bool Set(const SQObjectPtr &self, const SQObjectPtr &key, const SQObjectPtr &val, SQInteger selfidx);\r
+       SQInteger FallBackSet(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val);\r
        bool NewSlot(const SQObjectPtr &self, const SQObjectPtr &key, const SQObjectPtr &val,bool bstatic);\r
+       bool NewSlotA(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val,const SQObjectPtr &attrs,bool bstatic,bool raw);\r
        bool DeleteSlot(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &res);\r
        bool Clone(const SQObjectPtr &self, SQObjectPtr &target);\r
        bool ObjCmp(const SQObjectPtr &o1, const SQObjectPtr &o2,SQInteger &res);\r
        bool StringCat(const SQObjectPtr &str, const SQObjectPtr &obj, SQObjectPtr &dest);\r
-       bool IsEqual(SQObjectPtr &o1,SQObjectPtr &o2,bool &res);\r
-       void ToString(const SQObjectPtr &o,SQObjectPtr &res);\r
-       SQString *PrintObjVal(const SQObject &o);\r
+       static bool IsEqual(const SQObjectPtr &o1,const SQObjectPtr &o2,bool &res);\r
+       bool ToString(const SQObjectPtr &o,SQObjectPtr &res);\r
+       SQString *PrintObjVal(const SQObjectPtr &o);\r
 \r
  \r
        void Raise_Error(const SQChar *s, ...);\r
-       void Raise_Error(SQObjectPtr &desc);\r
-       void Raise_IdxError(SQObject &o);\r
+       void Raise_Error(const SQObjectPtr &desc);\r
+       void Raise_IdxError(const SQObjectPtr &o);\r
        void Raise_CompareError(const SQObject &o1, const SQObject &o2);\r
        void Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger type);\r
 \r
-       void TypeOf(const SQObjectPtr &obj1, SQObjectPtr &dest);\r
-       bool CallMetaMethod(SQDelegable *del, SQMetaMethod mm, SQInteger nparams, SQObjectPtr &outres);\r
+       void FindOuter(SQObjectPtr &target, SQObjectPtr *stackindex);\r
+       void RelocateOuters();\r
+       void CloseOuters(SQObjectPtr *stackindex);\r
+\r
+       bool TypeOf(const SQObjectPtr &obj1, SQObjectPtr &dest);\r
+       bool CallMetaMethod(SQObjectPtr &closure, SQMetaMethod mm, SQInteger nparams, SQObjectPtr &outres);\r
        bool ArithMetaMethod(SQInteger op, const SQObjectPtr &o1, const SQObjectPtr &o2, SQObjectPtr &dest);\r
        bool Return(SQInteger _arg0, SQInteger _arg1, SQObjectPtr &retval);\r
        //new stuff\r
@@ -98,23 +101,19 @@ public:
        _INLINE bool NEG_OP(SQObjectPtr &trg,const SQObjectPtr &o1);\r
        _INLINE bool CMP_OP(CmpOP op, const SQObjectPtr &o1,const SQObjectPtr &o2,SQObjectPtr &res);\r
        bool CLOSURE_OP(SQObjectPtr &target, SQFunctionProto *func);\r
-       bool GETVARGV_OP(SQObjectPtr &target,SQObjectPtr &idx,CallInfo *ci);\r
        bool CLASS_OP(SQObjectPtr &target,SQInteger base,SQInteger attrs);\r
-       bool GETPARENT_OP(SQObjectPtr &o,SQObjectPtr &target);\r
        //return true if the loop is finished\r
        bool FOREACH_OP(SQObjectPtr &o1,SQObjectPtr &o2,SQObjectPtr &o3,SQObjectPtr &o4,SQInteger arg_2,int exitpos,int &jump);\r
-       bool DELEGATE_OP(SQObjectPtr &trg,SQObjectPtr &o1,SQObjectPtr &o2);\r
-       _INLINE bool LOCAL_INC(SQInteger op,SQObjectPtr &target, SQObjectPtr &a, SQObjectPtr &incr);\r
+       //_INLINE bool LOCAL_INC(SQInteger op,SQObjectPtr &target, SQObjectPtr &a, SQObjectPtr &incr);\r
        _INLINE bool PLOCAL_INC(SQInteger op,SQObjectPtr &target, SQObjectPtr &a, SQObjectPtr &incr);\r
-       _INLINE bool DerefInc(SQInteger op,SQObjectPtr &target, SQObjectPtr &self, SQObjectPtr &key, SQObjectPtr &incr, bool postfix);\r
-       void PopVarArgs(VarArgs &vargs);\r
-       void ClearStack(SQInteger last_top);\r
+       _INLINE bool DerefInc(SQInteger op,SQObjectPtr &target, SQObjectPtr &self, SQObjectPtr &key, SQObjectPtr &incr, bool postfix,SQInteger arg0);\r
 #ifdef _DEBUG_DUMP\r
        void dumpstack(SQInteger stackbase=-1, bool dumpall = false);\r
 #endif\r
 \r
 #ifndef NO_GARBAGE_COLLECTOR\r
        void Mark(SQCollectable **chain);\r
+       SQObjectType GetType() {return OT_THREAD;}\r
 #endif\r
        void Finalize();\r
        void GrowCallStack() {\r
@@ -123,29 +122,36 @@ public:
                _callsstack = &_callstackdata[0];\r
                _alloccallsstacksize = newsize;\r
        }\r
-       void Release(){ sq_delete(this,SQVM); } //does nothing\r
+       bool EnterFrame(SQInteger newbase, SQInteger newtop, bool tailcall);\r
+       void LeaveFrame();\r
+       void Release(){ sq_delete(this,SQVM); }\r
 ////////////////////////////////////////////////////////////////////////////\r
        //stack functions for the api\r
        void Remove(SQInteger n);\r
 \r
-       bool IsFalse(SQObjectPtr &o);\r
+       static bool IsFalse(SQObjectPtr &o);\r
        \r
        void Pop();\r
        void Pop(SQInteger n);\r
        void Push(const SQObjectPtr &o);\r
+       void PushNull();\r
        SQObjectPtr &Top();\r
        SQObjectPtr &PopGet();\r
        SQObjectPtr &GetUp(SQInteger n);\r
        SQObjectPtr &GetAt(SQInteger n);\r
 \r
        SQObjectPtrVec _stack;\r
-       SQObjectPtrVec _vargsstack;\r
+\r
        SQInteger _top;\r
        SQInteger _stackbase;\r
+       SQOuter *_openouters;\r
        SQObjectPtr _roottable;\r
        SQObjectPtr _lasterror;\r
        SQObjectPtr _errorhandler;\r
-       SQObjectPtr _debughook;\r
+\r
+       bool _debughook;\r
+       SQDEBUGHOOK _debughook_native;\r
+       SQObjectPtr _debughook_closure;\r
 \r
        SQObjectPtr temp_reg;\r
        \r
@@ -161,12 +167,12 @@ public:
        //VMs sharing the same state\r
        SQSharedState *_sharedstate;\r
        SQInteger _nnativecalls;\r
+       SQInteger _nmetamethodscall;\r
        //suspend infos\r
        SQBool _suspended;\r
        SQBool _suspended_root;\r
        SQInteger _suspended_target;\r
        SQInteger _suspended_traps;\r
-       VarArgs _suspend_varargs;\r
 };\r
 \r
 struct AutoDec{\r
@@ -186,20 +192,18 @@ inline SQObjectPtr &stack_get(HSQUIRRELVM v,SQInteger idx){return ((idx>=0)?(v->
 #endif\r
 \r
 #define PUSH_CALLINFO(v,nci){ \\r
-       if(v->_callsstacksize == v->_alloccallsstacksize) { \\r
+       SQInteger css = v->_callsstacksize; \\r
+       if(css == v->_alloccallsstacksize) { \\r
                v->GrowCallStack(); \\r
        } \\r
-       v->ci = &v->_callsstack[v->_callsstacksize]; \\r
+       v->ci = &v->_callsstack[css]; \\r
        *(v->ci) = nci; \\r
        v->_callsstacksize++; \\r
 }\r
 \r
 #define POP_CALLINFO(v){ \\r
-       v->_callsstacksize--; \\r
+       SQInteger css = --v->_callsstacksize; \\r
        v->ci->_closure.Null(); \\r
-       if(v->_callsstacksize)  \\r
-               v->ci = &v->_callsstack[v->_callsstacksize-1] ; \\r
-       else    \\r
-               v->ci = NULL; \\r
+       v->ci = css?&v->_callsstack[css-1]:NULL;        \\r
 }\r
 #endif //_SQVM_H_\r