From 5ebb6d5482795d40144ec2dbb04a294e83581458 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Thu, 15 Mar 2018 00:29:21 -0400 Subject: [PATCH] Start work on structs. Can declare structs and access members. Copying structs and passing them as parameters or returning them doesn't work yet --- stdlib/bytecode_generator.krak | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/stdlib/bytecode_generator.krak b/stdlib/bytecode_generator.krak index f656a7d..983942b 100644 --- a/stdlib/bytecode_generator.krak +++ b/stdlib/bytecode_generator.krak @@ -485,11 +485,11 @@ obj bytecode_generator (Object) { } fun generate_identifier(node: *ast_node, lvalue: bool): int { // STRUCT HERE - if (lvalue) { + var ident_type = get_ast_type(node) + if (lvalue || (ident_type->is_object() && ident_type->indirection == 0)) return emit_addi(1, functions.last().var_to_frame_offset[node]) - } else { - return emit_ldr(1, functions.last().var_to_frame_offset[node], size_to_operand_size(type_size(get_ast_type(node)))) - } + else + return emit_ldr(1, functions.last().var_to_frame_offset[node], size_to_operand_size(type_size(ident_type))) } fun generate_return_statement(node: *ast_node): int { // STRUCT HERE @@ -552,6 +552,19 @@ obj bytecode_generator (Object) { return value_reg } + // STRUCT HERE + if (name == "." || name == "->") { + var base = generate(parameter_nodes[0]) + if (!is_identifier(parameter_nodes[1])) + error("trying to access not an identifier") + var val_type = get_ast_type(parameter_nodes[1]) + var offset = offset_into_struct(get_ast_type(parameter_nodes[0]), parameter_nodes[1]) + var member_ptr = emit_addi(base, offset) + if (lvalue || (val_type->is_object() && val_type->indirection == 0)) + return member_ptr + return emit_ldr(member_ptr, 0, size_to_operand_size(type_size(get_ast_type(parameter_nodes[1])))) + } + var params = parameter_nodes.map(fun(n: *ast_node): int return generate(n);) if (name == "+") { if (params.size == 1) @@ -565,19 +578,13 @@ obj bytecode_generator (Object) { return emit_add(params[0], emit_addi(emit_not(params[1]), 1)) } else if (name == "!") { return emit_ez(params[0]) - } else if (name == "[]" || name == "." || name == "->" || (name == "*" && params.size == 1)) { + } else if (name == "[]" || (name == "*" && params.size == 1)) { if (name == "[]") { if (lvalue) return emit_add(params[0], params[1]) else return emit_ldr(emit_add(params[0], params[1]), 0, size_to_operand_size(type_size(get_ast_type(parameter_nodes[0])->clone_with_decreased_indirection()))) } - // STRUCT HERE - if (name == "." || name == "->") { - error("no structs") - } - /*if (name == "." || name == "->") if (lvalue) return emit_add(params[0], params[1])*/ - /*else return emit_ldr(emit_add(params[0], params[1]), 0, size_to_operand_size(type_size(get_ast_type(parameter_nodes[1]))))*/ if (name == "*") { if (lvalue) return params[0] @@ -879,7 +886,7 @@ obj bytecode_generator (Object) { } // Stack ABI - // it's system v x64, but all params passed on stack + // it's system v x64ish, but all params passed on stack fun evaluate(): int { println("evaling main") println(bytecode_to_string(functions, instructions))