Browse Source

Add fixes from squrrel

mingodad 10 years ago
parent
commit
9c84674630

+ 2 - 0
SquiLu/include/squirrel.h

@@ -168,6 +168,7 @@ typedef wchar_t USQChar;
 #define scisalnum	iswalnum
 #define scprintf	wprintf
 #define MAX_CHAR	0xFFFF
+#define sq_rsl(l) ((l)<<WCHAR_SHIFT_MUL)
 #else
 typedef char SQChar;
 typedef unsigned char USQChar;
@@ -204,6 +205,7 @@ typedef unsigned char USQChar;
 #define scisalnum	isalnum
 #define scprintf	printf
 #define MAX_CHAR	0xFF
+#define sq_rsl(l) (l)
 #endif
 
 #ifdef _SQ64

+ 8 - 4
SquiLu/sqstdlib/sqstdrex.cpp

@@ -19,7 +19,7 @@ static const SQChar *g_nnames[] =
 	_SC("NONE"),_SC("OP_GREEDY"),	_SC("OP_OR"),
 	_SC("OP_EXPR"),_SC("OP_NOCAPEXPR"),_SC("OP_DOT"),	_SC("OP_CLASS"),
 	_SC("OP_CCLASS"),_SC("OP_NCLASS"),_SC("OP_RANGE"),_SC("OP_CHAR"),
-	_SC("OP_EOL"),_SC("OP_BOL"),_SC("OP_WB"),_C("OP_MB")
+	_SC("OP_EOL"),_SC("OP_BOL"),_SC("OP_WB"),_SC("OP_MB")
 };
 
 #endif
@@ -471,7 +471,7 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar
 				exp->_matches[capture].begin = cur;
 				exp->_currsubexp++;
 			}
-			int tempcap = exp->_currsubexp;
+			SQInteger tempcap = exp->_currsubexp;
 			do {
 				SQRexNode *subnext = NULL;
 				if(n->next != -1) {
@@ -508,17 +508,20 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar
 		if(str == exp->_eol) return str;
 		return NULL;
 	case OP_DOT:{
+		if (str == exp->_eol) return NULL;
 		str++;
 				}
 		return str;
 	case OP_NCLASS:
 	case OP_CLASS:
+		if (str == exp->_eol) return NULL;
 		if(sqstd_rex_matchclass(exp,&exp->_nodes[node->left],*str)?(type == OP_CLASS?SQTrue:SQFalse):(type == OP_NCLASS?SQTrue:SQFalse)) {
 			str++;
 			return str;
 		}
 		return NULL;
 	case OP_CCLASS:
+		if (str == exp->_eol) return NULL;
 		if(sqstd_rex_matchcclass(node->left,*str)) {
 			str++;
 			return str;
@@ -530,8 +533,8 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar
             if(*str != cb) return NULL; // string doesnt start with open char
             int ce = node->right; //char that closes a balanced expression
             int cont = 1;
-            const SQChar *strEol = exp->_eol;
-            while (++str < strEol) {
+            const SQChar *streol = exp->_eol;
+            while (++str < streol) {
               if (*str == ce) {
                 if (--cont == 0) {
                     return ++str;
@@ -542,6 +545,7 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar
         }
         return NULL; // string ends out of balance
 	default: /* char */
+		if (str == exp->_eol) return NULL;
 		if(*str != node->type) return NULL;
 		str++;
 		return str;

+ 17 - 9
SquiLu/squirrel/sqbaselib.cpp

@@ -1012,7 +1012,7 @@ static SQRESULT array_slice(HSQUIRRELVM v)
 	if(sidx < 0)sidx = alen + sidx;
 	if(eidx < 0)eidx = alen + eidx;
 	if(eidx < sidx)return sq_throwerror(v,_SC("wrong indexes"));
-	if(eidx > alen)return sq_throwerror(v,_SC("slice out of range"));
+	if(eidx > alen || sidx < 0)return sq_throwerror(v, _SC("slice out of range"));
 	SQArray *arr=SQArray::Create(_ss(v),eidx-sidx);
 	SQObjectPtr t;
 	SQInteger count=0;
@@ -1152,7 +1152,7 @@ static SQRESULT string_slice(HSQUIRRELVM v)
 	if(sidx < 0)sidx = slen + sidx;
 	if(eidx < 0)eidx = slen + eidx;
 	if(eidx < sidx)	return sq_throwerror(v,_SC("wrong indexes"));
-	if(eidx > slen)	return sq_throwerror(v,_SC("slice out of range"));
+	if(eidx > slen || sidx < 0)	return sq_throwerror(v, _SC("slice out of range"));
 	v->Push(SQString::Create(_ss(v),&_stringval(o)[sidx],eidx-sidx));
 	return 1;
 }
@@ -1193,14 +1193,22 @@ static SQRESULT string_find(HSQUIRRELVM v)
 	return sq_throwerror(v,_SC("invalid param"));
 }
 
-#define STRING_TOFUNCZ(func) static SQRESULT string_##func(HSQUIRRELVM v) \
-{ \
-	SQObject str=stack_get(v,1); \
+#define STRING_TOFUNCZ(func) static SQInteger string_##func(HSQUIRRELVM v) \
+{\
+	SQInteger sidx,eidx; \
+	SQObjectPtr str; \
+	if(SQ_FAILED(get_slice_params(v,sidx,eidx,str)))return -1; \
+	SQInteger slen = _string(str)->_len; \
+	if(sidx < 0)sidx = slen + sidx; \
+	if(eidx < 0)eidx = slen + eidx; \
+	if(eidx < sidx)	return sq_throwerror(v,_SC("wrong indexes")); \
+	if(eidx > slen || sidx < 0)	return sq_throwerror(v,_SC("slice out of range")); \
 	SQInteger len=_string(str)->_len; \
-	const SQChar *sThis=_stringval(str); \
-	SQChar *sNew=(_ss(v)->GetScratchPad(rsl(len))); \
-	for(SQInteger i=0;i<len;i++) sNew[i]=func(sThis[i]); \
-	v->Push(SQString::Create(_ss(v),sNew,len)); \
+	const SQChar *sthis=_stringval(str); \
+	SQChar *snew=(_ss(v)->GetScratchPad(sq_rsl(len))); \
+	memcpy(snew,sthis,sq_rsl(len));\
+	for(SQInteger i=sidx;i<eidx;i++) snew[i] = func(sthis[i]); \
+	v->Push(SQString::Create(_ss(v),snew,len)); \
 	return 1; \
 }
 

+ 9 - 0
SquiLu/squirrel/sqobject.cpp

@@ -153,6 +153,10 @@ bool SQGenerator::Yield(SQVM *v,SQInteger target)
 	for(SQInteger i=0;i<_ci._etraps;i++) {
 		_etraps.push_back(v->_etraps.top());
 		v->_etraps.pop_back();
+		// store relative stack base and size in case of resume to other _top
+		SQExceptionTrap &et = _etraps.back();
+		et._stackbase -= v->_stackbase;
+		et._stacksize -= v->_stackbase;
 	}
 	_state=eSuspended;
 	return true;
@@ -165,6 +169,7 @@ bool SQGenerator::Resume(SQVM *v,SQObjectPtr &dest)
 	SQInteger size = _stack.size();
 	SQInteger target = &dest - &(v->_stack._vals[v->_stackbase]);
 	assert(target>=0 && target<=255);
+	SQInteger newbase = v->_top;
 	if(!v->EnterFrame(v->_top, v->_top + size, false))
 		return false;
 	v->ci->_generator   = this;
@@ -180,6 +185,10 @@ bool SQGenerator::Resume(SQVM *v,SQObjectPtr &dest)
 	for(SQInteger i=0;i<_ci._etraps;i++) {
 		v->_etraps.push_back(_etraps.top());
 		_etraps.pop_back();
+		SQExceptionTrap &et = v->_etraps.back();
+		// restore absolute stack base and size
+		et._stackbase += newbase;
+		et._stacksize += newbase;
 	}
 	SQObject _this = _stack._vals[0];
 	v->_stack[v->_stackbase] = type(_this) == OT_WEAKREF ? _weakref(_this)->_obj : _this;

File diff suppressed because it is too large
+ 655 - 652
SquiLu/squirrel/sqvm.cpp


+ 219 - 215
SquiLu/squirrel/sqvm.h

@@ -1,229 +1,233 @@
-/*	see copyright notice in squirrel.h */
-#ifndef _SQVM_H_
-#define _SQVM_H_
+/*	see copyright notice in squirrel.h */
+#ifndef _SQVM_H_
+#define _SQVM_H_
 
 #ifdef PROFILE_SQVM
 #include "HighResolutionTimer.h"
 #endif
-
-#include "sqopcodes.h"
-#include "sqobject.h"
-#define MAX_NATIVE_CALLS 100
-#define MIN_STACK_OVERHEAD 15
-
-#define SQ_SUSPEND_FLAG -666
-#define DONT_FALL_BACK 666
-//base lib
-void sq_base_register(HSQUIRRELVM v);
-
-struct SQExceptionTrap{
-	SQExceptionTrap() {}
-	SQExceptionTrap(SQInteger ss, SQInteger stackbase,SQInstruction *ip, SQInteger ex_target){ _stacksize = ss; _stackbase = stackbase; _ip = ip; _extarget = ex_target;}
-	SQExceptionTrap(const SQExceptionTrap &et) { (*this) = et;	}
-	SQInteger _stackbase;
-	SQInteger _stacksize;
-	SQInstruction *_ip;
-	SQInteger _extarget;
-};
-
-#define _INLINE
-
-#define STK(a) _stack._vals[_stackbase+(a)]
-#define TARGET _stack._vals[_stackbase+arg0]
-
-typedef sqvector<SQExceptionTrap> ExceptionsTraps;
-
-struct SQVM : public CHAINABLE_OBJ
-{
-	struct CallInfo{
-		//CallInfo() { _generator = NULL;}
-		SQInstruction *_ip;
-		SQObjectPtr *_literals;
-		SQObjectPtr _closure;
-		SQGenerator *_generator;
-		SQInt32 _etraps;
-		SQInt32 _prevstkbase;
-		SQInt32 _prevtop;
-		SQInt32 _target;
-		SQInt32 _ncalls;
-		SQBool _root;
-	};
-
+
+#include "sqopcodes.h"
+#include "sqobject.h"
+#define MAX_NATIVE_CALLS 100
+#define MIN_STACK_OVERHEAD 15
+
+#define SQ_SUSPEND_FLAG -666
+#define DONT_FALL_BACK 666
+//#define EXISTS_FALL_BACK -1
+
+#define GET_FLAG_RAW				0x00000001
+#define GET_FLAG_DO_NOT_RAISE_ERROR	0x00000002
+//base lib
+void sq_base_register(HSQUIRRELVM v);
+
+struct SQExceptionTrap{
+	SQExceptionTrap() {}
+	SQExceptionTrap(SQInteger ss, SQInteger stackbase,SQInstruction *ip, SQInteger ex_target){ _stacksize = ss; _stackbase = stackbase; _ip = ip; _extarget = ex_target;}
+	SQExceptionTrap(const SQExceptionTrap &et) { (*this) = et;	}
+	SQInteger _stackbase;
+	SQInteger _stacksize;
+	SQInstruction *_ip;
+	SQInteger _extarget;
+};
+
+#define _INLINE
+
+#define STK(a) _stack._vals[_stackbase+(a)]
+#define TARGET _stack._vals[_stackbase+arg0]
+
+typedef sqvector<SQExceptionTrap> ExceptionsTraps;
+
+struct SQVM : public CHAINABLE_OBJ
+{
+	struct CallInfo{
+		//CallInfo() { _generator = NULL;}
+		SQInstruction *_ip;
+		SQObjectPtr *_literals;
+		SQObjectPtr _closure;
+		SQGenerator *_generator;
+		SQInt32 _etraps;
+		SQInt32 _prevstkbase;
+		SQInt32 _prevtop;
+		SQInt32 _target;
+		SQInt32 _ncalls;
+		SQBool _root;
+	};
+
 typedef sqvector<CallInfo> CallInfoVec;
 #ifdef PROFILE_SQVM
 	struct OpProfile {SQInteger op, count; SQFloat total_time;};
 	typedef sqvector<OpProfile> OpProfileVec;
-#endif
-public:
-	void DebugHookProxy(SQInteger type, const SQChar * sourcename, SQInteger line, const SQChar * funcname);
-	static void _DebugHookProxy(HSQUIRRELVM v, SQInteger type, const SQChar * sourcename, SQInteger line, const SQChar * funcname);
-	enum ExecutionType { ET_CALL, ET_RESUME_GENERATOR, ET_RESUME_VM,ET_RESUME_THROW_VM };
-	SQVM(SQSharedState *ss);
-	~SQVM();
-	bool Init(SQVM *friendvm, SQInteger stacksize);
-	bool Execute(SQObjectPtr &func, SQInteger nargs, SQInteger stackbase, SQObjectPtr &outres, SQBool raiseerror, ExecutionType et = ET_CALL);
-	//starts a native call return when the NATIVE closure returns
-	bool CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newbase, SQObjectPtr &retval,bool &suspend);
-	//starts a SQUIRREL call in the same "Execution loop"
-	bool StartCall(SQClosure *closure, SQInteger target, SQInteger nargs, SQInteger stackbase, bool tailcall);
-	bool CreateClassInstance(SQClass *theclass, SQObjectPtr &inst, SQObjectPtr &constructor);
-	//call a generic closure pure SQUIRREL or NATIVE
-	bool Call(SQObjectPtr &closure, SQInteger nparams, SQInteger stackbase, SQObjectPtr &outres,SQBool raiseerror);
-	SQRESULT Suspend();
-
-	void CallDebugHook(SQInteger type,SQInteger forcedline=0);
+#endif
+public:
+	void DebugHookProxy(SQInteger type, const SQChar * sourcename, SQInteger line, const SQChar * funcname);
+	static void _DebugHookProxy(HSQUIRRELVM v, SQInteger type, const SQChar * sourcename, SQInteger line, const SQChar * funcname);
+	enum ExecutionType { ET_CALL, ET_RESUME_GENERATOR, ET_RESUME_VM,ET_RESUME_THROW_VM };
+	SQVM(SQSharedState *ss);
+	~SQVM();
+	bool Init(SQVM *friendvm, SQInteger stacksize);
+	bool Execute(SQObjectPtr &func, SQInteger nargs, SQInteger stackbase, SQObjectPtr &outres, SQBool raiseerror, ExecutionType et = ET_CALL);
+	//starts a native call return when the NATIVE closure returns
+	bool CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newbase, SQObjectPtr &retval,bool &suspend);
+	//starts a SQUIRREL call in the same "Execution loop"
+	bool StartCall(SQClosure *closure, SQInteger target, SQInteger nargs, SQInteger stackbase, bool tailcall);
+	bool CreateClassInstance(SQClass *theclass, SQObjectPtr &inst, SQObjectPtr &constructor);
+	//call a generic closure pure SQUIRREL or NATIVE
+	bool Call(SQObjectPtr &closure, SQInteger nparams, SQInteger stackbase, SQObjectPtr &outres,SQBool raiseerror);
+	SQRESULT Suspend();
+
+	void CallDebugHook(SQInteger type,SQInteger forcedline=0);
 	void CallErrorHandler(SQObjectPtr &e);
-	void CallAtExitHandler();
-	bool Get(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &dest, bool raw, SQInteger selfidx);
-	SQInteger FallBackGet(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest);
-	bool InvokeDefaultDelegate(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest);
-	bool Set(const SQObjectPtr &self, const SQObjectPtr &key, const SQObjectPtr &val, SQInteger selfidx);
-	SQInteger FallBackSet(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val);
-	bool NewSlot(const SQObjectPtr &self, const SQObjectPtr &key, const SQObjectPtr &val,bool bstatic);
-	bool NewSlotA(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val,const SQObjectPtr &attrs,bool bstatic,bool raw);
-	bool DeleteSlot(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &res);
-	bool Clone(const SQObjectPtr &self, SQObjectPtr &target);
-	bool ObjCmp(const SQObjectPtr &o1, const SQObjectPtr &o2,SQInteger &res);
-	bool StringCat(const SQObjectPtr &str, const SQObjectPtr &obj, SQObjectPtr &dest);
-	static bool IsEqual(const SQObjectPtr &o1,const SQObjectPtr &o2);
-	static bool IsEqualIdentity(const SQObjectPtr &o1,const SQObjectPtr &o2);
-	bool ToString(const SQObjectPtr &o,SQObjectPtr &res);
-	SQString *PrintObjVal(const SQObjectPtr &o);
-
-
-	void Raise_Error(const SQChar *s, ...);
-	void Raise_Error(const SQObjectPtr &desc);
-	void Raise_IdxError(const SQObjectPtr &o);
-	void Raise_CompareError(const SQObject &o1, const SQObject &o2);
-	void Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger type);
-
-	void FindOuter(SQObjectPtr &target, SQObjectPtr *stackindex);
-	void RelocateOuters();
-	void CloseOuters(SQObjectPtr *stackindex);
-
-	bool TypeOf(const SQObjectPtr &obj1, SQObjectPtr &dest);
-	bool CallMetaMethod(SQObjectPtr &closure, SQMetaMethod mm, SQInteger nparams, SQObjectPtr &outres);
-	bool ArithMetaMethod(SQInteger op, const SQObjectPtr &o1, const SQObjectPtr &o2, SQObjectPtr &dest);
-	bool Return(SQInteger _arg0, SQInteger _arg1, SQObjectPtr &retval);
-	//new stuff
-	_INLINE bool ARITH_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,const SQObjectPtr &o2);
-	_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 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);
-	//_INLINE bool LOCAL_INC(SQInteger op,SQObjectPtr &target, SQObjectPtr &a, SQObjectPtr &incr);
-	_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,SQInteger arg0);
-#ifdef _DEBUG_DUMP
-	void dumpstack(SQInteger stackbase=-1, bool dumpall = false);
-#endif
-
-#ifndef NO_GARBAGE_COLLECTOR
-	void Mark(SQCollectable **chain);
-	SQObjectType GetType() {return OT_THREAD;}
-#endif
-	void Finalize();
-	void GrowCallStack() {
-		SQInteger newsize = _alloccallsstacksize*2;
-		_callstackdata.resize(newsize);
-		_callsstack = &_callstackdata[0];
-		_alloccallsstacksize = newsize;
-	}
-	bool EnterFrame(SQInteger newbase, SQInteger newtop, bool tailcall);
-	void LeaveFrame();
-	void Release(){ sq_delete(this,SQVM); }
-////////////////////////////////////////////////////////////////////////////
-	//stack functions for the api
-	void Remove(SQInteger n);
-	void Replace(SQInteger n);
-	void ReplaceAbs(SQInteger n);
-	void Insert(SQInteger n);
-
-	static bool IsFalse(SQObjectPtr &o);
-
-	void Pop();
-	void Pop(SQInteger n);
-	void Push(const SQObjectPtr &o);
-	void PushNull();
-	SQObjectPtr &Top();
-	SQObjectPtr &PopGet();
-	SQObjectPtr &GetUp(SQInteger n);
-	SQObjectPtr &GetAt(SQInteger n);
-
-	SQObjectPtrVec _stack;
-
-	SQInteger _top;
-	SQInteger _stackbase;
-	SQOuter	*_openouters;
-	SQObjectPtr _roottable;
-	SQObjectPtr _lasterror;
-	SQStackInfos _lasterror_stackinfo;
-	SQObjectPtr _errorhandler;
-	SQObjectPtr _atexithandler;
-
-	bool _debughook;
-	SQDEBUGHOOK _debughook_native;
-	SQObjectPtr _debughook_closure;
-
-	SQObjectPtr temp_reg;
-
-
-	CallInfo* _callsstack;
-	SQInteger _callsstacksize;
-	SQInteger _alloccallsstacksize;
-	sqvector<CallInfo>  _callstackdata;
-
-	ExceptionsTraps _etraps;
-	CallInfo *ci;
-	void *_foreignptr;
-	//VMs sharing the same state
-	SQSharedState *_sharedstate;
-	SQInteger _nnativecalls;
-	SQInteger _nmetamethodscall;
-	//suspend infos
-	SQBool _suspended;
+	void CallAtExitHandler();
+	bool Get(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &dest, bool raw, SQInteger selfidx);
+	SQInteger FallBackGet(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest);
+	bool InvokeDefaultDelegate(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest);
+	bool Set(const SQObjectPtr &self, const SQObjectPtr &key, const SQObjectPtr &val, SQInteger selfidx);
+	SQInteger FallBackSet(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val);
+	bool NewSlot(const SQObjectPtr &self, const SQObjectPtr &key, const SQObjectPtr &val,bool bstatic);
+	bool NewSlotA(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val,const SQObjectPtr &attrs,bool bstatic,bool raw);
+	bool DeleteSlot(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &res);
+	bool Clone(const SQObjectPtr &self, SQObjectPtr &target);
+	bool ObjCmp(const SQObjectPtr &o1, const SQObjectPtr &o2,SQInteger &res);
+	bool StringCat(const SQObjectPtr &str, const SQObjectPtr &obj, SQObjectPtr &dest);
+	static bool IsEqual(const SQObjectPtr &o1,const SQObjectPtr &o2);
+	static bool IsEqualIdentity(const SQObjectPtr &o1,const SQObjectPtr &o2);
+	bool ToString(const SQObjectPtr &o,SQObjectPtr &res);
+	SQString *PrintObjVal(const SQObjectPtr &o);
+
+
+	void Raise_Error(const SQChar *s, ...);
+	void Raise_Error(const SQObjectPtr &desc);
+	void Raise_IdxError(const SQObjectPtr &o);
+	void Raise_CompareError(const SQObject &o1, const SQObject &o2);
+	void Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger type);
+
+	void FindOuter(SQObjectPtr &target, SQObjectPtr *stackindex);
+	void RelocateOuters();
+	void CloseOuters(SQObjectPtr *stackindex);
+
+	bool TypeOf(const SQObjectPtr &obj1, SQObjectPtr &dest);
+	bool CallMetaMethod(SQObjectPtr &closure, SQMetaMethod mm, SQInteger nparams, SQObjectPtr &outres);
+	bool ArithMetaMethod(SQInteger op, const SQObjectPtr &o1, const SQObjectPtr &o2, SQObjectPtr &dest);
+	bool Return(SQInteger _arg0, SQInteger _arg1, SQObjectPtr &retval);
+	//new stuff
+	_INLINE bool ARITH_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,const SQObjectPtr &o2);
+	_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 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);
+	//_INLINE bool LOCAL_INC(SQInteger op,SQObjectPtr &target, SQObjectPtr &a, SQObjectPtr &incr);
+	_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,SQInteger arg0);
+#ifdef _DEBUG_DUMP
+	void dumpstack(SQInteger stackbase=-1, bool dumpall = false);
+#endif
+
+#ifndef NO_GARBAGE_COLLECTOR
+	void Mark(SQCollectable **chain);
+	SQObjectType GetType() {return OT_THREAD;}
+#endif
+	void Finalize();
+	void GrowCallStack() {
+		SQInteger newsize = _alloccallsstacksize*2;
+		_callstackdata.resize(newsize);
+		_callsstack = &_callstackdata[0];
+		_alloccallsstacksize = newsize;
+	}
+	bool EnterFrame(SQInteger newbase, SQInteger newtop, bool tailcall);
+	void LeaveFrame();
+	void Release(){ sq_delete(this,SQVM); }
+////////////////////////////////////////////////////////////////////////////
+	//stack functions for the api
+	void Remove(SQInteger n);
+	void Replace(SQInteger n);
+	void ReplaceAbs(SQInteger n);
+	void Insert(SQInteger n);
+
+	static bool IsFalse(SQObjectPtr &o);
+
+	void Pop();
+	void Pop(SQInteger n);
+	void Push(const SQObjectPtr &o);
+	void PushNull();
+	SQObjectPtr &Top();
+	SQObjectPtr &PopGet();
+	SQObjectPtr &GetUp(SQInteger n);
+	SQObjectPtr &GetAt(SQInteger n);
+
+	SQObjectPtrVec _stack;
+
+	SQInteger _top;
+	SQInteger _stackbase;
+	SQOuter	*_openouters;
+	SQObjectPtr _roottable;
+	SQObjectPtr _lasterror;
+	SQStackInfos _lasterror_stackinfo;
+	SQObjectPtr _errorhandler;
+	SQObjectPtr _atexithandler;
+
+	bool _debughook;
+	SQDEBUGHOOK _debughook_native;
+	SQObjectPtr _debughook_closure;
+
+	SQObjectPtr temp_reg;
+
+
+	CallInfo* _callsstack;
+	SQInteger _callsstacksize;
+	SQInteger _alloccallsstacksize;
+	sqvector<CallInfo>  _callstackdata;
+
+	ExceptionsTraps _etraps;
+	CallInfo *ci;
+	void *_foreignptr;
+	//VMs sharing the same state
+	SQSharedState *_sharedstate;
+	SQInteger _nnativecalls;
+	SQInteger _nmetamethodscall;
+	//suspend infos
+	SQBool _suspended;
 	SQBool _suspended_root;
-	SQBool _check_delayed_relase_hooks;
-	SQInteger _suspended_target;
+	SQBool _check_delayed_relase_hooks;
+	SQInteger _suspended_target;
 	SQInteger _suspended_traps;
 #ifdef PROFILE_SQVM
 	OpProfileVec _op_profile;
 	HighResolutionTimer _op_profile_timer;
-#endif
-};
-
-struct AutoDec{
-	AutoDec(SQInteger *n) { _n = n; }
-	~AutoDec() { (*_n)--; }
-	SQInteger *_n;
-};
-
-inline SQObjectPtr &stack_get(HSQUIRRELVM v,SQInteger idx){return ((idx>=0)?(v->GetAt(idx+v->_stackbase-1)):(v->GetUp(idx)));}
-
-#define _ss(_vm_) (_vm_)->_sharedstate
-
-#ifndef NO_GARBAGE_COLLECTOR
-#define _opt_ss(_vm_) (_vm_)->_sharedstate
-#else
-#define _opt_ss(_vm_) NULL
-#endif
-
-#define PUSH_CALLINFO(v,nci){ \
-	SQInteger css = v->_callsstacksize; \
-	if(css == v->_alloccallsstacksize) { \
-		v->GrowCallStack(); \
-	} \
-	v->ci = &v->_callsstack[css]; \
-	*(v->ci) = nci; \
-	v->_callsstacksize++; \
-}
-
-#define POP_CALLINFO(v){ \
-	SQInteger css = --v->_callsstacksize; \
-	v->ci->_closure.Null(); \
-	v->ci = css?&v->_callsstack[css-1]:NULL;	\
-}
-#endif //_SQVM_H_
+#endif
+};
+
+struct AutoDec{
+	AutoDec(SQInteger *n) { _n = n; }
+	~AutoDec() { (*_n)--; }
+	SQInteger *_n;
+};
+
+inline SQObjectPtr &stack_get(HSQUIRRELVM v,SQInteger idx){return ((idx>=0)?(v->GetAt(idx+v->_stackbase-1)):(v->GetUp(idx)));}
+
+#define _ss(_vm_) (_vm_)->_sharedstate
+
+#ifndef NO_GARBAGE_COLLECTOR
+#define _opt_ss(_vm_) (_vm_)->_sharedstate
+#else
+#define _opt_ss(_vm_) NULL
+#endif
+
+#define PUSH_CALLINFO(v,nci){ \
+	SQInteger css = v->_callsstacksize; \
+	if(css == v->_alloccallsstacksize) { \
+		v->GrowCallStack(); \
+	} \
+	v->ci = &v->_callsstack[css]; \
+	*(v->ci) = nci; \
+	v->_callsstacksize++; \
+}
+
+#define POP_CALLINFO(v){ \
+	SQInteger css = --v->_callsstacksize; \
+	v->ci->_closure.Null(); \
+	v->ci = css?&v->_callsstack[css-1]:NULL;	\
+}
+#endif //_SQVM_H_

Some files were not shown because too many files changed in this diff