[vala] codegen: Small refactoring in property accessor generation



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]