}
} else if (sym is Method) {
unowned Method m = (Method) sym;
- if (m.base_method != null || m.base_interface_method != null) {
+ if (m.base_method != null || m.base_interface_method != null || m.signal_reference != null) {
string m_name;
if (m.signal_reference != null) {
m_name = get_ccode_lower_case_name (m.signal_reference);
}
public override CCodeExpression get_signal_creation (Signal sig, TypeSymbol type) {
- var csignew = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_new"));
+ CCodeFunctionCall csignew;
+ if (sig.default_handler == null || sig.is_virtual) {
+ csignew = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_new"));
+ } else {
+ csignew = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_new_class_handler"));
+ }
csignew.add_argument (new CCodeConstant ("\"%s\"".printf (get_ccode_name (sig))));
csignew.add_argument (new CCodeIdentifier (get_ccode_type_id (type)));
string[] flags = new string[0];
if (sig.default_handler == null) {
csignew.add_argument (new CCodeConstant ("0"));
- } else {
+ } else if (sig.is_virtual) {
var struct_offset = new CCodeFunctionCall (new CCodeIdentifier ("G_STRUCT_OFFSET"));
if (type is Class) {
struct_offset.add_argument (new CCodeIdentifier ("%sClass".printf (get_ccode_name (type))));
}
struct_offset.add_argument (new CCodeIdentifier (get_ccode_vfunc_name (sig.default_handler)));
csignew.add_argument (struct_offset);
+ } else {
+ csignew.add_argument (new CCodeCastExpression (new CCodeIdentifier (get_ccode_real_name (sig.default_handler)), "GCallback"));
}
csignew.add_argument (new CCodeConstant ("NULL"));
csignew.add_argument (new CCodeConstant ("NULL"));
} else if (s is Signal) {
var sig = (Signal) s;
if (sig.default_handler != null) {
- generate_virtual_method_declaration (sig.default_handler, decl_space, type_struct);
+ if (sig.is_virtual) {
+ generate_virtual_method_declaration (sig.default_handler, decl_space, type_struct);
+ } else {
+ generate_method_declaration (sig.default_handler, cfile);
+ }
}
} else if (s is Property) {
var prop = (Property) s;
foreach (Signal sig in cl.get_signals ()) {
if (sig.default_handler != null) {
- generate_virtual_method_declaration (sig.default_handler, decl_space, type_struct);
+ if (sig.is_virtual) {
+ generate_virtual_method_declaration (sig.default_handler, decl_space, type_struct);
+ } else {
+ generate_method_declaration (sig.default_handler, cfile);
+ }
}
}
/* connect default signal handlers */
foreach (Signal sig in cl.get_signals ()) {
- if (sig.default_handler == null) {
+ if (sig.default_handler == null || !sig.is_virtual) {
continue;
}
generate_method_declaration (sig.default_handler, cfile);
generate_struct_method_declaration (iface, m, instance_struct, type_struct, decl_space, ref has_struct_member);
} else if ((sig = sym as Signal) != null) {
if (sig.default_handler != null) {
- generate_virtual_method_declaration (sig.default_handler, decl_space, type_struct);
+ if (sig.is_virtual) {
+ generate_virtual_method_declaration (sig.default_handler, decl_space, type_struct);
+ } else {
+ generate_method_declaration (sig.default_handler, cfile);
+ }
}
} else if ((prop = sym as Property) != null) {
generate_struct_property_declaration (iface, prop, instance_struct, type_struct, decl_space, ref has_struct_member);
/* connect default signal handlers */
foreach (Signal sig in iface.get_signals ()) {
- if (sig.default_handler == null) {
+ if (sig.default_handler == null || !sig.is_virtual) {
continue;
}
var cname = get_ccode_real_name (sig.default_handler);
objects/sealed-class.test \
objects/sealed-compact-class.test \
objects/signals.vala \
+ objects/signals-default-class-handler.vala \
objects/signals-enum-marshal.vala \
objects/signals-delegate.vala \
objects/signals-delegate-parameter.vala \
--- /dev/null
+bool success = false;
+bool success2 = false;
+
+class Foo {
+ public signal void foo () {
+ success = true;
+ }
+
+ [HasEmitter]
+ public signal void foo_with_emitter () {
+ success2 = true;
+ }
+}
+
+void main () {
+ var foo = new Foo ();
+
+ foo.foo ();
+ assert (success);
+
+ foo.foo_with_emitter ();
+ assert (success2);
+}
}
}
- if (!is_virtual && body != null) {
- error = true;
- Report.error (source_reference, "Only virtual signals can have a default signal handler body");
- }
-
-
- if (is_virtual) {
+ if (body != null || (is_virtual && external_package)) {
default_handler = new Method (name, return_type, source_reference);
default_handler.owner = owner;
- default_handler.access = access;
+ default_handler.access = (is_virtual ? access : SymbolAccessibility.PRIVATE);
default_handler.external = external;
default_handler.hides = hides;
- default_handler.is_virtual = true;
+ default_handler.is_virtual = is_virtual;
default_handler.signal_reference = this;
default_handler.body = body;
-
foreach (Parameter param in parameters) {
default_handler.add_parameter (param);
}