Browse Source

Add new api function to push a new class with or without parent.

mingodad 13 năm trước cách đây
mục cha
commit
2f7a543579
2 tập tin đã thay đổi với 20 bổ sung0 xóa
  1. 3 0
      include/squirrel.h
  2. 17 0
      squirrel/sqapi.cpp

+ 3 - 0
include/squirrel.h

@@ -398,6 +398,9 @@ SQUIRREL_API SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPoint
 SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag);
 SQUIRREL_API SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize);
 SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase);
+SQUIRREL_API SQRESULT sq_pushnewclass(HSQUIRRELVM v, const SQChar *className,
+                          const SQChar *parentName,
+                          void *classTag, SQRegFunction *methods);
 SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx);

+ 17 - 0
squirrel/sqapi.cpp

@@ -290,6 +290,23 @@ SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase)
 	return SQ_OK;
 }
 
+SQRESULT sq_pushnewclass(HSQUIRRELVM v, const SQChar *className,
+                          const SQChar *parentName,
+                          void *classTag, SQRegFunction *methods){
+    if(!className || !classTag)
+        return sq_throwerror(v, _SC("Missing base class name or class tag."));
+	sq_pushstring(v,className,-1);
+	if(parentName){
+        sq_pushstring(v, parentName,-1);
+        if (SQ_FAILED(sq_get(v, -3)))
+            return sq_throwerror(v, _SC("Missing base class \"%s\" for \"%s\"."), parentName, className);
+	}
+	sq_newclass(v,SQTrue);
+	sq_settypetag(v,-1,classTag);
+	if(methods) sq_insert_reg_funcs(v, methods);
+	return sq_newslot(v, -3, parentName ? SQTrue : SQFalse);
+}
+
 SQBool sq_instanceof(HSQUIRRELVM v)
 {
 	SQObjectPtr &inst = stack_get(v,-1);