Melange_compiler_libs.Lambda
type tag_info =
| Blk_constructor of {
name : string;
num_nonconst : int;
attributes : Parsetree.attributes;
}
| Blk_tuple
| Blk_array
| Blk_poly_var of string
| Blk_record of string array
| Blk_module of string list
| Blk_module_export of Ident.t list
| Blk_extension_slot
| Blk_extension
| Blk_na of string
| Blk_some
| Blk_some_not_nested
| Blk_record_inlined of {
}
| Blk_record_ext of string array
| Blk_lazy_general
| Blk_class
val blk_record :
((Types.label_description * Typedtree.record_label_definition) array ->
tag_info)
Stdlib.ref
val blk_record_ext :
((Types.label_description * Typedtree.record_label_definition) array ->
tag_info)
Stdlib.ref
val blk_record_inlined :
((Types.label_description * Typedtree.record_label_definition) array ->
string ->
int ->
tag_info)
Stdlib.ref
val default_tag_info : tag_info
val ref_tag_info : tag_info
val fld_record : (Types.label_description -> field_dbg_info) Stdlib.ref
val fld_record_inline : (Types.label_description -> field_dbg_info) Stdlib.ref
val fld_record_extension :
(Types.label_description -> field_dbg_info) Stdlib.ref
val ref_field_info : field_dbg_info
val fld_na : field_dbg_info
val ref_field_set_info : set_field_dbg_info
val fld_record_set : (Types.label_description -> set_field_dbg_info) Stdlib.ref
val fld_record_inline_set :
(Types.label_description -> set_field_dbg_info) Stdlib.ref
val fld_record_extension_set :
(Types.label_description -> set_field_dbg_info) Stdlib.ref
type pointer_info =
| Pt_constructor of {
name : string;
const : int;
non_const : int;
attributes : Parsetree.attributes;
}
| Pt_constructor_access of {
}
| Pt_variant of {
}
| Pt_module_alias
| Pt_builtin_boolean
| Pt_shape_none
| Pt_assertfalse
| Pt_na
type primitive =
| Pbytes_to_string
| Pbytes_of_string
| Pignore
| Pgetglobal of Ident.t
| Psetglobal of Ident.t
| Pmakeblock of int * tag_info * Asttypes.mutable_flag * block_shape
| Pfield of int * immediate_or_pointer * Asttypes.mutable_flag * field_dbg_info
| Pfield_computed
| Psetfield of int
* immediate_or_pointer
* initialization_or_assignment
* set_field_dbg_info
| Psetfield_computed of immediate_or_pointer * initialization_or_assignment
| Pfloatfield of int * field_dbg_info
| Psetfloatfield of int * initialization_or_assignment * set_field_dbg_info
| Pduprecord of Types.record_representation * int
| Prunstack
| Pperform
| Presume
| Preperform
| Pccall of Primitive.description
| Praise of raise_kind
| Psequand
| Psequor
| Pnot
| Pnegint
| Paddint
| Psubint
| Pmulint
| Pdivint of is_safe
| Pmodint of is_safe
| Pandint
| Porint
| Pxorint
| Plslint
| Plsrint
| Pasrint
| Pintcomp of integer_comparison
| Pcompare_ints
| Pcompare_floats
| Pcompare_bints of boxed_integer
| Poffsetint of int
| Poffsetref of int
| Pintoffloat
| Pfloatofint
| Pnegfloat
| Pabsfloat
| Paddfloat
| Psubfloat
| Pmulfloat
| Pdivfloat
| Pfloatcomp of float_comparison
| Pstringlength
| Pstringrefu
| Pstringrefs
| Pbyteslength
| Pbytesrefu
| Pbytessetu
| Pbytesrefs
| Pbytessets
| Pmakearray of array_kind * Asttypes.mutable_flag
| Pduparray of array_kind * Asttypes.mutable_flag
For Pduparray
, the argument must be an immutable array. The arguments of Pduparray
give the kind and mutability of the array being *produced* by the duplication.
| Parraylength of array_kind
| Parrayrefu of array_kind
| Parraysetu of array_kind
| Parrayrefs of array_kind
| Parraysets of array_kind
| Pisint
| Pisout
| Pbintofint of boxed_integer
| Pintofbint of boxed_integer
| Pcvtbint of boxed_integer * boxed_integer
| Pnegbint of boxed_integer
| Paddbint of boxed_integer
| Psubbint of boxed_integer
| Pmulbint of boxed_integer
| Pdivbint of {
size : boxed_integer;
is_safe : is_safe;
}
| Pmodbint of {
size : boxed_integer;
is_safe : is_safe;
}
| Pandbint of boxed_integer
| Porbint of boxed_integer
| Pxorbint of boxed_integer
| Plslbint of boxed_integer
| Plsrbint of boxed_integer
| Pasrbint of boxed_integer
| Pbintcomp of boxed_integer * integer_comparison
| Pbigarrayref of bool * int * bigarray_kind * bigarray_layout
| Pbigarrayset of bool * int * bigarray_kind * bigarray_layout
| Pbigarraydim of int
| Pstring_load_16 of bool
| Pstring_load_32 of bool
| Pstring_load_64 of bool
| Pbytes_load_16 of bool
| Pbytes_load_32 of bool
| Pbytes_load_64 of bool
| Pbytes_set_16 of bool
| Pbytes_set_32 of bool
| Pbytes_set_64 of bool
| Pbigstring_load_16 of bool
| Pbigstring_load_32 of bool
| Pbigstring_load_64 of bool
| Pbigstring_set_16 of bool
| Pbigstring_set_32 of bool
| Pbigstring_set_64 of bool
| Pctconst of compile_time_constant
| Pbswap16
| Pbbswap of boxed_integer
| Pint_as_pointer
| Patomic_load of {
immediate_or_pointer : immediate_or_pointer;
}
| Patomic_exchange
| Patomic_cas
| Patomic_fetch_add
| Popaque
| Pdls_get
and block_shape = value_kind list option
val equal_value_kind : value_kind -> value_kind -> bool
val equal_boxed_integer : boxed_integer -> boxed_integer -> bool
val default_pointer_info : pointer_info
type structured_constant =
| Const_base of Asttypes.constant * pointer_info
| Const_block of int * tag_info * structured_constant list
| Const_float_array of string list
| Const_immstring of string
val equal_inline_attribute : inline_attribute -> inline_attribute -> bool
val equal_specialise_attribute :
specialise_attribute ->
specialise_attribute ->
bool
type function_attribute = {
inline : inline_attribute;
specialise : specialise_attribute;
local : local_attribute;
poll : poll_attribute;
is_a_functor : bool;
stub : bool;
tmc_candidate : bool;
return_unit : bool;
}
type lambda =
| Lvar of Ident.t
| Lmutvar of Ident.t
| Lconst of structured_constant
| Lapply of lambda_apply
| Lfunction of lfunction
| Llet of let_kind * value_kind * Ident.t * lambda * lambda
| Lmutlet of value_kind * Ident.t * lambda * lambda
| Lletrec of (Ident.t * lambda) list * lambda
| Lprim of primitive * lambda list * scoped_location
| Lswitch of lambda * lambda_switch * scoped_location
| Lstringswitch of lambda
* (string * lambda) list
* lambda option
* scoped_location
| Lstaticraise of int * lambda list
| Lstaticcatch of lambda * int * (Ident.t * value_kind) list * lambda
| Ltrywith of lambda * Ident.t * lambda
| Lifthenelse of lambda * lambda * lambda
| Lsequence of lambda * lambda
| Lwhile of lambda * lambda
| Lfor of Ident.t * lambda * lambda * Asttypes.direction_flag * lambda
| Lassign of Ident.t * lambda
| Lsend of meth_kind * lambda * lambda * lambda list * scoped_location
| Levent of lambda * lambda_event
| Lifused of Ident.t * lambda
and lfunction = private {
kind : function_kind;
params : (Ident.t * value_kind) list;
return : value_kind;
body : lambda;
attr : function_attribute;
loc : scoped_location;
}
and lambda_apply = {
ap_func : lambda;
ap_args : lambda list;
ap_loc : scoped_location;
ap_tailcall : tailcall_attribute;
ap_inlined : inline_attribute;
ap_specialised : specialise_attribute;
}
and lambda_switch = {
sw_numconsts : int;
sw_consts : (int * lambda) list;
sw_numblocks : int;
sw_blocks : (int * lambda) list;
sw_failaction : lambda option;
sw_names : switch_names option;
}
and lambda_event = {
lev_loc : scoped_location;
lev_kind : lambda_event_kind;
lev_repr : int Stdlib.ref option;
lev_env : Env.t;
}
type program = {
module_ident : Ident.t;
main_module_block_size : int;
required_globals : Ident.Set.t;
code : lambda;
}
val const_unit : structured_constant
val const_int : ?ptr_info:pointer_info -> int -> structured_constant
val lambda_unit : lambda
val lambda_assert_false : lambda
val lambda_module_alias : lambda
val lfunction :
kind:function_kind ->
params:(Ident.t * value_kind) list ->
return:value_kind ->
body:lambda ->
attr:function_attribute ->
loc:scoped_location ->
lambda
iter_head_constructor f lam
apply f
to only the first level of sub expressions of lam
. It does not recursively traverse the expression.
Same as iter_head_constructor
, but use a different callback for sub-terms which are in tail position or not.
val transl_prim : string -> string -> lambda
Translate a value from a persistent module. For instance:
transl_internal_value "CamlinternalLazy" "force"
val free_variables : lambda -> Ident.Set.t
val transl_module_path : scoped_location -> Env.t -> Path.t -> lambda
val transl_value_path : scoped_location -> Env.t -> Path.t -> lambda
val transl_extension_path : scoped_location -> Env.t -> Path.t -> lambda
val transl_class_path : scoped_location -> Env.t -> Path.t -> lambda
val subst :
(Ident.t -> Types.value_description -> Env.t -> Env.t) ->
?freshen_bound_variables:bool ->
lambda Ident.Map.t ->
lambda ->
lambda
subst update_env ?freshen_bound_variables s lt
applies a substitution s
to the lambda-term lt
.
Assumes that the image of the substitution is out of reach of the bound variables of the lambda-term (no capture).
update_env
is used to refresh the environment contained in debug events.
freshen_bound_variables
, which defaults to false
, freshens the bound variables within lt
.
A version of subst
specialized for the case where we're just renaming idents.
Bottom-up rewriting, applying the function on each node from the leaves to the root.
Rewrite each immediate sub-term with the function.
val bind_with_value_kind :
let_kind ->
(Ident.t * value_kind) ->
lambda ->
lambda ->
lambda
val negate_integer_comparison : integer_comparison -> integer_comparison
val swap_integer_comparison : integer_comparison -> integer_comparison
val negate_float_comparison : float_comparison -> float_comparison
val swap_float_comparison : float_comparison -> float_comparison
val default_function_attribute : function_attribute
val default_stub_attribute : function_attribute
val function_is_curried : lfunction -> bool
val find_exact_application :
function_kind ->
arity:int ->
lambda list ->
lambda list option
Maximal number of parameters for a function, or in other words, maximal length of the params
list of a lfunction
record. This is unlimited (max_int
) for bytecode, but limited (currently to 126) for native code.
val staticfail : lambda
val is_guarded : lambda -> bool
val raise_kind : raise_kind -> string
val merge_inline_attributes :
inline_attribute ->
inline_attribute ->
inline_attribute option