Added memory leak dialog in vm_stop
Stack, call stack and heap are evaluated to check for leaks.
This commit is contained in:
50
vm/runtime.c
50
vm/runtime.c
@@ -380,10 +380,60 @@ void vm_load_call_stack(vm_t *vm, word *buffer, size_t size)
|
|||||||
|
|
||||||
void vm_stop(vm_t *vm)
|
void vm_stop(vm_t *vm)
|
||||||
{
|
{
|
||||||
|
#if VERBOSE >= 1
|
||||||
|
bool leaks = false;
|
||||||
|
printf("[" TERM_YELLOW "DATA" TERM_RESET "]: Checking for leaks...\n");
|
||||||
|
if (vm->call_stack.ptr > 0)
|
||||||
|
{
|
||||||
|
leaks = true;
|
||||||
|
printf("\t[" TERM_RED "DATA" TERM_RESET "]: Call stack at %lu\n\t[" TERM_RED
|
||||||
|
"DATA" TERM_RESET "]\n\t[" TERM_RED "DATA" TERM_RESET "]: Call "
|
||||||
|
"stack trace:",
|
||||||
|
vm->call_stack.ptr);
|
||||||
|
for (size_t i = vm->call_stack.ptr; i > 0; --i)
|
||||||
|
{
|
||||||
|
word w = vm->call_stack.address_pointers[i - 1];
|
||||||
|
printf("\t\t%lu: %lX", vm->call_stack.ptr - i, w);
|
||||||
|
if (i != 1)
|
||||||
|
printf(", ");
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (vm->heap.pages > 0)
|
||||||
|
{
|
||||||
|
leaks = true;
|
||||||
|
page_t *cur = vm->heap.beg;
|
||||||
|
size_t capacities[vm->heap.pages], total_capacity = 0;
|
||||||
|
for (size_t i = 0; i < vm->heap.pages; ++i)
|
||||||
|
{
|
||||||
|
capacities[i] = cur->available;
|
||||||
|
total_capacity += capacities[i];
|
||||||
|
}
|
||||||
|
printf("\t[" TERM_RED "DATA" TERM_RESET
|
||||||
|
"]: Heap: %luB (over %lu %s) not reclaimed\n",
|
||||||
|
total_capacity, vm->heap.pages,
|
||||||
|
vm->heap.pages == 1 ? "page" : "pages");
|
||||||
|
printf("\t[" TERM_RED "DATA" TERM_RESET "]: Complete breakdown:\n");
|
||||||
|
for (size_t i = 0; i < vm->heap.pages; i++)
|
||||||
|
printf("\t\t[%lu]: %luB bytes lost\n", i, capacities[i]);
|
||||||
|
}
|
||||||
|
if (vm->stack.ptr > 0)
|
||||||
|
{
|
||||||
|
leaks = true;
|
||||||
|
printf("\t[" TERM_RED "DATA" TERM_RESET "]: Stack: %luB not reclaimed\n",
|
||||||
|
vm->stack.ptr);
|
||||||
|
}
|
||||||
|
if (leaks)
|
||||||
|
printf("[" TERM_RED "DATA" TERM_RESET "]: Leaks found\n");
|
||||||
|
else
|
||||||
|
printf("[" TERM_GREEN "DATA" TERM_RESET "]: No leaks found\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
free(vm->registers.data);
|
free(vm->registers.data);
|
||||||
free(vm->program.instructions);
|
free(vm->program.instructions);
|
||||||
free(vm->stack.data);
|
free(vm->stack.data);
|
||||||
heap_stop(&vm->heap);
|
heap_stop(&vm->heap);
|
||||||
|
free(vm->call_stack.address_pointers);
|
||||||
|
|
||||||
vm->registers = (registers_t){0};
|
vm->registers = (registers_t){0};
|
||||||
vm->program = (struct Program){0};
|
vm->program = (struct Program){0};
|
||||||
|
|||||||
Reference in New Issue
Block a user