diff options
| author | Graydon Hoare <[email protected]> | 2010-07-22 17:05:45 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-07-22 17:05:45 -0700 |
| commit | ede42cf931dc9cb7c7f4c78d7f9521985c2a8e11 (patch) | |
| tree | 0fa2f6e9274f326687bb981172c76897b08c9eab /src | |
| parent | Un-XFAIL stuff that started working when pcwalton's new typechecker landed. (diff) | |
| download | rust-ede42cf931dc9cb7c7f4c78d7f9521985c2a8e11.tar.xz rust-ede42cf931dc9cb7c7f4c78d7f9521985c2a8e11.zip | |
A certain incomplete quantity of wrestling with "INIT" statements that don't actually initialize. Should probably rename them to MAKE. Anyway, WIP, but two steps forward (and one back). More later.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile | 3 | ||||
| -rw-r--r-- | src/boot/me/trans.ml | 104 | ||||
| -rw-r--r-- | src/test/run-pass/mlist-cycle.rs | 6 |
3 files changed, 82 insertions, 31 deletions
diff --git a/src/Makefile b/src/Makefile index c6f0a5bf..84f3a2b2 100644 --- a/src/Makefile +++ b/src/Makefile @@ -357,6 +357,7 @@ TEST_XFAILS_X86 := test/run-pass/bind-obj-ctor.rs \ test/run-pass/vec-slice.rs \ test/run-pass/fn-lval.rs \ test/run-pass/generic-fn-infer.rs \ + test/run-pass/generic-tag-alt.rs \ test/run-pass/generic-recursive-tag.rs \ test/run-pass/iter-ret.rs \ test/run-pass/mlist-cycle.rs \ @@ -387,6 +388,7 @@ TEST_XFAILS_LLVM := $(addprefix test/run-pass/, \ bind-thunk.rs \ bind-trivial.rs \ bitwise.rs \ + box-in-tup.rs \ box-unbox.rs \ cast.rs \ clone-with-exterior.rs \ @@ -476,6 +478,7 @@ TEST_XFAILS_LLVM := $(addprefix test/run-pass/, \ vec-append.rs \ vec-concat.rs \ vec-drop.rs \ + vec-in-tup.rs \ vec-late-init.rs \ vec-lib.rs \ vec-slice.rs \ diff --git a/src/boot/me/trans.ml b/src/boot/me/trans.ml index 4902c300..cd59ff5d 100644 --- a/src/boot/me/trans.ml +++ b/src/boot/me/trans.ml @@ -1248,12 +1248,16 @@ let trans_visitor (sorted_htab_keys fns)) end - and trans_init_str (dst:Ast.lval) (s:string) : unit = + and trans_init_str (initializing:bool) (dst:Ast.lval) (s:string) : unit = (* Include null byte. *) let init_sz = Int64.of_int ((String.length s) + 1) in let static = trans_static_string s in - let (dst, _) = trans_lval_init dst in - trans_upcall "upcall_new_str" dst [| static; imm init_sz |] + let (dst_cell, dst_ty) = trans_lval_maybe_init initializing dst in + let _ = + if not initializing + then drop_ty_in_current_frame dst_cell dst_ty + in + trans_upcall "upcall_new_str" dst_cell [| static; imm init_sz |] and trans_lit (lit:Ast.lit) : Il.operand = match lit with @@ -2220,22 +2224,33 @@ let trans_visitor trans_atom (Ast.ATOM_lval chan) |]; end - and trans_init_port (dst:Ast.lval) : unit = - let (dstcell, dst_ty) = trans_lval_init dst in + and trans_init_port (initializing:bool) (dst:Ast.lval) : unit = + let (dst_cell, dst_ty) = trans_lval_maybe_init initializing dst in + let _ = + if not initializing + then drop_ty_in_current_frame dst_cell dst_ty + in let unit_ty = match dst_ty with Ast.TY_port t -> t | _ -> bug () "init dst of port-init has non-port type" in let unit_sz = ty_sz abi unit_ty in - trans_upcall "upcall_new_port" dstcell [| imm unit_sz |] + trans_upcall "upcall_new_port" dst_cell [| imm unit_sz |] and trans_del_port (port:Il.cell) : unit = trans_void_upcall "upcall_del_port" [| Il.Cell port |] - and trans_init_chan (dst:Ast.lval) (port:Ast.lval) : unit = - let (dstcell, _) = trans_lval_init dst + and trans_init_chan + (initializing:bool) + (dst:Ast.lval) + (port:Ast.lval) + : unit = + let (dst_cell, dst_ty) = trans_lval_maybe_init initializing dst in + let _ = + if not initializing + then drop_ty_in_current_frame dst_cell dst_ty in - trans_upcall "upcall_new_chan" dstcell + trans_upcall "upcall_new_chan" dst_cell [| trans_atom (Ast.ATOM_lval port) |] and trans_del_chan (chan:Il.cell) : unit = @@ -2258,8 +2273,16 @@ let trans_visitor * part out for reuse in string code. *) - and trans_init_vec (dst:Ast.lval) (atoms:Ast.atom array) : unit = - let (dst_cell, dst_ty) = trans_lval_init dst in + and trans_init_vec + (initializing:bool) + (dst:Ast.lval) + (atoms:Ast.atom array) + : unit = + let (dst_cell, dst_ty) = trans_lval_maybe_init initializing dst in + let _ = + if not initializing + then drop_ty_in_current_frame dst_cell dst_ty + in let gc_ctrl = if (ty_mem_ctrl dst_ty) = MEM_gc then Il.Cell (get_tydesc None dst_ty) @@ -2292,17 +2315,26 @@ let trans_visitor mov (get_element_ptr vec Abi.vec_elt_fill) (Il.Cell fill); - and trans_init_box (dst:Ast.lval) (src:Ast.atom) : unit = + and trans_init_box + (initializing:bool) + (dst:Ast.lval) + (src:Ast.atom) + : unit = let src_op = trans_atom src in let src_cell = Il.Mem (force_to_mem src_op) in let src_ty = simplified_ty (atom_type cx src) in - let dst_sloti = lval_base_to_slot cx dst in - let dst_cell = cell_of_block_slot dst_sloti.id in - let dst_cell = deref_slot true dst_cell dst_sloti.node in - let dst_ty = slot_ty dst_sloti.node in + let (dst_cell, dst_ty) = trans_lval_maybe_init initializing dst in + let _ = + if not initializing + then drop_ty_in_current_frame dst_cell dst_ty + in + let dst_ty = strip_mutable_or_constrained_ty dst_ty in let (dst_cell, dst_ty) = deref_ty DEREF_one_box true dst_cell dst_ty in + let _ = log cx "init_box: dst ty %a, src ty %a" + Ast.sprintf_ty dst_ty Ast.sprintf_ty src_ty + in let _ = assert (dst_ty = src_ty) in trans_copy_ty (get_ty_params_of_current_frame()) true dst_cell dst_ty src_cell src_ty None @@ -2868,6 +2900,12 @@ let trans_visitor : unit = drop_slot (get_ty_params_of_current_frame()) cell slot curr_iso + and drop_ty_in_current_frame + (cell:Il.cell) + (ty:Ast.ty) + : unit = + drop_ty (get_ty_params_of_current_frame()) cell ty None + and null_check (cell:Il.cell) : quad_idx = emit (Il.cmp (Il.Cell cell) zero); let j = mark() in @@ -4338,7 +4376,7 @@ let trans_visitor and trans_copy_binop dst binop a_src = - let (dst_cell, dst_ty) = trans_lval_maybe_init false dst in + let (dst_cell, dst_ty) = trans_lval dst in let src_oper = trans_atom a_src in match dst_ty with Ast.TY_str @@ -4440,7 +4478,8 @@ let trans_visitor end | Ast.STMT_init_rec (dst, atab, base) -> - let (slot_cell, ty) = trans_lval_init dst in + let init = maybe_init stmt.id "rec-init" dst in + let (dst_cell, ty) = trans_lval_maybe_init init dst in let (trec, dst_tys) = match ty with Ast.TY_rec trec -> (trec, Array.map snd trec) @@ -4448,7 +4487,6 @@ let trans_visitor bugi cx stmt.id "non-rec destination type in stmt_init_rec" in - let (dst_cell, _) = deref_ty DEREF_none true slot_cell ty in begin match base with None -> @@ -4461,42 +4499,52 @@ let trans_visitor end | Ast.STMT_init_tup (dst, elems) -> - let (slot_cell, ty) = trans_lval_init dst in + let init = maybe_init stmt.id "tup-init" dst in + let (dst_cell, dst_ty) = trans_lval_maybe_init init dst in + let _ = + if not init + then drop_ty_in_current_frame dst_cell dst_ty + in let dst_tys = - match ty with + match dst_ty with Ast.TY_tup ttup -> ttup | _ -> bugi cx stmt.id "non-tup destination type in stmt_init_tup" in let atoms = Array.map snd elems in - let (dst_cell, _) = deref_ty DEREF_none true slot_cell ty in + let (dst_cell, _) = deref_ty DEREF_none init dst_cell dst_ty in trans_init_structural_from_atoms dst_cell dst_tys atoms | Ast.STMT_init_str (dst, s) -> - trans_init_str dst s + let init = maybe_init stmt.id "str-init" dst in + trans_init_str init dst s | Ast.STMT_init_vec (dst, _, atoms) -> - trans_init_vec dst atoms + let init = maybe_init stmt.id "vec-init" dst in + trans_init_vec init dst atoms | Ast.STMT_init_port dst -> - trans_init_port dst + let init = maybe_init stmt.id "port-init" dst in + trans_init_port init dst | Ast.STMT_init_chan (dst, port) -> + let init = maybe_init stmt.id "chan-init" dst in begin match port with None -> let (dst_cell, _) = - trans_lval_init dst + trans_lval_maybe_init init dst in mov dst_cell imm_false | Some p -> - trans_init_chan dst p + trans_init_chan init dst p end | Ast.STMT_init_box (dst, _, src) -> - trans_init_box dst src + let init = maybe_init stmt.id "box-init" dst in + trans_init_box init dst src | Ast.STMT_block block -> trans_block block diff --git a/src/test/run-pass/mlist-cycle.rs b/src/test/run-pass/mlist-cycle.rs index c41cd5f5..09221ea3 100644 --- a/src/test/run-pass/mlist-cycle.rs +++ b/src/test/run-pass/mlist-cycle.rs @@ -6,9 +6,9 @@ type cell = tup(mutable @list); type list = tag(link(@cell), nil()); fn main() { - let @cell first = tup(@nil()); - let @cell second = tup(@link(first)); + let @cell first = @tup(mutable @nil()); + let @cell second = @tup(mutable @link(first)); first._0 = @link(second); std.sys.rustrt.gc(); - let @cell third = tup(@nil()); + let @cell third = @tup(mutable @nil()); } |