From: Jürg Billeter Date: Sun, 27 Sep 2009 08:03:24 +0000 (+0200) Subject: Only move initializer to declaration when reordering is safe X-Git-Tag: 0.7.7~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3af113306cbe504c75cd1ec4a81fb0084b1b6dff;p=thirdparty%2Fvala.git Only move initializer to declaration when reordering is safe In general it is not safe to move non-constant initializer lists to the variable declaration at the beginning of the block. --- diff --git a/ccode/valaccodevariabledeclarator.vala b/ccode/valaccodevariabledeclarator.vala index fdb9dfab8..cf3a9c228 100644 --- a/ccode/valaccodevariabledeclarator.vala +++ b/ccode/valaccodevariabledeclarator.vala @@ -41,12 +41,25 @@ public class Vala.CCodeVariableDeclarator : CCodeDeclarator { */ public string? declarator_suffix { get; set; } + /** + * Initializer only used to zero memory, safe to initialize as part + * of declaration at beginning of block instead of separate assignment. + */ + public bool init0 { get; set; } + public CCodeVariableDeclarator (string name, CCodeExpression? initializer = null, string? declarator_suffix = null) { this.name = name; this.initializer = initializer; this.declarator_suffix = declarator_suffix; } + public CCodeVariableDeclarator.zero (string name, CCodeExpression initializer, string? declarator_suffix = null) { + this.name = name; + this.initializer = initializer; + this.declarator_suffix = declarator_suffix; + this.init0 = true; + } + public override void write (CCodeWriter writer) { writer.write_string (name); if (declarator_suffix != null) { @@ -65,15 +78,14 @@ public class Vala.CCodeVariableDeclarator : CCodeDeclarator { writer.write_string (declarator_suffix); } - // initializer lists can't be moved to a separate statement - if (initializer is CCodeInitializerList) { + if (init0) { writer.write_string (" = "); initializer.write (writer); } } public override void write_initialization (CCodeWriter writer) { - if (initializer != null && !(initializer is CCodeInitializerList)) { + if (initializer != null && !init0) { writer.write_indent (line); writer.write_string (name); diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index d20c8fac0..96835b299 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -2091,6 +2091,7 @@ internal class Vala.CCodeBaseModule : CCodeModule { // initialization not necessary for variables stored in closure if (cvar.initializer == null) { cvar.initializer = default_value_for_type (local.variable_type, true); + cvar.init0 = true; } } @@ -2724,9 +2725,11 @@ internal class Vala.CCodeBaseModule : CCodeModule { clist.append (new CCodeConstant ("0")); vardecl.initializer = clist; + vardecl.init0 = true; } else if (local.variable_type.is_reference_type_or_type_parameter () || local.variable_type.nullable) { vardecl.initializer = new CCodeConstant ("NULL"); + vardecl.init0 = true; } cfrag.append (cdecl); diff --git a/codegen/valadbusclientmodule.vala b/codegen/valadbusclientmodule.vala index 0de4e179d..23158536b 100644 --- a/codegen/valadbusclientmodule.vala +++ b/codegen/valadbusclientmodule.vala @@ -293,7 +293,7 @@ internal class Vala.DBusClientModule : DBusModule { cvalinit.append (new CCodeConstant ("0")); var cval_decl = new CCodeDeclaration ("GValue"); - cval_decl.add_declarator (new CCodeVariableDeclarator (val_name, cvalinit)); + cval_decl.add_declarator (new CCodeVariableDeclarator.zero (val_name, cvalinit)); block.add_statement (cval_decl); var val_ptr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (val_name)); @@ -624,7 +624,7 @@ internal class Vala.DBusClientModule : DBusModule { cvalinit.append (new CCodeConstant ("0")); var cval_decl = new CCodeDeclaration ("GValue"); - cval_decl.add_declarator (new CCodeVariableDeclarator ("gvalue", cvalinit)); + cval_decl.add_declarator (new CCodeVariableDeclarator.zero ("gvalue", cvalinit)); block.add_statement (cval_decl); var val_ptr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("gvalue")); @@ -679,7 +679,7 @@ internal class Vala.DBusClientModule : DBusModule { cvalinit.append (new CCodeConstant ("0")); var cval_decl = new CCodeDeclaration ("GValue"); - cval_decl.add_declarator (new CCodeVariableDeclarator ("gvalue", cvalinit)); + cval_decl.add_declarator (new CCodeVariableDeclarator.zero ("gvalue", cvalinit)); block.add_statement (cval_decl); var val_ptr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("gvalue")); diff --git a/codegen/valadbusmodule.vala b/codegen/valadbusmodule.vala index 1fbd47374..ac6007d1b 100644 --- a/codegen/valadbusmodule.vala +++ b/codegen/valadbusmodule.vala @@ -373,7 +373,7 @@ internal class Vala.DBusModule : GAsyncModule { cvalinit.append (new CCodeConstant ("0")); var cdecl = new CCodeDeclaration ("GValue"); - cdecl.add_declarator (new CCodeVariableDeclarator (temp_name, cvalinit)); + cdecl.add_declarator (new CCodeVariableDeclarator.zero (temp_name, cvalinit)); fragment.append (cdecl); cdecl = new CCodeDeclaration ("DBusMessageIter");