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.
 
 
 

1005 lines
30 KiB

// (c) Microsoft Corporation 2005-2009.
module Microsoft.FSharp.Compiler.AbstractIL.Internal.BinaryConstants
open Internal.Utilities
open Microsoft.FSharp.Compiler.AbstractIL
open Microsoft.FSharp.Compiler.AbstractIL.IL
open Microsoft.FSharp.Compiler.AbstractIL.Internal
open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library
type table = Table of int
let tag_of_table (Table n) = n
let tab_Module = Table 0
let tab_TypeRef = Table 1
let tab_TypeDef = Table 2
let tab_FieldPtr = Table 3
let tab_Field = Table 4
let tab_MethodPtr = Table 5
let tab_Method = Table 6
let tab_ParamPtr = Table 7
let tab_Param = Table 8
let tab_InterfaceImpl = Table 9
let tab_MemberRef = Table 10
let tab_Constant = Table 11
let tab_CustomAttribute = Table 12
let tab_FieldMarshal = Table 13
let tab_Permission = Table 14
let tab_ClassLayout = Table 15
let tab_FieldLayout = Table 16
let tab_StandAloneSig = Table 17
let tab_EventMap = Table 18
let tab_EventPtr = Table 19
let tab_Event = Table 20
let tab_PropertyMap = Table 21
let tab_PropertyPtr = Table 22
let tab_Property = Table 23
let tab_MethodSemantics = Table 24
let tab_MethodImpl = Table 25
let tab_ModuleRef = Table 26
let tab_TypeSpec = Table 27
let tab_ImplMap = Table 28
let tab_FieldRVA = Table 29
let tab_ENCLog = Table 30
let tab_ENCMap = Table 31
let tab_Assembly = Table 32
let tab_AssemblyProcessor = Table 33
let tab_AssemblyOS = Table 34
let tab_AssemblyRef = Table 35
let tab_AssemblyRefProcessor = Table 36
let tab_AssemblyRefOS = Table 37
let tab_File = Table 38
let tab_ExportedType = Table 39
let tab_ManifestResource = Table 40
let tab_Nested = Table 41
let tab_GenericParam = Table 42
let tab_MethodSpec = Table 43
let tab_GenericParamConstraint = Table 44
let tab_UserStrings = Table 0x70 (* Special encoding of embedded UserString tokens - See 1.9 Partition III *)
(* Sorted bit-vector as stored by CLR V1: 00fa 0133 0002 0000 *)
(* But what does this mean? The ECMA spec does not say! *)
(* Metainfo -schema reports sorting as shown below. *)
(* But some sorting, e.g. EventMap does not seem to show *)
(* Which tables are sorted and by which column *)
let sorted_table_info =
[ (tab_InterfaceImpl,0);
(tab_Constant, 1);
(tab_CustomAttribute, 0);
(tab_FieldMarshal, 0);
(tab_Permission, 1);
(tab_ClassLayout, 2);
(tab_FieldLayout, 1);
(tab_MethodSemantics, 2);
(tab_MethodImpl, 0);
(tab_ImplMap, 1);
(tab_FieldRVA, 1);
(tab_Nested, 0);
(tab_GenericParam, 2);
(tab_GenericParamConstraint, 0); ]
type typeDefOrRef_tag = TypeDefOrRefOrSpecTag of int32
let tdor_TypeDef = TypeDefOrRefOrSpecTag 0x00
let tdor_TypeRef = TypeDefOrRefOrSpecTag 0x01
let tdor_TypeSpec = TypeDefOrRefOrSpecTag 0x2
let mkTypeDefOrRefOrSpecTag x =
match x with
| 0x00 -> tdor_TypeDef // nb. avoid reallocation
| 0x01 -> tdor_TypeRef
| 0x02 -> tdor_TypeSpec
| _ -> invalid_arg "mkTypeDefOrRefOrSpecTag"
type hasConstant_tag = HasConstantTag of int32
let hc_FieldDef = HasConstantTag 0x0
let hc_ParamDef = HasConstantTag 0x1
let hc_Property = HasConstantTag 0x2
let mkHasConstantTag x =
match x with
| 0x00l -> hc_FieldDef
| 0x01l -> hc_ParamDef
| 0x02l -> hc_Property
| _ -> invalid_arg "mkHasConstantTag"
type hasCustomAttribute_tag = HasCustomAttributeTag of int32
let hca_MethodDef = HasCustomAttributeTag 0x0
let hca_FieldDef = HasCustomAttributeTag 0x1
let hca_TypeRef = HasCustomAttributeTag 0x2
let hca_TypeDef = HasCustomAttributeTag 0x3
let hca_ParamDef = HasCustomAttributeTag 0x4
let hca_InterfaceImpl = HasCustomAttributeTag 0x5
let hca_MemberRef = HasCustomAttributeTag 0x6
let hca_Module = HasCustomAttributeTag 0x7
let hca_Permission = HasCustomAttributeTag 0x8
let hca_Property = HasCustomAttributeTag 0x9
let hca_Event = HasCustomAttributeTag 0xa
let hca_StandAloneSig = HasCustomAttributeTag 0xb
let hca_ModuleRef = HasCustomAttributeTag 0xc
let hca_TypeSpec = HasCustomAttributeTag 0xd
let hca_Assembly = HasCustomAttributeTag 0xe
let hca_AssemblyRef = HasCustomAttributeTag 0xf
let hca_File = HasCustomAttributeTag 0x10
let hca_ExportedType = HasCustomAttributeTag 0x11
let hca_ManifestResource = HasCustomAttributeTag 0x12
let hca_GenericParam = HasCustomAttributeTag 0x13
let hca_GenericParamConstraint = HasCustomAttributeTag 0x14
let hca_MethodSpec = HasCustomAttributeTag 0x15
let mkHasCustomAttributeTag x =
match x with
| 0x00 -> hca_MethodDef
| 0x01 -> hca_FieldDef
| 0x02 -> hca_TypeRef
| 0x03 -> hca_TypeDef
| 0x04 -> hca_ParamDef
| 0x05 -> hca_InterfaceImpl
| 0x06 -> hca_MemberRef
| 0x07 -> hca_Module
| 0x08 -> hca_Permission
| 0x09 -> hca_Property
| 0x0a -> hca_Event
| 0x0b -> hca_StandAloneSig
| 0x0c -> hca_ModuleRef
| 0x0d -> hca_TypeSpec
| 0x0e -> hca_Assembly
| 0x0f -> hca_AssemblyRef
| 0x10 -> hca_File
| 0x11 -> hca_ExportedType
| 0x12 -> hca_ManifestResource
| 0x13 -> hca_GenericParam
| 0x14 -> hca_GenericParamConstraint
| 0x15 -> hca_MethodSpec
| _ -> HasCustomAttributeTag x
type hasFieldMarshal_tag = HasFieldMarshalTag of int32
let hfm_FieldDef = HasFieldMarshalTag 0x00
let hfm_ParamDef = HasFieldMarshalTag 0x01
let mkHasFieldMarshalTag x =
match x with
| 0x00 -> hfm_FieldDef
| 0x01 -> hfm_ParamDef
| _ -> HasFieldMarshalTag x
type hasDeclSecurity_tag = HasDeclSecurityTag of int32
let hds_TypeDef = HasDeclSecurityTag 0x00
let hds_MethodDef = HasDeclSecurityTag 0x01
let hds_Assembly = HasDeclSecurityTag 0x02
let mkHasDeclSecurityTag x =
match x with
| 0x00 -> hds_TypeDef
| 0x01 -> hds_MethodDef
| 0x02 -> hds_Assembly
| _ -> HasDeclSecurityTag x
type memberRefParent_tag = MemberRefParentTag of int32
let mrp_TypeRef = MemberRefParentTag 0x01
let mrp_ModuleRef = MemberRefParentTag 0x02
let mrp_MethodDef = MemberRefParentTag 0x03
let mrp_TypeSpec = MemberRefParentTag 0x04
let mkMemberRefParentTag x =
match x with
| 0x01 -> mrp_TypeRef
| 0x02 -> mrp_ModuleRef
| 0x03 -> mrp_MethodDef
| 0x04 -> mrp_TypeSpec
| _ -> MemberRefParentTag x
type hasSemantics_tag = HasSemanticsTag of int32
let hs_Event = HasSemanticsTag 0x00
let hs_Property = HasSemanticsTag 0x01
let mkHasSemanticsTag x =
match x with
| 0x00 -> hs_Event
| 0x01 -> hs_Property
| _ -> HasSemanticsTag x
type methodDefOrRef_tag = MethodDefOrRefTag of int32
let mdor_MethodDef = MethodDefOrRefTag 0x00
let mdor_MemberRef = MethodDefOrRefTag 0x01
let mdor_MethodSpec = MethodDefOrRefTag 0x02
let mkMethodDefOrRefTag x =
match x with
| 0x00 -> mdor_MethodDef
| 0x01 -> mdor_MemberRef
| 0x02 -> mdor_MethodSpec
| _ -> MethodDefOrRefTag x
type memberForwarded_tag = MemberForwardedTag of int32
let mf_FieldDef = MemberForwardedTag 0x00
let mf_MethodDef = MemberForwardedTag 0x01
let mkMemberForwardedTag x =
match x with
| 0x00 -> mf_FieldDef
| 0x01 -> mf_MethodDef
| _ -> MemberForwardedTag x
type implementation_tag = ImplementationTag of int32
let i_File = ImplementationTag 0x00
let i_AssemblyRef = ImplementationTag 0x01
let i_ExportedType = ImplementationTag 0x02
let mkImplementationTag x =
match x with
| 0x00 -> i_File
| 0x01 -> i_AssemblyRef
| 0x02 -> i_ExportedType
| _ -> ImplementationTag x
type customAttributeType_tag = CustomAttributeTypeTag of int32
let cat_MethodDef = CustomAttributeTypeTag 0x02
let cat_MemberRef = CustomAttributeTypeTag 0x03
let mkCustomAttributeTypeTag x =
match x with
| 0x02 -> cat_MethodDef
| 0x03 -> cat_MemberRef
| _ -> CustomAttributeTypeTag x
type resolutionScope_tag = ResolutionScopeTag of int32
let rs_Module = ResolutionScopeTag 0x00
let rs_ModuleRef = ResolutionScopeTag 0x01
let rs_AssemblyRef = ResolutionScopeTag 0x02
let rs_TypeRef = ResolutionScopeTag 0x03
let mkResolutionScopeTag x =
match x with
| 0x00 -> rs_Module
| 0x01 -> rs_ModuleRef
| 0x02 -> rs_AssemblyRef
| 0x03 -> rs_TypeRef
| _ -> ResolutionScopeTag x
type typeOrMethodDef_tag = TypeOrMethodDefTag of int32
let tomd_TypeDef = TypeOrMethodDefTag 0x00
let tomd_MethodDef = TypeOrMethodDefTag 0x01
let mkTypeOrMethodDefTag x =
match x with
| 0x00 -> tomd_TypeDef
| 0x01 -> tomd_MethodDef
| _ -> TypeOrMethodDefTag x
let et_END = 0x00
let et_VOID = 0x01
let et_BOOLEAN = 0x02
let et_CHAR = 0x03
let et_I1 = 0x04
let et_U1 = 0x05
let et_I2 = 0x06
let et_U2 = 0x07
let et_I4 = 0x08
let et_U4 = 0x09
let et_I8 = 0x0a
let et_U8 = 0x0b
let et_R4 = 0x0c
let et_R8 = 0x0d
let et_STRING = 0x0e
let et_PTR = 0x0f
let et_BYREF = 0x10
let et_VALUETYPE = 0x11
let et_CLASS = 0x12
let et_VAR = 0x13
let et_ARRAY = 0x14
let et_WITH = 0x15
let et_TYPEDBYREF = 0x16
let et_I = 0x18
let et_U = 0x19
let et_FNPTR = 0x1B
let et_OBJECT = 0x1C
let et_SZARRAY = 0x1D
let et_MVAR = 0x1e
let et_CMOD_REQD = 0x1F
let et_CMOD_OPT = 0x20
let et_SENTINEL = 0x41 (* sentinel for varargs *)
let et_PINNED = 0x45
let i_nop = 0x00
let i_break = 0x01
let i_ldarg_0 = 0x02
let i_ldarg_1 = 0x03
let i_ldarg_2 = 0x04
let i_ldarg_3 = 0x05
let i_ldloc_0 = 0x06
let i_ldloc_1 = 0x07
let i_ldloc_2 = 0x08
let i_ldloc_3 = 0x09
let i_stloc_0 = 0x0a
let i_stloc_1 = 0x0b
let i_stloc_2 = 0x0c
let i_stloc_3 = 0x0d
let i_ldarg_s = 0x0e
let i_ldarga_s = 0x0f
let i_starg_s = 0x10
let i_ldloc_s = 0x11
let i_ldloca_s = 0x12
let i_stloc_s = 0x13
let i_ldnull = 0x14
let i_ldc_i4_m1 = 0x15
let i_ldc_i4_0 = 0x16
let i_ldc_i4_1 = 0x17
let i_ldc_i4_2 = 0x18
let i_ldc_i4_3 = 0x19
let i_ldc_i4_4 = 0x1a
let i_ldc_i4_5 = 0x1b
let i_ldc_i4_6 = 0x1c
let i_ldc_i4_7 = 0x1d
let i_ldc_i4_8 = 0x1e
let i_ldc_i4_s = 0x1f
let i_ldc_i4 = 0x20
let i_ldc_i8 = 0x21
let i_ldc_r4 = 0x22
let i_ldc_r8 = 0x23
let i_dup = 0x25
let i_pop = 0x26
let i_jmp = 0x27
let i_call = 0x28
let i_calli = 0x29
let i_ret = 0x2a
let i_br_s = 0x2b
let i_brfalse_s = 0x2c
let i_brtrue_s = 0x2d
let i_beq_s = 0x2e
let i_bge_s = 0x2f
let i_bgt_s = 0x30
let i_ble_s = 0x31
let i_blt_s = 0x32
let i_bne_un_s = 0x33
let i_bge_un_s = 0x34
let i_bgt_un_s = 0x35
let i_ble_un_s = 0x36
let i_blt_un_s = 0x37
let i_br = 0x38
let i_brfalse = 0x39
let i_brtrue = 0x3a
let i_beq = 0x3b
let i_bge = 0x3c
let i_bgt = 0x3d
let i_ble = 0x3e
let i_blt = 0x3f
let i_bne_un = 0x40
let i_bge_un = 0x41
let i_bgt_un = 0x42
let i_ble_un = 0x43
let i_blt_un = 0x44
let i_switch = 0x45
let i_ldind_i1 = 0x46
let i_ldind_u1 = 0x47
let i_ldind_i2 = 0x48
let i_ldind_u2 = 0x49
let i_ldind_i4 = 0x4a
let i_ldind_u4 = 0x4b
let i_ldind_i8 = 0x4c
let i_ldind_i = 0x4d
let i_ldind_r4 = 0x4e
let i_ldind_r8 = 0x4f
let i_ldind_ref = 0x50
let i_stind_ref = 0x51
let i_stind_i1 = 0x52
let i_stind_i2 = 0x53
let i_stind_i4 = 0x54
let i_stind_i8 = 0x55
let i_stind_r4 = 0x56
let i_stind_r8 = 0x57
let i_add = 0x58
let i_sub = 0x59
let i_mul = 0x5a
let i_div = 0x5b
let i_div_un = 0x5c
let i_rem = 0x5d
let i_rem_un = 0x5e
let i_and = 0x5f
let i_or = 0x60
let i_xor = 0x61
let i_shl = 0x62
let i_shr = 0x63
let i_shr_un = 0x64
let i_neg = 0x65
let i_not = 0x66
let i_conv_i1 = 0x67
let i_conv_i2 = 0x68
let i_conv_i4 = 0x69
let i_conv_i8 = 0x6a
let i_conv_r4 = 0x6b
let i_conv_r8 = 0x6c
let i_conv_u4 = 0x6d
let i_conv_u8 = 0x6e
let i_callvirt = 0x6f
let i_cpobj = 0x70
let i_ldobj = 0x71
let i_ldstr = 0x72
let i_newobj = 0x73
let i_castclass = 0x74
let i_isinst = 0x75
let i_conv_r_un = 0x76
let i_unbox = 0x79
let i_throw = 0x7a
let i_ldfld = 0x7b
let i_ldflda = 0x7c
let i_stfld = 0x7d
let i_ldsfld = 0x7e
let i_ldsflda = 0x7f
let i_stsfld = 0x80
let i_stobj = 0x81
let i_conv_ovf_i1_un= 0x82
let i_conv_ovf_i2_un= 0x83
let i_conv_ovf_i4_un= 0x84
let i_conv_ovf_i8_un= 0x85
let i_conv_ovf_u1_un= 0x86
let i_conv_ovf_u2_un= 0x87
let i_conv_ovf_u4_un= 0x88
let i_conv_ovf_u8_un= 0x89
let i_conv_ovf_i_un = 0x8a
let i_conv_ovf_u_un = 0x8b
let i_box = 0x8c
let i_newarr = 0x8d
let i_ldlen = 0x8e
let i_ldelema = 0x8f
let i_ldelem_i1 = 0x90
let i_ldelem_u1 = 0x91
let i_ldelem_i2 = 0x92
let i_ldelem_u2 = 0x93
let i_ldelem_i4 = 0x94
let i_ldelem_u4 = 0x95
let i_ldelem_i8 = 0x96
let i_ldelem_i = 0x97
let i_ldelem_r4 = 0x98
let i_ldelem_r8 = 0x99
let i_ldelem_ref = 0x9a
let i_stelem_i = 0x9b
let i_stelem_i1 = 0x9c
let i_stelem_i2 = 0x9d
let i_stelem_i4 = 0x9e
let i_stelem_i8 = 0x9f
let i_stelem_r4 = 0xa0
let i_stelem_r8 = 0xa1
let i_stelem_ref = 0xa2
let i_conv_ovf_i1 = 0xb3
let i_conv_ovf_u1 = 0xb4
let i_conv_ovf_i2 = 0xb5
let i_conv_ovf_u2 = 0xb6
let i_conv_ovf_i4 = 0xb7
let i_conv_ovf_u4 = 0xb8
let i_conv_ovf_i8 = 0xb9
let i_conv_ovf_u8 = 0xba
let i_refanyval = 0xc2
let i_ckfinite = 0xc3
let i_mkrefany = 0xc6
let i_ldtoken = 0xd0
let i_conv_u2 = 0xd1
let i_conv_u1 = 0xd2
let i_conv_i = 0xd3
let i_conv_ovf_i = 0xd4
let i_conv_ovf_u = 0xd5
let i_add_ovf = 0xd6
let i_add_ovf_un = 0xd7
let i_mul_ovf = 0xd8
let i_mul_ovf_un = 0xd9
let i_sub_ovf = 0xda
let i_sub_ovf_un = 0xdb
let i_endfinally = 0xdc
let i_leave = 0xdd
let i_leave_s = 0xde
let i_stind_i = 0xdf
let i_conv_u = 0xe0
let i_arglist = 0xfe00
let i_ceq = 0xfe01
let i_cgt = 0xfe02
let i_cgt_un = 0xfe03
let i_clt = 0xfe04
let i_clt_un = 0xfe05
let i_ldftn = 0xfe06
let i_ldvirtftn = 0xfe07
let i_ldarg = 0xfe09
let i_ldarga = 0xfe0a
let i_starg = 0xfe0b
let i_ldloc = 0xfe0c
let i_ldloca = 0xfe0d
let i_stloc = 0xfe0e
let i_localloc = 0xfe0f
let i_endfilter = 0xfe11
let i_unaligned = 0xfe12
let i_volatile = 0xfe13
let i_constrained = 0xfe16
let i_readonly = 0xfe1e
let i_tail = 0xfe14
let i_initobj = 0xfe15
let i_cpblk = 0xfe17
let i_initblk = 0xfe18
let i_rethrow = 0xfe1a
let i_sizeof = 0xfe1c
let i_refanytype = 0xfe1d
let i_ldelem_any = 0xa3
let i_stelem_any = 0xa4
let i_unbox_any = 0xa5
let mk_ldc i = (((mk_ldc_i32 (i))))
let noarg_instrs = lazy
[
i_ldc_i4_0, mk_ldc 0;
i_ldc_i4_1, mk_ldc 1;
i_ldc_i4_2, mk_ldc 2;
i_ldc_i4_3, mk_ldc 3;
i_ldc_i4_4, mk_ldc 4;
i_ldc_i4_5, mk_ldc 5;
i_ldc_i4_6, mk_ldc 6;
i_ldc_i4_7, mk_ldc 7;
i_ldc_i4_8, mk_ldc 8;
i_ldc_i4_m1, mk_ldc (0-1);
0x0a, (I_stloc (uint16 ( 0)));
0x0b, (I_stloc (uint16 ( 1)));
0x0c, (I_stloc (uint16 ( 2)));
0x0d, (I_stloc (uint16 ( 3)));
0x06, (I_ldloc (uint16 ( 0)));
0x07, (I_ldloc (uint16 ( 1)));
0x08, (I_ldloc (uint16 ( 2)));
0x09, (I_ldloc (uint16 ( 3)));
0x02, (I_ldarg (uint16 ( 0)));
0x03, (I_ldarg (uint16 ( 1)));
0x04, (I_ldarg (uint16 ( 2)));
0x05, (I_ldarg (uint16 ( 3)));
0x2a, (I_ret);
0x58, (I_arith AI_add);
0xd6, (I_arith AI_add_ovf);
0xd7, (I_arith AI_add_ovf_un);
0x5f, (I_arith AI_and);
0x5b, (I_arith AI_div);
0x5c, (I_arith AI_div_un);
0xfe01, (I_arith AI_ceq);
0xfe02, (I_arith AI_cgt );
0xfe03, (I_arith AI_cgt_un);
0xfe04, (I_arith AI_clt);
0xfe05, (I_arith AI_clt_un);
0x67, (I_arith (AI_conv DT_I1));
0x68, (I_arith (AI_conv DT_I2));
0x69, (I_arith (AI_conv DT_I4));
0x6a, (I_arith (AI_conv DT_I8));
0xd3, (I_arith (AI_conv DT_I));
0x6b, (I_arith (AI_conv DT_R4));
0x6c, (I_arith (AI_conv DT_R8));
0xd2, (I_arith (AI_conv DT_U1));
0xd1, (I_arith (AI_conv DT_U2));
0x6d, (I_arith (AI_conv DT_U4));
0x6e, (I_arith (AI_conv DT_U8));
0xe0, (I_arith (AI_conv DT_U));
0x76, (I_arith (AI_conv DT_R));
0xb3, (I_arith (AI_conv_ovf DT_I1));
0xb5, (I_arith (AI_conv_ovf DT_I2));
0xb7, (I_arith (AI_conv_ovf DT_I4));
0xb9, (I_arith (AI_conv_ovf DT_I8));
0xd4, (I_arith (AI_conv_ovf DT_I));
0xb4, (I_arith (AI_conv_ovf DT_U1));
0xb6, (I_arith (AI_conv_ovf DT_U2));
0xb8, (I_arith (AI_conv_ovf DT_U4));
0xba, (I_arith (AI_conv_ovf DT_U8));
0xd5, (I_arith (AI_conv_ovf DT_U));
0x82, (I_arith (AI_conv_ovf_un DT_I1));
0x83, (I_arith (AI_conv_ovf_un DT_I2));
0x84, (I_arith (AI_conv_ovf_un DT_I4));
0x85, (I_arith (AI_conv_ovf_un DT_I8));
0x8a, (I_arith (AI_conv_ovf_un DT_I));
0x86, (I_arith (AI_conv_ovf_un DT_U1));
0x87, (I_arith (AI_conv_ovf_un DT_U2));
0x88, (I_arith (AI_conv_ovf_un DT_U4));
0x89, (I_arith (AI_conv_ovf_un DT_U8));
0x8b, (I_arith (AI_conv_ovf_un DT_U));
0x9c, (I_stelem DT_I1);
0x9d, (I_stelem DT_I2);
0x9e, (I_stelem DT_I4);
0x9f, (I_stelem DT_I8);
0xa0, (I_stelem DT_R4);
0xa1, (I_stelem DT_R8);
0x9b, (I_stelem DT_I);
0xa2, (I_stelem DT_REF);
0x90, (I_ldelem DT_I1);
0x92, (I_ldelem DT_I2);
0x94, (I_ldelem DT_I4);
0x96, (I_ldelem DT_I8);
0x91, (I_ldelem DT_U1);
0x93, (I_ldelem DT_U2);
0x95, (I_ldelem DT_U4);
0x98, (I_ldelem DT_R4);
0x99, (I_ldelem DT_R8);
0x97, (I_ldelem DT_I);
0x9a, (I_ldelem DT_REF);
0x5a, (I_arith AI_mul );
0xd8, (I_arith AI_mul_ovf);
0xd9, (I_arith AI_mul_ovf_un);
0x5d, (I_arith AI_rem );
0x5e, (I_arith AI_rem_un );
0x62, (I_arith AI_shl );
0x63, (I_arith AI_shr );
0x64, (I_arith AI_shr_un);
0x59, (I_arith AI_sub );
0xda, (I_arith AI_sub_ovf);
0xdb, (I_arith AI_sub_ovf_un);
0x61, (I_arith AI_xor);
0x60, (I_arith AI_or);
0x65, (I_arith AI_neg);
0x66, (I_arith AI_not);
i_ldnull, (I_arith AI_ldnull);
i_dup, (I_arith AI_dup);
i_pop, (I_arith AI_pop);
i_ckfinite, (I_arith AI_ckfinite);
i_nop, (I_arith AI_nop);
i_break, (I_break);
i_arglist, (I_arglist);
i_endfilter, (I_endfilter);
i_endfinally, I_endfinally;
i_refanytype, (I_refanytype);
i_localloc, (I_localloc);
i_throw, (I_throw);
i_ldlen, (I_ldlen);
i_rethrow, (I_rethrow);
];;
let is_noarg_instr i =
match i with
| I_arith (AI_ldc (DT_I4, NUM_I4 n)) when (-1) <= n && n <= 8 -> true
| I_stloc n | I_ldloc n | I_ldarg n when n <= 3us -> true
| I_ret
| I_arith AI_add
| I_arith AI_add_ovf
| I_arith AI_add_ovf_un
| I_arith AI_and
| I_arith AI_div
| I_arith AI_div_un
| I_arith AI_ceq
| I_arith AI_cgt
| I_arith AI_cgt_un
| I_arith AI_clt
| I_arith AI_clt_un
| I_arith (AI_conv DT_I1)
| I_arith (AI_conv DT_I2)
| I_arith (AI_conv DT_I4)
| I_arith (AI_conv DT_I8)
| I_arith (AI_conv DT_I)
| I_arith (AI_conv DT_R4)
| I_arith (AI_conv DT_R8)
| I_arith (AI_conv DT_U1)
| I_arith (AI_conv DT_U2)
| I_arith (AI_conv DT_U4)
| I_arith (AI_conv DT_U8)
| I_arith (AI_conv DT_U)
| I_arith (AI_conv DT_R)
| I_arith (AI_conv_ovf DT_I1)
| I_arith (AI_conv_ovf DT_I2)
| I_arith (AI_conv_ovf DT_I4)
| I_arith (AI_conv_ovf DT_I8)
| I_arith (AI_conv_ovf DT_I)
| I_arith (AI_conv_ovf DT_U1)
| I_arith (AI_conv_ovf DT_U2)
| I_arith (AI_conv_ovf DT_U4)
| I_arith (AI_conv_ovf DT_U8)
| I_arith (AI_conv_ovf DT_U)
| I_arith (AI_conv_ovf_un DT_I1)
| I_arith (AI_conv_ovf_un DT_I2)
| I_arith (AI_conv_ovf_un DT_I4)
| I_arith (AI_conv_ovf_un DT_I8)
| I_arith (AI_conv_ovf_un DT_I)
| I_arith (AI_conv_ovf_un DT_U1)
| I_arith (AI_conv_ovf_un DT_U2)
| I_arith (AI_conv_ovf_un DT_U4)
| I_arith (AI_conv_ovf_un DT_U8)
| I_arith (AI_conv_ovf_un DT_U)
| I_stelem DT_I1
| I_stelem DT_I2
| I_stelem DT_I4
| I_stelem DT_I8
| I_stelem DT_R4
| I_stelem DT_R8
| I_stelem DT_I
| I_stelem DT_REF
| I_ldelem DT_I1
| I_ldelem DT_I2
| I_ldelem DT_I4
| I_ldelem DT_I8
| I_ldelem DT_U1
| I_ldelem DT_U2
| I_ldelem DT_U4
| I_ldelem DT_R4
| I_ldelem DT_R8
| I_ldelem DT_I
| I_ldelem DT_REF
| I_arith AI_mul
| I_arith AI_mul_ovf
| I_arith AI_mul_ovf_un
| I_arith AI_rem
| I_arith AI_rem_un
| I_arith AI_shl
| I_arith AI_shr
| I_arith AI_shr_un
| I_arith AI_sub
| I_arith AI_sub_ovf
| I_arith AI_sub_ovf_un
| I_arith AI_xor
| I_arith AI_or
| I_arith AI_neg
| I_arith AI_not
| I_arith AI_ldnull
| I_arith AI_dup
| I_arith AI_pop
| I_arith AI_ckfinite
| I_arith AI_nop
| I_break
| I_arglist
| I_endfilter
| I_endfinally
| I_refanytype
| I_localloc
| I_throw
| I_ldlen
| I_rethrow -> true
| _ -> false
let brcmp_map = lazy
(Dictionary.of_list
[ BI_beq , i_beq
; BI_bgt , i_bgt
; BI_bgt_un , i_bgt_un
; BI_bge , i_bge
; BI_bge_un , i_bge_un
; BI_ble , i_ble
; BI_ble_un , i_ble_un
; BI_blt , i_blt
; BI_blt_un , i_blt_un
; BI_bne_un , i_bne_un
; BI_brfalse , i_brfalse
; BI_brtrue , i_brtrue ])
let brcmp_smap = lazy
(Dictionary.of_list
[ BI_beq , i_beq_s
; BI_bgt , i_bgt_s
; BI_bgt_un , i_bgt_un_s
; BI_bge , i_bge_s
; BI_bge_un , i_bge_un_s
; BI_ble , i_ble_s
; BI_ble_un , i_ble_un_s
; BI_blt , i_blt_s
; BI_blt_un , i_blt_un_s
; BI_bne_un , i_bne_un_s
; BI_brfalse , i_brfalse_s
; BI_brtrue , i_brtrue_s ])
(* From corhdr.h *)
let nt_VOID = 0x1
let nt_BOOLEAN = 0x2
let nt_I1 = 0x3
let nt_U1 = 0x4
let nt_I2 = 0x5
let nt_U2 = 0x6
let nt_I4 = 0x7
let nt_U4 = 0x8
let nt_I8 = 0x9
let nt_U8 = 0xa
let nt_R4 = 0xb
let nt_R8 = 0xc
let nt_SYSCHAR = 0xd
let nt_VARIANT = 0xe
let nt_CURRENCY = 0xf
let nt_PTR = 0x10
let nt_DECIMAL = 0x11
let nt_DATE = 0x12
let nt_BSTR = 0x13
let nt_LPSTR = 0x14
let nt_LPWSTR = 0x15
let nt_LPTSTR = 0x16
let nt_FIXEDSYSSTRING = 0x17
let nt_OBJECTREF = 0x18
let nt_IUNKNOWN = 0x19
let nt_IDISPATCH = 0x1a
let nt_STRUCT = 0x1b
let nt_INTF = 0x1c
let nt_SAFEARRAY = 0x1d
let nt_FIXEDARRAY = 0x1e
let nt_INT = 0x1f
let nt_UINT = 0x20
let nt_NESTEDSTRUCT = 0x21
let nt_BYVALSTR = 0x22
let nt_ANSIBSTR = 0x23
let nt_TBSTR = 0x24
let nt_VARIANTBOOL = 0x25
let nt_FUNC = 0x26
let nt_ASANY = 0x28
let nt_ARRAY = 0x2a
let nt_LPSTRUCT = 0x2b
let nt_CUSTOMMARSHALER = 0x2c
let nt_ERROR = 0x2d
let nt_MAX = 0x50
(* From c:/clrenv.i386/Crt/Inc/i386/hs.h *)
let vt_EMPTY = 0
let vt_NULL = 1
let vt_I2 = 2
let vt_I4 = 3
let vt_R4 = 4
let vt_R8 = 5
let vt_CY = 6
let vt_DATE = 7
let vt_BSTR = 8
let vt_DISPATCH = 9
let vt_ERROR = 10
let vt_BOOL = 11
let vt_VARIANT = 12
let vt_UNKNOWN = 13
let vt_DECIMAL = 14
let vt_I1 = 16
let vt_UI1 = 17
let vt_UI2 = 18
let vt_UI4 = 19
let vt_I8 = 20
let vt_UI8 = 21
let vt_INT = 22
let vt_UINT = 23
let vt_VOID = 24
let vt_HRESULT = 25
let vt_PTR = 26
let vt_SAFEARRAY = 27
let vt_CARRAY = 28
let vt_USERDEFINED = 29
let vt_LPSTR = 30
let vt_LPWSTR = 31
let vt_RECORD = 36
let vt_FILETIME = 64
let vt_BLOB = 65
let vt_STREAM = 66
let vt_STORAGE = 67
let vt_STREAMED_OBJECT = 68
let vt_STORED_OBJECT = 69
let vt_BLOB_OBJECT = 70
let vt_CF = 71
let vt_CLSID = 72
let vt_VECTOR = 0x1000
let vt_ARRAY = 0x2000
let vt_BYREF = 0x4000
let native_type_map =
lazy [ nt_CURRENCY , NativeType_currency
; nt_BSTR , (* COM interop *) NativeType_bstr
; nt_LPSTR , NativeType_lpstr
; nt_LPWSTR , NativeType_lpwstr
; nt_LPTSTR, NativeType_lptstr
; nt_IUNKNOWN , (* COM interop *) NativeType_iunknown
; nt_IDISPATCH , (* COM interop *) NativeType_idsipatch
; nt_BYVALSTR , NativeType_byvalstr
; nt_TBSTR , NativeType_tbstr
; nt_LPSTRUCT , NativeType_lpstruct
; nt_INTF , (* COM interop *) NativeType_interface
; nt_STRUCT , NativeType_struct
; nt_ERROR , (* COM interop *) NativeType_error
; nt_VOID , NativeType_void
; nt_BOOLEAN , NativeType_bool
; nt_I1 , NativeType_int8
; nt_I2 , NativeType_int16
; nt_I4 , NativeType_int32
; nt_I8, NativeType_int64
; nt_R4 , NativeType_float32
; nt_R8 , NativeType_float64
; nt_U1 , NativeType_unsigned_int8
; nt_U2 , NativeType_unsigned_int16
; nt_U4 , NativeType_unsigned_int32
; nt_U8, NativeType_unsigned_int64
; nt_INT , NativeType_int
; nt_UINT, NativeType_unsigned_int
; nt_ANSIBSTR, (* COM interop *) NativeType_ansi_bstr
; nt_VARIANTBOOL, (* COM interop *) NativeType_variant_bool
; nt_FUNC , NativeType_method
; nt_ASANY, NativeType_as_any ]
let native_type_rmap = lazy (List.map (fun (x,y) -> (y,x)) (Lazy.force native_type_map))
let variant_type_map =
lazy [ VariantType_empty , vt_EMPTY
; VariantType_null , vt_NULL
; VariantType_variant , vt_VARIANT
; VariantType_currency , vt_CY
; VariantType_decimal , vt_DECIMAL
; VariantType_date , vt_DATE
; VariantType_bstr , vt_BSTR
; VariantType_lpstr , vt_LPSTR
; VariantType_lpwstr , vt_LPWSTR
; VariantType_iunknown , vt_UNKNOWN
; VariantType_idispatch , vt_DISPATCH
; VariantType_safearray , vt_SAFEARRAY
; VariantType_error , vt_ERROR
; VariantType_hresult , vt_HRESULT
; VariantType_carray , vt_CARRAY
; VariantType_userdefined , vt_USERDEFINED
; VariantType_record , vt_RECORD
; VariantType_filetime , vt_FILETIME
; VariantType_blob , vt_BLOB
; VariantType_stream , vt_STREAM
; VariantType_storage , vt_STORAGE
; VariantType_streamed_object , vt_STREAMED_OBJECT
; VariantType_stored_object , vt_STORED_OBJECT
; VariantType_blob_object , vt_BLOB_OBJECT
; VariantType_cf , vt_CF
; VariantType_clsid , vt_CLSID
; VariantType_void , vt_VOID
; VariantType_bool , vt_BOOL
; VariantType_int8 , vt_I1
; VariantType_int16 , vt_I2
; VariantType_int32 , vt_I4
; VariantType_int64 , vt_I8
; VariantType_float32 , vt_R4
; VariantType_float64 , vt_R8
; VariantType_unsigned_int8 , vt_UI1
; VariantType_unsigned_int16 , vt_UI2
; VariantType_unsigned_int32 , vt_UI4
; VariantType_unsigned_int64 , vt_UI8
; VariantType_ptr , vt_PTR
; VariantType_int , vt_INT
; VariantType_unsigned_int , vt_UINT ]
let variant_type_rmap = lazy (List.map (fun (x,y) -> (y,x)) (Lazy.force variant_type_map))
let secaction_map =
lazy
[ SecAction_request , 0x0001
; SecAction_demand , 0x0002
; SecAction_assert , 0x0003
; SecAction_deny , 0x0004
; SecAction_permitonly , 0x0005
; SecAction_linkcheck , 0x0006
; SecAction_inheritcheck , 0x0007
; SecAction_reqmin , 0x0008
; SecAction_reqopt , 0x0009
; SecAction_reqrefuse , 0x000a
; SecAction_prejitgrant , 0x000b
; SecAction_prejitdeny , 0x000c
; SecAction_noncasdemand , 0x000d
; SecAction_noncaslinkdemand , 0x000e
; SecAction_noncasinheritance , 0x000f
; SecAction_linkdemandchoice , 0x0010
; SecAction_inheritancedemandchoice , 0x0011
; SecAction_demandchoice , 0x0012 ]
let secaction_rmap = lazy (List.map (fun (x,y) -> (y,x)) (Lazy.force secaction_map))
let e_CorILMethod_TinyFormat = 0x02
let e_CorILMethod_FatFormat = 0x03
let e_CorILMethod_FormatMask = 0x03
let e_CorILMethod_MoreSects = 0x08
let e_CorILMethod_InitLocals = 0x10
let e_CorILMethod_Sect_EHTable = 0x1
let e_CorILMethod_Sect_FatFormat = 0x40
let e_CorILMethod_Sect_MoreSects = 0x80
let e_COR_ILEXCEPTION_CLAUSE_EXCEPTION = 0x0
let e_COR_ILEXCEPTION_CLAUSE_FILTER = 0x1
let e_COR_ILEXCEPTION_CLAUSE_FINALLY = 0x2
let e_COR_ILEXCEPTION_CLAUSE_FAULT = 0x4
let e_IMAGE_CEE_CS_CALLCONV_FASTCALL = 0x04
let e_IMAGE_CEE_CS_CALLCONV_STDCALL = 0x02
let e_IMAGE_CEE_CS_CALLCONV_THISCALL = 0x03
let e_IMAGE_CEE_CS_CALLCONV_CDECL = 0x01
let e_IMAGE_CEE_CS_CALLCONV_VARARG = 0x05
let e_IMAGE_CEE_CS_CALLCONV_FIELD = 0x06
let e_IMAGE_CEE_CS_CALLCONV_LOCAL_SIG = 0x07
let e_IMAGE_CEE_CS_CALLCONV_PROPERTY = 0x08
let e_IMAGE_CEE_CS_CALLCONV_GENERICINST = 0x0a
let e_IMAGE_CEE_CS_CALLCONV_GENERIC = 0x10
let e_IMAGE_CEE_CS_CALLCONV_INSTANCE = 0x20
let e_IMAGE_CEE_CS_CALLCONV_INSTANCE_EXPLICIT = 0x40