#ifndef GC #define GC #include #include #include #include "stackslot.c" #include "stack.c" #include "bigint.h" #include "instruktion.c" #include "record.c" #include "SDA.c" typedef struct { unsigned int freiZeiger; unsigned int size; unsigned char *data; } *heapPartRef; // SDA struct sda sda; // Stack struct stack stack; #define SIZE 100000 //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)){ // if(obj->size > secondary->size-secondary->freiZeiger) perror("Heap is to Small"); // obj->forward_pointer = memcpy((void *) secondary->data[secondary->freiZeiger], obj, obj->size); // secondary->freiZeiger += obj->size; // } else { // if(sizeof(*obj) + (GET_ELEMENT_COUNT(obj) * sizeof(void *)) > secondary->size-secondary->freiZeiger) perror("Heap is to Small"); // GET_ELEMENT_COUNT(obj); // obj->forward_pointer = memcpy((void *) 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)); // } // } //} // //void runGC(){ // int rootSize = *sda.size + *reg.size + *stack.size + 4; // ObjRef* rootObjs = malloc(sizeof(ObjRef) * rootSize); // if(rootObjs == NULL) perror("malloc"); // int counter = 0; // //Bip // rootObjs[0] = bip.op1; // rootObjs[counter++] = bip.op2; // rootObjs[counter++] = bip.res; // rootObjs[counter++] = bip.rem; // //SDA // for (int i = 0; i < *sda.size; ++i) { // rootObjs[counter++] = sda.sda[i]; // } // //REG // for (int i = 0; i < *reg.size; ++i) { // rootObjs[counter++] = reg.stack[i].u.objRef; // } // //STACK // for (int i = 0; i < *stack.size; ++i) { // rootObjs[counter++] = stack.stack[i].u.objRef; // } // // for (int i = 0; i < rootSize; ++i) { // if(rootObjs[i] == NULL) continue; // copy(rootObjs[i]); // } // heapPartRef temp = primary; // primary = secondary; // secondary = temp; // //} // //void *alloc(size_t size){ // if(primary->size-primary->freiZeiger < size){ // runGC(); // } // primary->freiZeiger += size; // return (void *) primary->data[primary->freiZeiger - size]; //} #endif