Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Atd.Expand
SourceMonomorphization of type definitions
To support the generation of annotations for types that are created during the monomorphization process, a mapping must be kept connecting the monomorphic type name to the original polymorphic one, including its original number of parameters.
This table is only used in producing those annotations to support the Atdgen command line option -o-name-overlap. It can probably be ignored for most uses of expand_module_body.
val expand_module_body :
?prefix:string ->
?keep_poly:bool ->
?debug:bool ->
Ast.module_body ->
Ast.module_body * original_types
Monomorphization of type expressions.
The goal is to inline each parametrized type definition as much as possible, allowing code generators to create more efficient code directly:
type ('a, 'b) t = [ Foo of 'a | Bar of 'b ] type int_t = (int, int) t
becomes:
type int_t = _1 type _1 = [ Foo of int | Bar of int ]
A secondary goal is to factor out type subexpressions in order for the code generators to produce less code:
type x = \{ x : int list } type y = \{ y : int list option }
becomes:
type x = \{ x : _1 } type y = \{ y : _2 } type _1 = int list (* `int list' now occurs only once *) type _2 = _1 option
By default, only parameterless type definitions are returned. The keep_poly
option allows to return parametrized type definitions as well.
Input:
type 'a abs = abstract type int_abs = int abs type 'a tree = [ Leaf of 'a | Node of ('a tree * 'a tree) ] type t = int tree type x = [ Foo | Bar ] tree
Output (pseudo-syntax where quoted strings indicate unique type identifiers):
type "int abs" = int abs type int_abs = "int abs" type 'a tree = [ Leaf of 'a | Node of ('a tree * 'a tree) ] (* only if keep_poly = true *) type "int tree" = [ Leaf of int | Node of ("int tree" * "int tree") ] type t = "int tree" type "[ Foo | Bar ] tree" = [ Leaf of [ Foo | Bar ] | Node of ("[ Foo | Bar ] tree" * "[ Foo | Bar ] tree") ] type x = "[ Foo | Bar ] tree"