store_variable (param, get_parameter_cvalue (param), value, false);
}
- public override void store_field (Field field, Expression? instance, TargetValue value) {
+ public override void store_field (Field field, TargetValue? instance, TargetValue value) {
if (requires_destroy (field.variable_type)) {
/* unref old value */
ccode.add_expression (destroy_field (field, instance));
set_cvalue (this_access, new CCodeIdentifier ("self"));
}
- ccode.add_expression (destroy_field (f, this_access));
+ ccode.add_expression (destroy_field (f, this_access.target_value));
pop_context ();
}
return destroy_variable (param, get_parameter_cvalue (param));
}
- public CCodeExpression destroy_field (Field field, Expression? instance) {
+ public CCodeExpression destroy_field (Field field, TargetValue? instance) {
return destroy_variable (field, get_field_cvalue (field, instance));
}
public abstract TargetValue get_parameter_cvalue (Parameter param);
- public abstract TargetValue get_field_cvalue (Field field, Expression? instance);
+ public abstract TargetValue get_field_cvalue (Field field, TargetValue? instance);
public virtual string get_delegate_target_cname (string delegate_cname) {
assert_not_reached ();
this_access.value_type = get_data_type_for_symbol ((TypeSymbol) f.parent_symbol);
set_cvalue (this_access, new CCodeIdentifier ("(*self)"));
- ccode.add_expression (destroy_field (f, this_access));
+ ccode.add_expression (destroy_field (f, this_access.target_value));
}
}
}
set_cvalue (expr, get_array_length_cexpression (expr.inner, 1));
} else if (expr.symbol_reference is Field) {
var field = (Field) expr.symbol_reference;
- expr.target_value = load_field (field, expr.inner);
+ expr.target_value = load_field (field, expr.inner != null ? expr.inner.target_value : null);
} else if (expr.symbol_reference is EnumValue) {
var ev = (EnumValue) expr.symbol_reference;
}
/* Returns lvalue access to the given field */
- public override TargetValue get_field_cvalue (Field field, Expression? instance) {
+ public override TargetValue get_field_cvalue (Field field, TargetValue? instance) {
var result = new GLibValue (field.variable_type.copy ());
var array_type = field.variable_type as ArrayType;
CCodeExpression pub_inst = null;
if (instance != null) {
- pub_inst = get_cvalue (instance);
+ pub_inst = get_cvalue_ (instance);
}
var instance_target_type = get_data_type_for_symbol ((TypeSymbol) field.parent_symbol);
} else {
// Accessing the field of an instance
var k = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_GET_CLASS"));
- k.add_argument (get_cvalue (instance));
+ k.add_argument (get_cvalue_ (instance));
klass = k;
}
cast.add_argument (klass);
}
/* Returns unowned access to the given field */
- public override TargetValue load_field (Field field, Expression? instance) {
+ public override TargetValue load_field (Field field, TargetValue? instance) {
return load_variable (field, get_field_cvalue (field, instance));
}
}
store_variable (param, get_parameter_cvalue (param), value, false);
}
- public override void store_field (Field field, Expression? instance, TargetValue value) {
+ public override void store_field (Field field, TargetValue? instance, TargetValue value) {
store_variable (field, get_field_cvalue (field, instance), value, false);
}
}
set_cvalue (expr, ccall);
} else if (expr.symbol_reference is Field) {
var f = (Field) expr.symbol_reference;
- expr.target_value = load_field (f, expr.inner);
+ expr.target_value = load_field (f, expr.inner != null ? expr.inner.target_value : null);
} else if (expr.symbol_reference is EnumValue) {
var ev = (EnumValue) expr.symbol_reference;
return result;
}
- public TargetValue get_field_cvalue (Field f, Expression? instance) {
+ public TargetValue get_field_cvalue (Field f, TargetValue? instance) {
var result = new DovaValue (f.variable_type);
if (f.binding == MemberBinding.INSTANCE) {
CCodeExpression pub_inst = null;
if (instance != null) {
- pub_inst = get_cvalue (instance);
+ pub_inst = get_cvalue_ (instance);
}
var instance_target_type = get_data_type_for_symbol ((TypeSymbol) f.parent_symbol);
return load_variable (param, get_parameter_cvalue (param));
}
- public override TargetValue load_field (Field field, Expression? instance) {
+ public override TargetValue load_field (Field field, TargetValue? instance) {
return load_variable (field, get_field_cvalue (field, instance));
}
}
} else if (param != null) {
codegen.store_parameter (param, new_value);
} else if (field != null) {
- codegen.store_field (field, instance ? ma.inner : null, new_value);
+ codegen.store_field (field, instance && ma.inner != null ? ma.inner.target_value : null, new_value);
}
// when load_variable is changed to use temporary
} else if (param != null) {
target_value = codegen.load_parameter (param);
} else if (field != null) {
- target_value = codegen.load_field (field, instance ? ma.inner : null);
+ target_value = codegen.load_field (field, instance && ma.inner != null ? ma.inner.target_value : null);
}
codegen.visit_expression (this);
public abstract void store_parameter (Parameter param, TargetValue value);
- public abstract TargetValue load_field (Field field, Expression? instance);
+ public abstract TargetValue load_field (Field field, TargetValue? instance);
- public abstract void store_field (Field field, Expression? instance, TargetValue value);
+ public abstract void store_field (Field field, TargetValue? instance, TargetValue value);
}