if (lvalue.actual_value_type != null) {
type = lvalue.actual_value_type;
}
- if (requires_destroy (type)) {
+ if (get_ccode_delegate_target (field) && requires_destroy (type)) {
/* unref old value */
ccode.add_expression (destroy_field (field, instance));
}
decl_space.add_type_member_declaration (cdecl);
}
}
- } else if (f.variable_type is DelegateType) {
+ } else if (f.variable_type is DelegateType && get_ccode_delegate_target (f)) {
var delegate_type = (DelegateType) f.variable_type;
if (delegate_type.delegate_symbol.has_target) {
// create field to store delegate target
var rhs_array_len = get_array_length_cvalue (field_value, 1);
ccode.add_assignment (lhs_array_size, rhs_array_len);
}
- } else if (f.variable_type is DelegateType) {
+ } else if (f.variable_type is DelegateType && get_ccode_delegate_target (f)) {
var delegate_type = (DelegateType) f.variable_type;
if (delegate_type.delegate_symbol.has_target) {
var field_value = get_field_cvalue (f, load_this_parameter ((TypeSymbol) f.parent_symbol));
pop_context ();
}
- if (requires_destroy (f.variable_type) && instance_finalize_context != null) {
+ if (get_ccode_delegate_target (f) && requires_destroy (f.variable_type) && instance_finalize_context != null) {
push_context (instance_finalize_context);
ccode.add_expression (destroy_field (f, load_this_parameter ((TypeSymbol) f.parent_symbol)));
pop_context ();
cfile.add_type_member_declaration (cdecl);
}
}
- } else if (f.variable_type is DelegateType) {
+ } else if (f.variable_type is DelegateType && get_ccode_delegate_target (f)) {
var delegate_type = (DelegateType) f.variable_type;
if (delegate_type.delegate_symbol.has_target) {
// create field to store delegate target
var this_value = load_this_parameter (st);
foreach (Field f in st.get_fields ()) {
if (f.binding == MemberBinding.INSTANCE) {
- if (requires_destroy (f.variable_type)) {
+ if (get_ccode_delegate_target (f) && requires_destroy (f.variable_type)) {
ccode.add_expression (destroy_field (f, this_value));
}
}
foreach (Field f in st.get_fields ()) {
if (f.binding == MemberBinding.INSTANCE) {
var value = load_field (f, load_this_parameter ((TypeSymbol) st));
- if (requires_copy (f.variable_type)) {
+ if (get_ccode_delegate_target (f) && requires_copy (f.variable_type)) {
value = copy_value (value, f);
if (value == null) {
// error case, continue to avoid critical
instance_struct.add_field (get_ccode_name (len_type), get_array_size_cname (get_ccode_name (f)));
}
}
- } else if (f.variable_type is DelegateType) {
+ } else if (f.variable_type is DelegateType && get_ccode_delegate_target (f)) {
var delegate_type = (DelegateType) f.variable_type;
if (delegate_type.delegate_symbol.has_target) {
// create field to store delegate target
foreach (var f in st.get_fields ()) {
if (f.binding == MemberBinding.INSTANCE) {
var value = load_field (f, load_this_parameter ((TypeSymbol) st));
- if (requires_copy (f.variable_type)) {
+ if (get_ccode_delegate_target (f) && requires_copy (f.variable_type)) {
value = copy_value (value, f);
if (value == null) {
// error case, continue to avoid critical
instance_struct.add_field (get_ccode_name (len_type), get_array_size_cname (get_ccode_name (f)));
}
}
- } else if (f.variable_type is DelegateType) {
+ } else if (f.variable_type is DelegateType && get_ccode_delegate_target (f)) {
var delegate_type = (DelegateType) f.variable_type;
if (delegate_type.delegate_symbol.has_target) {
// create field to store delegate target
instance_priv_struct.add_field (get_ccode_name (len_type), get_array_size_cname (get_ccode_name (f)));
}
}
- } else if (f.variable_type is DelegateType) {
+ } else if (f.variable_type is DelegateType && get_ccode_delegate_target (f)) {
var delegate_type = (DelegateType) f.variable_type;
if (delegate_type.delegate_symbol.has_target) {
// create field to store delegate target
delegates/delegates.vala \
delegates/delegates-error.test \
delegates/fields.vala \
+ delegates/fields-no-target.vala \
delegates/reference_transfer.vala \
delegates/wrapper.vala \
delegates/bug519949.test \
--- /dev/null
+public delegate void FooFunc ();
+
+[CCode (delegate_target = false)]
+public FooFunc func;
+
+public struct Foo {
+ [CCode (delegate_target = false)]
+ public FooFunc func;
+ public int i;
+}
+
+public class Bar {
+ [CCode (delegate_target = false)]
+ public FooFunc func;
+ public int i;
+}
+
+void foo_cb () {
+}
+
+const Foo[] foos = {
+ { foo_cb, 42 }
+};
+
+void main() {
+ func = foo_cb;
+
+ Foo f_stack = { foo_cb, 23 };
+ Foo? f_heap = { foo_cb, 4711 };
+
+ assert (f_stack.i == 23);
+ assert (f_heap.i == 4711);
+ assert (foos[0].i == 42);
+
+ Bar b = new Bar ();
+ b.func = foo_cb;
+ b.i = 42;
+}
+
foreach (Field f in fields) {
if (f.binding == MemberBinding.INSTANCE
+ && f.get_attribute_bool ("CCode", "delegate_target", true)
&& f.variable_type.is_disposable ()) {
return true;
}