64 lines
1.6 KiB
C++
64 lines
1.6 KiB
C++
#include "CommonHeader.h"
|
|
#include "Class.h"
|
|
|
|
namespace nonut
|
|
{
|
|
Class::Class(const String& className, const SQObject classObjectInstance)
|
|
{
|
|
HSQUIRRELVM vm = Sqrat::DefaultVM::Get();
|
|
if (classObjectInstance._type == OT_NULL)
|
|
{
|
|
const auto top = sq_gettop(vm);
|
|
|
|
sq_pushroottable(vm); //push root table
|
|
sq_pushstring(vm, className.c_str(), className.length()); //push class name
|
|
|
|
if (sq_get(vm, -2) == SQ_OK) //retrieve class
|
|
{
|
|
sq_getstackobj(vm, -1, &classObject);
|
|
sq_addref(vm, &classObject);
|
|
if (sq_createinstance(vm, -1) == SQ_OK) //create class instance
|
|
{
|
|
//1. Get object ptr
|
|
sq_getstackobj(vm, -1, &this->classObjectInstance); //retrieve object
|
|
sq_addref(vm, &this->classObjectInstance);
|
|
//Add ref thanks to which object will not be immediately deleted
|
|
sq_pop(vm, 1); // pop class instance
|
|
}
|
|
}
|
|
sq_settop(vm, top); // TODO: FIX LEAK PROPERLY
|
|
}
|
|
else
|
|
{
|
|
this->classObjectInstance = classObjectInstance;
|
|
const auto top = sq_gettop(vm);
|
|
sq_addref(vm, &this->classObjectInstance);
|
|
|
|
sq_pushroottable(vm); //push root table
|
|
sq_pushstring(vm, className.c_str(), className.length()); //push class name
|
|
|
|
if (sq_get(vm, -2) == SQ_OK) //retrieve class
|
|
{
|
|
sq_getstackobj(vm, -1, &classObject);
|
|
sq_addref(vm, &classObject);
|
|
}
|
|
|
|
sq_settop(vm, top);
|
|
}
|
|
}
|
|
|
|
Class::~Class()
|
|
{
|
|
HSQUIRRELVM vm = Sqrat::DefaultVM::Get();
|
|
sq_release(vm, &classObject);
|
|
sq_release(vm, &classObjectInstance);
|
|
sq_resetobject(&classObject);
|
|
sq_resetobject(&classObjectInstance);
|
|
}
|
|
|
|
SQObject Class::getInstance() const
|
|
{
|
|
return classObjectInstance;
|
|
}
|
|
}
|