[vala/staging] codegen: Don't allow assigning delegate if no target/closure is available
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/staging] codegen: Don't allow assigning delegate if no target/closure is available
- Date: Mon, 19 Jun 2017 18:38:00 +0000 (UTC)
commit 9e2cd62d98b212067c8b3c2c644bc56903109aee
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Fri Mar 24 07:56:25 2017 +0100
codegen: Don't allow assigning delegate if no target/closure is available
https://bugzilla.gnome.org/show_bug.cgi?id=598869
codegen/valaccodeassignmentmodule.vala | 11 +++++++++--
tests/Makefile.am | 1 +
tests/delegates/bug598869.test | 17 +++++++++++++++++
3 files changed, 27 insertions(+), 2 deletions(-)
---
diff --git a/codegen/valaccodeassignmentmodule.vala b/codegen/valaccodeassignmentmodule.vala
index 718cd71..6e9ce0d 100644
--- a/codegen/valaccodeassignmentmodule.vala
+++ b/codegen/valaccodeassignmentmodule.vala
@@ -147,8 +147,15 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
var delegate_type = lvalue.value_type as DelegateType;
if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
- if (get_delegate_target_cvalue (lvalue) != null) {
- ccode.add_assignment (get_delegate_target_cvalue (lvalue),
get_delegate_target_cvalue (value));
+ var lvalue_target = get_delegate_target_cvalue (lvalue);
+ var rvalue_target = get_delegate_target_cvalue (value);
+ if (lvalue_target != null) {
+ if (rvalue_target != null) {
+ ccode.add_assignment (lvalue_target, rvalue_target);
+ } else {
+ Report.error (source_reference, "Assigning delegate without required
target in scope");
+ ccode.add_assignment (lvalue_target, new CCodeInvalidExpression ());
+ }
var lvalue_destroy_notify = get_delegate_target_destroy_notify_cvalue
(lvalue);
var rvalue_destroy_notify = get_delegate_target_destroy_notify_cvalue (value);
if (lvalue_destroy_notify != null) {
diff --git a/tests/Makefile.am b/tests/Makefile.am
index bf30775..50708d1 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -153,6 +153,7 @@ TESTS = \
delegates/bug539166.vala \
delegates/bug595610.vala \
delegates/bug595639.vala \
+ delegates/bug598869.test \
delegates/bug638415.vala \
delegates/bug639751.vala \
delegates/bug659778.vala \
diff --git a/tests/delegates/bug598869.test b/tests/delegates/bug598869.test
new file mode 100644
index 0000000..328814a
--- /dev/null
+++ b/tests/delegates/bug598869.test
@@ -0,0 +1,17 @@
+Invalid Code
+
+delegate void FooFunc (int i);
+
+class Foo {
+ public FooFunc func;
+}
+
+class Bar {
+ public void baz (int i) {
+ }
+}
+
+void main () {
+ var foo = new Foo ();
+ foo.func = Bar.baz;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]