From eaa22e1d11cffb7138d0757aa9b554bcdf5b4884 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Fri, 16 Mar 2018 01:20:44 -0400 Subject: [PATCH] Struct copying should work. Now it's just making them be parameters and return values --- stdlib/bytecode_generator.krak | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/stdlib/bytecode_generator.krak b/stdlib/bytecode_generator.krak index 983942b..284ab05 100644 --- a/stdlib/bytecode_generator.krak +++ b/stdlib/bytecode_generator.krak @@ -381,7 +381,10 @@ obj bytecode_generator (Object) { functions.last().var_to_frame_offset[identifier] = -functions.last().frame_size if (node->declaration_statement.expression) { // STRUCT HERE - emit_str(1, functions.last().var_to_frame_offset[identifier], generate(node->declaration_statement.expression), size_to_operand_size(type_size(get_ast_type(identifier)))) + if (ident_type->is_object() && ident_type->indirection == 0) + emit_struct_copy(1, functions.last().var_to_frame_offset[identifier], generate(node->declaration_statement.expression), 0, get_ast_type(identifier)) + else + emit_str(1, functions.last().var_to_frame_offset[identifier], generate(node->declaration_statement.expression), size_to_operand_size(type_size(get_ast_type(identifier)))) reset_reg() } return -1 @@ -389,8 +392,12 @@ obj bytecode_generator (Object) { fun generate_assignment_statement(node: *ast_node): int { var from = generate(node->assignment_statement.from) var to = generate(node->assignment_statement.to, true) + var var_type = get_ast_type(node->assignment_statement.to) // STRUCT HERE - emit_str(to, 0, from, size_to_operand_size(type_size(get_ast_type(node->assignment_statement.to)))) + if (var_type->is_object() && var_type->indirection == 0) + emit_struct_copy(to, 0, from, 0, var_type) + else + emit_str(to, 0, from, size_to_operand_size(type_size(var_type))) reset_reg() return -1 } @@ -695,6 +702,19 @@ obj bytecode_generator (Object) { ast_name_map.set(node, result) return result } + fun emit_struct_copy(to: int, to_offset: int, from: int, from_offset: int, t: *type) { + for (var i = 0; i < t->type_def->type_def.variables.size; i++;) { + var member_var = t->type_def->type_def.variables[i]->declaration_statement.identifier + var member_type = get_ast_type(member_var) + var member_offset = offset_into_struct(t, member_var) + if (member_type->is_object() && member_type->indirection == 0) { + emit_struct_copy(to, (to_offset + member_offset) cast int, from, (from_offset + member_offset) cast int, member_type) + } else { + var member_size = size_to_operand_size(type_size(member_type)) + emit_str(to, (to_offset + member_offset) cast int, emit_ldr(from, (from_offset + member_offset) cast int, member_size), member_size) + } + } + } fun emit_imm(value: ulong): int { return emit_imm((value) cast int); } fun emit_imm(value: int): int { var i: imm