[vala] codegen: Small refactoring in property accessor generation
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] codegen: Small refactoring in property accessor generation
- Date: Thu, 12 Aug 2010 13:22:32 +0000 (UTC)
commit e97db7611eb7383a7db55acccf2f9d599721b11c
Author: Jürg Billeter <j bitron ch>
Date: Tue Aug 10 19:45:46 2010 +0200
codegen: Small refactoring in property accessor generation
codegen/valaccodebasemodule.vala | 51 ++++++++++++++++++++------------------
1 files changed, 27 insertions(+), 24 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 5524e5d..a45db5f 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
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]