change how numbers are stored so they are in an efficent binary format, able to be quickly read by the runtime

This commit is contained in:
William Bell
2025-08-12 00:13:01 +01:00
parent f851b37f99
commit d4528e44f6
13 changed files with 126 additions and 72 deletions

View File

@@ -4,23 +4,39 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#include "../translator.h"
#include "number.h"
#include "../translator.h"
#include <gmp.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
size_t translate_parsed_number(Translated *translated, char *number_str, size_t to_register) {
size_t length = strlen(number_str)+1;
size_t number_pos = arena_push(&translated->constants, number_str, length);
set_registers(translated, to_register+1);
size_t start = push_instruction_byte(translated, OP_LOAD_CONST);
push_instruction_byte(translated, to_register);
size_t translate_parsed_number(Translated *translated, mpq_t *number,
size_t to_register) {
mpz_t num, den;
mpz_init(num);
mpz_init(den);
mpz_set(num, mpq_numref(*number));
mpz_set(den, mpq_denref(*number));
size_t num_size;
void *num_data = mpz_export(NULL, &num_size, 1, 1, 0, 0, num);
size_t numerator_pos = arena_push(&translated->constants, num_data, num_size);
free(num_data);
mpz_clear(num);
// Export denominator
size_t den_size;
void *den_data = mpz_export(NULL, &den_size, 1, 1, 0, 0, den);
size_t denominator_pos =
arena_push(&translated->constants, den_data, den_size);
free(den_data);
mpz_clear(den);
set_registers(translated, to_register + 1);
push_instruction_byte(translated, TYPE_OP_NUMBER);
push_instruction_code(translated,length);
push_instruction_code(translated, number_pos);
size_t start = push_instruction_byte(translated, OP_LOAD_NUMBER);
push_instruction_byte(translated, to_register);
push_instruction_code(translated, num_size);
push_instruction_code(translated, numerator_pos);
push_instruction_code(translated, den_size);
push_instruction_code(translated, denominator_pos);
return start;
}

View File

@@ -8,6 +8,7 @@
#define BYTECODE_NUMBER_H
#include "../translator.h"
size_t translate_parsed_number(Translated *translated, char *number_str, size_t to_register);
size_t translate_parsed_number(Translated *translated, mpq_t *number,
size_t to_register);
#endif