From bce013426fffe7baa80c2f2a7dbf2810285d54bb Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=BCrg=20Billeter?= Date: Mon, 14 Sep 2009 20:03:14 +0200 Subject: [PATCH] Fix string switch statements with owned switch expression Fixes bug 591879. --- codegen/valaccodecontrolflowmodule.vala | 10 +++++++++- vala/valaswitchstatement.vala | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/codegen/valaccodecontrolflowmodule.vala b/codegen/valaccodecontrolflowmodule.vala index 19a30a058..cb1b8c286 100644 --- a/codegen/valaccodecontrolflowmodule.vala +++ b/codegen/valaccodecontrolflowmodule.vala @@ -44,13 +44,16 @@ internal class Vala.CCodeControlFlowModule : CCodeMethodModule { void visit_string_switch_statement (SwitchStatement stmt) { // we need a temporary variable to save the property value - var temp_var = get_temp_variable (stmt.expression.value_type, false, stmt); + var temp_var = get_temp_variable (stmt.expression.value_type, stmt.expression.value_type.value_owned, stmt); stmt.expression.temp_vars.insert (0, temp_var); var ctemp = new CCodeIdentifier (temp_var.name); var cinit = new CCodeAssignment (ctemp, (CCodeExpression) stmt.expression.ccodenode); var czero = new CCodeConstant ("0"); + var free_call = new CCodeFunctionCall (new CCodeIdentifier ("g_free")); + free_call.add_argument (ctemp); + var cswitchblock = new CCodeFragment (); stmt.ccodenode = cswitchblock; @@ -93,6 +96,11 @@ internal class Vala.CCodeControlFlowModule : CCodeMethodModule { cswitchblock.append (new CCodeExpressionStatement (cinit)); create_temp_decl (stmt, stmt.expression.temp_vars); + if (stmt.expression.value_type.value_owned) { + // free owned string + cswitchblock.append (new CCodeExpressionStatement (free_call)); + } + Gee.List default_statements = null; label_count = 0; diff --git a/vala/valaswitchstatement.vala b/vala/valaswitchstatement.vala index a66a284b7..d1468e5a8 100644 --- a/vala/valaswitchstatement.vala +++ b/vala/valaswitchstatement.vala @@ -114,6 +114,9 @@ public class Vala.SwitchStatement : CodeNode, Statement { return false; } + // ensure that possibly owned (string) expression stays alive + expression.target_type = expression.value_type.copy (); + foreach (SwitchSection section in sections) { section.check (analyzer); } -- 2.47.3