add constant buffer compression
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
#include "translator.h"
|
#include "translator.h"
|
||||||
#include "string/string.h"
|
|
||||||
#include "declaration/declaration.h"
|
#include "declaration/declaration.h"
|
||||||
#include "number/number.h"
|
#include "number/number.h"
|
||||||
|
#include "string/string.h"
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -20,13 +20,13 @@ void arena_resize(ConstantArena *arena, size_t new_size) {
|
|||||||
return;
|
return;
|
||||||
arena->data = realloc(arena->data, new_capacity);
|
arena->data = realloc(arena->data, new_capacity);
|
||||||
if (!arena->data) {
|
if (!arena->data) {
|
||||||
fprintf(stderr, "error: failed to resize arena from %zu to %zu\n", new_capacity, arena->capacity);
|
fprintf(stderr, "error: failed to resize arena from %zu to %zu\n",
|
||||||
|
new_capacity, arena->capacity);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
arena->capacity = new_capacity;
|
arena->capacity = new_capacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void arena_free(ConstantArena *arena) {
|
void arena_free(ConstantArena *arena) {
|
||||||
free(arena->data);
|
free(arena->data);
|
||||||
arena->capacity = 0;
|
arena->capacity = 0;
|
||||||
@@ -38,6 +38,13 @@ void * arena_get(ConstantArena *arena, size_t offset) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t arena_push(ConstantArena *arena, const void *data, size_t length) {
|
size_t arena_push(ConstantArena *arena, const void *data, size_t length) {
|
||||||
|
if (arena->size >= length) {
|
||||||
|
for (size_t i = 0; i <= (arena->size - length); i++) {
|
||||||
|
if (memcmp(data, arena->data + i, length) == 0) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
arena_resize(arena, arena->size + length);
|
arena_resize(arena, arena->size + length);
|
||||||
size_t offset = arena->size;
|
size_t offset = arena->size;
|
||||||
memcpy(arena->data + arena->size, data, length);
|
memcpy(arena->data + arena->size, data, length);
|
||||||
@@ -53,7 +60,8 @@ Translated init_translator() {
|
|||||||
return translated;
|
return translated;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_instruction_code(Translated * translator, size_t offset, uint64_t code) {
|
void set_instruction_code(Translated *translator, size_t offset,
|
||||||
|
uint64_t code) {
|
||||||
code = htole64(code);
|
code = htole64(code);
|
||||||
size_t *ptr = (translator->bytecode.data + offset);
|
size_t *ptr = (translator->bytecode.data + offset);
|
||||||
*ptr = code;
|
*ptr = code;
|
||||||
@@ -67,7 +75,8 @@ size_t push_instruction_code(Translated * translator, uint64_t code) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void set_registers(Translated *translator, size_t count) {
|
void set_registers(Translated *translator, size_t count) {
|
||||||
if (count>translator->registerCount) translator->registerCount = count;
|
if (count > translator->registerCount)
|
||||||
|
translator->registerCount = count;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t translate_parsed(Translated *translated, ParsedValue *parsedValue) {
|
size_t translate_parsed(Translated *translated, ParsedValue *parsedValue) {
|
||||||
|
|||||||
Reference in New Issue
Block a user