}
}
- public override CCodeExpression get_unref_expression (CCodeExpression cvar, DataType type, Expression? expr, bool is_macro_definition) {
+ public override CCodeExpression destroy_value (TargetValue value, bool is_macro_definition = false) {
+ var type = value.value_type;
+
if (type is ArrayType) {
var array_type = (ArrayType) type;
if (!array_type.fixed_length) {
- return base.get_unref_expression (cvar, type, expr, is_macro_definition);
+ return base.destroy_value (value, is_macro_definition);
}
requires_array_free = true;
var ccall = new CCodeFunctionCall (get_destroy_func_expression (type));
ccall = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_destroy"));
- ccall.add_argument (cvar);
+ ccall.add_argument (get_cvalue_ (value));
ccall.add_argument (new CCodeConstant ("%d".printf (array_type.length)));
ccall.add_argument (new CCodeCastExpression (get_destroy_func_expression (array_type.element_type), "GDestroyNotify"));
return ccall;
} else {
- return base.get_unref_expression (cvar, type, expr, is_macro_definition);
+ return base.destroy_value (value, is_macro_definition);
}
}
return null;
}
- public virtual CCodeExpression get_unref_expression (CCodeExpression cvar, DataType type, Expression? expr, bool is_macro_definition = false) {
+ public CCodeExpression get_unref_expression (CCodeExpression cvar, DataType type, Expression? expr, bool is_macro_definition = false) {
+ var value = new GLibValue (type, cvar);
+ if (expr != null && expr.target_value != null) {
+ value.array_length_cvalues = ((GLibValue) expr.target_value).array_length_cvalues;
+ value.delegate_target_cvalue = get_delegate_target_cvalue (expr.target_value);
+ value.delegate_target_destroy_notify_cvalue = get_delegate_target_destroy_notify_cvalue (expr.target_value);
+ }
+ return destroy_value (value, is_macro_definition);
+ }
+
+ public virtual CCodeExpression destroy_value (TargetValue value, bool is_macro_definition = false) {
+ var type = value.value_type;
+ var cvar = get_cvalue_ (value);
+
if (type is DelegateType) {
- CCodeExpression delegate_target_destroy_notify;
- var delegate_target = get_delegate_target_cexpression (expr, out delegate_target_destroy_notify);
+ var delegate_target = get_delegate_target_cvalue (value);
+ var delegate_target_destroy_notify = get_delegate_target_destroy_notify_cvalue (value);
var ccall = new CCodeFunctionCall (delegate_target_destroy_notify);
ccall.add_argument (delegate_target);
string free0_func = "_%s0".printf (freeid.name);
if (add_wrapper (free0_func)) {
- var macro = get_unref_expression (new CCodeIdentifier ("var"), type, expr, true);
+ var macro = destroy_value (new GLibValue (type, new CCodeIdentifier ("var")), true);
cfile.add_type_declaration (new CCodeMacroReplacement.with_expression ("%s(var)".printf (free0_func), macro));
}
bool first = true;
for (int dim = 1; dim <= array_type.rank; dim++) {
if (first) {
- csizeexpr = get_array_length_cexpression (expr, dim);
+ csizeexpr = get_array_length_cvalue (value, dim);
first = false;
} else {
- csizeexpr = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, csizeexpr, get_array_length_cexpression (expr, dim));
+ csizeexpr = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, csizeexpr, get_array_length_cvalue (value, dim));
}
}
}
}
- public virtual CCodeExpression get_unref_expression (CCodeExpression cvar, DataType type, Expression? expr = null) {
+ public CCodeExpression get_unref_expression (CCodeExpression cvar, DataType type, Expression? expr = null) {
+ return destroy_value (new DovaValue (type, cvar));
+ }
+
+ public CCodeExpression destroy_value (TargetValue value) {
+ var type = value.value_type;
+ var cvar = get_cvalue_ (value);
+
var ccall = new CCodeFunctionCall (get_destroy_func_expression (type));
if (type is ValueType && !type.nullable) {