Compare commits
No commits in common. "91b36a53d552ac656bc9c7bee44ade1b60a520bf" and "084b715729c1ed2ff96f2abf8a821751ee2a0225" have entirely different histories.
91b36a53d5
...
084b715729
@ -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
|
||||
GC.c)
|
||||
heap.c)
|
||||
|
||||
# Include directories for the bigint library
|
||||
target_include_directories(bigint PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bigint/build/include)
|
||||
|
||||
52
GC.c
52
GC.c
@ -1,52 +0,0 @@
|
||||
#ifndef GC
|
||||
#define GC
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "stackslot.c"
|
||||
#include "stack.c"
|
||||
#include "bigint.h"
|
||||
#include "instruktion.c"
|
||||
#include "record.c"
|
||||
|
||||
typedef struct {
|
||||
unsigned int freiZeiger;
|
||||
unsigned int size;
|
||||
ObjRef *data;
|
||||
} *heapPartRef;
|
||||
|
||||
// Stack
|
||||
struct stack stack;
|
||||
#define SIZE 64
|
||||
|
||||
//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)){
|
||||
obj->forward_pointer = memcpy(secondary->data[secondary->freiZeiger],obj,obj->size);
|
||||
secondary->freiZeiger += obj->size;
|
||||
} else {
|
||||
GET_ELEMENT_COUNT(obj);
|
||||
obj->forward_pointer = memcpy(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));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
11
heap.c
Normal file
11
heap.c
Normal file
@ -0,0 +1,11 @@
|
||||
//
|
||||
// Created by Nils Polek on 23.01.24.
|
||||
//
|
||||
typedef struct {
|
||||
int size;
|
||||
int hcurrent;
|
||||
}heap;
|
||||
|
||||
//void* alloc(int size){
|
||||
// return {}
|
||||
//}
|
||||
12
njvm.c
12
njvm.c
@ -9,15 +9,22 @@
|
||||
#include "debugMenu.c"
|
||||
#include "bigint.h"
|
||||
#include "record.c"
|
||||
#include "GC.c"
|
||||
|
||||
// Debug
|
||||
int debug = 0;
|
||||
|
||||
// Stack
|
||||
struct stack stack;
|
||||
#define SIZE 64
|
||||
|
||||
//Register
|
||||
struct stack reg;
|
||||
|
||||
// Program
|
||||
struct program program;
|
||||
|
||||
|
||||
// SDA
|
||||
struct sda sda;
|
||||
unsigned fp;
|
||||
|
||||
void version(void) {
|
||||
@ -306,6 +313,7 @@ void tests(void) {
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
|
||||
// Initialize the Stack
|
||||
int size = SIZE;
|
||||
int current = 0;
|
||||
|
||||
8
objref.c
8
objref.c
@ -1,11 +1,9 @@
|
||||
#ifndef OBJREF
|
||||
#define OBJREF
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef struct ObjRef{
|
||||
unsigned int size;
|
||||
unsigned char data[1];
|
||||
typedef struct {
|
||||
unsigned int size;
|
||||
unsigned char data[1];
|
||||
} *ObjRef;
|
||||
|
||||
#endif /* ifndef OBJREF
|
||||
|
||||
4
stack.c
4
stack.c
@ -7,10 +7,6 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "stackslot.c"
|
||||
#include "sda.c"
|
||||
|
||||
// SDA
|
||||
struct sda sda;
|
||||
|
||||
struct stack {
|
||||
int* size;
|
||||
|
||||
89
stackslot.c
89
stackslot.c
@ -1,66 +1,57 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef STACKSLOT
|
||||
#define STACKSLOT
|
||||
typedef int Object;
|
||||
typedef struct ObjRef{
|
||||
bool brokenHeart;
|
||||
struct ObjRef *forward_pointer;
|
||||
unsigned int size;
|
||||
unsigned char data[1];
|
||||
typedef struct {
|
||||
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