new object creation interface

This commit is contained in:
IlyaShurupov 2024-03-25 10:25:25 +03:00
parent c737f41d8a
commit e937d189df
23 changed files with 103 additions and 84 deletions

View file

@ -127,7 +127,7 @@ void FunctionDefinition::EvalStatement(Statement* stm) {
mLocals.put(func.mFunctionId, mConstants.get(func.mFunctionId));
// create and register const func object
auto function_obj = objects_api::cast<MethodObject>(NDO->create("method"));
auto function_obj = objects_api::create<MethodObject>();
auto method_const_obj = mConstants.addMethod(func.mFunctionId, function_obj);
for (auto child_stm : stm_func_def->mStatements->mStatements) {
@ -155,7 +155,7 @@ void FunctionDefinition::EvalStatement(Statement* stm) {
mLocals.put(func.mFunctionId, mConstants.get(func.mFunctionId));
// create and register const func object
auto function_obj = objects_api::cast<MethodObject>(NDO->create("method"));
auto function_obj = objects_api::create<MethodObject>();
auto method_const_obj = mConstants.addMethod(func.mFunctionId, function_obj);
// compile function

View file

@ -51,10 +51,8 @@ void objects_api::define(ObjectType* type) {
type->type_methods.init();
}
Object* objects_api::create(const std::string& name) {
MODULE_SANITY_CHECK(gModuleObjects)
const ObjectType* type = types.get(name);
Object* objects_api::create(const ObjectType* type) {
ASSERT(type);
Object* obj_instance = ObjectMemAllocate(type);
@ -108,7 +106,7 @@ bool objects_api::compare(Object* first, Object* second) {
}
Object* objects_api::instantiate(Object* in) {
obj::Object* obj = NDO->create(in->type->name);
obj::Object* obj = objects_api::createByName(in->type->name);
tp::obj::objects_api::copy(obj, in);
return obj;
}
@ -162,8 +160,8 @@ void objects_api::destroy(Object* in) const {
return;
}
if (in->refc > 1) {
in->refc--;
if (in->references > 1) {
in->references--;
return;
}

View file

@ -23,7 +23,7 @@ Object* ObjectMemAllocate(const ObjectType* type) {
object->down = nullptr;
object->flags = 0;
object->refc = (alni) 1;
object->references = (alni) 1;
if (bottom) {
bottom->down = object;
@ -69,7 +69,7 @@ void obj::assertNoLeaks() {
printf("ERROR : not all objects are destroyed\n");
ualni idx = 0;
for (Object* object = bottom; object; object = object->up) {
printf(" ===== Object - %llu. Ref count - %lli ===== \n", idx, object->refc);
printf(" ===== Object - %llu. Ref count - %lli ===== \n", idx, object->references);
logTypeData(object->type);
idx++;
}

View file

@ -52,7 +52,7 @@ void Interpreter::exec(
}
}
bool Interpreter::finished() { return !mCallStack.len(); }
bool Interpreter::finished() const { return !mCallStack.len(); }
void Interpreter::stepBytecode() {
halni call_depth = mCallStack.len();
@ -236,7 +236,7 @@ void Interpreter::stepBytecodeIn() {
{
auto type = mOperandsStack.getOperand<StringObject>();
auto id = mOperandsStack.getOperand<StringObject>();
mScopeStack.addLocal(NDO->create(type->val), id->val);
mScopeStack.addLocal(objects_api::createByName(type->val.c_str()), id->val);
break;
}
@ -253,12 +253,11 @@ void Interpreter::stepBytecodeIn() {
case OpCode::OBJ_CREATE:
{
auto type = mOperandsStack.getOperand<StringObject>();
Object* new_obj = nullptr;
// basic types
auto idx = NDO->types.presents(type->val);
if (idx) {
auto new_obj = NDO->create(type->val);
Object* new_obj = objects_api::createByName(type->val.c_str());
mOperandsStack.push(new_obj);
mScopeStack.addTemp(new_obj);
@ -286,7 +285,7 @@ void Interpreter::stepBytecodeIn() {
case OpCode::CLASS_CONSTRUCT:
{
auto class_obj = (ClassObject*) NDO->create("class");
auto class_obj = NDO->create<ClassObject>();
for (auto local : mScopeStack.getCurrentScope()->mLocals) {
class_obj->addMember(local->val, local->key);

View file

@ -10,7 +10,7 @@ void BoolObject::constructor(BoolObject* self) { self->val = false; }
void BoolObject::copy(BoolObject* self, const BoolObject* in) { self->val = in->val; }
BoolObject* BoolObject::create(bool in) {
auto out = objects_api::cast<BoolObject>(NDO->create("bool"));
auto out = objects_api::create<BoolObject>();
out->val = alni(in);
return out;
}

View file

@ -7,14 +7,14 @@ using namespace tp;
using namespace obj;
void ClassObject::constructor(ClassObject* self) {
self->members = objects_api::cast<DictObject>(NDO->create("dict"));
self->members = objects_api::create<DictObject>();
self->addMember(NDO_NULL, "__init__");
self->addMember(NDO_NULL, "__del__");
}
void ClassObject::copy(ClassObject* self, const ClassObject* blueprint) {
NDO->copy(self->members, blueprint->members);
objects_api::copy(self->members, blueprint->members);
}
void ClassObject::destructor(ClassObject* self) { NDO->destroy(self->members); }
@ -22,24 +22,24 @@ void ClassObject::destructor(ClassObject* self) { NDO->destroy(self->members); }
void ClassObject::addMember(Object* obj, const std::string& id) { members->put(id, obj); }
void ClassObject::createMember(const std::string& type, const std::string& id) {
auto newo = NDO->create(type);
auto newo = tp::obj::objects_api::createByName(type.c_str());
members->put(id, newo);
}
alni ClassObject::save_size(ClassObject* self) {
return sizeof(alni); // dict object adress
return sizeof(alni); // dict object address
}
void ClassObject::save(ClassObject* self, ArchiverOut& file_self) {
// save dictobject
// save dict object
alni ndo_object_adress = NDO->save(file_self, self->members);
file_self << ndo_object_adress;
}
void ClassObject::load(ArchiverIn& file_self, ClassObject* self) {
alni ndo_object_adress;
file_self >> ndo_object_adress;
self->members = objects_api::cast<DictObject>(NDO->load(file_self, ndo_object_adress));
alni ndo_object_address;
file_self >> ndo_object_address;
self->members = objects_api::cast<DictObject>(NDO->load(file_self, ndo_object_address));
tp::obj::objects_api::increaseReferenceCount(self->members);
}
@ -57,16 +57,17 @@ alni allocated_size_recursive(ClassObject* self) {
return out;
}
struct ObjectType ClassObject::TypeData = { .base = nullptr,
.constructor = (object_constructor) ClassObject::constructor,
.destructor = (object_destructor) ClassObject::destructor,
.copy = (object_copy) ClassObject::copy,
.size = sizeof(ClassObject),
.name = "class",
.save_size = (object_save_size) save_size,
.save = (object_save) save,
.load = (object_load) load,
.childs_retrival = (object_debug_all_childs_retrival) childs_retrival,
.allocated_size = (object_allocated_size) allocated_size,
.allocated_size_recursive =
(object_allocated_size_recursive) allocated_size_recursive };
struct ObjectType ClassObject::TypeData = {
.base = nullptr,
.constructor = (object_constructor) ClassObject::constructor,
.destructor = (object_destructor) ClassObject::destructor,
.copy = (object_copy) ClassObject::copy,
.size = sizeof(ClassObject),
.name = "class",
.save_size = (object_save_size) save_size,
.save = (object_save) save,
.load = (object_load) load,
.childs_retrival = (object_debug_all_childs_retrival) childs_retrival,
.allocated_size = (object_allocated_size) allocated_size,
.allocated_size_recursive = (object_allocated_size_recursive) allocated_size_recursive,
};

View file

@ -9,7 +9,7 @@ void ColorObject::constructor(ColorObject* self) { self->mCol = tp::RGBA(1.f); }
void ColorObject::copy(ColorObject* self, const ColorObject* in) { self->mCol = in->mCol; }
ColorObject* ColorObject::create(tp::RGBA in) {
auto out = objects_api::cast<ColorObject>(NDO->create("RGBA"));
auto out = objects_api::create<ColorObject>();
out->mCol = in;
return out;
}

View file

@ -139,7 +139,7 @@ bool obj::EnumObject::compare(EnumObject* first, EnumObject* second) {
}
EnumObject* obj::EnumObject::create(tp::InitialierList<const char*> list) {
auto enum_object = (EnumObject*) obj::NDO->create("enum");
auto enum_object = objects_api::create<EnumObject>();
enum_object->init(list);
return enum_object;
}

View file

@ -8,7 +8,7 @@ void FloatObject::constructor(FloatObject* self) { self->val = 0; }
void FloatObject::copy(FloatObject* self, const FloatObject* in) { self->val = in->val; }
FloatObject* FloatObject::create(alnf in) {
auto out = objects_api::cast<FloatObject>(NDO->create("float"));
auto out = objects_api::create<FloatObject>();
out->val = alnf(in);
return out;
}

View file

@ -9,7 +9,7 @@ void IntObject::constructor(IntObject* self) { self->val = 0; }
void IntObject::copy(IntObject* self, const IntObject* in) { self->val = in->val; }
IntObject* IntObject::create(alni in) {
auto out = objects_api::cast<IntObject>(NDO->create("int"));
auto out = objects_api::create<IntObject>();
out->val = in;
return out;
}

View file

@ -13,7 +13,7 @@ void LinkObject::destructor(LinkObject* self) {
void LinkObject::copy(LinkObject* self, const LinkObject* in) { self->setLink(in->link); }
LinkObject* LinkObject::create(Object* in) {
auto out = objects_api::cast<LinkObject>(NDO->create("link"));
auto out = objects_api::create<LinkObject>();
return out;
}

View file

@ -60,7 +60,7 @@ void MethodObject::UnInitialize() { obj::ScriptSection::uninitialize(); }
void MethodObject::compile() { Compile(this); }
MethodObject* MethodObject::create(const std::string& script) {
auto out = (MethodObject*) NDO->create(MethodObject::TypeData.name);
auto out = objects_api::create<MethodObject>();
out->mScript->mReadable->val = script;
out->compile();
return out;

View file

@ -12,7 +12,7 @@ void StringObject::destructor(StringObject* self) { self->val.~basic_string(); }
void StringObject::copy(StringObject* self, const StringObject* in) { self->val = in->val; }
StringObject* StringObject::create(const std::string& in) {
auto out = objects_api::cast<StringObject>(NDO->create("str"));
auto out = objects_api::create<StringObject>();
out->val = in;
return out;
}

View file

@ -6,7 +6,7 @@ using namespace tp;
using namespace obj;
TypeObject* TypeObject::create(const ObjectType* type) {
auto out = objects_api::cast<TypeObject>(NDO->create("typeobject"));
auto out = objects_api::create<TypeObject>();
out->mTypeRef = type;
return out;
}