public TargetValue transform_value (TargetValue value, DataType? target_type, CodeNode node) {
var type = value.value_type;
var result = ((GLibValue) value).copy ();
- var requires_temp_value = false;
if (type.value_owned
&& type.floating_reference) {
temp_ref_values.insert (0, ((GLibValue) temp_value).copy ());
store_value (temp_value, result);
result.cvalue = get_cvalue_ (temp_value);
- requires_temp_value = false;
}
}
}
ccode.add_expression (ccall);
result = (GLibValue) temp_value;
- requires_temp_value = false;
} else if (gvariant_boxing) {
// implicit conversion to GVariant
string variant_func = "_variant_new%d".printf (++next_variant_function_id);
cfile.add_function (cfunc);
result.cvalue = ccall;
- requires_temp_value = true;
+ result.value_type.value_owned = true;
+
+ result = (GLibValue) store_temp_value (result, node);
+ if (!target_type.value_owned) {
+ // value leaked
+ temp_ref_values.insert (0, ((GLibValue) result).copy ());
+ }
} else if (boxing) {
// value needs to be boxed
if (!result.lvalue || !result.value_type.equals (value.value_type)) {
result.cvalue = get_implicit_cast_expression (result.cvalue, value.value_type, result.value_type, node);
result = (GLibValue) store_temp_value (result, node);
- requires_temp_value = false;
}
result.cvalue = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, result.cvalue);
result.lvalue = false;
result.lvalue = result.lvalue && result.cvalue == old_cexpr;
}
- if (requires_temp_value && !(target_type is ArrayType && ((ArrayType) target_type).inline_allocated)) {
- result = (GLibValue) store_temp_value (result, node);
- }
-
if (!gvalue_boxing && !gvariant_boxing && target_type.value_owned && (!type.value_owned || boxing || unboxing) && requires_copy (target_type) && !(type is NullType)) {
// need to copy value
var copy = (GLibValue) copy_value (result, node);