From 017025100aeb1fa852849ff0e6bf2c551f432e24 Mon Sep 17 00:00:00 2001 From: Juerg Billeter Date: Mon, 20 Aug 2007 21:52:07 +0000 Subject: [PATCH] fix memory management for throw statements, fixes bug 465071 2007-08-20 Juerg Billeter * vala/valasemanticanalyzer.vala, vala/valathrowstatement.vala, gobject/valacodegenerator.vala: fix memory management for throw statements, fixes bug 465071 svn path=/trunk/; revision=491 --- ChangeLog | 6 ++++++ gobject/valacodegenerator.vala | 17 +++++++++++++++++ vala/valasemanticanalyzer.vala | 1 + vala/valathrowstatement.vala | 2 -- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index a6d5d47..5df87a2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-08-20 Jürg Billeter + + * vala/valasemanticanalyzer.vala, vala/valathrowstatement.vala, + gobject/valacodegenerator.vala: fix memory management for throw + statements, fixes bug 465071 + 2007-08-20 Mathias Hasselmann * tests/test-027.*: Add test for prefix increments diff --git a/gobject/valacodegenerator.vala b/gobject/valacodegenerator.vala index fff55f1..5bbbeb6 100644 --- a/gobject/valacodegenerator.vala +++ b/gobject/valacodegenerator.vala @@ -1787,8 +1787,25 @@ public class Vala.CodeGenerator : CodeVisitor { var cfrag = new CCodeFragment (); + if (memory_management) { + /* declare temporary objects */ + append_temp_decl (cfrag, temp_vars); + } + cfrag.append (new CCodeExpressionStatement ((CCodeExpression) stmt.error_expression.ccodenode)); + if (memory_management) { + /* free temporary objects */ + foreach (VariableDeclarator decl in temp_ref_vars) { + var ma = new MemberAccess.simple (decl.name); + ma.symbol_reference = decl; + cfrag.append (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (decl.name), decl.type_reference, ma))); + } + } + + temp_vars.clear (); + temp_ref_vars.clear (); + if (current_return_type != null && current_return_type.data_type != null) { cfrag.append (new CCodeReturnStatement (default_value_for_type (current_return_type.data_type))); } else { diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index 184384d..2cd5acf 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -1853,6 +1853,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor { Report.error (expr.source_reference, "Invalid type for argument 1"); } } + expr.static_type = new TypeReference (); } } diff --git a/vala/valathrowstatement.vala b/vala/valathrowstatement.vala index 0795501..59d6f11 100644 --- a/vala/valathrowstatement.vala +++ b/vala/valathrowstatement.vala @@ -60,8 +60,6 @@ public class Vala.ThrowStatement : CodeNode, Statement { public override void accept_children (CodeVisitor! visitor) { if (error_expression != null) { error_expression.accept (visitor); - - visitor.visit_end_full_expression (error_expression); } } -- 2.7.4