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:
parent
8b8186db87
commit
6a0b06e562
@ -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;;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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 }
|
||||
;;
|
||||
|
||||
|
@ -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 ->
|
||||
|
@ -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)
|
||||
|
@ -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 =
|
||||
|
@ -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))
|
||||
|
@ -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 =
|
||||
|
@ -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. *)
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
;;
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user