Add list type, obj_free for compound types, and self-reference guard

- Implement OBJ_LIST with offset-based items array and capacity
- obj_free now releases child allocations (string buffer, list items)
- obj_print detects self-referencing lists to prevent infinite recursion
- Visualizer distinguishes freed blocks (JLANG_NOT_USE) from active ones
- JLANG_free now zeroes payload on release
This commit is contained in:
Jose Luis Montañes Ojados
2026-02-16 00:33:02 +01:00
parent 13c9d052a0
commit d14227efeb
3 changed files with 97 additions and 35 deletions

View File

@@ -14,6 +14,7 @@
#define JLANG_FREE 0
#define JLANG_HEADER 1
#define JLANG_PAYLOAD 2
#define JLANG_NOT_USE 3
/*
La estructura de Metadata se encarga de almacenar el tamaño del bloque y si
@@ -129,7 +130,7 @@ size_t JLANG_malloc(void *ptr, size_t size) {
freeHeader->size = size;
freeHeader->in_use = 1;
void *payloadPtr = (char *) freeHeader + sizeof(JLANG_metadata);
void *payloadPtr = (char *)freeHeader + sizeof(JLANG_metadata);
return (char *)payloadPtr - allocPtr->memory;
}
@@ -144,6 +145,9 @@ void JLANG_free(void *ptr, size_t blockOffset) {
// Set block as not_used
blockHeader->in_use = 0;
// Set to 0 payload
memset(blockPtr, 0, blockHeader->size);
}
/*
@@ -181,16 +185,21 @@ void JLANG_visualize(void *ptr) {
*/
if (currentHeader->size > 0) {
byteMapPtr[blockIndex] = JLANG_HEADER;
for (int i = 0; i < sizeof(JLANG_metadata); i++) {
byteMapPtr[blockIndex + i] = JLANG_HEADER;
}
if (currentHeader->in_use == 1) {
byteMapPtr[blockIndex] = JLANG_HEADER;
for (int i = 0; i < sizeof(JLANG_metadata); i++) {
byteMapPtr[blockIndex + i] = JLANG_HEADER;
}
/*
PAYLOAD
*/
for (int i = 0; i < currentHeader->size; i++) {
byteMapPtr[blockIndex + sizeof(JLANG_metadata) + i] = JLANG_PAYLOAD;
/*
PAYLOAD
*/
for (int i = 0; i < currentHeader->size; i++) {
byteMapPtr[blockIndex + sizeof(JLANG_metadata) + i] = JLANG_PAYLOAD;
}
} else {
// Mark all block as JLANG_NOT_USE
memset(byteMapPtr + blockIndex, JLANG_NOT_USE, sizeof(JLANG_metadata) + currentHeader->size);
}
} else {
break;
@@ -223,6 +232,9 @@ void JLANG_visualize(void *ptr) {
case JLANG_FREE:
printf("\033[32m");
break;
case JLANG_NOT_USE:
printf("\033[47;5;224m");
break;
default:
printf("\033[41m");
break;