njvm/GC.c
2024-01-26 19:13:42 +01:00

53 lines
1.3 KiB
C

#ifndef GC
#define GC
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "stackslot.c"
#include "stack.c"
#include "bigint.h"
#include "instruktion.c"
#include "record.c"
typedef struct {
unsigned int freiZeiger;
unsigned int size;
ObjRef *data;
} *heapPartRef;
// Stack
struct stack stack;
#define SIZE 64
//Register
struct stack reg;
heapPartRef primary;
heapPartRef secondary;
unsigned int heapSize;
void initHeap(int size){
heapSize = 2 * sizeof (unsigned int) + size;
if ((primary = malloc(heapSize)) == NULL) perror("malloc");
if ((secondary = malloc(heapSize)) == NULL) perror("malloc");
}
// nimmt obj und copier es in den secondary Speicher
void copy(ObjRef obj){
if(obj->brokenHeart == true) return;
obj->brokenHeart = true;
if (IS_PRIMITIVE(obj)){
obj->forward_pointer = memcpy(secondary->data[secondary->freiZeiger],obj,obj->size);
secondary->freiZeiger += obj->size;
} else {
GET_ELEMENT_COUNT(obj);
obj->forward_pointer = memcpy(secondary->data[secondary->freiZeiger],obj,sizeof(*obj) + (GET_ELEMENT_COUNT(obj) * sizeof(void *)));
secondary->freiZeiger += sizeof(*obj) + (GET_ELEMENT_COUNT(obj) * sizeof(void *));
for (int i = 0; i < GET_ELEMENT_COUNT(obj); ++i) {
copy(getField(obj,i));
}
}
}
#endif