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)) {
}
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 {
cname = acc.get_cname ();
}
+ CCodeFunction function;
if (acc.writable || acc.construction || returns_real_struct) {
function = new CCodeFunction (cname, "void");
} else {
}
}
- 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) {
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