Retire defunct copy_ty in favour of trans_copy_ty, which invokes the same logic at the bottom.
This commit is contained in:
parent
d0a1b6e914
commit
2d40bc669c
1 changed files with 60 additions and 71 deletions
|
@ -1695,7 +1695,7 @@ let trans_visitor
|
||||||
let dst = deref out_ptr in
|
let dst = deref out_ptr in
|
||||||
let ty_params = deref (get_element_ptr args 0) in
|
let ty_params = deref (get_element_ptr args 0) in
|
||||||
let src = deref (get_element_ptr args 1) in
|
let src = deref (get_element_ptr args 1) in
|
||||||
copy_ty ty_params dst src ty curr_iso
|
trans_copy_ty ty_params false dst ty src ty curr_iso
|
||||||
in
|
in
|
||||||
let ty_params_ptr = ty_params_covering ty in
|
let ty_params_ptr = ty_params_covering ty in
|
||||||
let fty =
|
let fty =
|
||||||
|
@ -2595,73 +2595,6 @@ let trans_visitor
|
||||||
iter_ty_parts_full ty_params dst src ty
|
iter_ty_parts_full ty_params dst src ty
|
||||||
(clone_ty ty_params clone_task) curr_iso
|
(clone_ty ty_params clone_task) curr_iso
|
||||||
|
|
||||||
and copy_ty
|
|
||||||
(ty_params:Il.cell)
|
|
||||||
(dst:Il.cell)
|
|
||||||
(src:Il.cell)
|
|
||||||
(ty:Ast.ty)
|
|
||||||
(curr_iso:Ast.ty_iso option)
|
|
||||||
: unit =
|
|
||||||
iflog (fun _ ->
|
|
||||||
annotate ("copy_ty: referent data of type " ^
|
|
||||||
(Fmt.fmt_to_str Ast.fmt_ty ty)));
|
|
||||||
match ty with
|
|
||||||
Ast.TY_nil
|
|
||||||
| Ast.TY_bool
|
|
||||||
| Ast.TY_mach _
|
|
||||||
| Ast.TY_int
|
|
||||||
| Ast.TY_uint
|
|
||||||
| Ast.TY_native _
|
|
||||||
| Ast.TY_type
|
|
||||||
| Ast.TY_char ->
|
|
||||||
iflog
|
|
||||||
(fun _ -> annotate
|
|
||||||
(Printf.sprintf "copy_ty: simple mov (%Ld byte scalar)"
|
|
||||||
(ty_sz abi ty)));
|
|
||||||
mov dst (Il.Cell src)
|
|
||||||
|
|
||||||
| Ast.TY_param (i, _) ->
|
|
||||||
iflog
|
|
||||||
(fun _ -> annotate
|
|
||||||
(Printf.sprintf "copy_ty: parametric copy %#d" i));
|
|
||||||
aliasing false src
|
|
||||||
begin
|
|
||||||
fun src ->
|
|
||||||
let td = get_ty_param ty_params i in
|
|
||||||
let ty_params_ptr = get_tydesc_params ty_params td in
|
|
||||||
trans_call_dynamic_glue
|
|
||||||
td Abi.tydesc_field_copy_glue
|
|
||||||
(Some dst) [| ty_params_ptr; src; |]
|
|
||||||
end
|
|
||||||
|
|
||||||
| Ast.TY_fn _
|
|
||||||
| Ast.TY_obj _ ->
|
|
||||||
begin
|
|
||||||
let src_item = get_element_ptr src Abi.binding_field_item in
|
|
||||||
let dst_item = get_element_ptr dst Abi.binding_field_item in
|
|
||||||
let src_binding = get_element_ptr src Abi.binding_field_binding in
|
|
||||||
let dst_binding = get_element_ptr dst Abi.binding_field_binding in
|
|
||||||
mov dst_item (Il.Cell src_item);
|
|
||||||
let null_jmp = null_check src_binding in
|
|
||||||
(* Copy if we have a src binding. *)
|
|
||||||
(* FIXME (issue #58): this is completely wrong, call
|
|
||||||
* through to the binding's self-copy fptr. For now
|
|
||||||
* this only works by accident.
|
|
||||||
*)
|
|
||||||
trans_copy_ty ty_params true
|
|
||||||
dst_binding (Ast.TY_box Ast.TY_int)
|
|
||||||
src_binding (Ast.TY_box Ast.TY_int)
|
|
||||||
curr_iso;
|
|
||||||
patch null_jmp
|
|
||||||
end
|
|
||||||
|
|
||||||
| _ ->
|
|
||||||
iter_ty_parts_full ty_params dst src ty
|
|
||||||
(fun dst src ty curr_iso ->
|
|
||||||
trans_copy_ty ty_params true
|
|
||||||
dst ty src ty curr_iso)
|
|
||||||
curr_iso
|
|
||||||
|
|
||||||
and free_ty
|
and free_ty
|
||||||
(is_gc:bool)
|
(is_gc:bool)
|
||||||
(ty_params:Il.cell)
|
(ty_params:Il.cell)
|
||||||
|
@ -3004,10 +2937,66 @@ let trans_visitor
|
||||||
annotate ("heavy copy: slot preparation"));
|
annotate ("heavy copy: slot preparation"));
|
||||||
|
|
||||||
let curr_iso = maybe_enter_iso dst_ty curr_iso in
|
let curr_iso = maybe_enter_iso dst_ty curr_iso in
|
||||||
let (dst, dst_ty') = deref_ty DEREF_none initializing dst dst_ty in
|
let (dst, ty) = deref_ty DEREF_none initializing dst dst_ty in
|
||||||
let (src, _) = deref_ty DEREF_none false src src_ty in
|
let (src, _) = deref_ty DEREF_none false src src_ty in
|
||||||
assert (dst_ty' = dst_ty);
|
assert (ty = dst_ty);
|
||||||
copy_ty ty_params dst src dst_ty' curr_iso
|
match ty with
|
||||||
|
Ast.TY_nil
|
||||||
|
| Ast.TY_bool
|
||||||
|
| Ast.TY_mach _
|
||||||
|
| Ast.TY_int
|
||||||
|
| Ast.TY_uint
|
||||||
|
| Ast.TY_native _
|
||||||
|
| Ast.TY_type
|
||||||
|
| Ast.TY_char ->
|
||||||
|
iflog
|
||||||
|
(fun _ -> annotate
|
||||||
|
(Printf.sprintf "copy_ty: simple mov (%Ld byte scalar)"
|
||||||
|
(ty_sz abi ty)));
|
||||||
|
mov dst (Il.Cell src)
|
||||||
|
|
||||||
|
| Ast.TY_param (i, _) ->
|
||||||
|
iflog
|
||||||
|
(fun _ -> annotate
|
||||||
|
(Printf.sprintf "copy_ty: parametric copy %#d" i));
|
||||||
|
aliasing false src
|
||||||
|
begin
|
||||||
|
fun src ->
|
||||||
|
let td = get_ty_param ty_params i in
|
||||||
|
let ty_params_ptr = get_tydesc_params ty_params td in
|
||||||
|
trans_call_dynamic_glue
|
||||||
|
td Abi.tydesc_field_copy_glue
|
||||||
|
(Some dst) [| ty_params_ptr; src; |]
|
||||||
|
end
|
||||||
|
|
||||||
|
| Ast.TY_fn _
|
||||||
|
| Ast.TY_obj _ ->
|
||||||
|
begin
|
||||||
|
let src_item = get_element_ptr src Abi.binding_field_item in
|
||||||
|
let dst_item = get_element_ptr dst Abi.binding_field_item in
|
||||||
|
let src_binding = get_element_ptr src Abi.binding_field_binding in
|
||||||
|
let dst_binding = get_element_ptr dst Abi.binding_field_binding in
|
||||||
|
mov dst_item (Il.Cell src_item);
|
||||||
|
let null_jmp = null_check src_binding in
|
||||||
|
(* Copy if we have a src binding. *)
|
||||||
|
(* FIXME (issue #58): this is completely wrong, call
|
||||||
|
* through to the binding's self-copy fptr. For now
|
||||||
|
* this only works by accident.
|
||||||
|
*)
|
||||||
|
trans_copy_ty ty_params false
|
||||||
|
dst_binding (Ast.TY_box Ast.TY_int)
|
||||||
|
src_binding (Ast.TY_box Ast.TY_int)
|
||||||
|
curr_iso;
|
||||||
|
patch null_jmp
|
||||||
|
end
|
||||||
|
|
||||||
|
| _ ->
|
||||||
|
iter_ty_parts_full ty_params dst src ty
|
||||||
|
(fun dst src ty curr_iso ->
|
||||||
|
trans_copy_ty ty_params true
|
||||||
|
dst ty src ty curr_iso)
|
||||||
|
curr_iso
|
||||||
|
|
||||||
|
|
||||||
and trans_copy
|
and trans_copy
|
||||||
(initializing:bool)
|
(initializing:bool)
|
||||||
|
|
Loading…
Add table
Reference in a new issue