[vala] Report error when capturing uninitialized variables in closures



commit 873e330917ecced15684491a511c38b45baf761f
Author: Jürg Billeter <j bitron ch>
Date:   Thu Sep 17 18:32:34 2009 +0200

    Report error when capturing uninitialized variables in closures

 vala/valalambdaexpression.vala |    7 +++++++
 vala/valamemberaccess.vala     |    1 +
 vala/valamethod.vala           |   20 ++++++++++++++++++++
 3 files changed, 28 insertions(+), 0 deletions(-)
---
diff --git a/vala/valalambdaexpression.vala b/vala/valalambdaexpression.vala
index b7bb1f3..16a51c1 100644
--- a/vala/valalambdaexpression.vala
+++ b/vala/valalambdaexpression.vala
@@ -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);
+		}
+	}
 }
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index b7dc62a..70f3a26 100644
--- a/vala/valamemberaccess.vala
+++ b/vala/valamemberaccess.vala
@@ -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;
diff --git a/vala/valamethod.vala b/vala/valamethod.vala
index 327cdb1..05b7893 100644
--- a/vala/valamethod.vala
+++ b/vala/valamethod.vala
@@ -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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]