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 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
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[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
|
||||||
// Initialize the Stack
|
// Initialize the Stack
|
||||||
int size = SIZE;
|
int size = SIZE;
|
||||||
int current = 0;
|
int current = 0;
|
||||||
|
|||||||
86
stackslot.c
86
stackslot.c
@ -1,57 +1,65 @@
|
|||||||
#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 {
|
||||||
unsigned int size;
|
bool brokenHeart;
|
||||||
unsigned char data[1];
|
unsigned int size;
|
||||||
|
unsigned char data[1];
|
||||||
} *ObjRef;
|
} *ObjRef;
|
||||||
|
|
||||||
typedef struct{
|
typedef struct {
|
||||||
bool isObjRef;
|
bool isObjRef;
|
||||||
union {
|
union {
|
||||||
ObjRef objRef;
|
ObjRef objRef;
|
||||||
int number;
|
int number;
|
||||||
} 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 *stackSlot;
|
StackSlot stackSlotWithObjRef(ObjRef val) {
|
||||||
stackSlot=malloc(sizeof(StackSlot));
|
StackSlot *stackSlot;
|
||||||
stackSlot->isObjRef=true;
|
stackSlot = malloc(sizeof(StackSlot));
|
||||||
stackSlot->u.objRef=val;
|
stackSlot->isObjRef = true;
|
||||||
return *stackSlot;
|
stackSlot->u.objRef = val;
|
||||||
|
return *stackSlot;
|
||||||
}
|
}
|
||||||
StackSlot stackSlotWitchNumber(int val){
|
|
||||||
StackSlot *stackSlot;
|
StackSlot stackSlotWitchNumber(int val) {
|
||||||
stackSlot= malloc(sizeof(StackSlot));
|
StackSlot *stackSlot;
|
||||||
stackSlot->isObjRef=false;
|
stackSlot = malloc(sizeof(StackSlot));
|
||||||
stackSlot->u.number=val;
|
stackSlot->isObjRef = false;
|
||||||
return *stackSlot;
|
stackSlot->u.number = val;
|
||||||
|
return *stackSlot;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user