RAII #2

Merged
samsonium merged 14 commits from impl-dealloc into master 2026-10-18 18:00:04 +00:00
Showing only changes of commit 82b6cc3346 - Show all commits
+10 -6
View File
@@ -281,6 +281,7 @@ int fzl_vm_run(fzl_vm_t *vm)
break; break;
} }
// NOTE: make recursive owning transfer for nested objects!
case FZL_OPCODE_ESCAPE_OBJECT: case FZL_OPCODE_ESCAPE_OBJECT:
{ {
if (vm->dtop < 1) if (vm->dtop < 1)
@@ -291,7 +292,7 @@ int fzl_vm_run(fzl_vm_t *vm)
return -1; return -1;
} }
fzl_value_t obj = vm->dstack[--vm->dtop]; fzl_value_t obj = vm->dstack[--vm->dtop];
if (obj.type != FZL_TYPE_OBJECT) if (obj.type != FZL_TYPE_OBJECT && obj.type < FZL_TYPE_INT8)
{ {
snprintf(last_err, sizeof(last_err), snprintf(last_err, sizeof(last_err),
"runtime error - cannot escape non-object type"); "runtime error - cannot escape non-object type");
@@ -310,13 +311,16 @@ int fzl_vm_run(fzl_vm_t *vm)
} }
bool found = false; bool found = false;
for (size_t i = 0; i < current->owned_objects_count; i++) if (obj.as.u != 0)
{ {
if (obj.as.obj == current->owned_objects[i]) for (size_t i = 0; i < current->owned_objects_count; i++)
{ {
found = true; if (obj.as.obj == current->owned_objects[i])
current->owned_objects[i] = NULL; {
break; found = true;
current->owned_objects[i] = NULL;
break;
}
} }
} }