Rename 'exterior' to 'box' and 'interior' to 'local' (at least wrt. slots; keep MEM_interior for describing interior-parts-of-allocations)

This commit is contained in:
Graydon Hoare 2010-06-30 22:45:54 -07:00
parent 8b8186db87
commit 6a0b06e562
17 changed files with 198 additions and 200 deletions

View File

@ -26,20 +26,20 @@ let frame_glue_fns_field_mark = 0;;
let frame_glue_fns_field_drop = 1;;
let frame_glue_fns_field_reloc = 2;;
let exterior_rc_slot_field_refcnt = 0;;
let exterior_rc_slot_field_body = 1;;
let box_rc_slot_field_refcnt = 0;;
let box_rc_slot_field_body = 1;;
let exterior_gc_slot_alloc_base = (-3);;
let exterior_gc_slot_field_prev = (-3);;
let exterior_gc_slot_field_next = (-2);;
let exterior_gc_slot_field_ctrl = (-1);;
let exterior_gc_slot_field_refcnt = 0;;
let exterior_gc_slot_field_body = 1;;
let box_gc_slot_alloc_base = (-3);;
let box_gc_slot_field_prev = (-3);;
let box_gc_slot_field_next = (-2);;
let box_gc_slot_field_ctrl = (-1);;
let box_gc_slot_field_refcnt = 0;;
let box_gc_slot_field_body = 1;;
let exterior_rc_header_size = 1;;
let exterior_gc_header_size = 4;;
let box_rc_header_size = 1;;
let box_gc_header_size = 4;;
let exterior_gc_malloc_return_adjustment = 3;;
let box_gc_malloc_return_adjustment = 3;;
let stk_field_valgrind_id = 0 + 1;;
let stk_field_limit = stk_field_valgrind_id + 1;;

View File

@ -829,7 +829,7 @@ let sweep_gc_chain
emit (Il.jmp Il.JE
(codefix exit_jmp_fix)); (* if nonzero *)
mov (rc ecx) (* Load GC ctrl word *)
(c (edi_n Abi.exterior_gc_slot_field_ctrl));
(c (edi_n Abi.box_gc_slot_field_ctrl));
mov (rc eax) (ro ecx);
band (rc eax) (immi 1L); (* Extract mark to eax. *)
band (* Clear mark in ecx. *)
@ -839,7 +839,7 @@ let sweep_gc_chain
if clear_mark
then
mov (* Write-back cleared. *)
((edi_n Abi.exterior_gc_slot_field_ctrl))
((edi_n Abi.box_gc_slot_field_ctrl))
(ro ecx);
emit (Il.cmp (ro eax) (immi 0L));
@ -870,7 +870,7 @@ let sweep_gc_chain
mark skip_jmp_fix;
mov (rc edi) (* Advance down chain *)
(c (edi_n Abi.exterior_gc_slot_field_next));
(c (edi_n Abi.box_gc_slot_field_next));
emit (Il.jmp Il.JMP
(codefix repeat_jmp_fix)); (* loop *)
mark exit_jmp_fix;
@ -901,7 +901,7 @@ let gc_glue
(* The sweep pass has two sub-passes over the GC chain:
*
* - In pass #1, 'severing', we goes through and disposes of all
* mutable exterior slots in each record. That is, rc-- the referent,
* mutable box slots in each record. That is, rc-- the referent,
* and then null-out. If the rc-- gets to zero, that just means the
* mutable is part of the garbage set currently being collected. But
* a mutable may be live-and-outside; this detaches the garbage set

View File

@ -88,7 +88,7 @@ and ty =
| TY_named of name
| TY_type
| TY_exterior of ty
| TY_box of ty
| TY_mutable of ty
| TY_constrained of (ty * constrs)
@ -100,7 +100,7 @@ and ty =
*)
and mode =
| MODE_interior
| MODE_local
| MODE_alias
and slot = { slot_mode: mode;
@ -201,7 +201,7 @@ and stmt' =
| STMT_init_str of (lval * string)
| STMT_init_port of lval
| STMT_init_chan of (lval * (lval option))
| STMT_init_exterior of (lval * atom)
| STMT_init_box of (lval * atom)
| STMT_copy of (lval * expr)
| STMT_copy_binop of (lval * binop * atom)
| STMT_call of (lval * lval * (atom array))
@ -523,7 +523,7 @@ and fmt_name (ff:Format.formatter) (n:name) : unit =
and fmt_mode (ff:Format.formatter) (m:mode) : unit =
match m with
| MODE_alias -> fmt ff "&"
| MODE_interior -> ()
| MODE_local -> ()
and fmt_slot (ff:Format.formatter) (s:slot) : unit =
match s.slot_ty with
@ -656,7 +656,7 @@ and fmt_ty (ff:Format.formatter) (t:ty) : unit =
| TY_named n -> fmt_name ff n
| TY_type -> fmt ff "type"
| TY_exterior t ->
| TY_box t ->
fmt ff "@@";
fmt_ty ff t
@ -1167,7 +1167,7 @@ and fmt_stmt_body (ff:Format.formatter) (s:stmt) : unit =
fmt_lval ff t;
fmt ff ";"
| STMT_init_exterior (lv, at) ->
| STMT_init_box (lv, at) ->
fmt_lval ff lv;
fmt ff " = @@";
fmt_atom ff at;

View File

@ -242,7 +242,7 @@ and parse_stmts (ps:pstate) : Ast.stmt array =
match name with
Ast.NAME_base (Ast.BASE_ident ident) ->
let slot =
{ Ast.slot_mode = Ast.MODE_interior;
{ Ast.slot_mode = Ast.MODE_local;
Ast.slot_ty = None }
in
Ast.PAT_slot

View File

@ -180,12 +180,12 @@ let err (str:string) (ps:pstate) =
let (slot_nil:Ast.slot) =
{ Ast.slot_mode = Ast.MODE_interior;
{ Ast.slot_mode = Ast.MODE_local;
Ast.slot_ty = Some Ast.TY_nil }
;;
let (slot_auto:Ast.slot) =
{ Ast.slot_mode = Ast.MODE_interior;
{ Ast.slot_mode = Ast.MODE_local;
Ast.slot_ty = None }
;;

View File

@ -33,7 +33,7 @@ type pexp' =
| PEXP_lit of Ast.lit
| PEXP_str of string
| PEXP_mutable of pexp
| PEXP_exterior of pexp
| PEXP_box of pexp
| PEXP_custom of Ast.name * (pexp array) * (string option)
and plval =
@ -334,7 +334,7 @@ and parse_atomic_ty (ps:pstate) : Ast.ty =
| AT ->
bump ps;
Ast.TY_exterior (parse_ty ps)
Ast.TY_box (parse_ty ps)
| MUTABLE ->
bump ps;
@ -368,7 +368,7 @@ and parse_slot (aliases_ok:bool) (ps:pstate) : Ast.slot =
match (peek ps, aliases_ok) with
(AND, true) -> bump ps; Ast.MODE_alias
| (AND, false) -> raise (err "alias slot in prohibited context" ps)
| _ -> Ast.MODE_interior
| _ -> Ast.MODE_local
in
let ty = parse_ty ps in
{ Ast.slot_mode = mode;
@ -485,7 +485,7 @@ and parse_bottom_pexp (ps:pstate) : pexp =
bump ps;
let inner = parse_pexp ps in
let bpos = lexpos ps in
span ps apos bpos (PEXP_exterior inner)
span ps apos bpos (PEXP_box inner)
| TUP ->
bump ps;
@ -1102,7 +1102,7 @@ and desugar_expr_atom
| PEXP_bind _
| PEXP_spawn _
| PEXP_custom _
| PEXP_exterior _
| PEXP_box _
| PEXP_mutable _ ->
let (_, tmp, decl_stmt) = build_tmp ps slot_auto apos bpos in
let stmts = desugar_expr_init ps tmp pexp in
@ -1299,11 +1299,11 @@ and desugar_expr_init
in
aa port_stmts [| chan_stmt |]
| PEXP_exterior arg ->
| PEXP_box arg ->
let (arg_stmts, arg_mode_atom) =
desugar_expr_atom ps arg
in
let stmt = ss (Ast.STMT_init_exterior (dst_lval, arg_mode_atom)) in
let stmt = ss (Ast.STMT_init_box (dst_lval, arg_mode_atom)) in
aa arg_stmts [| stmt |]
| PEXP_mutable arg ->

View File

@ -263,7 +263,7 @@ let trans_crate
| Ast.TY_chan _ | Ast.TY_port _ | Ast.TY_task ->
p rc_opaque_ty
| Ast.TY_exterior t ->
| Ast.TY_box t ->
(* FIXME: wrong, this needs to point to a refcounted cell. *)
p (trans_ty t)
@ -296,7 +296,7 @@ let trans_crate
match slot.Ast.slot_mode with
| Ast.MODE_alias _ ->
Llvm.pointer_type base_llty
| Ast.MODE_interior _ -> base_llty
| Ast.MODE_local _ -> base_llty
in
let get_element_ptr
@ -453,7 +453,7 @@ let trans_crate
llbuilder :=
if_ptr_in_slot_not_null
(decr_refcnt_and_if_zero
Abi.exterior_rc_slot_field_refcnt
Abi.box_rc_slot_field_refcnt
free_and_null_out_slot)
(!llbuilder)
@ -461,11 +461,11 @@ let trans_crate
llbuilder :=
if_ptr_in_slot_not_null
(decr_refcnt_and_if_zero
Abi.exterior_rc_slot_field_refcnt
Abi.box_rc_slot_field_refcnt
free_and_null_out_slot)
(!llbuilder)
| MEM_interior when Semant.type_is_structured ty ->
| MEM_local when Semant.type_is_structured ty ->
(* FIXME: to handle recursive types, need to call drop
glue here, not inline. *)
drop_ty llbuilder lltask slot_ptr ty curr_iso
@ -562,7 +562,7 @@ let trans_crate
Array.iteri build_arg (Llvm.params llfn);
(* Allocate space for all the blocks' slots.
* and zero the exteriors. *)
* and zero the box pointers. *)
let init_block (block_id:node_id) : unit =
let init_slot
(key:Ast.slot_key)

View File

@ -1323,7 +1323,7 @@ let (abbrev_mutable_type:abbrev) =
|])
;;
let (abbrev_exterior_type:abbrev) =
let (abbrev_box_type:abbrev) =
(DW_TAG_pointer_type, DW_CHILDREN_no,
[|
(DW_AT_type, DW_FORM_ref_addr);
@ -1551,7 +1551,7 @@ let dwarf_visitor
in
match slot.Ast.slot_mode with
| Ast.MODE_interior ->
| Ast.MODE_local ->
ref_type_die (slot_ty slot)
| Ast.MODE_alias ->
@ -2013,20 +2013,19 @@ let dwarf_visitor
ref_addr_for_fix (Stack.top iso_stack).(i)
in
let exterior_type t =
let fix = new_fixup "exterior DIE" in
let box_type t =
let fix = new_fixup "box DIE" in
let body_off =
word_sz_int * Abi.exterior_rc_slot_field_body
word_sz_int * Abi.box_rc_slot_field_body
in
emit_die (DEF (fix, SEQ [|
uleb (get_abbrev_code abbrev_exterior_type);
uleb (get_abbrev_code abbrev_box_type);
(* DW_AT_type: DW_FORM_ref_addr *)
(ref_type_die t);
(* DW_AT_data_location: DW_FORM_block1 *)
(* This is a DWARF expression for moving
from the address of an exterior
allocation to the address of its
body. *)
(* This is a DWARF expression for moving from the
address of a box allocation to the address of
its body. *)
dw_form_block1
[| DW_OP_push_object_address;
DW_OP_lit body_off;
@ -2078,7 +2077,7 @@ let dwarf_visitor
| Ast.TY_param p -> rust_type_param p
| Ast.TY_obj ob -> obj_type ob
| Ast.TY_mutable t -> mutable_type t
| Ast.TY_exterior t -> exterior_type t
| Ast.TY_box t -> box_type t
| _ ->
bug () "unimplemented dwarf encoding for type %a"
Ast.sprintf_ty ty
@ -2916,7 +2915,7 @@ let rec extract_mod_items
Ast.TY_native (get_opaque_of (get_native_id die))
| DW_TAG_pointer_type ->
Ast.TY_exterior (get_referenced_ty die)
Ast.TY_box (get_referenced_ty die)
| DW_TAG_const_type
when ((get_num die DW_AT_mutable) = 1) ->
@ -3012,7 +3011,7 @@ let rec extract_mod_items
Ast.slot_ty = Some ty }
| _ ->
let ty = get_ty die in
{ Ast.slot_mode = Ast.MODE_interior;
{ Ast.slot_mode = Ast.MODE_local;
Ast.slot_ty = Some ty }
and get_referenced_ty die =

View File

@ -221,7 +221,7 @@ let layout_visitor
let offset =
let word_sz = cx.ctxt_abi.Abi.abi_word_sz in
let word_n (n:int) = Int64.mul word_sz (Int64.of_int n) in
SIZE_fixed (word_n (Abi.exterior_rc_slot_field_body
SIZE_fixed (word_n (Abi.box_rc_slot_field_body
+ 1 (* the state tydesc. *)))
in
log cx "laying out object-state for node #%d at offset %s"
@ -262,7 +262,7 @@ let layout_visitor
*)
let glue_callsz =
let word = interior_slot Ast.TY_int in
let word = local_slot Ast.TY_int in
let glue_fn =
mk_simple_ty_fn
(Array.init Abi.worst_case_glue_call_args (fun _ -> word))

View File

@ -570,7 +570,7 @@ let type_resolving_visitor
header_slots
in
let output_slot =
interior_slot (ty_iso_of cx recursive_tag_groups
local_slot (ty_iso_of cx recursive_tag_groups
all_tags nid)
in
let ty =

View File

@ -21,10 +21,10 @@ type glue =
| GLUE_exit_main_task
| GLUE_exit_task
| GLUE_copy of Ast.ty (* One-level copy. *)
| GLUE_drop of Ast.ty (* De-initialize interior memory. *)
| GLUE_free of Ast.ty (* Drop body + free() exterior ptr. *)
| GLUE_sever of Ast.ty (* Null all exterior state slots. *)
| GLUE_mark of Ast.ty (* Mark all exterior state slots. *)
| GLUE_drop of Ast.ty (* De-initialize local memory. *)
| GLUE_free of Ast.ty (* Drop body + free() box ptr. *)
| GLUE_sever of Ast.ty (* Null all box state slots. *)
| GLUE_mark of Ast.ty (* Mark all box state slots. *)
| GLUE_clone of Ast.ty (* Deep copy. *)
| GLUE_compare of Ast.ty
| GLUE_hash of Ast.ty
@ -604,35 +604,35 @@ let expr_slots (cx:ctxt) (e:Ast.expr) : node_id array =
(* Type extraction. *)
let interior_slot_full mut ty : Ast.slot =
let local_slot_full mut ty : Ast.slot =
let ty =
if mut
then Ast.TY_mutable ty
else ty
in
{ Ast.slot_mode = Ast.MODE_interior;
{ Ast.slot_mode = Ast.MODE_local;
Ast.slot_ty = Some ty }
;;
let exterior_slot_full mut ty : Ast.slot =
let box_slot_full mut ty : Ast.slot =
let ty =
match ty with
Ast.TY_exterior _ -> ty
| _ -> Ast.TY_exterior ty
Ast.TY_box _ -> ty
| _ -> Ast.TY_box ty
in
let ty =
if mut
then Ast.TY_mutable ty
else ty
in
{ Ast.slot_mode = Ast.MODE_interior;
{ Ast.slot_mode = Ast.MODE_local;
Ast.slot_ty = Some ty }
;;
let interior_slot ty : Ast.slot = interior_slot_full false ty
let local_slot ty : Ast.slot = local_slot_full false ty
;;
let exterior_slot ty : Ast.slot = exterior_slot_full false ty
let box_slot ty : Ast.slot = box_slot_full false ty
;;
@ -640,7 +640,7 @@ let exterior_slot ty : Ast.slot = exterior_slot_full false ty
type ('ty, 'tys, 'slot, 'slots, 'tag) ty_fold =
{
(* Functions that correspond to interior nodes in Ast.ty. *)
(* Functions that correspond to local nodes in Ast.ty. *)
ty_fold_slot : (Ast.mode * 'ty) -> 'slot;
ty_fold_slots : ('slot array) -> 'slots;
ty_fold_tys : ('ty array) -> 'tys;
@ -672,7 +672,7 @@ type ('ty, 'tys, 'slot, 'slots, 'tag) ty_fold =
ty_fold_param : (int * Ast.effect) -> 'ty;
ty_fold_named : Ast.name -> 'ty;
ty_fold_type : unit -> 'ty;
ty_fold_exterior : 'ty -> 'ty;
ty_fold_box : 'ty -> 'ty;
ty_fold_mutable : 'ty -> 'ty;
ty_fold_constrained : ('ty * Ast.constrs) -> 'ty }
;;
@ -739,7 +739,7 @@ let rec fold_ty
| Ast.TY_named n -> f.ty_fold_named n
| Ast.TY_type -> f.ty_fold_type ()
| Ast.TY_exterior t -> f.ty_fold_exterior (fold_ty f t)
| Ast.TY_box t -> f.ty_fold_box (fold_ty f t)
| Ast.TY_mutable t -> f.ty_fold_mutable (fold_ty f t)
| Ast.TY_constrained (t, constrs) ->
@ -778,7 +778,7 @@ let ty_fold_default (default:'a) : 'a simple_ty_fold =
ty_fold_param = (fun _ -> default);
ty_fold_named = (fun _ -> default);
ty_fold_type = (fun _ -> default);
ty_fold_exterior = (fun _ -> default);
ty_fold_box = (fun _ -> default);
ty_fold_mutable = (fun _ -> default);
ty_fold_constrained = (fun _ -> default) }
;;
@ -824,7 +824,7 @@ let ty_fold_rebuild (id:Ast.ty -> Ast.ty)
ty_fold_param = (fun (i, mut) -> id (Ast.TY_param (i, mut)));
ty_fold_named = (fun n -> id (Ast.TY_named n));
ty_fold_type = (fun _ -> id (Ast.TY_type));
ty_fold_exterior = (fun t -> id (Ast.TY_exterior t));
ty_fold_box = (fun t -> id (Ast.TY_box t));
ty_fold_mutable = (fun t -> id (Ast.TY_mutable t));
ty_fold_constrained = (fun (t, constrs) ->
id (Ast.TY_constrained (t, constrs))) }
@ -1069,7 +1069,7 @@ let check_concrete params thing =
let rec simplified_ty (t:Ast.ty) : Ast.ty =
match t with
Ast.TY_exterior t
Ast.TY_box t
| Ast.TY_mutable t
| Ast.TY_constrained (t, _) -> simplified_ty t
| _ -> t
@ -1097,12 +1097,12 @@ let rec project_type
| (Ast.TY_obj (_, fns), Ast.COMP_named (Ast.COMP_ident id)) ->
(Ast.TY_fn (Hashtbl.find fns id))
| (Ast.TY_exterior t, Ast.COMP_deref) -> t
| (Ast.TY_box t, Ast.COMP_deref) -> t
(* Exterior, mutable and constrained are transparent to the
(* Box, mutable and constrained are transparent to the
* other lval-ext forms: x.y and x.(y).
*)
| (Ast.TY_exterior t, _)
| (Ast.TY_box t, _)
| (Ast.TY_mutable t, _)
| (Ast.TY_constrained (t, _), _) -> project_type t comp
@ -1315,7 +1315,7 @@ let ty_of_mod_item ((*inside*)_:bool) (item:Ast.mod_item) : Ast.ty =
let tobj = Ast.TY_obj (ty_obj_of_obj ob) in
let tsig = { Ast.sig_input_slots = arg_slots ob.Ast.obj_state;
Ast.sig_input_constrs = ob.Ast.obj_constrs;
Ast.sig_output_slot = interior_slot tobj }
Ast.sig_output_slot = local_slot tobj }
in
(Ast.TY_fn (tsig, taux))
@ -1325,7 +1325,7 @@ let ty_of_mod_item ((*inside*)_:bool) (item:Ast.mod_item) : Ast.ty =
in
let tsig = { Ast.sig_input_slots = tup_slots htup;
Ast.sig_input_constrs = [| |];
Ast.sig_output_slot = interior_slot (Ast.TY_tag ttag) }
Ast.sig_output_slot = local_slot (Ast.TY_tag ttag) }
in
(Ast.TY_fn (tsig, taux))
;;
@ -1867,7 +1867,7 @@ let rec referent_type (abi:Abi.abi) (t:Ast.ty) : Il.referent_ty =
| Ast.TY_native _ -> ptr
| Ast.TY_exterior t ->
| Ast.TY_box t ->
sp (Il.StructTy [| word; referent_type abi t |])
| Ast.TY_mutable t -> referent_type abi t
@ -1884,7 +1884,7 @@ and slot_referent_type (abi:Abi.abi) (sl:Ast.slot) : Il.referent_ty =
let rty = referent_type abi (slot_ty sl) in
match sl.Ast.slot_mode with
| Ast.MODE_interior _ -> rty
| Ast.MODE_local _ -> rty
| Ast.MODE_alias _ -> sp rty
;;
@ -2000,7 +2000,7 @@ let slot_sz (abi:Abi.abi) (s:Ast.slot) : int64 =
;;
let word_slot (abi:Abi.abi) : Ast.slot =
interior_slot (Ast.TY_mach abi.Abi.abi_word_ty)
local_slot (Ast.TY_mach abi.Abi.abi_word_ty)
;;
let alias_slot (ty:Ast.ty) : Ast.slot =
@ -2045,7 +2045,7 @@ let mk_simple_ty_fn
(arg_slots:Ast.slot array)
: Ast.ty =
(* In some cases we don't care what the output slot is. *)
let out_slot = interior_slot Ast.TY_nil in
let out_slot = local_slot Ast.TY_nil in
mk_ty_fn out_slot arg_slots
;;
@ -2053,7 +2053,7 @@ let mk_simple_ty_iter
(arg_slots:Ast.slot array)
: Ast.ty =
(* In some cases we don't care what the output slot is. *)
let out_slot = interior_slot Ast.TY_nil in
let out_slot = local_slot Ast.TY_nil in
mk_ty_fn_or_iter out_slot arg_slots true
;;
@ -2073,7 +2073,7 @@ let ty_str (ty:Ast.ty) : string =
let fold_slot (mode,ty) =
(match mode with
Ast.MODE_alias -> "a"
| Ast.MODE_interior -> "")
| Ast.MODE_local -> "")
^ ty
in
let num n = (string_of_int n) ^ "$" in
@ -2147,7 +2147,7 @@ let ty_str (ty:Ast.ty) : string =
ty_fold_param = (fun _ -> "P");
ty_fold_type = (fun _ -> "Y");
ty_fold_mutable = (fun t -> "m" ^ t);
ty_fold_exterior = (fun t -> "e" ^ t);
ty_fold_box = (fun t -> "e" ^ t);
(* FIXME (issue #78): encode obj types. *)
(* FIXME (issue #78): encode opaque and param numbers. *)

View File

@ -1584,17 +1584,16 @@ let trans_visitor
: fixup =
let g = GLUE_free ty in
let inner _ (args:Il.cell) =
(*
* Free-glue assumes it's called with a pointer to an
* exterior allocation with normal exterior layout. It's
* just a way to move drop+free out of leaf code.
(* Free-glue assumes it's called with a pointer to a box allocation with
* normal box layout. It's just a way to move drop+free out of leaf
* code.
*)
let ty_params = deref (get_element_ptr args 0) in
let cell = get_element_ptr args 1 in
let (body_mem, _) =
need_mem_cell
(get_element_ptr_dyn ty_params (deref cell)
Abi.exterior_rc_slot_field_body)
Abi.box_rc_slot_field_body)
in
let vr = next_vreg_cell Il.voidptr_t in
lea vr body_mem;
@ -1608,7 +1607,7 @@ let trans_visitor
"free-glue complete";
in
let ty_params_ptr = ty_params_covering ty in
let fty = mk_simple_ty_fn [| ty_params_ptr; exterior_slot ty |] in
let fty = mk_simple_ty_fn [| ty_params_ptr; box_slot ty |] in
get_typed_mem_glue g fty inner
@ -1657,7 +1656,7 @@ let trans_visitor
let ty_params_ptr = ty_params_covering ty in
let fty =
mk_ty_fn
(interior_slot ty) (* dst *)
(local_slot ty) (* dst *)
[|
ty_params_ptr;
alias_slot ty; (* src *)
@ -1681,7 +1680,7 @@ let trans_visitor
let ty_params_ptr = ty_params_covering ty in
let fty =
mk_ty_fn
(interior_slot ty)
(local_slot ty)
[| ty_params_ptr; alias_slot ty |]
in
get_typed_mem_glue g fty inner
@ -2120,7 +2119,7 @@ let trans_visitor
trans_void_upcall "upcall_kill" [| Il.Cell task |]
(*
* A vec is implicitly exterior: every slot vec[T] is 1 word and
* A vec is implicitly boxed: every slot vec[T] is 1 word and
* points to a refcounted structure. That structure has 3 words with
* defined meaning at the beginning; data follows the header.
*
@ -2212,22 +2211,22 @@ let trans_visitor
(ty_align abi ty))
(tydesc_rty abi))
and exterior_ctrl_cell (cell:Il.cell) (off:int) : Il.cell =
and box_ctrl_cell (cell:Il.cell) (off:int) : Il.cell =
let (mem, _) = need_mem_cell (deref_imm cell (word_n off)) in
word_at mem
and exterior_rc_cell (cell:Il.cell) : Il.cell =
exterior_ctrl_cell cell Abi.exterior_rc_slot_field_refcnt
and box_rc_cell (cell:Il.cell) : Il.cell =
box_ctrl_cell cell Abi.box_rc_slot_field_refcnt
and exterior_allocation_size
and box_allocation_size
(ty:Ast.ty)
: Il.operand =
let header_sz =
match ty_mem_ctrl ty with
MEM_gc
| MEM_rc_opaque
| MEM_rc_struct -> word_n Abi.exterior_rc_header_size
| MEM_interior -> bug () "exterior_allocation_size of MEM_interior"
| MEM_rc_struct -> word_n Abi.box_rc_header_size
| MEM_interior -> bug () "box_allocation_size of MEM_interior"
in
let ty = simplified_ty ty in
let refty_sz =
@ -2304,8 +2303,8 @@ let trans_visitor
* vreg and so has to be aware of when it's iterating over 2
* sequences of cells or just 1.
*)
check_exterior_rty src_cell;
check_exterior_rty dst_cell;
check_box_rty src_cell;
check_box_rty dst_cell;
if dst_cell = src_cell
then
begin
@ -2413,9 +2412,9 @@ let trans_visitor
(* Drop non-null bindings. *)
(* FIXME (issue #58): this is completely wrong, Closures need to
* carry tydescs like objs. For now this only works by accident,
* and will leak closures with exterior substructure.
* and will leak closures with box substructure.
*)
drop_ty ty_params binding (Ast.TY_exterior Ast.TY_int) curr_iso;
drop_ty ty_params binding (Ast.TY_box Ast.TY_int) curr_iso;
patch null_jmp
| Ast.TY_obj _ ->
@ -2465,13 +2464,13 @@ let trans_visitor
| MEM_rc_opaque
| MEM_rc_struct ->
let _ = check_exterior_rty cell in
let _ = check_box_rty cell in
let null_jmp = null_check cell in
let rc = exterior_rc_cell cell in
let rc = box_rc_cell cell in
let j = drop_refcount_and_cmp rc in
(* FIXME (issue #25): check to see that the exterior has
* further exterior members; if it doesn't we can elide the
(* FIXME (issue #25): check to see that the box has
* further box members; if it doesn't we can elide the
* call to the glue function. *)
if mctrl = MEM_rc_opaque
@ -2491,7 +2490,7 @@ let trans_visitor
| MEM_interior when type_is_structured ty ->
(iflog (fun _ ->
annotate ("drop interior slot " ^
annotate ("drop interior memory " ^
(Fmt.fmt_to_str Ast.fmt_ty ty))));
let (mem, _) = need_mem_cell cell in
let vr = next_vreg_cell Il.voidptr_t in
@ -2516,9 +2515,9 @@ let trans_visitor
match ty_mem_ctrl ty with
MEM_gc ->
let _ = check_exterior_rty cell in
let _ = check_box_rty cell in
let null_jmp = null_check cell in
let rc = exterior_rc_cell cell in
let rc = box_rc_cell cell in
let _ = note_gc_step ty "severing GC slot" in
emit (Il.binary Il.SUB rc (Il.Cell rc) one);
mov cell zero;
@ -2551,7 +2550,7 @@ let trans_visitor
-> mov dst (Il.Cell src)
| Ast.TY_fn _
| Ast.TY_obj _ -> ()
| Ast.TY_exterior ty ->
| Ast.TY_box ty ->
let glue_fix = get_clone_glue ty curr_iso in
trans_call_static_glue
(code_fixup_to_ptr_operand glue_fix)
@ -2615,8 +2614,8 @@ let trans_visitor
* this only works by accident.
*)
trans_copy_ty ty_params true
dst_binding (Ast.TY_exterior Ast.TY_int)
src_binding (Ast.TY_exterior Ast.TY_int)
dst_binding (Ast.TY_box Ast.TY_int)
src_binding (Ast.TY_box Ast.TY_int)
curr_iso;
patch null_jmp
end
@ -2652,7 +2651,7 @@ let trans_visitor
: Ast.ty =
match (curr_iso, t) with
(Some iso, Ast.TY_idx n) ->
Ast.TY_exterior (Ast.TY_iso { iso with Ast.iso_index = n })
Ast.TY_box (Ast.TY_iso { iso with Ast.iso_index = n })
| (None, Ast.TY_idx _) ->
bug () "TY_idx outside TY_iso"
| _ -> t
@ -2687,11 +2686,11 @@ let trans_visitor
let marked_jump =
trans_compare Il.JE (Il.Cell tmp) zero;
in
(* Iterate over exterior parts marking outgoing links. *)
(* Iterate over box parts marking outgoing links. *)
let (body_mem, _) =
need_mem_cell
(get_element_ptr (deref cell)
Abi.exterior_gc_slot_field_body)
Abi.box_gc_slot_field_body)
in
let ty = maybe_iso curr_iso ty in
let curr_iso = maybe_enter_iso ty curr_iso in
@ -2703,7 +2702,7 @@ let trans_visitor
| MEM_interior when type_is_structured ty ->
(iflog (fun _ ->
annotate ("mark interior slot " ^
annotate ("mark interior memory " ^
(Fmt.fmt_to_str Ast.fmt_ty ty))));
let (mem, _) = need_mem_cell cell in
let tmp = next_vreg_cell Il.voidptr_t in
@ -2716,13 +2715,13 @@ let trans_visitor
| _ -> ()
and check_exterior_rty cell =
and check_box_rty cell =
match cell with
Il.Reg (_, Il.AddrTy (Il.StructTy fields))
| Il.Mem (_, Il.ScalarTy (Il.AddrTy (Il.StructTy fields)))
when (((Array.length fields) > 0) && (fields.(0) = word_rty)) -> ()
| _ -> bug ()
"expected plausibly-exterior cell, got %s"
"expected plausibly-box cell, got %s"
(Il.string_of_referent_ty (Il.cell_referent_ty cell))
and drop_slot_in_current_frame
@ -2755,7 +2754,7 @@ let trans_visitor
match slot.Ast.slot_mode with
Ast.MODE_alias
(* Aliases are always free to drop. *)
| Ast.MODE_interior ->
| Ast.MODE_local ->
drop_ty ty_params cell (slot_ty slot) curr_iso
and note_drop_step ty step =
@ -2788,7 +2787,7 @@ let trans_visitor
end
(* Returns the offset of the slot-body in the initialized allocation. *)
and init_exterior (cell:Il.cell) (ty:Ast.ty) : unit =
and init_box (cell:Il.cell) (ty:Ast.ty) : unit =
let mctrl = ty_mem_ctrl ty in
match mctrl with
MEM_gc
@ -2799,14 +2798,14 @@ let trans_visitor
then Il.Cell (get_tydesc None ty)
else zero
in
iflog (fun _ -> annotate "init exterior: malloc");
let sz = exterior_allocation_size ty in
iflog (fun _ -> annotate "init box: malloc");
let sz = box_allocation_size ty in
trans_malloc cell sz ctrl;
iflog (fun _ -> annotate "init exterior: load refcount");
let rc = exterior_rc_cell cell in
iflog (fun _ -> annotate "init box: load refcount");
let rc = box_rc_cell cell in
mov rc one
| MEM_interior -> bug () "init_exterior of MEM_interior"
| MEM_interior -> bug () "init_box of MEM_interior"
and deref_ty
(initializing:bool)
@ -2819,14 +2818,14 @@ let trans_visitor
| Ast.TY_constrained (ty, _) ->
deref_ty initializing cell ty
| Ast.TY_exterior ty' ->
check_exterior_rty cell;
| Ast.TY_box ty' ->
check_box_rty cell;
if initializing
then init_exterior cell ty;
then init_box cell ty;
let cell =
get_element_ptr_dyn_in_current_frame
(deref cell)
(Abi.exterior_rc_slot_field_body)
(Abi.box_rc_slot_field_body)
in
(* Init recursively so @@@@T chain works. *)
deref_ty initializing cell ty'
@ -2840,7 +2839,7 @@ let trans_visitor
(slot:Ast.slot)
: Il.cell =
match slot.Ast.slot_mode with
Ast.MODE_interior ->
Ast.MODE_local ->
cell
| Ast.MODE_alias _ ->
@ -2892,7 +2891,7 @@ let trans_visitor
| (MEM_rc_struct, MEM_rc_struct) ->
(* Lightweight copy: twiddle refcounts, move pointer. *)
anno "refcounted light";
add_to (exterior_rc_cell src) one;
add_to (box_rc_cell src) one;
if not initializing
then
drop_ty ty_params dst dst_ty None;
@ -2961,7 +2960,7 @@ let trans_visitor
match t with
Ast.TY_vec _
| Ast.TY_str -> true
| Ast.TY_exterior t when can_append t -> true
| Ast.TY_box t when can_append t -> true
| _ -> false
in
match (dst_ty, src) with
@ -3129,7 +3128,7 @@ let trans_visitor
(Ast.MODE_alias, CLONE_none) ->
mov dst (Il.Cell (alias (Il.Mem (need_mem_cell src))))
| (Ast.MODE_interior, CLONE_none) ->
| (Ast.MODE_local, CLONE_none) ->
trans_copy_ty
ty_params true
dst dst_ty src src_ty None
@ -4402,9 +4401,9 @@ let trans_visitor
in
let obj_args_ty = Ast.TY_tup obj_args_tup in
let state_ty = Ast.TY_tup [| Ast.TY_type; obj_args_ty |] in
let state_ptr_ty = Ast.TY_exterior state_ty in
let state_ptr_ty = Ast.TY_box state_ty in
let state_ptr_rty = referent_type abi state_ptr_ty in
let state_malloc_sz = exterior_allocation_size state_ptr_ty in
let state_malloc_sz = box_allocation_size state_ptr_ty in
let ctor_ty = Hashtbl.find cx.ctxt_all_item_types obj_id in
let obj_ty =
@ -4684,8 +4683,8 @@ let trans_visitor
else ignore (Stack.pop curr_file)
in
let visit_local_mod_item_pre n _ i =
iflog (fun _ -> log cx "translating local item #%d = %s"
let visit_defined_mod_item_pre n _ i =
iflog (fun _ -> log cx "translating defined item #%d = %s"
(int_of_node i.id) (path_name()));
match i.node.Ast.decl_item with
Ast.MOD_ITEM_fn f -> trans_fn i.id f.Ast.fn_body
@ -4730,7 +4729,7 @@ let trans_visitor
inner.Walk.visit_obj_drop_pre obj b
in
let visit_local_obj_fn_pre _ _ fn =
let visit_defined_obj_fn_pre _ _ fn =
trans_fn fn.id fn.node.Ast.fn_body
in
@ -4745,7 +4744,7 @@ let trans_visitor
then
visit_required_obj_fn_pre obj ident fn
else
visit_local_obj_fn_pre obj ident fn;
visit_defined_obj_fn_pre obj ident fn;
end;
inner.Walk.visit_obj_fn_pre obj ident fn
in
@ -4757,7 +4756,7 @@ let trans_visitor
then
visit_required_mod_item_pre n p i
else
visit_local_mod_item_pre n p i
visit_defined_mod_item_pre n p i
end;
inner.Walk.visit_mod_item_pre n p i
in

View File

@ -7,7 +7,7 @@ open Semant;;
* "simple" precise, mark-sweep, single-generation, per-task (thereby
* preemptable and relatively quick) GC scheme on mutable memory.
*
* - For the sake of this note, call any exterior of 'state' effect a gc_val.
* - For the sake of this note, call any box of 'state' effect a gc_val.
*
* - gc_vals come from the same malloc as all other values but undergo
* different storage management.
@ -19,7 +19,7 @@ open Semant;;
*
* - A pointer to a gc_val, however, points to the third of these three
* words. So a certain quantity of code can treat gc_vals the same way it
* would treat refcounted exterior vals.
* would treat refcounted box vals.
*
* - The first word at the head of a gc_val is used as a refcount, as in
* non-gc allocations.
@ -122,7 +122,7 @@ let rec ty_mem_ctrl (ty:Ast.ty) : mem_ctrl =
if type_has_state ty
then MEM_gc
else MEM_rc_opaque
| Ast.TY_exterior t ->
| Ast.TY_box t ->
if type_has_state t
then MEM_gc
else
@ -139,7 +139,7 @@ let rec ty_mem_ctrl (ty:Ast.ty) : mem_ctrl =
let slot_mem_ctrl (slot:Ast.slot) : mem_ctrl =
match slot.Ast.slot_mode with
Ast.MODE_alias -> MEM_interior
| Ast.MODE_interior ->
| Ast.MODE_local ->
ty_mem_ctrl (slot_ty slot)
;;

View File

@ -5,7 +5,7 @@ type tyspec =
TYSPEC_equiv of tyvar
| TYSPEC_all
| TYSPEC_resolved of (Ast.ty_param array) * Ast.ty
| TYSPEC_exterior of tyvar (* @ of some t *)
| TYSPEC_box of tyvar (* @ of some t *)
| TYSPEC_mutable of tyvar (* something mutable *)
| TYSPEC_callable of (tyvar * tyvar array) (* out, ins *)
| TYSPEC_collection of tyvar (* vec or str *)
@ -107,7 +107,7 @@ let rec tyspec_to_str (ts:tyspec) : string =
| TYSPEC_equiv tv ->
fmt_tyspec ff (!tv)
| TYSPEC_exterior tv ->
| TYSPEC_box tv ->
fmt ff "@@";
fmt_tyspec ff (!tv)
@ -173,31 +173,31 @@ let rec resolve_tyvar (tv:tyvar) : tyvar =
type unify_ctxt =
{ mut_ok: bool;
ext_ok: bool }
box_ok: bool }
;;
let arg_pass_ctx =
{ ext_ok = false;
{ box_ok = false;
mut_ok = true }
;;
let rval_ctx =
{ ext_ok = true;
{ box_ok = true;
mut_ok = true }
;;
let lval_ctx =
{ ext_ok = false;
{ box_ok = false;
mut_ok = true }
;;
let init_ctx =
{ ext_ok = true;
{ box_ok = true;
mut_ok = true }
;;
let strict_ctx =
{ ext_ok = false;
{ box_ok = false;
mut_ok = false }
;;
@ -265,12 +265,12 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
iflog cx
(fun _ ->
log cx "%s> unifying types:" indent;
if ucx.ext_ok || ucx.mut_ok
if ucx.box_ok || ucx.mut_ok
then
log cx "%s> (w/ %s%s%s)"
indent
(if ucx.ext_ok then "ext-ok" else "")
(if ucx.ext_ok && ucx.mut_ok then " " else "")
(if ucx.box_ok then "ext-ok" else "")
(if ucx.box_ok && ucx.mut_ok then " " else "")
(if ucx.mut_ok then "mut-ok" else "");
log cx "%s> input tyvar A: %s" indent (tyspec_to_str !av);
log cx "%s> input tyvar B: %s" indent (tyspec_to_str !bv));
@ -341,8 +341,8 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
: Ast.ty =
match ty_a, ty_b with
a, b when a = b -> a
| Ast.TY_exterior a, b | b, Ast.TY_exterior a when ucx.ext_ok ->
Ast.TY_exterior (unify_resolved_types a b)
| Ast.TY_box a, b | b, Ast.TY_box a when ucx.box_ok ->
Ast.TY_box (unify_resolved_types a b)
| Ast.TY_mutable a, b | b, Ast.TY_mutable a when ucx.mut_ok ->
Ast.TY_mutable (unify_resolved_types a b)
| Ast.TY_constrained (a, constrs), b
@ -366,15 +366,15 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
is_comparable_or_ordered comparable ty
| Ast.TY_mutable ty ->
ucx.mut_ok && is_comparable_or_ordered comparable ty
| Ast.TY_exterior ty ->
ucx.ext_ok && is_comparable_or_ordered comparable ty
| Ast.TY_box ty ->
ucx.box_ok && is_comparable_or_ordered comparable ty
in
let rec floating (ty:Ast.ty) : bool =
match ty with
Ast.TY_mach TY_f32 | Ast.TY_mach TY_f64 -> true
| Ast.TY_mutable ty when ucx.mut_ok -> floating ty
| Ast.TY_exterior ty when ucx.ext_ok -> floating ty
| Ast.TY_box ty when ucx.box_ok -> floating ty
| _ -> false
in
@ -386,7 +386,7 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
| Ast.TY_mach TY_i64 ->
true
| Ast.TY_mutable ty when ucx.mut_ok -> integral ty
| Ast.TY_exterior ty when ucx.ext_ok -> integral ty
| Ast.TY_box ty when ucx.box_ok -> integral ty
| _ -> false
in
@ -397,7 +397,7 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
Ast.TY_str -> true
| Ast.TY_vec _ -> true
| Ast.TY_mutable ty when ucx.mut_ok -> plusable ty
| Ast.TY_exterior ty when ucx.ext_ok -> plusable ty
| Ast.TY_box ty when ucx.box_ok -> plusable ty
| _ -> numeric ty
in
@ -408,7 +408,7 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
| Ast.TY_mach TY_i8 | Ast.TY_mach TY_i16 | Ast.TY_mach TY_i32
-> true
| Ast.TY_mutable ty when ucx.mut_ok -> loggable ty
| Ast.TY_exterior ty when ucx.ext_ok -> loggable ty
| Ast.TY_box ty when ucx.box_ok -> loggable ty
| _ -> false
in
@ -419,34 +419,34 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
| (TYSPEC_all, other) | (other, TYSPEC_all) -> other
(* exterior *)
(* box *)
| (TYSPEC_exterior a', TYSPEC_exterior b') ->
| (TYSPEC_box a', TYSPEC_box b') ->
unify_tyvars ucx a' b'; !a
| (TYSPEC_exterior a',
TYSPEC_resolved (_, Ast.TY_exterior _)) ->
| (TYSPEC_box a',
TYSPEC_resolved (_, Ast.TY_box _)) ->
unify_tyvars ucx a' b; !b
| (TYSPEC_resolved (_, Ast.TY_exterior _),
TYSPEC_exterior b') ->
| (TYSPEC_resolved (_, Ast.TY_box _),
TYSPEC_box b') ->
unify_tyvars ucx a b'; !a
| (_, TYSPEC_resolved (params, Ast.TY_exterior ty))
when ucx.ext_ok ->
| (_, TYSPEC_resolved (params, Ast.TY_box ty))
when ucx.box_ok ->
unify_ty_parametric ucx ty params a; !b
| (TYSPEC_resolved (params, Ast.TY_exterior ty), _)
when ucx.ext_ok ->
| (TYSPEC_resolved (params, Ast.TY_box ty), _)
when ucx.box_ok ->
unify_ty_parametric ucx ty params b; !a
| (TYSPEC_exterior a', _) when ucx.ext_ok
| (TYSPEC_box a', _) when ucx.box_ok
-> unify_tyvars ucx a' b; !a
| (_, TYSPEC_exterior b') when ucx.ext_ok
| (_, TYSPEC_box b') when ucx.box_ok
-> unify_tyvars ucx a b'; !b
| (_, TYSPEC_exterior _)
| (TYSPEC_exterior _, _) -> fail()
| (_, TYSPEC_box _)
| (TYSPEC_box _, _) -> fail()
(* mutable *)
@ -505,8 +505,8 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
unify_slot arg_pass_ctx out_slot None out_tv;
Array.iteri unify_in_slot in_slots;
ty
| Ast.TY_exterior ty when ucx.ext_ok
-> Ast.TY_exterior (unify ty)
| Ast.TY_box ty when ucx.box_ok
-> Ast.TY_box (unify ty)
| Ast.TY_mutable ty when ucx.mut_ok
-> Ast.TY_mutable (unify ty)
| _ -> fail ()
@ -520,8 +520,8 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
Ast.TY_vec ty' -> unify_ty ucx ty' tv; ty
| Ast.TY_str ->
unify_ty ucx (Ast.TY_mach TY_u8) tv; ty
| Ast.TY_exterior ty
when ucx.ext_ok -> Ast.TY_exterior (unify ty)
| Ast.TY_box ty
when ucx.box_ok -> Ast.TY_box (unify ty)
| Ast.TY_mutable ty
when ucx.mut_ok -> Ast.TY_mutable (unify ty)
| _ -> fail ()
@ -548,8 +548,8 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
| Ast.TY_obj (_, fns) ->
unify_dict_with_obj_fns dct fns;
ty
| Ast.TY_exterior ty
when ucx.ext_ok -> Ast.TY_exterior (unify ty)
| Ast.TY_box ty
when ucx.box_ok -> Ast.TY_box (unify ty)
| Ast.TY_mutable ty
when ucx.mut_ok -> Ast.TY_mutable (unify ty)
| _ -> fail ()
@ -591,8 +591,8 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
Ast.TY_rec fields ->
unify_dict_with_record_fields dct fields;
ty
| Ast.TY_exterior ty
when ucx.ext_ok -> Ast.TY_exterior (unify ty)
| Ast.TY_box ty
when ucx.box_ok -> Ast.TY_box (unify ty)
| Ast.TY_mutable ty
when ucx.mut_ok -> Ast.TY_mutable (unify ty)
| _ -> fail ()
@ -612,10 +612,10 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
in
Array.iteri check_elem tvs;
ty
| Ast.TY_exterior ty
when ucx.ext_ok -> Ast.TY_exterior (unify ty)
| Ast.TY_box ty
when ucx.box_ok -> Ast.TY_box (unify ty)
| Ast.TY_mutable ty
when ucx.ext_ok -> Ast.TY_mutable (unify ty)
when ucx.box_ok -> Ast.TY_mutable (unify ty)
| _ -> fail ()
in
TYSPEC_resolved (params, unify ty)
@ -625,8 +625,8 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
let rec unify ty =
match ty with
Ast.TY_vec ty' -> unify_ty ucx ty' tv; ty
| Ast.TY_exterior ty when ucx.ext_ok ->
Ast.TY_exterior (unify ty)
| Ast.TY_box ty when ucx.box_ok ->
Ast.TY_box (unify ty)
| Ast.TY_mutable ty when ucx.mut_ok ->
Ast.TY_mutable (unify ty)
| _ -> fail ()
@ -1113,10 +1113,10 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
TYSPEC_collection tv
| Ast.COMP_deref ->
TYSPEC_exterior tv
TYSPEC_box tv
in
let base_tv = ref base_ts in
unify_lval' { ucx with ext_ok = true } base base_tv;
unify_lval' { ucx with box_ok = true } base base_tv;
match !(resolve_tyvar base_tv) with
TYSPEC_resolved (_, ty) ->
unify_ty ucx (project_type ty comp) tv
@ -1367,7 +1367,7 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
Ast.TY_fn (tsig, _) ->
begin
let vec_str =
interior_slot (Ast.TY_vec Ast.TY_str)
local_slot (Ast.TY_vec Ast.TY_str)
in
match tsig.Ast.sig_input_slots with
[| |] -> ()
@ -1532,8 +1532,8 @@ let process_crate (cx:ctxt) (crate:Ast.crate) : unit =
let ts = !(resolve_tyvar tv) in
match ts with
TYSPEC_resolved ([||], ty) -> ty
| TYSPEC_exterior tv ->
Ast.TY_exterior (get_resolved_ty tv id)
| TYSPEC_box tv ->
Ast.TY_box (get_resolved_ty tv id)
| TYSPEC_mutable tv ->
Ast.TY_mutable (get_resolved_ty tv id)

View File

@ -301,7 +301,7 @@ and walk_ty
| Ast.TY_nil -> ()
| Ast.TY_task -> ()
| Ast.TY_any -> ()
| Ast.TY_exterior m -> walk_ty v m
| Ast.TY_box m -> walk_ty v m
| Ast.TY_mutable m -> walk_ty v m
in
walk_bracketed
@ -471,7 +471,7 @@ and walk_stmt
walk_option (walk_lval v) port;
walk_lval v chan;
| Ast.STMT_init_exterior (dst, src) ->
| Ast.STMT_init_box (dst, src) ->
walk_lval v dst;
walk_atom v src

View File

@ -4,10 +4,10 @@
{
type t = tup(int,int,int);
// Allocate an exterior.
// Allocate a box.
let @t x = tup(1,2,3);
// Signal parent that we've allocated an exterior.
// Signal parent that we've allocated a box.
c <| 1;
while (true) {

View File

@ -1,6 +1,6 @@
fn main() {
obj handle(@int i) {
}
// This just tests whether the obj leaks its exterior state members.
// This just tests whether the obj leaks its box state members.
auto ob = handle(0xf00f00);
}