Files
PyG2O/src/NoNut/core/Class.cpp
2024-11-04 13:50:49 +03:00

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;
}
}