[vala/0.36] codegen: Don't allow assigning delegate if no target/closure is available



commit 820dbe6c7b5a0be04c9ff62729e601605cd1744f
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 76004f7..51d0857 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 45435ba..781e60b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -173,6 +173,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]