2
0
Эх сурвалжийг харах

Add new parameter to sq_pushnewclass to indicate if we want the new class left on top of the stack and fixed the logic inside this function.

mingodad 13 жил өмнө
parent
commit
0682b72199

+ 1 - 1
include/squirrel.h

@@ -400,7 +400,7 @@ SQUIRREL_API SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger
 SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase);
 SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase);
 SQUIRREL_API SQRESULT sq_pushnewclass(HSQUIRRELVM v, const SQChar *className,
 SQUIRREL_API SQRESULT sq_pushnewclass(HSQUIRRELVM v, const SQChar *className,
                           const SQChar *parentName,
                           const SQChar *parentName,
-                          void *classTag, SQRegFunction *methods);
+                          void *classTag, SQRegFunction *methods, SQBool leaveOnTop);
 SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx);

+ 24 - 6
squirrel/sqapi.cpp

@@ -292,19 +292,37 @@ SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase)
 
 
 SQRESULT sq_pushnewclass(HSQUIRRELVM v, const SQChar *className,
 SQRESULT sq_pushnewclass(HSQUIRRELVM v, const SQChar *className,
                           const SQChar *parentName,
                           const SQChar *parentName,
-                          void *classTag, SQRegFunction *methods){
+                          void *classTag, SQRegFunction *methods,
+                          SQBool leaveOnTop){
     if(!className || !classTag)
     if(!className || !classTag)
-        return sq_throwerror(v, _SC("Missing base class name or class tag."));
+        return sq_throwerror(v, _SC("Missing class name or class tag."));
+    SQBool hasBase = parentName ? SQTrue : SQFalse;
+    SQInteger top = sq_gettop(v);
+    HSQOBJECT obj;
+
 	sq_pushstring(v,className,-1);
 	sq_pushstring(v,className,-1);
-	if(parentName){
+	if(hasBase){
         sq_pushstring(v, parentName,-1);
         sq_pushstring(v, parentName,-1);
-        if (SQ_FAILED(sq_get(v, -3)))
+        if (SQ_FAILED(sq_getonroottable(v)) || sq_gettype(v, -1) != OT_CLASS){
+            sq_settop(v, top); //leave stack as we got it
             return sq_throwerror(v, _SC("Missing base class \"%s\" for \"%s\"."), parentName, className);
             return sq_throwerror(v, _SC("Missing base class \"%s\" for \"%s\"."), parentName, className);
+        }
 	}
 	}
-	sq_newclass(v,SQTrue);
+	sq_newclass(v, hasBase);
 	sq_settypetag(v,-1,classTag);
 	sq_settypetag(v,-1,classTag);
 	if(methods) sq_insert_reg_funcs(v, methods);
 	if(methods) sq_insert_reg_funcs(v, methods);
-	return sq_newslot(v, -3, parentName ? SQTrue : SQFalse);
+
+	if(leaveOnTop){
+	    sq_resetobject(&obj);
+	    sq_getstackobj(v, -1, &obj);
+	}
+
+	if(SQ_FAILED(sq_newslot(v, -3, SQFalse))){
+            sq_settop(v, top); //leave stack as we got it
+            return SQ_ERROR;
+    }
+    if(leaveOnTop) sq_pushobject(v, obj);
+	return SQ_OK;
 }
 }
 
 
 SQBool sq_instanceof(HSQUIRRELVM v)
 SQBool sq_instanceof(HSQUIRRELVM v)