aboutsummaryrefslogtreecommitdiff
path: root/src/program.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/program.c')
-rw-r--r--src/program.c28
1 files changed, 10 insertions, 18 deletions
diff --git a/src/program.c b/src/program.c
index 92fcb6c..60e9870 100644
--- a/src/program.c
+++ b/src/program.c
@@ -28,12 +28,12 @@ typedef struct {
static CHECK_RESULT int amal_program_append_header(amal_program *self) {
/*doc(Bytecode header)
# Header layout
- |Size|Name |Description |
+ |Type|Field |Description |
|----|-------------|----------------------------------------------------------------------------|
- |4 |Magic number |The magic number used to identify an amalgam bytecode file. |
- |1 |Major version|The major version of the bytecode. Updates in this is a breaking change. |
- |1 |Minor version|The minor version of the bytecode. Updates in this are backwards compatible.|
- |1 |Patch version|The patch version of the bytecode. Updates in this are only minor bug fixes.|
+ |u32 |Magic number |The magic number used to identify an amalgam bytecode file. |
+ |u8 |Major version|The major version of the bytecode. Updates in this is a breaking change. |
+ |u8 |Minor version|The minor version of the bytecode. Updates in this are backwards compatible.|
+ |u8 |Patch version|The patch version of the bytecode. Updates in this are only minor bug fixes.|
The versions in the header only changes for every release, not every change.
*/
@@ -142,18 +142,7 @@ static CHECK_RESULT int amal_program_read_intermediates(amal_program *self) {
}
self->intermediates_start = &self->data.data[self->read_index];
- if(intermediates_size > 0)
- self->num_intermediates = intermediates_size / (sizeof(u8) + sizeof(u64));
- /*
- read_end = self->read_index + intermediates_size;
- while(self->read_index < read_end) {
- NumberType type;
- NumberUnion value;
- am_memcpy(&type, &self->data.data[self->read_index], sizeof(u8));
- am_memcpy(&value, &self->data.data[self->read_index + sizeof(u8)], sizeof(u64));
- self->read_index += sizeof(u8) + sizeof(u64);
- }
- */
+ self->num_intermediates = intermediates_size / (sizeof(u8) + sizeof(u64));
self->read_index += intermediates_size;
return AMAL_PROGRAM_OK;
@@ -203,7 +192,7 @@ static CHECK_RESULT int amal_program_read_strings(amal_program *self) {
if(bytes_left_to_read(self) < string_size)
return AMAL_PROGRAM_INVALID_STRINGS;
- self->read_index += string_size;
+ self->read_index += string_size +1; /* +1 to skip null-termination character */
}
assert(self->read_index == read_end);
@@ -248,10 +237,12 @@ static i64 abs_i64(i64 value) {
return value >= 0 ? value : -value;
}
+#ifdef DEBUG
static int assert_reg_outside_stack() {
assert(bool_false && "Register outside stack!");
return 0;
}
+#endif
static CHECK_RESULT int amal_program_read_instructions(amal_program *self) {
u32 instructions_size;
@@ -262,6 +253,7 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self) {
func_num_registers = 0;
inside_func = bool_false;
+ (void)inside_func;
if(bytes_left_to_read(self) < sizeof(instructions_size))
return AMAL_PROGRAM_INVALID_INSTRUCTIONS_SIZE;