]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Add ref_sink_function_void argument to CCode
authorLuca Bruno <lucabru@src.gnome.org>
Sun, 7 Aug 2011 19:25:46 +0000 (21:25 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Mon, 8 Aug 2011 10:40:44 +0000 (12:40 +0200)
codegen/valaccodeattribute.vala
codegen/valaccodebasemodule.vala

index e97406465f7ad76ed3b773bc91bfa7fb3f4ee4d4..19e3de1f9e7833a7c9d0b99f278651caf10535ef 100644 (file)
@@ -163,6 +163,24 @@ public class Vala.CCodeAttribute : AttributeCache {
                }
        }
 
+       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) {
@@ -439,6 +457,7 @@ public class Vala.CCodeAttribute : AttributeCache {
        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;
index c189a6f4156c6c8bb537b36cf73349117cd66f17..26f88eee27133da6e1256362652be865802a4508 100644 (file)
@@ -3769,6 +3769,15 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                }
        }
 
+       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);
@@ -5048,9 +5057,12 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        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));
                        }
@@ -5598,6 +5610,10 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                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;
        }