[vala/0.46] vala: Check assigned handler of dynamic signal before proceeding further
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/0.46] vala: Check assigned handler of dynamic signal before proceeding further
- Date: Tue, 21 Apr 2020 07:50:20 +0000 (UTC)
commit 6b79c0cc0863cf9a6a0242e487fd224965f6bd38
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Wed Apr 15 21:17:33 2020 +0200
vala: Check assigned handler of dynamic signal before proceeding further
This fixes criticals if an errornous expression was given.
tests/Makefile.am | 1 +
tests/objects/signals-dymanic-invalid-handler.test | 6 ++++++
vala/valamemberaccess.vala | 5 +++++
3 files changed, 12 insertions(+)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 833d8aad8..244c16d2f 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -394,6 +394,7 @@ TESTS = \
objects/signals-enum-marshal.vala \
objects/signals-delegate.vala \
objects/signals-delegate-parameter.vala \
+ objects/signals-dymanic-invalid-handler.test \
objects/signals-fundamental-return.vala \
objects/signals-gobject-return.vala \
objects/signals-lambda-delegate.vala \
diff --git a/tests/objects/signals-dymanic-invalid-handler.test
b/tests/objects/signals-dymanic-invalid-handler.test
new file mode 100644
index 000000000..ce1e86cf1
--- /dev/null
+++ b/tests/objects/signals-dymanic-invalid-handler.test
@@ -0,0 +1,6 @@
+Invalid Code
+
+void main () {
+ dynamic Object? foo = null;
+ foo.on_bar.connect (non_existent);
+}
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index 7022c31fb..2cb9c5781 100644
--- a/vala/valamemberaccess.vala
+++ b/vala/valamemberaccess.vala
@@ -426,6 +426,11 @@ public class Vala.MemberAccess : Expression {
// the first argument is the handler
if (mcall.get_argument_list().size > 0) {
s.handler = mcall.get_argument_list()[0];
+ unowned MemberAccess? arg = s.handler as MemberAccess;
+ if (arg == null || !arg.check (context) ||
!(arg.symbol_reference is Method)) {
+ error = true;
+ Report.error (s.handler.source_reference,
"Invalid handler for `%s'".printf (s.get_full_name ()));
+ }
}
s.access = SymbolAccessibility.PUBLIC;
dynamic_object_type.type_symbol.scope.add (null, s);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]