diff options
| author | Tim Chevalier <chevalier@alum.wellesley.edu> | 2012-05-13 19:59:43 -0700 |
|---|---|---|
| committer | Tim Chevalier <chevalier@alum.wellesley.edu> | 2012-05-14 14:26:10 -0700 |
| commit | 89cd2f6bd01e66f41b8dc49dd09930aa86cd2bd9 (patch) | |
| tree | 122d27dbed85bdb6e6931a2227abcbabb05a14e7 /src/rustc/middle | |
| parent | 11e9947ff55b4c8a4f9c8ce875bfff6f2016e8b4 (diff) | |
Enforce that self doesn't escape from a class
Closes #2294
Diffstat (limited to 'src/rustc/middle')
| -rw-r--r-- | src/rustc/middle/check_self.rs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/rustc/middle/check_self.rs b/src/rustc/middle/check_self.rs new file mode 100644 index 00000000000..b1d2c4b8215 --- /dev/null +++ b/src/rustc/middle/check_self.rs @@ -0,0 +1,60 @@ +/* + This module checks that within a class, "self" doesn't escape. + That is, it rejects any class in which "self" occurs other than + as the left-hand side of a field reference. + */ +import syntax::ast::*; +import syntax::visit::*; +import driver::session::session; +import std::map::hashmap; +import resolve::def_map; + +fn check_crate(cx: ty::ctxt, crate: @crate) { + visit_crate(*crate, cx, mk_vt(@{ + visit_item: bind check_item(_, _, _) + with *default_visitor() + })); + cx.sess.abort_if_errors(); +} + +fn check_item(it: @item, &&cx: ty::ctxt, &&_v: vt<ty::ctxt>) { + alt it.node { + item_class(*) { + visit_item(it, cx, check_self_visitor()); + } + _ {} + } +} + +fn check_self_visitor() -> vt<ty::ctxt> { + mk_vt(@{ + visit_expr: bind check_self_expr(_, _, _) + with *default_visitor() + }) +} + +fn check_self_expr(e: @expr, &&cx: ty::ctxt, &&v: vt<ty::ctxt>) { + alt e.node { + expr_field(@{node: expr_path(p),_},_,_) { + // self is ok here; don't descend + } + expr_path(_) { + alt cx.def_map.find(e.id) { + some(def_self(_)) { + cx.sess.span_err(e.span, "can't return self or store \ + it in a data structure"); + } + _ {} + } + } + _ { visit_expr(e, cx, v); } + } +} + +// Local Variables: +// mode: rust +// fill-column: 78; +// indent-tabs-mode: nil +// c-basic-offset: 4 +// buffer-file-coding-system: utf-8-unix +// End: |
