Math.NET Numerics
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

161 lines
6.6 KiB

// (c) Microsoft Corporation. All rights reserved
/// ILX extensions to Abstract IL types and instructions F#
module (* internal *) Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.Types
open Internal.Utilities
open Microsoft.FSharp.Compiler.AbstractIL
open Microsoft.FSharp.Compiler.AbstractIL.Internal
module Il = Microsoft.FSharp.Compiler.AbstractIL.IL
open Il
(* --------------------------------------------------------------------
* Union and closure references
* -------------------------------------------------------------------- *)
type IlxUnionAlternative =
{ altName: string;
altFields: ILFieldDef array;
altCustomAttrs: ILAttributes }
and IlxUnionRef = IlxUnionRef of ILTypeRef * IlxUnionAlternative array * bool (* cudNullPermitted *)
and IlxUnionSpec = IlxUnionSpec of IlxUnionRef * ILGenericArgs
and IlxClosureLambdas =
| Lambdas_forall of ILGenericParameterDef * IlxClosureLambdas
| Lambdas_lambda of ILParameter * IlxClosureLambdas
| Lambdas_return of ILType
and IlxClosureRef = IlxClosureRef of ILTypeRef * IlxClosureLambdas * IlxClosureFreeVar list
and IlxClosureSpec = IlxClosureSpec of IlxClosureRef * ILGenericArgs
and IlxClosureFreeVar =
{ fvName: string ;
fvCompilerGenerated:bool;
fvType: ILType }
/// IlxClosureApps - i.e. types being applied at a callsite
type IlxClosureApps =
| Apps_tyapp of ILType * IlxClosureApps
| Apps_app of ILType * IlxClosureApps
| Apps_done of ILType
/// ILX extensions to the intruction set
///
type IlxInstr =
| EI_lddata of IlxUnionSpec * int * int
| EI_isdata of IlxUnionSpec * int
| EI_brisdata of IlxUnionSpec * int * ILCodeLabel * ILCodeLabel
| EI_castdata of bool * IlxUnionSpec * int
| EI_stdata of IlxUnionSpec * int * int
| EI_datacase of (bool * IlxUnionSpec * (int * ILCodeLabel) list * ILCodeLabel) (* last label is fallthrough, bool is whether to leave value on the stack for each case *)
| EI_lddatatag of IlxUnionSpec
| EI_newdata of IlxUnionSpec * int
| EI_newclo of IlxClosureSpec
| EI_castclo of IlxClosureSpec
| EI_isclo of IlxClosureSpec
| EI_callclo of Tailcall * IlxClosureSpec * IlxClosureApps
| EI_stclofld of (IlxClosureSpec * int)
| EI_stenv of int
| EI_ldenv of int
| EI_ldenva of int
| EI_callfunc of Tailcall * IlxClosureApps
| EI_ldftn_then_call of ILMethodSpec * (Tailcall * ILMethodSpec * varargs) (* special: for internal use only *)
| EI_ld_instance_ftn_then_newobj of ILMethodSpec * ILCallingSignature * (ILMethodSpec * varargs) (* special: for internal use only *)
val mk_ilx_ext_instr: (IlxInstr -> IlxExtensionInstr)
val is_ilx_ext_instr: (IlxExtensionInstr -> bool)
val dest_ilx_ext_instr: (IlxExtensionInstr -> IlxInstr)
val mk_IlxInstr: IlxInstr -> ILInstr
// --------------------------------------------------------------------
// ILX extensions to the kinds of type definitions available
// --------------------------------------------------------------------
type IlxClosureInfo =
{ cloStructure: IlxClosureLambdas;
cloFreeVars: IlxClosureFreeVar list;
cloCode: (ILMethodBody Lazy.t);
cloSource: ILSourceMarker option}
and IlxUnionInfo =
{ /// Is the representation public?
cudReprAccess: ILMemberAccess;
/// Are the representation helpers public?
cudHelpersAccess: ILMemberAccess;
/// Generate the helpers?
cudHelpers: bool;
cudDebugProxies: bool;
cudDebugDisplayAttributes: ILAttribute list;
cudAlternatives: IlxUnionAlternative array;
cudNullPermitted: bool;
/// Debug info for generated code for classunions
cudWhere: ILSourceMarker option;
}
type IlxTypeDefKind =
| ETypeDef_closure of IlxClosureInfo
| ETypeDef_classunion of IlxUnionInfo
val mk_ilx_ext_type_def_kind: (IlxTypeDefKind -> IlxExtensionTypeKind)
val is_ilx_ext_type_def_kind: (IlxExtensionTypeKind -> bool)
val dest_ilx_ext_type_def_kind: (IlxExtensionTypeKind -> IlxTypeDefKind)
val mk_IlxTypeDefKind: IlxTypeDefKind -> ILTypeDefKind
(* --------------------------------------------------------------------
* These are now obsolete
* -------------------------------------------------------------------- *)
val mk_array_ty_old: ILArrayShape * ILType -> ILType
val gen_mk_array_ty: ILArrayShape * ILType -> ILType
val gen_is_array_ty: ILType -> bool
val gen_dest_array_ty: ILType -> ILArrayShape * ILType
(* --------------------------------------------------------------------
* MS-ILX constructs: Closures, thunks, classunions
* -------------------------------------------------------------------- *)
val inst_apps_aux: int -> ILGenericArgs -> IlxClosureApps -> IlxClosureApps
val dest_func_app: IlxClosureApps -> ILType * IlxClosureApps
val dest_tyfunc_app: IlxClosureApps -> ILType * IlxClosureApps
val formal_freevar_type_of_cloref : IlxClosureRef -> int -> ILType
val tref_of_clospec : IlxClosureSpec -> ILTypeRef
val cloref_of_clospec : IlxClosureSpec -> IlxClosureRef
val formal_freevar_type_of_clospec: IlxClosureSpec -> int -> ILType
val actual_freevar_type_of_clospec: IlxClosureSpec -> int -> ILType
val formal_freevars_of_clospec : IlxClosureSpec -> IlxClosureFreeVar list
val actual_freevars_of_clospec : IlxClosureSpec -> IlxClosureFreeVar list
val actual_lambdas_of_clospec : IlxClosureSpec -> IlxClosureLambdas
val formal_lambdas_of_clospec : IlxClosureSpec -> IlxClosureLambdas
val inst_of_clospec : IlxClosureSpec -> ILGenericArgs
val generalize_cloref: ILGenericParameterDefs -> IlxClosureRef -> IlxClosureSpec
(* --------------------------------------------------------------------
* MS-ILX: Unions
* -------------------------------------------------------------------- *)
val objtype_of_cuspec : IlxUnionSpec -> ILType
val inst_of_cuspec : IlxUnionSpec -> ILGenericArgs
val alts_of_cuspec : IlxUnionSpec -> IlxUnionAlternative list
val altsarray_of_cuspec : IlxUnionSpec -> IlxUnionAlternative array
val tref_of_cuspec : IlxUnionSpec -> ILTypeRef
val nullPermitted_of_cuspec : IlxUnionSpec -> bool
val actual_typ_of_cuspec_field: IlxUnionSpec -> int -> int -> ILType
val alt_of_cuspec : IlxUnionSpec -> int -> IlxUnionAlternative
val fdef_of_cuspec : IlxUnionSpec -> int -> int -> ILFieldDef
val fdefs_of_alt : IlxUnionAlternative -> ILFieldDef array
val fdef_of_alt : IlxUnionAlternative -> int -> ILFieldDef
val name_of_alt : IlxUnionAlternative -> string
val alt_is_nullary: IlxUnionAlternative -> bool
val mk_freevar: string * bool * ILType -> IlxClosureFreeVar
val name_of_freevar: IlxClosureFreeVar -> string
val typ_of_freevar: IlxClosureFreeVar -> ILType