Load and destroy methods revised for proper reference counting

The update enhances object management by involving scope-based reference counting. The change affects loading and destruction operations in the Object and several other classes, ensuring the release or retention of objects adhere to their usage context. A function for logging type data has also been introduced to provide better clarity during debugging. Also, tests in script & interpreter have been altered to run in separate module initializations to avoid cross-test interference. Overall, it provides better memory management and dependable tests.
This commit is contained in:
IlushaShurupov 2023-08-01 20:05:29 +03:00 committed by Ilya Shurupov
parent ab0edfc302
commit 3f4f2caf1f
12 changed files with 58 additions and 10 deletions

View file

@ -73,7 +73,11 @@ static void deinit(const tp::ModuleManifest*) {
MethodObject::UnInitialize();
obj::BCgen::deinit();
assertNoLeaks();
delete NDO;
NDO = nullptr;
}
static tp::ModuleManifest* sModuleDependencies[] = {

View file

@ -3,6 +3,8 @@
#include "NewPlacement.hpp"
#include "core/object.h"
#include "primitives/nullobject.h"
#include "HeapAllocatorGlobal.hpp"
#include <malloc.h>
@ -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;
}

View file

@ -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() {