diff --git a/Objects/private/compiler/function.cpp b/Objects/private/compiler/function.cpp index ce7e815..7b26b8d 100644 --- a/Objects/private/compiler/function.cpp +++ b/Objects/private/compiler/function.cpp @@ -527,6 +527,7 @@ void obj::BCgen::deinit() { ASSERT(sParger); if (sParger) { delete sParger; + sParger = nullptr; } } diff --git a/Objects/private/core/module.cpp b/Objects/private/core/module.cpp index 3140810..91d09e2 100644 --- a/Objects/private/core/module.cpp +++ b/Objects/private/core/module.cpp @@ -73,7 +73,11 @@ static void deinit(const tp::ModuleManifest*) { MethodObject::UnInitialize(); obj::BCgen::deinit(); + + assertNoLeaks(); + delete NDO; + NDO = nullptr; } static tp::ModuleManifest* sModuleDependencies[] = { diff --git a/Objects/private/core/objectsave.cpp b/Objects/private/core/objectsave.cpp index 5da599f..adc57b4 100644 --- a/Objects/private/core/objectsave.cpp +++ b/Objects/private/core/objectsave.cpp @@ -3,6 +3,8 @@ #include "NewPlacement.hpp" #include "core/object.h" +#include "primitives/nullobject.h" + #include "HeapAllocatorGlobal.hpp" #include @@ -63,6 +65,27 @@ namespace obj { tp::HeapAllocGlobal::deallocate(memh); } + void logTypeData(const ObjectType* type) { + printf("type - %s\n", type->name); + if (type->base) { + printf("Based on "); + logTypeData(type->base); + } + } + + void assertNoLeaks() { + if (bottom) { + printf("ERROR : not all objects are destroyed\n"); + tp::ualni idx = 0; + for (ObjectMemHead* memh = bottom; memh; memh = memh->up) { + printf(" ===== Object - %i. Ref count - %i ===== \n", idx, memh->refc); + logTypeData(NDO_FROM_MEMH(memh)->type); + idx++; + } + } + } + + struct ObjectFileHead { Object* load_head_adress = 0; tp::halni refc = 0; @@ -274,7 +297,13 @@ namespace obj { return NULL; } - setrefc(out, ofh.refc); + setrefc(out, 0); + + // check for null object + if (out->type == &NullObject::TypeData) { + ObjectMemDeallocate(out); + out = NdoNull_globalInstance; + } // save heap adress in "loaded_file" ((ObjectFileHead*) (loaded_file + file_adress))->load_head_adress = out; @@ -405,8 +434,6 @@ namespace obj { } */ - setrefc(out, 0); - return out; } diff --git a/Objects/private/core/scriptsection.cpp b/Objects/private/core/scriptsection.cpp index 7cf9879..930cf55 100644 --- a/Objects/private/core/scriptsection.cpp +++ b/Objects/private/core/scriptsection.cpp @@ -150,6 +150,8 @@ void load_constants(ScriptSection* self, ArchiverIn& file, tp::alni start_addr) // script text tp::alni str_addr; file >> str_addr; + + NDO->destroy(script->mReadable); // we already have string object in the script when creating script script->mReadable = NDO_CAST(obj::StringObject, obj::NDO->load(file, str_addr)); file.setAddress(file.getAddress() + sizeof(tp::alni)); // constants length @@ -257,6 +259,7 @@ void ScriptSection::initialize() { void ScriptSection::uninitialize() { ASSERT(gScriptSection); delete gScriptSection; + gScriptSection = nullptr; } ScriptSection* ScriptSection::globalHandle() { diff --git a/Objects/private/primitives/classobject.cpp b/Objects/private/primitives/classobject.cpp index 6baaf87..5131504 100644 --- a/Objects/private/primitives/classobject.cpp +++ b/Objects/private/primitives/classobject.cpp @@ -47,6 +47,7 @@ void ClassObject::load(ArchiverIn& file_self, ClassObject* self) { alni ndo_object_adress; file_self >> ndo_object_adress; self->members = NDO_CAST(DictObject, NDO->load(file_self, ndo_object_adress)); + NDO->refinc(self->members); } tp::Buffer childs_retrival(ClassObject* self) { diff --git a/Objects/private/primitives/dictobject.cpp b/Objects/private/primitives/dictobject.cpp index 3848888..db4f6dd 100644 --- a/Objects/private/primitives/dictobject.cpp +++ b/Objects/private/primitives/dictobject.cpp @@ -88,7 +88,7 @@ void DictObject::load(ArchiverIn& file_self, DictObject* self) { file_self >> key; // add to dictinary - self->items.put(key, val); + self->put(key, val); } } diff --git a/Objects/private/primitives/linkobject.cpp b/Objects/private/primitives/linkobject.cpp index 462c77b..610156e 100644 --- a/Objects/private/primitives/linkobject.cpp +++ b/Objects/private/primitives/linkobject.cpp @@ -49,6 +49,7 @@ void LinkObject::load(ArchiverIn& file_self, LinkObject* self) { } else { self->link = NDO->load(file_self, saved_object_adress); + NDO->refinc(self->link); } } diff --git a/Objects/private/primitives/listobject.cpp b/Objects/private/primitives/listobject.cpp index 58d7461..7d4b1d8 100644 --- a/Objects/private/primitives/listobject.cpp +++ b/Objects/private/primitives/listobject.cpp @@ -57,7 +57,7 @@ void ListObject::load(ArchiverIn& file_self, ListObject* self) { for (alni i = 0; i < len; i++) { alni ndo_object_adress; file_self >> ndo_object_adress; - self->items.pushBack(NDO->load(file_self, ndo_object_adress)); + self->pushBack(NDO->load(file_self, ndo_object_adress)); } } diff --git a/Objects/public/core/object.h b/Objects/public/core/object.h index 345a9e9..2a0ac05 100644 --- a/Objects/public/core/object.h +++ b/Objects/public/core/object.h @@ -236,6 +236,9 @@ namespace obj { Object* load(ArchiverIn&, tp::alni file_adress); }; + void logTypeData(const ObjectType* type); + void assertNoLeaks(); + Object* ndo_cast(const Object* in, const ObjectType* to_type); template diff --git a/Objects/tests/Tests.cpp b/Objects/tests/Tests.cpp index 640bf29..90728d7 100644 --- a/Objects/tests/Tests.cpp +++ b/Objects/tests/Tests.cpp @@ -18,12 +18,19 @@ int main() { tp::ModuleManifest module("ObjectsTests", nullptr, nullptr, deps); if (module.initialize()) { - testCore(); - testPrimitives(); - testInterpreter(); - module.deinitialize(); } + + if (module.initialize()) { + testPrimitives(); + module.deinitialize(); + } + + if (module.initialize()) { + testInterpreter(); + module.deinitialize(); + } + return 0; } \ No newline at end of file diff --git a/Objects/tests/interpreter/TestInterpreter.cpp b/Objects/tests/interpreter/TestInterpreter.cpp index 8cb70ca..ec2ef8d 100644 --- a/Objects/tests/interpreter/TestInterpreter.cpp +++ b/Objects/tests/interpreter/TestInterpreter.cpp @@ -31,8 +31,8 @@ TEST_DEF_STATIC(Simple) { interpreterLoaded->exec(); - NDO->destroy(interpreter); NDO->destroy(interpreterLoaded); + NDO->destroy(interpreter); } TEST_DEF(Interpreter) { diff --git a/Strings/private/Logging.cpp b/Strings/private/Logging.cpp index 34ec6df..4ef468d 100644 --- a/Strings/private/Logging.cpp +++ b/Strings/private/Logging.cpp @@ -54,5 +54,6 @@ namespace tp { void Logger::deinitializeGlobal() { DEBUG_ASSERT(gLogger) delete gLogger; + gLogger = nullptr; } } \ No newline at end of file