changed stack size
This commit is contained in:
parent
084b715729
commit
169217fd2c
@ -13,7 +13,7 @@ target_include_directories(njvm PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/bigint/build
|
||||
# Add the library
|
||||
add_library(bigint STATIC ${CMAKE_SOURCE_DIR}/bigint/src/bigint.c
|
||||
support.c
|
||||
heap.c)
|
||||
GC.c)
|
||||
|
||||
# Include directories for the bigint library
|
||||
target_include_directories(bigint PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bigint/build/include)
|
||||
|
||||
77
GC.c
Normal file
77
GC.c
Normal file
@ -0,0 +1,77 @@
|
||||
#include <string.h>
|
||||
typedef struct {
|
||||
unsigned int size;
|
||||
unsigned int current;
|
||||
unsigned char data[1];
|
||||
} heapPart;
|
||||
typedef struct {
|
||||
heapPart *primary;
|
||||
heapPart *secondary;
|
||||
unsigned int size;
|
||||
unsigned int current;
|
||||
} heap;
|
||||
|
||||
void scan(heap *h) {
|
||||
heapPart *part = h->primary;
|
||||
unsigned int i;
|
||||
for (i = 0; i < h->current; i++) {
|
||||
unsigned int j;
|
||||
for (j = 0; j < part->current; j++) {
|
||||
void *p = *(void **) (part->data + j);
|
||||
if (p >= part->data && p < part->data + part->size) {
|
||||
*(void **) (part->data + j) = h->secondary + h->current;
|
||||
memcpy(h->secondary + h->current, p, sizeof(void *));
|
||||
h->current++;
|
||||
}
|
||||
}
|
||||
part++;
|
||||
}
|
||||
}
|
||||
|
||||
void collect(heap *h) {
|
||||
scan(h);
|
||||
heapPart *tmp = h->primary;
|
||||
h->primary = h->secondary;
|
||||
h->secondary = tmp;
|
||||
h->current = 0;
|
||||
}
|
||||
|
||||
void *alloc(heap *h, unsigned int size) {
|
||||
if (h->current == h->size) {
|
||||
collect(h);
|
||||
}
|
||||
heapPart *part = h->primary + h->current;
|
||||
if (part->current + size > part->size) {
|
||||
collect(h);
|
||||
part = h->primary + h->current;
|
||||
}
|
||||
void *p = part->data + part->current;
|
||||
part->current += size;
|
||||
return p;
|
||||
}
|
||||
|
||||
void *reallocate(heap *h, void *p, unsigned int size) {
|
||||
if (p == NULL) {
|
||||
return alloc(h, size);
|
||||
}
|
||||
heapPart *part = h->primary;
|
||||
unsigned int i;
|
||||
for (i = 0; i < h->current; i++) {
|
||||
if (p >= part->data && p < part->data + part->size) {
|
||||
break;
|
||||
}
|
||||
part++;
|
||||
}
|
||||
if (i == h->current) {
|
||||
return NULL;
|
||||
}
|
||||
if (size <= part->size) {
|
||||
return p;
|
||||
}
|
||||
void *newP = alloc(h, size);
|
||||
if (newP == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
memcpy(newP, p, part->size);
|
||||
return newP;
|
||||
}
|
||||
11
heap.c
11
heap.c
@ -1,11 +0,0 @@
|
||||
//
|
||||
// Created by Nils Polek on 23.01.24.
|
||||
//
|
||||
typedef struct {
|
||||
int size;
|
||||
int hcurrent;
|
||||
}heap;
|
||||
|
||||
//void* alloc(int size){
|
||||
// return {}
|
||||
//}
|
||||
1
njvm.c
1
njvm.c
@ -313,7 +313,6 @@ void tests(void) {
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
|
||||
// Initialize the Stack
|
||||
int size = SIZE;
|
||||
int current = 0;
|
||||
|
||||
86
stackslot.c
86
stackslot.c
@ -1,57 +1,65 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef STACKSLOT
|
||||
#define STACKSLOT
|
||||
typedef int Object;
|
||||
typedef struct {
|
||||
unsigned int size;
|
||||
unsigned char data[1];
|
||||
bool brokenHeart;
|
||||
unsigned int size;
|
||||
unsigned char data[1];
|
||||
} *ObjRef;
|
||||
|
||||
typedef struct{
|
||||
bool isObjRef;
|
||||
union {
|
||||
ObjRef objRef;
|
||||
int number;
|
||||
} u;
|
||||
typedef struct {
|
||||
bool isObjRef;
|
||||
union {
|
||||
ObjRef objRef;
|
||||
int number;
|
||||
} u;
|
||||
} StackSlot;
|
||||
|
||||
ObjRef getIntObj(int val){
|
||||
ObjRef intObject;
|
||||
unsigned int objSize = sizeof(unsigned int) + sizeof(int);
|
||||
if ((intObject = malloc(objSize)) == NULL) {
|
||||
perror("malloc");
|
||||
}
|
||||
*(int *)intObject->data=val;
|
||||
intObject->size=sizeof(int);
|
||||
return intObject;
|
||||
ObjRef getIntObj(int val) {
|
||||
ObjRef intObject;
|
||||
unsigned int objSize = sizeof(unsigned int) + sizeof(int);
|
||||
if ((intObject = malloc(objSize)) == NULL) {
|
||||
perror("malloc");
|
||||
}
|
||||
*(int *) intObject->data = val;
|
||||
intObject->size = sizeof(int);
|
||||
return intObject;
|
||||
}
|
||||
int getValFromIntObj(ObjRef iref){
|
||||
return *(int *)iref->data;
|
||||
|
||||
int getValFromIntObj(ObjRef iref) {
|
||||
return *(int *) iref->data;
|
||||
}
|
||||
int getIntValfromStackSlot(StackSlot s){
|
||||
if(s.isObjRef){
|
||||
return *(int *)s.u.objRef->data;
|
||||
}
|
||||
return s.u.number;
|
||||
|
||||
int getIntValfromStackSlot(StackSlot s) {
|
||||
if (s.isObjRef) {
|
||||
return *(int *) s.u.objRef->data;
|
||||
}
|
||||
return s.u.number;
|
||||
}
|
||||
void setValIntObj(ObjRef iref, int val){
|
||||
iref->size=sizeof(int);
|
||||
*(int *)iref->data=val;
|
||||
|
||||
void setValIntObj(ObjRef iref, int val) {
|
||||
iref->size = sizeof(int);
|
||||
*(int *) iref->data = val;
|
||||
}
|
||||
StackSlot stackSlotWithObjRef(ObjRef val){
|
||||
StackSlot *stackSlot;
|
||||
stackSlot=malloc(sizeof(StackSlot));
|
||||
stackSlot->isObjRef=true;
|
||||
stackSlot->u.objRef=val;
|
||||
return *stackSlot;
|
||||
|
||||
StackSlot stackSlotWithObjRef(ObjRef val) {
|
||||
StackSlot *stackSlot;
|
||||
stackSlot = malloc(sizeof(StackSlot));
|
||||
stackSlot->isObjRef = true;
|
||||
stackSlot->u.objRef = val;
|
||||
return *stackSlot;
|
||||
}
|
||||
StackSlot stackSlotWitchNumber(int val){
|
||||
StackSlot *stackSlot;
|
||||
stackSlot= malloc(sizeof(StackSlot));
|
||||
stackSlot->isObjRef=false;
|
||||
stackSlot->u.number=val;
|
||||
return *stackSlot;
|
||||
|
||||
StackSlot stackSlotWitchNumber(int val) {
|
||||
StackSlot *stackSlot;
|
||||
stackSlot = malloc(sizeof(StackSlot));
|
||||
stackSlot->isObjRef = false;
|
||||
stackSlot->u.number = val;
|
||||
return *stackSlot;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user