changed stack size

This commit is contained in:
nilspolek 2024-01-26 17:00:50 +01:00
parent 084b715729
commit 169217fd2c
5 changed files with 125 additions and 52 deletions

View File

@ -13,7 +13,7 @@ target_include_directories(njvm PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/bigint/build
# Add the library # Add the library
add_library(bigint STATIC ${CMAKE_SOURCE_DIR}/bigint/src/bigint.c add_library(bigint STATIC ${CMAKE_SOURCE_DIR}/bigint/src/bigint.c
support.c support.c
heap.c) GC.c)
# Include directories for the bigint library # Include directories for the bigint library
target_include_directories(bigint PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bigint/build/include) target_include_directories(bigint PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bigint/build/include)

77
GC.c Normal file
View 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
View File

@ -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
View File

@ -313,7 +313,6 @@ void tests(void) {
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
// Initialize the Stack // Initialize the Stack
int size = SIZE; int size = SIZE;
int current = 0; int current = 0;

View File

@ -1,15 +1,17 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#ifndef STACKSLOT #ifndef STACKSLOT
#define STACKSLOT #define STACKSLOT
typedef int Object; typedef int Object;
typedef struct { typedef struct {
bool brokenHeart;
unsigned int size; unsigned int size;
unsigned char data[1]; unsigned char data[1];
} *ObjRef; } *ObjRef;
typedef struct{ typedef struct {
bool isObjRef; bool isObjRef;
union { union {
ObjRef objRef; ObjRef objRef;
@ -17,41 +19,47 @@ typedef struct{
} u; } u;
} StackSlot; } StackSlot;
ObjRef getIntObj(int val){ ObjRef getIntObj(int val) {
ObjRef intObject; ObjRef intObject;
unsigned int objSize = sizeof(unsigned int) + sizeof(int); unsigned int objSize = sizeof(unsigned int) + sizeof(int);
if ((intObject = malloc(objSize)) == NULL) { if ((intObject = malloc(objSize)) == NULL) {
perror("malloc"); perror("malloc");
} }
*(int *)intObject->data=val; *(int *) intObject->data = val;
intObject->size=sizeof(int); intObject->size = sizeof(int);
return intObject; 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){ int getIntValfromStackSlot(StackSlot s) {
return *(int *)s.u.objRef->data; if (s.isObjRef) {
return *(int *) s.u.objRef->data;
} }
return s.u.number; return s.u.number;
} }
void setValIntObj(ObjRef iref, int val){
iref->size=sizeof(int); void setValIntObj(ObjRef iref, int val) {
*(int *)iref->data=val; iref->size = sizeof(int);
*(int *) iref->data = val;
} }
StackSlot stackSlotWithObjRef(ObjRef val){
StackSlot stackSlotWithObjRef(ObjRef val) {
StackSlot *stackSlot; StackSlot *stackSlot;
stackSlot=malloc(sizeof(StackSlot)); stackSlot = malloc(sizeof(StackSlot));
stackSlot->isObjRef=true; stackSlot->isObjRef = true;
stackSlot->u.objRef=val; stackSlot->u.objRef = val;
return *stackSlot; return *stackSlot;
} }
StackSlot stackSlotWitchNumber(int val){
StackSlot stackSlotWitchNumber(int val) {
StackSlot *stackSlot; StackSlot *stackSlot;
stackSlot= malloc(sizeof(StackSlot)); stackSlot = malloc(sizeof(StackSlot));
stackSlot->isObjRef=false; stackSlot->isObjRef = false;
stackSlot->u.number=val; stackSlot->u.number = val;
return *stackSlot; return *stackSlot;
} }
#endif #endif