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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user