mirror of
https://github.com/janet-lang/janet
synced 2025-12-04 07:38:09 +00:00
Work on deserialization for loading bytecode and
other objects.
This commit is contained in:
86
core/gc.c
86
core/gc.c
@@ -42,15 +42,8 @@ static void gst_mark_funcdef(Gst *vm, GstFuncDef *def) {
|
||||
if (def->literals) {
|
||||
count = def->literalsLen;
|
||||
gc_header(def->literals)->color = vm->black;
|
||||
for (i = 0; i < count; ++i) {
|
||||
/* If the literal is a NIL type, it actually
|
||||
* contains a FuncDef */
|
||||
if (def->literals[i].type == GST_NIL) {
|
||||
gst_mark_funcdef(vm, (GstFuncDef *) def->literals[i].data.pointer);
|
||||
} else {
|
||||
gst_mark(vm, def->literals + i);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < count; ++i)
|
||||
gst_mark(vm, def->literals + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -167,6 +160,14 @@ void gst_mark(Gst *vm, GstValue *x) {
|
||||
temp.data.object = userHeader->meta;
|
||||
gst_mark(vm, &temp);
|
||||
}
|
||||
|
||||
case GST_FUNCENV:
|
||||
gst_mark_funcenv(vm, x->data.env);
|
||||
break;
|
||||
|
||||
case GST_FUNCDEF:
|
||||
gst_mark_funcdef(vm, x->data.def);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -251,70 +252,3 @@ void gst_clear_memory(Gst *vm) {
|
||||
}
|
||||
vm->blocks = NULL;
|
||||
}
|
||||
|
||||
/* Header for managed memory blocks */
|
||||
struct MMHeader {
|
||||
struct MMHeader *next;
|
||||
struct MMHeader *previous;
|
||||
};
|
||||
|
||||
/* Initialize managed memory */
|
||||
void gst_mm_init(GstManagedMemory *mm) {
|
||||
*mm = NULL;
|
||||
}
|
||||
|
||||
/* Allocate some managed memory */
|
||||
void *gst_mm_alloc(GstManagedMemory *mm, uint32_t size) {
|
||||
struct MMHeader *mem = gst_raw_alloc(size + sizeof(struct MMHeader));
|
||||
if (mem == NULL)
|
||||
return NULL;
|
||||
mem->next = *mm;
|
||||
mem->previous = NULL;
|
||||
*mm = mem;
|
||||
return mem + 1;
|
||||
}
|
||||
|
||||
/* Intialize zeroed managed memory */
|
||||
void *gst_mm_zalloc(GstManagedMemory *mm, uint32_t size) {
|
||||
struct MMHeader *mem = gst_raw_calloc(1, size + sizeof(struct MMHeader));
|
||||
if (mem == NULL)
|
||||
return NULL;
|
||||
mem->next = *mm;
|
||||
mem->previous = NULL;
|
||||
*mm = mem;
|
||||
return mem + 1;
|
||||
}
|
||||
|
||||
/* Free a memory block used in managed memory */
|
||||
void gst_mm_free(GstManagedMemory *mm, void *block) {
|
||||
struct MMHeader *mem = (struct MMHeader *)(((char *)block) - sizeof(struct MMHeader));
|
||||
if (mem->previous != NULL) {
|
||||
mem->previous->next = mem->next;
|
||||
} else {
|
||||
*mm = mem->next;
|
||||
}
|
||||
gst_raw_free(mem);
|
||||
}
|
||||
|
||||
/* Free all memory in managed memory */
|
||||
void gst_mm_clear(GstManagedMemory *mm) {
|
||||
struct MMHeader *block = (struct MMHeader *)(*mm);
|
||||
struct MMHeader *next;
|
||||
while (block != NULL) {
|
||||
next = block->next;
|
||||
free(block);
|
||||
block = next;
|
||||
};
|
||||
*mm = NULL;
|
||||
}
|
||||
|
||||
/* Analog to realloc */
|
||||
void *gst_mm_realloc(GstManagedMemory *mm, void *block, uint32_t nsize) {
|
||||
struct MMHeader *mem = gst_raw_realloc(block, nsize + sizeof(struct MMHeader));
|
||||
if (mem == NULL)
|
||||
return NULL;
|
||||
mem->next = *mm;
|
||||
mem->previous = NULL;
|
||||
*mm = mem;
|
||||
return mem + 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user