diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2012-03-29 19:25:50 -0700 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2012-03-29 19:41:09 -0700 |
| commit | 35a3fa099930e2bb87bd4e4a911039be8fc19e2d (patch) | |
| tree | 7289b6f085ccafd38b4ea2de9eb648b43345e5bc /src/rustc/middle | |
| parent | 2b45da8a339d1e2935d250cfae63b44a3b16688f (diff) | |
add some comments explaining how the tables work
Diffstat (limited to 'src/rustc/middle')
| -rw-r--r-- | src/rustc/middle/ty.rs | 10 | ||||
| -rw-r--r-- | src/rustc/middle/typeck.rs | 25 |
2 files changed, 35 insertions, 0 deletions
diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs index ad4d0ec58b2..99cd0d20564 100644 --- a/src/rustc/middle/ty.rs +++ b/src/rustc/middle/ty.rs @@ -194,8 +194,18 @@ type ctxt = sess: session::session, def_map: resolve::def_map, region_map: @middle::region::region_map, + + // Stores the types for various nodes in the AST. Note that this table + // is not guaranteed to be populated until after typeck. See + // typeck::fn_ctxt for details. node_types: node_type_table, + + // Stores the type parameters which were substituted to obtain the type + // of this node. This only applies to nodes that refer to entities + // parameterized by type parameters, such as generic fns, types, or + // other items. node_type_substs: hashmap<node_id, [t]>, + items: ast_map::map, freevars: freevars::freevar_map, tcache: type_cache, diff --git a/src/rustc/middle/typeck.rs b/src/rustc/middle/typeck.rs index 12c81361c6b..6969c1222d6 100644 --- a/src/rustc/middle/typeck.rs +++ b/src/rustc/middle/typeck.rs @@ -82,8 +82,33 @@ type fn_ctxt = locals: hashmap<ast::node_id, int>, next_var_id: @mut int, next_region_var_id: @mut int, + + // While type checking a function, the intermediate types for the + // expressions, blocks, and so forth contained within the function are + // stored in these tables. These types may contain unresolved type + // variables. After type checking is complete, the functions in the + // writeback module are used to take the types from this table, resolve + // them, and then write them into their permanent home in the type + // context `ccx.tcx`. + // + // This means that during inferencing you should use `fcx.write_ty()` + // and `fcx.expr_ty()` / `fcx.node_ty()` to write/obtain the types of + // nodes within the function. + // + // The types of top-level items, which never contain unbound type + // variables, are stored directly into the `tcx` tables. + // + // n.b.: A type variable is not the same thing as a type parameter. A + // type variable is rather an "instance" of a type parameter: that is, + // given a generic function `fn foo<T>(t: T)`: while checking the + // function `foo`, the type `ty_param(0)` refers to the type `T`, which + // is treated in abstract. When `foo()` is called, however, `T` will be + // substituted for a fresh type variable `ty_var(N)`. This variable will + // eventually be resolved to some concrete type (which might itself be + // type parameter). node_types: smallintmap::smallintmap<ty::t>, node_type_substs: hashmap<ast::node_id, [ty::t]>, + ccx: @crate_ctxt}; // Determines whether the given node ID is a use of the def of |
