This commit is contained in:
2026-06-21 16:13:00 +10:00
parent ff98aa63b4
commit b2f6883e62
10 changed files with 351 additions and 42 deletions

75
src/Bytecode/save.c Normal file
View File

@@ -0,0 +1,75 @@
#include "../../include/ground.h"
#include <stdio.h>
static void writeValue(FILE* f, GroundValue* v) {
switch (v->type.type) {
case GroundType_Int: {
uint8_t tag = 0;
fwrite(&tag, 1, 1, f);
fwrite(&v->as.Int, 8, 1, f);
break;
}
case GroundType_Double: {
uint8_t tag = 1;
fwrite(&tag, 1, 1, f);
fwrite(&v->as.Double, 8, 1, f);
break;
}
case GroundType_Char: {
uint8_t tag = 2;
fwrite(&tag, 1, 1, f);
fwrite(&v->as.Char, 1, 1, f);
break;
}
case GroundType_Bool: {
uint8_t tag = 3;
fwrite(&tag, 1, 1, f);
fwrite(&v->as.Bool, 1, 1, f);
break;
}
case GroundType_String: {
uint8_t tag = 4;
fwrite(&tag, 1, 1, f);
uint64_t len = v->as.String.len;
fwrite(&len, 8, 1, f);
fwrite(v->as.String.cstr, 1, len, f);
break;
}
default: {
uint8_t tag = 0xFF;
fwrite(&tag, 1, 1, f);
break;
}
}
}
void _GroundBytecodeSave(GroundBytecode* bytecode, const char* path) {
FILE* f = fopen(path, "wb");
if (f == NULL) {
Ground.Log.Error("failed to open file for writing in Ground.Bytecode.save");
Ground.Flags.error = true;
return;
}
fwrite("GRNDbc\0", 7, 1, f);
uint32_t version = 1;
fwrite(&version, 4, 1, f);
uint64_t count = bytecode->heap.len;
fwrite(&count, 8, 1, f);
for (GroundSize i = 0; i < count; i++) {
writeValue(f, &bytecode->heap.heap[i]);
}
count = bytecode->program.len;
fwrite(&count, 8, 1, f);
for (GroundSize i = 0; i < count; i++) {
uint8_t type = (uint8_t)bytecode->program.at[i].type;
fwrite(&type, 1, 1, f);
uint64_t argCount = bytecode->program.at[i].args.len;
fwrite(&argCount, 8, 1, f);
fwrite(bytecode->program.at[i].args.at, 8, argCount, f);
}
fclose(f);
}