njvm/record.c
nilspolek 815db27637 gc
2024-01-28 21:59:21 +01:00

58 lines
1.7 KiB
C

//
// Created by Nils Polek on 23.01.24.
//
#ifndef RECORD
#define RECORD
#include "stackslot.c"
#include "instruktion.c"
#include "njvm.h"
ObjRef newRecord(int size){
ObjRef record;
unsigned int objSize;
objSize = sizeof(*record) + (size * sizeof(void *));
if((record = alloc(objSize)) == NULL){
perror("malloc");
}
record->size = MSB;
record->size = record->size + size;
for(int i = 0; i < size; i++) {
GET_REFS_PTR(record)[i] = NULL;
}
return record;
}
int getSize(ObjRef arr){
if(arr == NULL) return 0;
return GET_ELEMENT_COUNT(arr);
}
ObjRef getField(ObjRef arr, int point){
if(arr == NULL) perror("Record is null");
if(arr->brokenHeart==true) perror("Broken Heart");
if(0 > point || point > getSize(arr)){
printf("Index %i out of bounds for length %i\n",point, getSize(arr));
}
return *(ObjRef *)GET_REFS_PTR(arr)[point]->data;
}
void setField(ObjRef arr, int point, ObjRef value){
bool isNull = false;
if(value == NULL) isNull = true;
if(0 > point || point >= getSize(arr)){
printf("Index %i out of bounds for length %i\n",point, getSize(arr));
exit(EXIT_FAILURE);
}
if(arr == NULL) perror("Record is null");
if(IS_PRIMITIVE(arr)) perror("Record is a primitive");
int size;
if (isNull) size = sizeof(void *);
else {
if (IS_PRIMITIVE(value))
size = value->size;
else
size = sizeof(*value) + (GET_ELEMENT_COUNT(value) * sizeof(void *));
}
if((GET_REFS_PTR(arr)[point] = alloc(size)) == NULL) perror("malloc");
GET_REFS_PTR(arr)[point] ->size = size;
* (ObjRef *)GET_REFS_PTR(arr)[point]->data = value;
}
#endif