]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix temporary variable handling for class field initializers
authorJürg Billeter <j@bitron.ch>
Tue, 23 Mar 2010 17:07:11 +0000 (18:07 +0100)
committerJürg Billeter <j@bitron.ch>
Tue, 23 Mar 2010 17:15:05 +0000 (18:15 +0100)
codegen/valaccodebasemodule.vala
codegen/valagtypemodule.vala

index e00f0d35a5ca9f5f497511da3ba3aa405f46e61c..89ef3d5833982533c2242fdcff97458f64438b6f 100644 (file)
@@ -1057,6 +1057,32 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                f.error = true;
                                return;
                        }
+
+                       if (f.access == SymbolAccessibility.PRIVATE) {
+                               var ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS_PRIVATE".printf (cl.get_upper_case_cname ())));
+                               ccall.add_argument (new CCodeIdentifier ("klass"));
+                               lhs = new CCodeMemberAccess (ccall, f.get_cname (), true);
+                       } else {
+                               lhs = new CCodeMemberAccess (new CCodeIdentifier ("klass"), f.get_cname (), true);
+                       }
+
+                       if (f.initializer != null) {
+                               var rhs = (CCodeExpression) f.initializer.ccodenode;
+
+                               class_init_fragment.append (new CCodeExpressionStatement (new CCodeAssignment (lhs, rhs)));
+
+                               append_temp_decl (class_init_fragment, temp_vars);
+
+                               foreach (LocalVariable local in temp_ref_vars) {
+                                       var ma = new MemberAccess.simple (local.name);
+                                       ma.symbol_reference = local;
+                                       ma.value_type = local.variable_type.copy ();
+                                       class_init_fragment.append (new CCodeExpressionStatement (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma)));
+                               }
+
+                               temp_vars.clear ();
+                               temp_ref_vars.clear ();
+                       }
                } else {
                        generate_field_declaration (f, source_declarations);
 
index b95e375f7fbd5318cbc49224766cdca358b367ee..bda752ce578b33c085647a4004a97e24fadef687 100644 (file)
@@ -1290,27 +1290,6 @@ internal class Vala.GTypeModule : GErrorModule {
                        }
                }
 
-               /* initialize class fields */
-               var fields = cl.get_fields ();
-               foreach (Field field in fields) {
-                       if (field.binding != MemberBinding.CLASS || field.initializer == null) {
-                               continue;
-                       }
-
-                       CCodeExpression left;
-
-                       if (field.access == SymbolAccessibility.PRIVATE) {
-                               ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS_PRIVATE".printf (cl.get_upper_case_cname ())));
-                               ccall.add_argument (new CCodeIdentifier ("klass"));
-                               left = new CCodeMemberAccess (ccall, field.get_cname (), true);
-                       } else {
-                               left = new CCodeMemberAccess (new CCodeIdentifier ("klass"), field.get_cname (), true);
-                       }
-                       CCodeExpression right = (CCodeExpression) field.initializer.ccodenode;
-                       CCodeAssignment assign = new CCodeAssignment (left, right);
-                       init_block.add_statement (new CCodeExpressionStatement (assign));
-               }
-
                generate_class_init (cl, init_block);
 
                if (!cl.is_compact) {