forked from let-def/ocaml
-
Notifications
You must be signed in to change notification settings - Fork 0
/
typedecl_unboxed.ml
43 lines (40 loc) · 2.15 KB
/
typedecl_unboxed.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
(**************************************************************************)
(* *)
(* OCaml *)
(* *)
(* Gabriel Scherer, projet Parsifal, INRIA Saclay *)
(* Rodolphe Lepigre, projet Deducteam, INRIA Saclay *)
(* *)
(* Copyright 2018 Institut National de Recherche en Informatique et *)
(* en Automatique. *)
(* *)
(* All rights reserved. This file is distributed under the terms of *)
(* the GNU Lesser General Public License version 2.1, with the *)
(* special exception on linking described in the file LICENSE. *)
(* *)
(**************************************************************************)
open Types
(* We use the Ctype.expand_head_opt version of expand_head to get access
to the manifest type of private abbreviations. *)
let rec get_unboxed_type_representation env ty fuel =
if fuel < 0 then None else
let ty = Ctype.expand_head_opt env ty in
match get_desc ty with
| Tconstr (p, args, _) ->
begin match Env.find_type p env with
| exception Not_found -> Some ty
| {type_params; type_kind =
Type_record ([{ld_type = ty2; _}], Record_unboxed _)
| Type_variant ([{cd_args = Cstr_tuple [ty2]; _}], Variant_unboxed)
| Type_variant ([{cd_args = Cstr_record [{ld_type = ty2; _}]; _}],
Variant_unboxed)}
->
let ty2 = match get_desc ty2 with Tpoly (t, _) -> t | _ -> ty2 in
get_unboxed_type_representation env
(Ctype.apply env type_params ty2 args) (fuel - 1)
| _ -> Some ty
end
| _ -> Some ty
let get_unboxed_type_representation env ty =
(* Do not give too much fuel: PR#7424 *)
get_unboxed_type_representation env ty 100