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_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
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[]) {
// Initialize the Stack
int size = SIZE;
int current = 0;

View File

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