]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Report error when capturing uninitialized variables in closures
authorJürg Billeter <j@bitron.ch>
Thu, 17 Sep 2009 16:32:34 +0000 (18:32 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 17 Sep 2009 16:32:34 +0000 (18:32 +0200)
vala/valalambdaexpression.vala
vala/valamemberaccess.vala
vala/valamethod.vala

index b7bb1f3c57e7d865fbda27818dea119ac5731b38..16a51c1c33d94fe8d75faaa0ef892465055c5ce3 100644 (file)
@@ -226,4 +226,11 @@ public class Vala.LambdaExpression : Expression {
 
                return !error;
        }
+
+       public override void get_used_variables (Collection<LocalVariable> collection) {
+               // require captured variables to be initialized
+               if (method.closure) {
+                       method.get_captured_variables (collection);
+               }
+       }
 }
index b7dc62ac4294ab9d30287a0d14cce6105a16a37a..70f3a260c327a28b0de96c00db89eafeec97076e 100644 (file)
@@ -426,6 +426,7 @@ public class Vala.MemberAccess : Expression {
                                local.captured = true;
                                block.captured = true;
                                analyzer.current_method.closure = true;
+                               analyzer.current_method.add_captured_variable (local);
                        }
                } else if (member is FormalParameter) {
                        var param = (FormalParameter) member;
index 327cdb1d83273b0a05384fdb348dab5fc8cb8b55..05b78936fadc80b6034d544ad1079e901b447233 100644 (file)
@@ -243,6 +243,9 @@ public class Vala.Method : Member {
 
        Method? callback_method;
 
+       // only valid for closures
+       Gee.List<LocalVariable> captured_variables;
+
        /**
         * Creates a new method.
         *
@@ -1025,6 +1028,23 @@ public class Vala.Method : Member {
 
                return params;
        }
+
+       public void add_captured_variable (LocalVariable local) {
+               assert (this.closure);
+
+               if (captured_variables == null) {
+                       captured_variables = new ArrayList<LocalVariable> ();
+               }
+               captured_variables.add (local);
+       }
+
+       public void get_captured_variables (Collection<LocalVariable> variables) {
+               if (captured_variables != null) {
+                       foreach (var local in captured_variables) {
+                               variables.add (local);
+                       }
+               }
+       }
 }
 
 // vim:sw=8 noet