Storing a global variable

This commit is contained in:
Krzosa Karol
2022-06-21 23:45:07 +02:00
parent eee9e24cfc
commit a229891485
3 changed files with 265 additions and 258 deletions

View File

@@ -1,33 +1,4 @@
function Register_Index
allocate_register(Bc *b){
if(b->free_registers.len == 0){
Register_Index result = b->registers.addi({});
return result;
}
Register_Index index = b->free_registers.pop();
b->used_registers.add(index);
return index;
}
function void
release_register(Bc *b, Register_Index reg){
if(reg == 0) return;
B32 found = false;
For(b->used_registers){
if(it == reg){
b->used_registers.unordered_remove(&it);
found = true;
break;
}
}
assert_msg(found, "Trying to release register that is not used");
}
function Register_Index
bc_emit_expr(Bc *b, Ast *ast){
if(!ast) return REG_NULL;
@@ -66,11 +37,13 @@ compile_to_bc(){
}
CASE(VAR, Decl){
node->bytecode_data_position = exp_alloc(&b->memory, node->type->size, AF_ZeroMemory);
Register_Index index = bc_emit_expr(b, node->expr);
if(index!=REG_NULL){
// bc_emit_store(b, )
if(node->expr){
Register_Index expression_index = bc_emit_expr(b, node->expr);
Register_Index address_index = allocate_register(b);
emit_load_constant_address(b, address_index, node->bytecode_data_position);
emit_memory(b, BC_STORE_TO_MEMORY64, address_index, expression_index);
release_register(b, expression_index);
}
release_register(b, index);
BREAK();
}
default: {}