[vala] Report error when capturing uninitialized variables in closures
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [vala] Report error when capturing uninitialized variables in closures
- Date: Thu, 17 Sep 2009 16:37:12 +0000 (UTC)
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]