Browse Source

Again moved the call to CallDelayedReleaseHooks to make it work with coroutines too.

mingodad 12 years ago
parent
commit
90c87c87f5
2 changed files with 29 additions and 36 deletions
  1. 23 13
      SquiLu-ext/dad_utils.cpp
  2. 6 23
      SquiLu/squirrel/sqvm.cpp

+ 23 - 13
SquiLu-ext/dad_utils.cpp

@@ -4,7 +4,6 @@
 typedef struct {
 typedef struct {
     HSQOBJECT func_to_call;
     HSQOBJECT func_to_call;
     HSQOBJECT param;
     HSQOBJECT param;
-    HSQUIRRELVM v;
 } gc_scope_alert_st;
 } gc_scope_alert_st;
 
 
 static const SQChar *gc_scope_alert_TAG = _SC("gc_scope_alert");
 static const SQChar *gc_scope_alert_TAG = _SC("gc_scope_alert");
@@ -14,17 +13,17 @@ static SQRESULT gc_scope_alert_releasehook(SQUserPointer p, SQInteger size, HSQU
 	gc_scope_alert_st *self = ((gc_scope_alert_st *)p);
 	gc_scope_alert_st *self = ((gc_scope_alert_st *)p);
 //printf("%p %p\n", p, v);
 //printf("%p %p\n", p, v);
 	if(self){
 	if(self){
-	    //if(v){
-            SQInteger top = sq_gettop(self->v);
-            sq_reservestack(self->v, 20);
-            sq_pushobject(self->v, self->func_to_call);
-            sq_pushroottable(self->v);
-            sq_pushobject(self->v, self->param);
-            sq_call(self->v, 2, SQFalse, SQTrue);
-            sq_release(self->v, &self->func_to_call);
-            sq_release(self->v, &self->param);
-            sq_settop(self->v, top);
-	    //}
+	    if(v){
+            SQInteger top = sq_gettop(v);
+            sq_reservestack(v, 20);
+            sq_pushobject(v, self->func_to_call);
+            sq_pushroottable(v);
+            sq_pushobject(v, self->param);
+            sq_call(v, 2, SQFalse, SQTrue);
+            sq_release(v, &self->func_to_call);
+            sq_release(v, &self->param);
+            sq_settop(v, top);
+	    }
 	    //else
 	    //else
 	    sq_free(self, sizeof(gc_scope_alert_st));
 	    sq_free(self, sizeof(gc_scope_alert_st));
 	}
 	}
@@ -35,7 +34,6 @@ static SQRESULT gc_scope_alert_constructor(HSQUIRRELVM v)
 {
 {
     SQInteger rc;
     SQInteger rc;
     gc_scope_alert_st proto;
     gc_scope_alert_st proto;
-    proto.v = v;
     sq_resetobject(&proto.func_to_call);
     sq_resetobject(&proto.func_to_call);
     sq_resetobject(&proto.param);
     sq_resetobject(&proto.param);
     if((rc = sq_getstackobj(v, 2, &proto.func_to_call)) < 0) return rc;
     if((rc = sq_getstackobj(v, 2, &proto.func_to_call)) < 0) return rc;
@@ -52,6 +50,16 @@ static SQRESULT gc_scope_alert_constructor(HSQUIRRELVM v)
     return 1;
     return 1;
 }
 }
 
 
+static SQRESULT spectralnorm_A(HSQUIRRELVM v)
+{
+	SQ_FUNC_VARS_NO_TOP();
+	SQ_GET_INTEGER(v, 2, i);
+	SQ_GET_INTEGER(v, 3, j);
+	SQInteger ij = j + i++;
+	sq_pushfloat(v, 1.0/(ij * (ij+1)/2.0+i));
+    return 1;
+}
+
 #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),  gc_scope_alert_##name,nparams,tycheck}
 #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),  gc_scope_alert_##name,nparams,tycheck}
 static SQRegFunction gc_scope_alert_methods[] =
 static SQRegFunction gc_scope_alert_methods[] =
 {
 {
@@ -65,6 +73,8 @@ extern "C" {
 
 
     SQRESULT sqext_register_dad_utils(HSQUIRRELVM v)
     SQRESULT sqext_register_dad_utils(HSQUIRRELVM v)
     {
     {
+    	sq_insertfunc(v, _SC("spectralnorm_A"), spectralnorm_A, 3, _SC(".ii"), true);
+
         sq_pushstring(v,_SC("dad_utils"),-1);
         sq_pushstring(v,_SC("dad_utils"),-1);
         sq_newtable(v);
         sq_newtable(v);
 
 

+ 6 - 23
SquiLu/squirrel/sqvm.cpp

@@ -818,7 +818,10 @@ exception_restore:
 						continue;
 						continue;
 					case OT_NATIVECLOSURE: {
 					case OT_NATIVECLOSURE: {
 						bool suspend;
 						bool suspend;
-						_GUARD(CallNative(_nativeclosure(clo), arg3, _stackbase+arg2, clo,suspend));
+						_GUARD(CallNative(_nativeclosure(clo), arg3, _stackbase+arg2, clo,suspend));
+
+						if(_check_delayed_relase_hooks) _sharedstate->CallDelayedReleaseHooks(this);
+
 						if(suspend){
 						if(suspend){
 							_suspended = SQTrue;
 							_suspended = SQTrue;
 							_suspended_target = sarg0;
 							_suspended_target = sarg0;
@@ -1747,7 +1750,8 @@ void SQVM::LeaveFrame() {
 					case OT_CLOSURE:
 					case OT_CLOSURE:
 					case OT_NATIVECLOSURE:{
 					case OT_NATIVECLOSURE:{
 						SQObjectPtr res;
 						SQObjectPtr res;
-						Call(dtor, 1, last_top, res, SQFalse);
+						Push(val);
+						Call(dtor, 1, last_top+1, res, SQFalse);
 					}
 					}
 					break;
 					break;
 					default: break; //shutup GCC 4.x
 					default: break; //shutup GCC 4.x
@@ -1781,28 +1785,7 @@ void SQVM::LeaveFrame() {
 	if(_openouters) CloseOuters(&(_stack._vals[last_stackbase]));
 	if(_openouters) CloseOuters(&(_stack._vals[last_stackbase]));
 	while (last_top >= _top) {
 	while (last_top >= _top) {
 		_stack._vals[last_top--].Null();
 		_stack._vals[last_top--].Null();
-#if 0
-		SQObjectPtr &val = _stack._vals[last_top];
-		if(val._type == OT_INSTANCE){
-			SQObjectPtr dtor;
-			if(_instance(val)->_class->GetDestructor(dtor)){
-				switch(type(dtor)) {
-					case OT_CLOSURE:
-					case OT_NATIVECLOSURE:{
-						SQObjectPtr res;
-						Push(val);
-						Call(dtor, 1, last_top+1, res, SQFalse);
-					}
-					break;
-					default: break; //shutup GCC 4.x
-				}
-			}
-		}
-		if(val._type != OT_NULL) val.Null();
-		--last_top;
-#endif
 	}
 	}
-	if(_check_delayed_relase_hooks) _sharedstate->CallDelayedReleaseHooks(this);
 }
 }
 
 
 void SQVM::RelocateOuters()
 void SQVM::RelocateOuters()