Skip to content

Commit b81aa05

Browse files
committed
Recursively genericize types and spread across glue. Saves 1mb size, 8s compile time on rustc.
1 parent f5bf8d0 commit b81aa05

File tree

2 files changed

+38
-16
lines changed

2 files changed

+38
-16
lines changed

src/boot/me/semant.ml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,6 +1146,37 @@ let get_nth_tag_tup
11461146
;;
11471147

11481148

1149+
let generic_obj_ty =
1150+
Ast.TY_obj (Ast.LAYER_value, Hashtbl.create 0)
1151+
;;
1152+
1153+
let generic_fn_ty =
1154+
Ast.TY_fn ({ Ast.sig_input_slots = [| |];
1155+
Ast.sig_input_constrs = [| |];
1156+
Ast.sig_output_slot =
1157+
{ Ast.slot_mode = Ast.MODE_local;
1158+
Ast.slot_ty = Some Ast.TY_nil }; },
1159+
{ Ast.fn_is_iter = false;
1160+
Ast.fn_effect = Ast.EFF_pure })
1161+
;;
1162+
1163+
let rec get_genericized_ty ty =
1164+
(* Using a full-and-honest fold here is too slow, sadly. *)
1165+
let sub = get_genericized_ty in
1166+
match ty with
1167+
Ast.TY_obj _ -> generic_obj_ty
1168+
| Ast.TY_fn _ -> generic_fn_ty
1169+
| Ast.TY_vec t -> Ast.TY_vec (sub t)
1170+
| Ast.TY_tup tys -> Ast.TY_tup (Array.map sub tys)
1171+
| Ast.TY_rec elts ->
1172+
Ast.TY_rec (Array.map (fun (id, t) -> (id, sub t)) elts)
1173+
| Ast.TY_box t ->
1174+
Ast.TY_box (sub t)
1175+
| Ast.TY_mutable t ->
1176+
Ast.TY_mutable (sub t)
1177+
| _ -> ty
1178+
;;
1179+
11491180

11501181
let associative_binary_op_ty_fold
11511182
(default:'a)

src/boot/me/trans.ml

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1926,22 +1926,7 @@ let trans_visitor
19261926
and get_drop_glue
19271927
(ty:Ast.ty)
19281928
: fixup =
1929-
1930-
(* obj and fn glue delegates to the body, so is always 'generic'. *)
1931-
let ty =
1932-
match ty with
1933-
Ast.TY_obj _ -> Ast.TY_obj (Ast.LAYER_value, Hashtbl.create 0)
1934-
| Ast.TY_fn _ ->
1935-
Ast.TY_fn ({ Ast.sig_input_slots = [| |];
1936-
Ast.sig_input_constrs = [| |];
1937-
Ast.sig_output_slot =
1938-
{ Ast.slot_mode = Ast.MODE_local;
1939-
Ast.slot_ty = Some Ast.TY_nil }; },
1940-
{ Ast.fn_is_iter = false;
1941-
Ast.fn_effect = Ast.EFF_pure })
1942-
| _ -> ty
1943-
in
1944-
1929+
let ty = get_genericized_ty ty in
19451930
let g = GLUE_drop ty in
19461931
let inner _ (args:Il.cell) =
19471932
let ty_params = deref (get_element_ptr args 0) in
@@ -1960,6 +1945,7 @@ let trans_visitor
19601945
(ty:Ast.ty)
19611946
(is_gc:bool)
19621947
: fixup =
1948+
let ty = get_genericized_ty ty in
19631949
let g = GLUE_free ty in
19641950
let inner _ (args:Il.cell) =
19651951
(* Free-glue assumes it's called with a pointer to a box allocation with
@@ -1978,6 +1964,7 @@ let trans_visitor
19781964
and get_sever_glue
19791965
(ty:Ast.ty)
19801966
: fixup =
1967+
let ty = get_genericized_ty ty in
19811968
let g = GLUE_sever ty in
19821969
let inner _ (args:Il.cell) =
19831970
let ty_params = deref (get_element_ptr args 0) in
@@ -1994,6 +1981,7 @@ let trans_visitor
19941981
and get_mark_glue
19951982
(ty:Ast.ty)
19961983
: fixup =
1984+
let ty = get_genericized_ty ty in
19971985
let g = GLUE_mark ty in
19981986
let inner _ (args:Il.cell) =
19991987
let ty_params = deref (get_element_ptr args 0) in
@@ -2010,6 +1998,7 @@ let trans_visitor
20101998
and get_clone_glue
20111999
(ty:Ast.ty)
20122000
: fixup =
2001+
let ty = get_genericized_ty ty in
20132002
let g = GLUE_clone ty in
20142003
let inner (out_ptr:Il.cell) (args:Il.cell) =
20152004
let dst = deref out_ptr in
@@ -2034,6 +2023,7 @@ let trans_visitor
20342023
and get_copy_glue
20352024
(ty:Ast.ty)
20362025
: fixup =
2026+
let ty = get_genericized_ty ty in
20372027
let arg_ty_params_alias = 0 in
20382028
let arg_src_alias = 1 in
20392029
let arg_initflag = 2 in
@@ -2068,6 +2058,7 @@ let trans_visitor
20682058
get_typed_mem_glue g fty inner
20692059

20702060
and get_cmp_glue ty =
2061+
let ty = get_genericized_ty ty in
20712062
let arg_ty_params_alias = 0 in
20722063
let arg_lhs_alias = 1 in
20732064
let arg_rhs_alias = 2 in

0 commit comments

Comments
 (0)