aboutsummaryrefslogtreecommitdiff
path: root/src/boot/me
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-07-02 12:02:56 -0700
committerGraydon Hoare <[email protected]>2010-07-02 12:02:56 -0700
commit285a4735b9565cc75cabd02f7b9c89aa8a70657e (patch)
treecd9fbc798e6cc08ec7f758edc1a564a69f672532 /src/boot/me
parentRemove nameless node causing errors on doc make. (diff)
downloadrust-285a4735b9565cc75cabd02f7b9c89aa8a70657e.tar.xz
rust-285a4735b9565cc75cabd02f7b9c89aa8a70657e.zip
Parse effect-qualified type definitions.
Diffstat (limited to 'src/boot/me')
-rw-r--r--src/boot/me/dwarf.ml11
-rw-r--r--src/boot/me/resolve.ml8
-rw-r--r--src/boot/me/walk.ml2
3 files changed, 13 insertions, 8 deletions
diff --git a/src/boot/me/dwarf.ml b/src/boot/me/dwarf.ml
index 7b54de25..5fd8638f 100644
--- a/src/boot/me/dwarf.ml
+++ b/src/boot/me/dwarf.ml
@@ -1210,6 +1210,8 @@ let (abbrev_typedef:abbrev) =
(DW_TAG_typedef, DW_CHILDREN_yes,
[|
(DW_AT_name, DW_FORM_string);
+ (DW_AT_mutable, DW_FORM_flag);
+ (DW_AT_pure, DW_FORM_flag);
(DW_AT_type, DW_FORM_ref_addr)
|])
;;
@@ -2319,6 +2321,7 @@ let dwarf_visitor
let emit_typedef_die
(id:Ast.ident)
+ (e:Ast.effect)
(ty:Ast.ty)
: unit =
let abbrev_code = get_abbrev_code abbrev_typedef in
@@ -2327,6 +2330,7 @@ let dwarf_visitor
uleb abbrev_code;
(* DW_AT_name: DW_FORM_string *)
ZSTRING id;
+ encode_effect e;
(* DW_AT_type: DW_FORM_ref_addr *)
(ref_type_die ty);
|])
@@ -2388,13 +2392,13 @@ let dwarf_visitor
(Hashtbl.find cx.ctxt_fn_fixups item.id);
emit_type_param_decl_dies item.node.Ast.decl_params;
end
- | Ast.MOD_ITEM_type _ ->
+ | Ast.MOD_ITEM_type (e, _) ->
begin
log cx "walking typedef '%s' with %d type params"
(path_name())
(Array.length item.node.Ast.decl_params);
emit_typedef_die
- id (Hashtbl.find cx.ctxt_all_type_items item.id);
+ id e (Hashtbl.find cx.ctxt_all_type_items item.id);
emit_type_param_decl_dies item.node.Ast.decl_params;
end
| _ -> ()
@@ -3100,9 +3104,10 @@ let rec extract_mod_items
let die = Hashtbl.find dies i in
match die.die_tag with
DW_TAG_typedef ->
+ let effect = get_effect die in
let ident = get_name die in
let ty = get_referenced_ty die in
- let tyi = Ast.MOD_ITEM_type ty in
+ let tyi = Ast.MOD_ITEM_type (effect, ty) in
let (params, islots) = get_formals die in
assert ((Array.length islots) = 0);
htab_put mis ident (decl params tyi)
diff --git a/src/boot/me/resolve.ml b/src/boot/me/resolve.ml
index 72558ae6..5077d5ce 100644
--- a/src/boot/me/resolve.ml
+++ b/src/boot/me/resolve.ml
@@ -270,7 +270,7 @@ let type_reference_and_tag_extracting_visitor
let visit_mod_item_pre id params item =
begin
match item.node.Ast.decl_item with
- Ast.MOD_ITEM_type ty ->
+ Ast.MOD_ITEM_type (_, ty) ->
begin
log cx "extracting references for type node %d"
(int_of_node item.id);
@@ -395,7 +395,7 @@ and lookup_type_by_name
| Some (scopes', id) ->
let ty, params =
match htab_search cx.ctxt_all_defns id with
- Some (DEFN_item { Ast.decl_item = Ast.MOD_ITEM_type t;
+ Some (DEFN_item { Ast.decl_item = Ast.MOD_ITEM_type (_, t);
Ast.decl_params = params }) ->
(t, Array.map (fun p -> p.node) params)
| Some (DEFN_item { Ast.decl_item = Ast.MOD_ITEM_obj ob;
@@ -543,7 +543,7 @@ let type_resolving_visitor
begin
try
match item.node.Ast.decl_item with
- Ast.MOD_ITEM_type ty ->
+ Ast.MOD_ITEM_type (_, ty) ->
let ty =
resolve_type cx (!scopes) recursive_tag_groups
all_tags empty_recur_info ty
@@ -838,7 +838,7 @@ let resolve_recursion
then begin
match Hashtbl.find cx.ctxt_all_defns id with
DEFN_item
- { Ast.decl_item = Ast.MOD_ITEM_type (Ast.TY_tag _) } ->
+ { Ast.decl_item = Ast.MOD_ITEM_type (_, (Ast.TY_tag _)) } ->
log cx "type %d is a recursive tag" (int_of_node id);
Hashtbl.replace recursive_tag_types id ()
| _ ->
diff --git a/src/boot/me/walk.ml b/src/boot/me/walk.ml
index af4a6216..0b60c832 100644
--- a/src/boot/me/walk.ml
+++ b/src/boot/me/walk.ml
@@ -235,7 +235,7 @@ and walk_mod_item
: unit =
let children _ =
match item.node.Ast.decl_item with
- Ast.MOD_ITEM_type ty -> walk_ty v ty
+ Ast.MOD_ITEM_type (_, ty) -> walk_ty v ty
| Ast.MOD_ITEM_fn f -> walk_fn v f item.id
| Ast.MOD_ITEM_tag (htup, ttag, _) ->
walk_header_tup v htup;