}
}
+ public bool ref_sink_function_void {
+ get {
+ if (_ref_sink_function_void == null) {
+ if (ccode != null && ccode.has_argument ("ref_sink_function_void")) {
+ _ref_sink_function_void = ccode.get_bool ("ref_sink_function_void");
+ } else {
+ var cl = (Class) sym;
+ if (cl.base_class != null) {
+ _ref_sink_function_void = CCodeBaseModule.get_ccode_ref_sink_function_void (cl.base_class);
+ } else {
+ _ref_sink_function_void = false;
+ }
+ }
+ }
+ return _ref_sink_function_void;
+ }
+ }
+
public string unref_function {
get {
if (!unref_function_set) {
private string? _unref_function;
private bool unref_function_set;
private string _ref_sink_function;
+ private bool? _ref_sink_function_void;
private string? _copy_function;
private bool copy_function_set;
private string? _destroy_function;
}
}
+ bool is_ref_sink_function_void (DataType type) {
+ var cl = type.data_type as Class;
+ if (cl != null) {
+ return get_ccode_ref_sink_function_void (cl);
+ } else {
+ return false;
+ }
+ }
+
public virtual TargetValue? copy_value (TargetValue value, CodeNode node) {
var type = value.value_type;
var cexpr = get_cvalue_ (value);
if (sink_func != "") {
var csink = new CCodeFunctionCall (new CCodeIdentifier (sink_func));
csink.add_argument (result.cvalue);
-
- result.cvalue = csink;
- requires_temp_value = true;
+ if (!is_ref_sink_function_void (type)) {
+ result.cvalue = csink;
+ requires_temp_value = true;
+ } else {
+ ccode.add_expression (csink);
+ }
} else {
Report.error (null, "type `%s' does not support floating references".printf (type.data_type.name));
}
return get_ccode_attribute(cl).ref_function_void;
}
+ public static bool get_ccode_ref_sink_function_void (Class cl) {
+ return get_ccode_attribute(cl).ref_sink_function_void;
+ }
+
public static string get_ccode_unref_function (ObjectTypeSymbol sym) {
return get_ccode_attribute(sym).unref_function;
}