]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Support more flexible C switch statements
authorJürg Billeter <j@bitron.ch>
Sat, 1 Nov 2008 20:12:06 +0000 (20:12 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sat, 1 Nov 2008 20:12:06 +0000 (20:12 +0000)
2008-11-01  Jürg Billeter  <j@bitron.ch>

* ccode/valaccodecasestatement.vala:
* ccode/valaccodeswitchstatement.vala:
* gobject/valaccodegenerator.vala:
* gobject/valagobjectclassmodule.vala:

Support more flexible C switch statements

svn path=/trunk/; revision=1948

ChangeLog
ccode/valaccodecasestatement.vala
ccode/valaccodeswitchstatement.vala
gobject/valaccodegenerator.vala
gobject/valagobjectclassmodule.vala

index fc19aa6af16250fa4533988121baf699502592be..ac0df11181d285d0536df16a2370b449f69b817e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-11-01  Jürg Billeter  <j@bitron.ch>
+
+       * ccode/valaccodecasestatement.vala:
+       * ccode/valaccodeswitchstatement.vala:
+       * gobject/valaccodegenerator.vala:
+       * gobject/valagobjectclassmodule.vala:
+
+       Support more flexible C switch statements
+
 2008-11-01  Jürg Billeter  <j@bitron.ch>
 
        * vala/Makefile.am:
index 1ac924b24b2d021acb2b68ac8829a132c0eddc80..8e892a8fd6fe0dd95e7abe446dce7fde8fd72382 100644 (file)
@@ -32,30 +32,15 @@ public class Vala.CCodeCaseStatement : CCodeStatement {
         */
        public CCodeExpression expression { get; set; }
        
-       private Gee.List<CCodeStatement> statements = new ArrayList<CCodeStatement> ();
-       
        public CCodeCaseStatement (CCodeExpression expression) {
                this.expression = expression;
        }
        
-       /**
-        * Append the specified statement to this switch section.
-        *
-        * @param stmt a statement
-        */
-       public void add_statement (CCodeStatement stmt) {
-               statements.add (stmt);
-       }
-       
        public override void write (CCodeWriter writer) {
                writer.write_indent (line);
                writer.write_string ("case ");
                expression.write (writer);
                writer.write_string (":");
                writer.write_newline ();
-
-               foreach (CCodeStatement stmt in statements) {
-                       stmt.write (writer);
-               }
        }
 }
index bcce2654f63662314d5c99975680ef1794402853..9bf1d9d1a87726ba7b3da9ed0e7a66d8b7beeb9d 100644 (file)
@@ -26,58 +26,22 @@ using Gee;
 /**
  * Represents a switch selection statement in the C code.
  */
-public class Vala.CCodeSwitchStatement : CCodeStatement {
+public class Vala.CCodeSwitchStatement : CCodeBlock {
        /**
         * The switch expression.
         */
        public CCodeExpression expression { get; set; }
        
-       private Gee.List<CCodeCaseStatement> case_statements = new ArrayList<CCodeCaseStatement> ();
-       private Gee.List<CCodeStatement> default_statements = new ArrayList<CCodeStatement> ();
-       
        public CCodeSwitchStatement (CCodeExpression expression) {
                this.expression = expression;
        }
        
-       /**
-        * Adds the specified case statement to the list of switch sections.
-        *
-        * @param case_stmt a case statement
-        */
-       public void add_case (CCodeCaseStatement case_stmt) {
-               case_statements.add (case_stmt);
-       }
-
-       /**
-        * Append the specified statement to the default clause.
-        *
-        * @param stmt a statement
-        */
-       public void add_default_statement (CCodeStatement stmt) {
-               default_statements.add (stmt);
-       }
-
        public override void write (CCodeWriter writer) {
                writer.write_indent (line);
                writer.write_string ("switch (");
                expression.write (writer);
                writer.write_string (")");
-               writer.write_begin_block ();
-               
-               foreach (CCodeCaseStatement case_stmt in case_statements) {
-                       case_stmt.write (writer);
-               }
-
-               if (default_statements.size > 0) {
-                       writer.write_indent ();
-                       writer.write_string ("default:");
-                       writer.write_newline ();
-
-                       foreach (CCodeStatement stmt in default_statements) {
-                               stmt.write (writer);
-                       }
-               }
 
-               writer.write_end_block ();
+               base.write (writer);
        }
 }
index 722525145e67f6865bfa37a027995ddf213fdd40..5773e1c0e82cb1c4a926f1287757ad9d6123c018 100644 (file)
@@ -2109,23 +2109,21 @@ public class Vala.CCodeGenerator : CodeGenerator {
 
                foreach (SwitchSection section in stmt.get_sections ()) {
                        if (section.has_default_label ()) {
+                               cswitch.add_statement (new CCodeLabel ("default"));
                                var cdefaultblock = new CCodeBlock ();
-                               cswitch.add_default_statement (cdefaultblock);
+                               cswitch.add_statement (cdefaultblock);
                                foreach (CodeNode default_stmt in section.get_statements ()) {
                                        cdefaultblock.add_statement (default_stmt.ccodenode);
                                }
                                continue;
                        }
 
-                       CCodeCaseStatement ccase = null;
-
                        foreach (SwitchLabel label in section.get_labels ()) {
-                               ccase = new CCodeCaseStatement ((CCodeExpression) label.expression.ccodenode);
-                               cswitch.add_case (ccase);
+                               cswitch.add_statement (new CCodeCaseStatement ((CCodeExpression) label.expression.ccodenode));
                        }
 
                        var cblock = new CCodeBlock ();
-                       ccase.add_statement (cblock);
+                       cswitch.add_statement (cblock);
                        foreach (CodeNode body_stmt in section.get_statements ()) {
                                cblock.add_statement (body_stmt.ccodenode);
                        }
index 894a91832b8543984e8ad7a5d3cc0fd0d79a0dca..2413550ef65363fdabebc7e2666bebae29e35f77 100644 (file)
@@ -1155,19 +1155,19 @@ public class Vala.GObjectClassModule : CCodeModule {
                                cself = codegen.transform_expression (cself, new ObjectType (cl), new ObjectType (base_type));
                        }
 
-                       var ccase = new CCodeCaseStatement (new CCodeIdentifier (prop.get_upper_case_cname ()));
+                       cswitch.add_statement (new CCodeCaseStatement (new CCodeIdentifier (prop.get_upper_case_cname ())));
                        var ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_get_%s".printf (prefix, prop.name)));
                        ccall.add_argument (cself);
                        var csetcall = new CCodeFunctionCall ();
                        csetcall.call = head.get_value_setter_function (prop.property_type);
                        csetcall.add_argument (new CCodeIdentifier ("value"));
                        csetcall.add_argument (ccall);
-                       ccase.add_statement (new CCodeExpressionStatement (csetcall));
-                       ccase.add_statement (new CCodeBreakStatement ());
-                       cswitch.add_case (ccase);
+                       cswitch.add_statement (new CCodeExpressionStatement (csetcall));
+                       cswitch.add_statement (new CCodeBreakStatement ());
                }
-               cswitch.add_default_statement (get_invalid_property_id_warn_statement ());
-               cswitch.add_default_statement (new CCodeBreakStatement ());
+               cswitch.add_statement (new CCodeLabel ("default"));
+               cswitch.add_statement (get_invalid_property_id_warn_statement ());
+               cswitch.add_statement (new CCodeBreakStatement ());
 
                block.add_statement (cswitch);
 
@@ -1215,7 +1215,7 @@ public class Vala.GObjectClassModule : CCodeModule {
                                cself = codegen.transform_expression (cself, new ObjectType (cl), new ObjectType (base_type));
                        }
 
-                       var ccase = new CCodeCaseStatement (new CCodeIdentifier (prop.get_upper_case_cname ()));
+                       cswitch.add_statement (new CCodeCaseStatement (new CCodeIdentifier (prop.get_upper_case_cname ())));
                        var ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_set_%s".printf (prefix, prop.name)));
                        ccall.add_argument (cself);
                        var cgetcall = new CCodeFunctionCall ();
@@ -1226,51 +1226,47 @@ public class Vala.GObjectClassModule : CCodeModule {
                        }
                        cgetcall.add_argument (new CCodeIdentifier ("value"));
                        ccall.add_argument (cgetcall);
-                       ccase.add_statement (new CCodeExpressionStatement (ccall));
-                       ccase.add_statement (new CCodeBreakStatement ());
-                       cswitch.add_case (ccase);
+                       cswitch.add_statement (new CCodeExpressionStatement (ccall));
+                       cswitch.add_statement (new CCodeBreakStatement ());
                }
-               cswitch.add_default_statement (get_invalid_property_id_warn_statement ());
-               cswitch.add_default_statement (new CCodeBreakStatement ());
+               cswitch.add_statement (new CCodeLabel ("default"));
+               cswitch.add_statement (get_invalid_property_id_warn_statement ());
+               cswitch.add_statement (new CCodeBreakStatement ());
 
                block.add_statement (cswitch);
 
                /* type, dup func, and destroy func properties for generic types */
                foreach (TypeParameter type_param in cl.get_type_parameters ()) {
                        string func_name, enum_value;
-                       CCodeCaseStatement ccase;
                        CCodeMemberAccess cfield;
                        CCodeFunctionCall cgetcall;
 
                        func_name = "%s_type".printf (type_param.name.down ());
                        enum_value = "%s_%s".printf (cl.get_lower_case_cname (null), func_name).up ();
-                       ccase = new CCodeCaseStatement (new CCodeIdentifier (enum_value));
+                       cswitch.add_statement (new CCodeCaseStatement (new CCodeIdentifier (enum_value)));
                        cfield = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
                        cgetcall = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_gtype"));
                        cgetcall.add_argument (new CCodeIdentifier ("value"));
-                       ccase.add_statement (new CCodeExpressionStatement (new CCodeAssignment (cfield, cgetcall)));
-                       ccase.add_statement (new CCodeBreakStatement ());
-                       cswitch.add_case (ccase);
+                       cswitch.add_statement (new CCodeExpressionStatement (new CCodeAssignment (cfield, cgetcall)));
+                       cswitch.add_statement (new CCodeBreakStatement ());
 
                        func_name = "%s_dup_func".printf (type_param.name.down ());
                        enum_value = "%s_%s".printf (cl.get_lower_case_cname (null), func_name).up ();
-                       ccase = new CCodeCaseStatement (new CCodeIdentifier (enum_value));
+                       cswitch.add_statement (new CCodeCaseStatement (new CCodeIdentifier (enum_value)));
                        cfield = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
                        cgetcall = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_pointer"));
                        cgetcall.add_argument (new CCodeIdentifier ("value"));
-                       ccase.add_statement (new CCodeExpressionStatement (new CCodeAssignment (cfield, cgetcall)));
-                       ccase.add_statement (new CCodeBreakStatement ());
-                       cswitch.add_case (ccase);
+                       cswitch.add_statement (new CCodeExpressionStatement (new CCodeAssignment (cfield, cgetcall)));
+                       cswitch.add_statement (new CCodeBreakStatement ());
 
                        func_name = "%s_destroy_func".printf (type_param.name.down ());
                        enum_value = "%s_%s".printf (cl.get_lower_case_cname (null), func_name).up ();
-                       ccase = new CCodeCaseStatement (new CCodeIdentifier (enum_value));
+                       cswitch.add_statement (new CCodeCaseStatement (new CCodeIdentifier (enum_value)));
                        cfield = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
                        cgetcall = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_pointer"));
                        cgetcall.add_argument (new CCodeIdentifier ("value"));
-                       ccase.add_statement (new CCodeExpressionStatement (new CCodeAssignment (cfield, cgetcall)));
-                       ccase.add_statement (new CCodeBreakStatement ());
-                       cswitch.add_case (ccase);
+                       cswitch.add_statement (new CCodeExpressionStatement (new CCodeAssignment (cfield, cgetcall)));
+                       cswitch.add_statement (new CCodeBreakStatement ());
                }
 
                set_prop.block = block;