From ab5250bd0b88db4f780f80e2c66c98c706d537a3 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Sat, 30 Jan 2016 23:59:21 -0500 Subject: [PATCH] Copy construct into function calls --- stdlib/c_generator.krak | 20 +++++++++++++++++--- tests/to_parse.krak | 6 ++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/stdlib/c_generator.krak b/stdlib/c_generator.krak index cba7aa9..18c0828 100644 --- a/stdlib/c_generator.krak +++ b/stdlib/c_generator.krak @@ -225,7 +225,7 @@ obj c_generator (Object) { var to_ret = code_triple() // if we're returning an object, copy_construct a new one to return if (return_value_type->is_object() && return_value_type->indirection == 0 && has_method(return_value_type->type_def, "copy_construct", vector(return_value_type->clone_with_indirection(1)))) { - var temp_ident = ast_identifier_ptr(string("temporary"), return_value_type) + var temp_ident = ast_identifier_ptr(string("temporary_return"), return_value_type) var declaration = ast_declaration_statement_ptr(temp_ident, null()) // have to pass false to the declaration generator, so can't do it through generate_statement to_ret.pre = generate_declaration_statement(declaration, enclosing_object, defer_stack, false).one_string() + ";\n" @@ -306,7 +306,6 @@ obj c_generator (Object) { if (!dot_style_method_call && enclosing_object && get_ast_scope(enclosing_object)->contains_key(func_name)) call_string += "this" - var parameters = node->function_call.parameters if ( parameters.size == 2 && (func_name == "+" || func_name == "-" || func_name == "*" || func_name == "/" || func_name == "||" || func_name == "&&" || func_name == "<" || func_name == ">" || func_name == "<=" || func_name == ">=" @@ -320,11 +319,26 @@ obj c_generator (Object) { if (func_name == "++p" || func_name == "--p") return code_triple("(") + generate(parameters[0], enclosing_object, null>>>()) + ")" + func_name.slice(0,-2) + // So we don't end up copy_constructing etc, we just handle the unary operators right here + if (func_name == "*" || func_name == "&") + return code_triple("(") + func_name + generate(parameters[0], enclosing_object, null>>>()) + ")" + // regular parameter generation parameters.for_each(fun(param: *ast_node) { if (call_string != "") call_string += ", " - call_string += generate(param, enclosing_object, null>>>()) + + var param_type = get_ast_type(param) + if (param_type->is_object() && param_type->indirection == 0 && has_method(param_type->type_def, "copy_construct", vector(param_type->clone_with_indirection(1)))) { + var temp_ident = ast_identifier_ptr(string("temporary_param"), param_type) + var declaration = ast_declaration_statement_ptr(temp_ident, null()) + // have to pass false to the declaration generator, so can't do it through generate_statement + call_string.pre = generate_declaration_statement(declaration, enclosing_object, null>>>(), false).one_string() + ";\n" + call_string.pre += generate_statement(ast_statement_ptr(make_method_call(temp_ident, "copy_construct", vector(make_operator_call("&", vector(param))))), enclosing_object, null>>>()).one_string() + call_string += generate(temp_ident, enclosing_object, null>>>()) + } else { + call_string += generate(param, enclosing_object, null>>>()) + } }) return code_triple() + func_name + "(" + call_string + ")" } diff --git a/tests/to_parse.krak b/tests/to_parse.krak index 398fc35..4c18f68 100644 --- a/tests/to_parse.krak +++ b/tests/to_parse.krak @@ -32,6 +32,10 @@ obj Something (ObjectTrait) { return this; } } +fun return_something_p_1(it: Something): Something { + it.member += 11 + return it +} /* fun some_function(): int return 0; fun some_other_function(in: bool): float { @@ -47,6 +51,8 @@ fun main(): int { var second_obj = test_methods second_obj.member += 5 simple_println(second_obj.member) + /*var some = return_something_p_1(second_obj)*/ + simple_println(return_something_p_1(second_obj).member) return 0 /* var a_declaration:int