From: Jürg Billeter Date: Tue, 10 Aug 2010 17:45:46 +0000 (+0200) Subject: codegen: Small refactoring in property accessor generation X-Git-Tag: 0.9.6~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e97db7611eb7383a7db55acccf2f9d599721b11c;p=thirdparty%2Fvala.git codegen: Small refactoring in property accessor generation --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 5524e5da9..a45db5f17 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -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