]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Small refactoring in property accessor generation
authorJürg Billeter <j@bitron.ch>
Tue, 10 Aug 2010 17:45:46 +0000 (19:45 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 12 Aug 2010 13:21:45 +0000 (15:21 +0200)
codegen/valaccodebasemodule.vala

index 5524e5da9e353e900394c79ff64e44b1e0d9f0f4..a45db5f177026df0851dd1b0efac7eacd31ca3dd 100644 (file)
@@ -1416,10 +1416,6 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        acc.result_var.accept (this);
                }
 
-               if (acc.body != null) {
-                       acc.body.emit (this);
-               }
-
                var t = (TypeSymbol) prop.parent_symbol;
 
                if (acc.construction && !t.is_subtype_of (gobject_type)) {
@@ -1465,6 +1461,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                }
 
                if (prop.is_abstract || prop.is_virtual) {
+                       CCodeFunction function;
                        if (acc.readable && !returns_real_struct) {
                                function = new CCodeFunction (acc.get_cname (), current_return_type.get_cname ());
                        } else {
@@ -1562,6 +1559,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                cname = acc.get_cname ();
                        }
 
+                       CCodeFunction function;
                        if (acc.writable || acc.construction || returns_real_struct) {
                                function = new CCodeFunction (cname, "void");
                        } else {
@@ -1608,12 +1606,18 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                }
                        }
 
-                       function.block = (CCodeBlock) acc.body.ccodenode;
+                       var init_fragment = new CCodeFragment ();
 
-                       if (is_virtual) {
-                               var cdecl = new CCodeDeclaration (this_type.get_cname ());
-                               cdecl.add_declarator (new CCodeVariableDeclarator ("self", transform_expression (new CCodeIdentifier ("base"), base_type, this_type)));
-                               function.block.prepend_statement (cdecl);
+                       if (prop.binding == MemberBinding.INSTANCE && !is_virtual) {
+                               CCodeStatement check_stmt;
+                               if (!acc.readable || returns_real_struct) {
+                                       check_stmt = create_property_type_check_statement (prop, false, t, true, "self");
+                               } else {
+                                       check_stmt = create_property_type_check_statement (prop, true, t, true, "self");
+                               }
+                               if (check_stmt != null) {
+                                       init_fragment.append (check_stmt);
+                               }
                        }
 
                        if (acc.readable && !returns_real_struct) {
@@ -1621,26 +1625,25 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                if (acc.return_block == null || acc.return_block.get_predecessors ().size > 0) {
                                        var cdecl = new CCodeDeclaration (acc.value_type.get_cname ());
                                        cdecl.add_declarator (new CCodeVariableDeclarator ("result"));
-                                       function.block.prepend_statement (cdecl);
+                                       init_fragment.append (cdecl);
                                }
                        }
 
-                       if (current_method_inner_error) {
-                               var cdecl = new CCodeDeclaration ("GError *");
-                               cdecl.add_declarator (new CCodeVariableDeclarator ("_inner_error_", new CCodeConstant ("NULL")));
-                               function.block.prepend_statement (cdecl);
+                       if (is_virtual) {
+                               var cdecl = new CCodeDeclaration (this_type.get_cname ());
+                               cdecl.add_declarator (new CCodeVariableDeclarator ("self", transform_expression (new CCodeIdentifier ("base"), base_type, this_type)));
+                               init_fragment.append (cdecl);
                        }
 
-                       if (prop.binding == MemberBinding.INSTANCE && !is_virtual) {
-                               CCodeStatement check_stmt;
-                               if (!acc.readable || returns_real_struct) {
-                                       check_stmt = create_property_type_check_statement (prop, false, t, true, "self");
-                               } else {
-                                       check_stmt = create_property_type_check_statement (prop, true, t, true, "self");
-                               }
-                               if (check_stmt != null) {
-                                       function.block.prepend_statement (check_stmt);
-                               }
+                       acc.body.emit (this);
+
+                       function.block = (CCodeBlock) acc.body.ccodenode;
+                       function.block.prepend_statement (init_fragment);
+
+                       if (current_method_inner_error) {
+                               var cdecl = new CCodeDeclaration ("GError *");
+                               cdecl.add_declarator (new CCodeVariableDeclarator.zero ("_inner_error_", new CCodeConstant ("NULL")));
+                               function.block.add_statement (cdecl);
                        }
 
                        // notify on property changes