var unref_call = new CCodeFunctionCall (new CCodeIdentifier ("block%d_data_unref".printf (parent_block_id)));
unref_call.add_argument (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "_data%d_".printf (parent_block_id)));
free_block.add_statement (new CCodeExpressionStatement (unref_call));
- } else if (current_method.binding == MemberBinding.INSTANCE) {
+ } else if (in_constructor || (current_method != null && current_method.binding == MemberBinding.INSTANCE)) {
data.add_field ("%s *".printf (current_class.get_cname ()), "self");
var ma = new MemberAccess.simple ("this");
ref_call.add_argument (get_variable_cexpression ("_data%d_".printf (parent_block_id)));
cblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), "_data%d_".printf (parent_block_id)), ref_call)));
- } else if (current_method.binding == MemberBinding.INSTANCE) {
+ } else if (in_constructor || (current_method != null && current_method.binding == MemberBinding.INSTANCE)) {
var ref_call = new CCodeFunctionCall (get_dup_func_expression (new ObjectType (current_class), b.source_reference));
ref_call.add_argument (new CCodeIdentifier ("self"));
public override void visit_constructor (Constructor c) {
bool old_method_inner_error = current_method_inner_error;
current_method_inner_error = false;
- in_constructor = true;
if (c.binding == MemberBinding.CLASS || c.binding == MemberBinding.STATIC) {
in_static_or_class_context = true;
+ } else {
+ in_constructor = true;
}
c.accept_children (codegen);
in_static_or_class_context = false;