53 lines
1.3 KiB
C
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
|