]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix string switch statements with owned switch expression
authorJürg Billeter <j@bitron.ch>
Mon, 14 Sep 2009 18:03:14 +0000 (20:03 +0200)
committerJürg Billeter <j@bitron.ch>
Mon, 14 Sep 2009 18:03:14 +0000 (20:03 +0200)
Fixes bug 591879.

codegen/valaccodecontrolflowmodule.vala
vala/valaswitchstatement.vala

index 19a30a0587b020160c097e919b091dd4aa909534..cb1b8c2865256b7e5984119d114983f9941426c3 100644 (file)
@@ -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<Statement> default_statements = null;
                label_count = 0;
 
index a66a284b724eead484870a7d21741b9b22bbad5a..d1468e5a8f50e3eb29b14b0b1a2fcb5d108e10ae 100644 (file)
@@ -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);
                }