Просмотр исходного кода

Code refactored to improve performance.

mingodad 12 лет назад
Родитель
Сommit
7b9948ad55
1 измененных файлов с 29 добавлено и 17 удалено
  1. 29 17
      SquiLu/squirrel/sqvm.cpp

+ 29 - 17
SquiLu/squirrel/sqvm.cpp

@@ -54,11 +54,12 @@ bool SQVM::BW_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,con
 
 #define _ARITH_(op,trg,o1,o2) _ARITH_BASE_(op,trg,o1,o2, trg = _integer(o1) op _integer(o2))
 
-#define _ARITH_NOZERO(op,trg,o1,o2,err) _ARITH_BASE_(op,trg,o1,o2, \
-		{ SQInteger i1 = _integer(o1); SQInteger i2 = _integer(o2);\
+#define _ARITH_NOZERO(op,trg,o1,o2,err) _ARITH_BASE_(op,trg,o1,o2, {\
+			SQInteger i1 = _integer(o1); SQInteger i2 = _integer(o2);\
             if(i2 == 0) { Raise_Error(err); SQ_THROW(); } \
             else if(i2 == -1 && i1 == INT_MIN) { Raise_Error(_SC("integer overflow")); SQ_THROW(); }\
-            trg = i1 op i2; })
+            trg = i1 op i2;\
+		})
 
 bool SQVM::ARITH_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,const SQObjectPtr &o2)
 {
@@ -85,8 +86,17 @@ bool SQVM::ARITH_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,
 			trg = res; }
 			break;
 		case (OT_FLOAT|OT_INTEGER):
-		case (OT_FLOAT):{
-			SQFloat res, f1 = tofloat(o1), f2 = tofloat(o2);
+		case (OT_FLOAT):{
+			SQFloat res, f1, f2;
+			if(tmask == OT_FLOAT){
+				f1 = _float(o1);
+				f2 = _float(o2);
+			}
+			else
+			{
+				f1 = tofloat(o1);
+				f2 = tofloat(o2);
+			}
 			switch(op) {
 			case '+': res = f1 + f2; break;
 			case '-': res = f1 - f2; break;
@@ -179,18 +189,19 @@ SQVM::~SQVM()
 
 bool SQVM::ArithMetaMethod(SQInteger op,const SQObjectPtr &o1,const SQObjectPtr &o2,SQObjectPtr &dest)
 {
-	SQMetaMethod mm;
-	switch(op){
-		case _SC('+'): mm=MT_ADD; break;
-		case _SC('-'): mm=MT_SUB; break;
-		case _SC('/'): mm=MT_DIV; break;
-		case _SC('*'): mm=MT_MUL; break;
-		case _SC('%'): mm=MT_MODULO; break;
-		default: assert(0); break; //shutup compiler
-	}
-	if(is_delegable(o1) && _delegable(o1)->_delegate) {
+	if(is_delegable(o1) && _delegable(o1)->_delegate) {
+
+		SQObjectPtr closure;
+		SQMetaMethod mm;
+		switch(op){
+			case _SC('+'): mm=MT_ADD; break;
+			case _SC('-'): mm=MT_SUB; break;
+			case _SC('/'): mm=MT_DIV; break;
+			case _SC('*'): mm=MT_MUL; break;
+			case _SC('%'): mm=MT_MODULO; break;
+			default: assert(0); break; //shutup compiler
+		}
 
-		SQObjectPtr closure;
 		if(_delegable(o1)->GetMetaMethod(this, mm, closure)) {
 			Push(o1);Push(o2);
 			return CallMetaMethod(closure,mm,2,dest);
@@ -1283,7 +1294,8 @@ bool SQVM::CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newb
 		retval.Null();
 	}
 	//retval = ret ? _stack._vals[_top-1] : _null_;
-	LeaveFrame();
+	LeaveFrame();
+	if(_check_delayed_relase_hooks) _sharedstate->CallDelayedReleaseHooks(this);
 	return true;
 }