From 964388b0a053d7c8744942282ed4a9ee73bfa6db Mon Sep 17 00:00:00 2001 From: Luca Bruno Date: Sun, 7 Aug 2011 12:22:15 +0200 Subject: [PATCH] Move MethodCall transformation into the CCodeTransformer --- codegen/valaccodetransformer.vala | 23 +++++++++++++++++++++ vala/valaflowanalyzer.vala | 8 ++++++++ vala/valamethodcall.vala | 33 ------------------------------- 3 files changed, 31 insertions(+), 33 deletions(-) diff --git a/codegen/valaccodetransformer.vala b/codegen/valaccodetransformer.vala index 3599fc3c8..fa24ae7ab 100644 --- a/codegen/valaccodetransformer.vala +++ b/codegen/valaccodetransformer.vala @@ -68,4 +68,27 @@ public class Vala.CCodeTransformer : CodeTransformer { base.visit_expression (expr); } + + public override void visit_method_call (MethodCall expr) { + if (expr.tree_can_fail) { + if (expr.parent_node is LocalVariable || expr.parent_node is ExpressionStatement) { + // simple statements, no side effects after method call + } else if (!(context.analyzer.get_current_non_local_symbol (expr) is Block)) { + // can't handle errors in field initializers + Report.error (expr.source_reference, "Field initializers must not throw errors"); + } else { + var formal_target_type = copy_type (expr.target_type); + var target_type = copy_type (expr.target_type); + begin_replace_expression (expr); + + var local = b.add_temp_declaration (copy_type (expr.value_type), expr); + var replacement = return_temp_access (local, expr.value_type, target_type, formal_target_type); + + end_replace_expression (replacement); + return; + } + } + + base.visit_method_call (expr); + } } diff --git a/vala/valaflowanalyzer.vala b/vala/valaflowanalyzer.vala index dc7e471a3..48b850045 100644 --- a/vala/valaflowanalyzer.vala +++ b/vala/valaflowanalyzer.vala @@ -1093,6 +1093,14 @@ public class Vala.FlowAnalyzer : CodeVisitor { } } + public override void visit_method_call (MethodCall expr) { + if (unreachable (expr)) { + return; + } + + handle_errors (expr); + } + private bool unreachable (CodeNode node) { if (current_block == null) { node.unreachable = true; diff --git a/vala/valamethodcall.vala b/vala/valamethodcall.vala index 1b0916349..433915f31 100644 --- a/vala/valamethodcall.vala +++ b/vala/valamethodcall.vala @@ -652,39 +652,6 @@ public class Vala.MethodCall : Expression { value_type.check (context); - if (tree_can_fail) { - if (parent_node is LocalVariable || parent_node is ExpressionStatement) { - // simple statements, no side effects after method call - } else if (!(context.analyzer.get_current_non_local_symbol (this) is Block)) { - // can't handle errors in field initializers - Report.error (source_reference, "Field initializers must not throw errors"); - } else { - // store parent_node as we need to replace the expression in the old parent node later on - var old_parent_node = parent_node; - - var local = new LocalVariable (value_type.copy (), get_temp_name (), null, source_reference); - var decl = new DeclarationStatement (local, source_reference); - - insert_statement (context.analyzer.get_insert_block (this), decl); - - var temp_access = SemanticAnalyzer.create_temp_access (local, target_type); - - // don't set initializer earlier as this changes parent_node and parent_statement - local.initializer = this; - decl.check (context); - - // move temp variable to insert block to ensure the - // variable is in the same block as the declaration - // otherwise there will be scoping issues in the generated code - var block = context.analyzer.get_current_block (this); - block.remove_local_variable (local); - context.analyzer.get_insert_block (this).add_local_variable (local); - - old_parent_node.replace_expression (this, temp_access); - temp_access.check (context); - } - } - return !error; } -- 2.47.2