From: Jürg Billeter Date: Sat, 1 Nov 2008 20:12:06 +0000 (+0000) Subject: Support more flexible C switch statements X-Git-Tag: VALA_0_5_1~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d54e290a749a349052865ef2ba03a95e4974f2e6;p=thirdparty%2Fvala.git Support more flexible C switch statements 2008-11-01 Jürg Billeter * ccode/valaccodecasestatement.vala: * ccode/valaccodeswitchstatement.vala: * gobject/valaccodegenerator.vala: * gobject/valagobjectclassmodule.vala: Support more flexible C switch statements svn path=/trunk/; revision=1948 --- diff --git a/ChangeLog b/ChangeLog index fc19aa6af..ac0df1118 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-11-01 Jürg Billeter + + * ccode/valaccodecasestatement.vala: + * ccode/valaccodeswitchstatement.vala: + * gobject/valaccodegenerator.vala: + * gobject/valagobjectclassmodule.vala: + + Support more flexible C switch statements + 2008-11-01 Jürg Billeter * vala/Makefile.am: diff --git a/ccode/valaccodecasestatement.vala b/ccode/valaccodecasestatement.vala index 1ac924b24..8e892a8fd 100644 --- a/ccode/valaccodecasestatement.vala +++ b/ccode/valaccodecasestatement.vala @@ -32,30 +32,15 @@ public class Vala.CCodeCaseStatement : CCodeStatement { */ public CCodeExpression expression { get; set; } - private Gee.List statements = new ArrayList (); - 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); - } } } diff --git a/ccode/valaccodeswitchstatement.vala b/ccode/valaccodeswitchstatement.vala index bcce2654f..9bf1d9d1a 100644 --- a/ccode/valaccodeswitchstatement.vala +++ b/ccode/valaccodeswitchstatement.vala @@ -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 case_statements = new ArrayList (); - private Gee.List default_statements = new ArrayList (); - 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); } } diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index 722525145..5773e1c0e 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -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); } diff --git a/gobject/valagobjectclassmodule.vala b/gobject/valagobjectclassmodule.vala index 894a91832..2413550ef 100644 --- a/gobject/valagobjectclassmodule.vala +++ b/gobject/valagobjectclassmodule.vala @@ -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;