System.Number
using System.Runtime.InteropServices;
using System.Globalization;
using System.Runtime.CompilerServices;
namespace System
{
private class Number : System.Object
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
private struct NumberBuffer
{
public const int NumberBufferBytes = 0x00000072;
private byte* baseAddress;
public char* digits;
public int precision;
public int scale;
public bool sign;
public NumberBuffer(byte* stackBuffer)
{
//IL_0000: ldarg.0
//IL_0001: ldarg.1
//IL_0002: stfld uint8* System.Number/NumberBuffer::baseAddress
//IL_0007: ldarg.0
//IL_0008: ldarg.1
//IL_0009: ldc.i4.s 12
//IL_000b: conv.i
//IL_000c: add
//IL_000d: stfld char* System.Number/NumberBuffer::digits
//IL_0012: ldarg.0
//IL_0013: ldc.i4.0
//IL_0014: stfld int32 System.Number/NumberBuffer::precision
//IL_0019: ldarg.0
//IL_001a: ldc.i4.0
//IL_001b: stfld int32 System.Number/NumberBuffer::scale
//IL_0020: ldarg.0
//IL_0021: ldc.i4.0
//IL_0022: stfld bool System.Number/NumberBuffer::sign
//IL_0027: ret
this.baseAddress=stackBuffer;
this.digits = stackBuffer + 12;
this.precision = 0;
this.scale = 0;
this.sign = false;
}
public byte* PackForNative()
{
//.maxstack 3
//.locals init (int32* V_0)
//IL_0000: ldarg.0
//IL_0001: ldfld uint8* System.Number/NumberBuffer::baseAddress
//IL_0006: stloc.0
//IL_0007: ldloc.0
//IL_0008: ldarg.0
//IL_0009: ldfld int32 System.Number/NumberBuffer::precision
//IL_000e: stind.i4
//IL_000f: ldloc.0
//IL_0010: ldc.i4.4
//IL_0011: conv.i
//IL_0012: add
//IL_0013: ldarg.0
//IL_0014: ldfld int32 System.Number/NumberBuffer::scale
//IL_0019: stind.i4
//IL_001a: ldloc.0
//IL_001b: ldc.i4.8
//IL_001c: conv.i
//IL_001d: add
//IL_001e: ldarg.0
//IL_001f: ldfld bool System.Number/NumberBuffer::sign
//IL_0024: brtrue.s IL_0029
//IL_0026: ldc.i4.0
//IL_0027: br.s IL_002a
//IL_0029: ldc.i4.1
//IL_002a: stind.i4
//IL_002b: ldarg.0
//IL_002c: ldfld uint8* System.Number/NumberBuffer::baseAddress
//IL_0031: ret
int* V_0;
V_0 = this.baseAddress;
*V_0 = this.precision;
*(V_0 + 4) = this.scale;
if(this.sign)
{
*(V_0+8)=1;
}
else
{
*(V_0+8)=0;
}
return this.baseAddress;
}
}
private const int NumberMaxDigits = 0x00000032;
private const int Int32Precision = 0x0000000A;
private const int UInt32Precision = 0x0000000A;
private const int Int64Precision = 0x00000013;
private const int UInt64Precision = 0x00000014;
private Number():base()
{
//.maxstack 8
//IL_0000: ldarg.0
//IL_0001: call instance void System.Object::.ctor()
//IL_0006: ret
}
public static string FormatDecimal(System.Decimal @value,string format,NumberFormatInfo info)
{
//internalcall
}
public static string FormatDouble(float64 @value,string format,NumberFormatInfo info)
{
//internalcall
}
public static string FormatInt32(int32 @value,string format,NumberFormatInfo info)
{
//internalcall
}
public static string FormatUInt32(uint32 @value,string format,NumberFormatInfo info)
{
//internalcall
}
public static string FormatInt64(int64 @value,string format,NumberFormatInfo info)
{
//internalcall
}
public static string FormatUInt64(uint64 @value,string format,NumberFormatInfo info)
{
//internalcall
}
public static string FormatSingle(float32 @value,string format,NumberFormatInfo info)
{
//internalcall
}
public static bool NumberBufferToDecimal(byte* number, ref System.Decimal @value)
{
//internalcall
}
public static bool NumberBufferToDouble(byte* number, ref double @value)
{
//internalcall
}
private static bool HexNumberToInt32(ref NumberBuffer number, ref int @value)
{
//.maxstack 2
//.locals init (uint32 V_0,
// bool V_1)
//IL_0000: ldc.i4.0
//IL_0001: stloc.0
//IL_0002: ldarg.0
//IL_0003: ldloca.s V_0
//IL_0005: call bool System.Number::HexNumberToUInt32(valuetype System.Number/NumberBuffer&,
// uint32&)
//IL_000a: stloc.1
//IL_000b: ldarg.1
//IL_000c: ldloc.0
//IL_000d: stind.i4
//IL_000e: ldloc.1
//IL_000f: ret
uint V_0;
bool V_1;
V_0 = 0;
V_1=Number.HexNumberToUInt32(ref number, ref V_0);
@value = V_0;
return V_1;
}
private static bool HexNumberToInt64(ref NumberBuffer number, ref long @value)
{
//.maxstack 2
//.locals init (uint64 V_0,
// bool V_1)
//IL_0000: ldc.i4.0
//IL_0001: conv.i8
//IL_0002: stloc.0
//IL_0003: ldarg.0
//IL_0004: ldloca.s V_0
//IL_0006: call bool System.Number::HexNumberToUInt64(valuetype System.Number/NumberBuffer&,
// uint64&)
//IL_000b: stloc.1
//IL_000c: ldarg.1
//IL_000d: ldloc.0
//IL_000e: stind.i8
//IL_000f: ldloc.1
//IL_0010: ret
ulong V_0;
bool V_1;
V_0 = (ulong)0;
V_1=Number.HexNumberToUInt64(ref number, ref V_0);
@value = V_0;
return V_1;
}
private static bool HexNumberToUInt32(ref NumberBuffer number,ref uint @value)
{
//.maxstack 3
//.locals init (int32 V_0,
// char* V_1,
// uint32 V_2,
// uint32 V_3)
//IL_0000: ldarg.0
//IL_0001: ldfld int32 System.Number/NumberBuffer::scale
//IL_0006: stloc.0
//IL_0007: ldloc.0
//IL_0008: ldc.i4.s 10
//IL_000a: bgt.s IL_0015
//IL_000c: ldloc.0
//IL_000d: ldarg.0
//IL_000e: ldfld int32 System.Number/NumberBuffer::precision
//IL_0013: bge.s IL_0017
//IL_0015: ldc.i4.0
//IL_0016: ret
//IL_0017: ldarg.0
//IL_0018: ldfld char* System.Number/NumberBuffer::digits
//IL_001d: stloc.1
//IL_001e: ldc.i4.0
//IL_001f: stloc.2
//IL_0020: br.s IL_0082
//IL_0022: ldloc.2
//IL_0023: ldc.i4 0xfffffff
//IL_0028: ble.un.s IL_002c
//IL_002a: ldc.i4.0
//IL_002b: ret
//IL_002c: ldloc.2
//IL_002d: ldc.i4.s 16
//IL_002f: mul
//IL_0030: stloc.2
//IL_0031: ldloc.1
//IL_0032: ldind.u2
//IL_0033: brfalse.s IL_0082
//IL_0035: ldloc.2
//IL_0036: stloc.3
//IL_0037: ldloc.1
//IL_0038: ldind.u2
//IL_0039: brfalse.s IL_007a
//IL_003b: ldloc.1
//IL_003c: ldind.u2
//IL_003d: ldc.i4.s 48
//IL_003f: blt.s IL_0051
//IL_0041: ldloc.1
//IL_0042: ldind.u2
//IL_0043: ldc.i4.s 57
//IL_0045: bgt.s IL_0051
//IL_0047: ldloc.3
//IL_0048: ldloc.1
//IL_0049: ldind.u2
//IL_004a: ldc.i4.s 48
//IL_004c: sub
//IL_004d: add
//IL_004e: stloc.3
//IL_004f: br.s IL_0075
//IL_0051: ldloc.1
//IL_0052: ldind.u2
//IL_0053: ldc.i4.s 65
//IL_0055: blt.s IL_006a
//IL_0057: ldloc.1
//IL_0058: ldind.u2
//IL_0059: ldc.i4.s 70
//IL_005b: bgt.s IL_006a
//IL_005d: ldloc.3
//IL_005e: ldloc.1
//IL_005f: ldind.u2
//IL_0060: ldc.i4.s 65
//IL_0062: sub
//IL_0063: ldc.i4.s 10
//IL_0065: add
//IL_0066: add
//IL_0067: stloc.3
//IL_0068: br.s IL_0075
//IL_006a: ldloc.3
//IL_006b: ldloc.1
//IL_006c: ldind.u2
//IL_006d: ldc.i4.s 97
//IL_006f: sub
//IL_0070: ldc.i4.s 10
//IL_0072: add
//IL_0073: add
//IL_0074: stloc.3
//IL_0075: ldloc.1
//IL_0076: ldc.i4.2
//IL_0077: conv.i
//IL_0078: add
//IL_0079: stloc.1
//IL_007a: ldloc.3
//IL_007b: ldloc.2
//IL_007c: bge.un.s IL_0080
//IL_007e: ldc.i4.0
//IL_007f: ret
//IL_0080: ldloc.3
//IL_0081: stloc.2
//IL_0082: ldloc.0
//IL_0083: ldc.i4.1
//IL_0084: sub
//IL_0085: dup
//IL_0086: stloc.0
//IL_0087: ldc.i4.0
//IL_0088: bge.s IL_0022
//IL_008a: ldarg.1
//IL_008b: ldloc.2
//IL_008c: stind.i4
//IL_008d: ldc.i4.1
//IL_008e: ret
int V_0;
char* V_1;
uint V_2, V_3;
V_0 = number.scale;
//0-9:48-57,A-F:65-70,a-f:97-102
if (V_0 <= 10)
{
if (V_0 >= number.precision)
{
V_1 = number.digits;
V_2 = 0;
//无条件跳往IL_0082
//IL_0082
for (--V_0;/*IL_0082*/V_0 >= 0;/*IL_0088*/V_0--/*IL_0082*/) //跳往IL_0022
{
if (V_2 <= 0xfffffff)//IL_0022
{
V_2 = V_2 * 16;
if (*V_1 != '\x0000')//如果条件不满足跳往IL_0082
{
V_3 = V_2;//IL_0035
if (*V_1 != '\x0000')//如果条件不满足跳往IL_007a
{
if (*V_1 < '0' || *V_1 > '9')//跳往IL_0051
{
if (*V_1 < 'A' || *V_1 > 'F')//跳往IL_006a
{
V_3 = V_3 + (*V_1 - 'a' + 10);
//IL_0075
}
else
{
//IL_005d
V_3 = V_3 + ((*V_1 - 'A') + 10);
//无条件跳往//IL_0075
}
}
else
{
V_3 = V_3 + (*V_1 - '0');
//无条件跳往IL_0075
}
V_1 = V_1 + 2;//IL_0075
//IL_007a
}
if (V_3 >= V_2)//IL_007a,跳往IL_0080
{
V_2 = V_3;//IL_0080
//IL_0082
}
else
{
return false;//IL_007e
}
}
}
else
{
return false;
}
}
@value = V_2; //IL_008a
return true;
}
}
return false;
}
private static bool HexNumberToUInt64(ref NumberBuffer number, ref ulong @value)
{
//.maxstack 3
//.locals init (int32 V_0,
// char* V_1,
// uint64 V_2,
// uint64 V_3)
//IL_0000: ldarg.0
//IL_0001: ldfld int32 System.Number/NumberBuffer::scale
//IL_0006: stloc.0
//IL_0007: ldloc.0
//IL_0008: ldc.i4.s 20
//IL_000a: bgt.s IL_0015
//IL_000c: ldloc.0
//IL_000d: ldarg.0
//IL_000e: ldfld int32 System.Number/NumberBuffer::precision
//IL_0013: bge.s IL_0017
//IL_0015: ldc.i4.0
//IL_0016: ret
//IL_0017: ldarg.0
//IL_0018: ldfld char* System.Number/NumberBuffer::digits
//IL_001d: stloc.1
//IL_001e: ldc.i4.0
//IL_001f: conv.i8
//IL_0020: stloc.2
//IL_0021: br.s IL_008b
//IL_0023: ldloc.2
//IL_0024: ldc.i8 0xfffffffffffffff
//IL_002d: ble.un.s IL_0031
//IL_002f: ldc.i4.0
//IL_0030: ret
//IL_0031: ldloc.2
//IL_0032: ldc.i4.s 16
//IL_0034: conv.i8
//IL_0035: mul
//IL_0036: stloc.2
//IL_0037: ldloc.1
//IL_0038: ldind.u2
//IL_0039: brfalse.s IL_008b
//IL_003b: ldloc.2
//IL_003c: stloc.3
//IL_003d: ldloc.1
//IL_003e: ldind.u2
//IL_003f: brfalse.s IL_0083
//IL_0041: ldloc.1
//IL_0042: ldind.u2
//IL_0043: ldc.i4.s 48
//IL_0045: blt.s IL_0058
//IL_0047: ldloc.1
//IL_0048: ldind.u2
//IL_0049: ldc.i4.s 57
//IL_004b: bgt.s IL_0058
//IL_004d: ldloc.3
//IL_004e: ldloc.1
//IL_004f: ldind.u2
//IL_0050: ldc.i4.s 48
//IL_0052: sub
//IL_0053: conv.i8
//IL_0054: add
//IL_0055: stloc.3
//IL_0056: br.s IL_007e
//IL_0058: ldloc.1
//IL_0059: ldind.u2
//IL_005a: ldc.i4.s 65
//IL_005c: blt.s IL_0072
//IL_005e: ldloc.1
//IL_005f: ldind.u2
//IL_0060: ldc.i4.s 70
//IL_0062: bgt.s IL_0072
//IL_0064: ldloc.3
//IL_0065: ldloc.1
//IL_0066: ldind.u2
//IL_0067: ldc.i4.s 65
//IL_0069: sub
//IL_006a: ldc.i4.s 10
//IL_006c: add
//IL_006d: conv.i8
//IL_006e: add
//IL_006f: stloc.3
//IL_0070: br.s IL_007e
//IL_0072: ldloc.3
//IL_0073: ldloc.1
//IL_0074: ldind.u2
//IL_0075: ldc.i4.s 97
//IL_0077: sub
//IL_0078: ldc.i4.s 10
//IL_007a: add
//IL_007b: conv.i8
//IL_007c: add
//IL_007d: stloc.3
//IL_007e: ldloc.1
//IL_007f: ldc.i4.2
//IL_0080: conv.i
//IL_0081: add
//IL_0082: stloc.1
//IL_0083: ldloc.3
//IL_0084: ldloc.2
//IL_0085: bge.un.s IL_0089
//IL_0087: ldc.i4.0
//IL_0088: ret
//IL_0089: ldloc.3
//IL_008a: stloc.2
//IL_008b: ldloc.0
//IL_008c: ldc.i4.1
//IL_008d: sub
//IL_008e: dup
//IL_008f: stloc.0
//IL_0090: ldc.i4.0
//IL_0091: bge.s IL_0023
//IL_0093: ldarg.1
//IL_0094: ldloc.2
//IL_0095: stind.i8
//IL_0096: ldc.i4.1
//IL_0097: ret
int V_0;
char* V_1;
ulong V_2, V_3;
V_0 = number.scale;
//0-9:48-57,A-F:65-70,a-f:97-102
if (V_0 <= 20)
{
if (V_0 >= number.precision)
{
V_1 = number.digits;
V_2 = 0;
//无条件跳往IL_008b
//IL_008b
for (--V_0;/*IL_008b*/V_0 >= 0;/*IL_0091*/V_0--/*IL_008b*/) //跳往IL_0023
{
if (V_2 <= 0xfffffffffffffff)//IL_0023
{
V_2 = V_2 * 16;
if (*V_1 != '\x0000')//如果条件不满足跳往IL_008b
{
V_3 = V_2;//IL_003b
if (*V_1 != '\x0000')//如果条件不满足跳往IL_0083
{
if (*V_1 < '0' || *V_1 > '9')//跳往IL_0058
{
if (*V_1 < 'A' || *V_1 > 'F')//跳往IL_0072
{
V_3 = V_3 + (*V_1 - 'a' + 10);//IL_0072
//IL_007e
}
else
{
//IL_005d
V_3 = V_3 + ((*V_1 - 'A') + 10);
//无条件跳往//IL_007e
}
}
else
{
V_3 = V_3 + (*V_1 - '0');
//无条件跳往IL_007e
}
//IL_007e
V_1 = V_1 + 2;
//IL_0083
}
if (V_3 >= V_2)//IL_0083,跳往IL_0089
{
V_2 = V_3;//IL_0089
//IL_008b
}
else
{
return false;//IL_0087
}
}
}
else
{
return false;
}
}
@value = V_2; //IL_0093
return true;
}
}
return false;
}
private static bool IsWhite(char ch)
{
//.maxstack 8
//IL_0000: ldarg.0
//IL_0001: ldc.i4.s 32
//IL_0003: beq.s IL_0015
//IL_0005: ldarg.0
//IL_0006: ldc.i4.s 9
//IL_0008: blt.s IL_0013
//IL_000a: ldarg.0
//IL_000b: ldc.i4.s 13
//IL_000d: cgt
//IL_000f: ldc.i4.0
//IL_0010: ceq
//IL_0012: ret
//IL_0013: ldc.i4.0
//IL_0014: ret
//IL_0015: ldc.i4.1
//IL_0016: ret
//U+0009 HT character tabulation (tab)
//U+000A LF line feed
//U+000B VT line tabulation (vertical tab)
//U+000C FF form feed
//U+000D CR carriage return
//U+0020 space
if (ch == '\x0032')
{
return true;
}
else if(ch >='\x0009'&&ch <= '\x0013' )
{
return true;
}
else return false;
}
private static bool NumberToInt32(ref NumberBuffer number, ref int @value)
{
//.maxstack 4
//.locals init (int32 V_0,
// char* V_1,
// int32 V_2)
//IL_0000: ldarg.0
//IL_0001: ldfld int32 System.Number/NumberBuffer::scale
//IL_0006: stloc.0
//IL_0007: ldloc.0
//IL_0008: ldc.i4.s 10
//IL_000a: bgt.s IL_0015
//IL_000c: ldloc.0
//IL_000d: ldarg.0
//IL_000e: ldfld int32 System.Number/NumberBuffer::precision
//IL_0013: bge.s IL_0017
//IL_0015: ldc.i4.0
//IL_0016: ret
//IL_0017: ldarg.0
//IL_0018: ldfld char* System.Number/NumberBuffer::digits
//IL_001d: stloc.1
//IL_001e: ldc.i4.0
//IL_001f: stloc.2
//IL_0020: br.s IL_0042
//IL_0022: ldloc.2
//IL_0023: ldc.i4 0xccccccc
//IL_0028: ble.un.s IL_002c
//IL_002a: ldc.i4.0
//IL_002b: ret
//IL_002c: ldloc.2
//IL_002d: ldc.i4.s 10
//IL_002f: mul
//IL_0030: stloc.2
//IL_0031: ldloc.1
//IL_0032: ldind.u2
//IL_0033: brfalse.s IL_0042
//IL_0035: ldloc.2
//IL_0036: ldloc.1
//IL_0037: dup
//IL_0038: ldc.i4.2
//IL_0039: conv.i
//IL_003a: add
//IL_003b: stloc.1
//IL_003c: ldind.u2
//IL_003d: ldc.i4.s 48
//IL_003f: sub
//IL_0040: add
//IL_0041: stloc.2
//IL_0042: ldloc.0
//IL_0043: ldc.i4.1
//IL_0044: sub
//IL_0045: dup
//IL_0046: stloc.0
//IL_0047: ldc.i4.0
//IL_0048: bge.s IL_0022
//IL_004a: ldarg.0
//IL_004b: ldfld bool System.Number/NumberBuffer::sign
//IL_0050: brfalse.s IL_005b
//IL_0052: ldloc.2
//IL_0053: neg
//IL_0054: stloc.2
//IL_0055: ldloc.2
//IL_0056: ldc.i4.0
//IL_0057: ble.s IL_0061
//IL_0059: ldc.i4.0
//IL_005a: ret
//IL_005b: ldloc.2
//IL_005c: ldc.i4.0
//IL_005d: bge.s IL_0061
//IL_005f: ldc.i4.0
//IL_0060: ret
//IL_0061: ldarg.1
//IL_0062: ldloc.2
//IL_0063: stind.i4
//IL_0064: ldc.i4.1
//IL_0065: ret
int V_0; char* V_1; int V_2;
V_0=number.scale;
if(V_0<=10)
{
if (V_0 >= number.precision)
{
V_1 = number.digits;
V_2 = 0;
//IL_0020,无条件跳往IL_0042
for (--V_0;/*IL_0042*/ ; V_0--/*IL_0042*/)
{
if (V_0 >= 0)//IL_0048,跳往IL_0022
{
if ((uint)V_2 <= (uint)0xccccccc)//IL_0022,跳往IL_002c
{
V_2 = V_2 * 10;
if (*V_1 != '\0')
{
V_2 = V_2 + (*V_1 - 48);
V_1 = V_1 + 2;
}
continue;
}
else
{
return false;
}
}
else
{
//IL_004a
if (!number.sign)//跳往IL_005b
{
if (V_2 >= 0)//跳往IL_0061
{
@value = V_2;
return true;
}
else
{
return false;
}
}
else
{
//IL_0052:
V_2 = ~(V_2);
if (V_2 <= 0) //跳往IL_0061
{
@value = V_2;
return true;
}
else
{
return false;
}
}
}
}
}
}
else
{
return false;
}
}
private static bool NumberToInt64(ref NumberBuffer number, ref long @value)
{
//.maxstack 4
//.locals init (int32 V_0,
// char* V_1,
// int64 V_2)
//IL_0000: ldarg.0
//IL_0001: ldfld int32 System.Number/NumberBuffer::scale
//IL_0006: stloc.0
//IL_0007: ldloc.0
//IL_0008: ldc.i4.s 19
//IL_000a: bgt.s IL_0015
//IL_000c: ldloc.0
//IL_000d: ldarg.0
//IL_000e: ldfld int32 System.Number/NumberBuffer::precision
//IL_0013: bge.s IL_0017
//IL_0015: ldc.i4.0
//IL_0016: ret
//IL_0017: ldarg.0
//IL_0018: ldfld char* System.Number/NumberBuffer::digits
//IL_001d: stloc.1
//IL_001e: ldc.i4.0
//IL_001f: conv.i8
//IL_0020: stloc.2
//IL_0021: br.s IL_0049
//IL_0023: ldloc.2
//IL_0024: ldc.i8 0xccccccccccccccc
//IL_002d: ble.un.s IL_0031
//IL_002f: ldc.i4.0
//IL_0030: ret
//IL_0031: ldloc.2
//IL_0032: ldc.i4.s 10
//IL_0034: conv.i8
//IL_0035: mul
//IL_0036: stloc.2
//IL_0037: ldloc.1
//IL_0038: ldind.u2
//IL_0039: brfalse.s IL_0049
//IL_003b: ldloc.2
//IL_003c: ldloc.1
//IL_003d: dup
//IL_003e: ldc.i4.2
//IL_003f: conv.i
//IL_0040: add
//IL_0041: stloc.1
//IL_0042: ldind.u2
//IL_0043: ldc.i4.s 48
//IL_0045: sub
//IL_0046: conv.i8
//IL_0047: add
//IL_0048: stloc.2
//IL_0049: ldloc.0
//IL_004a: ldc.i4.1
//IL_004b: sub
//IL_004c: dup
//IL_004d: stloc.0
//IL_004e: ldc.i4.0
//IL_004f: bge.s IL_0023
//IL_0051: ldarg.0
//IL_0052: ldfld bool System.Number/NumberBuffer::sign
//IL_0057: brfalse.s IL_0063
//IL_0059: ldloc.2
//IL_005a: neg
//IL_005b: stloc.2
//IL_005c: ldloc.2
//IL_005d: ldc.i4.0
//IL_005e: conv.i8
//IL_005f: ble.s IL_006a
//IL_0061: ldc.i4.0
//IL_0062: ret
//IL_0063: ldloc.2
//IL_0064: ldc.i4.0
//IL_0065: conv.i8
//IL_0066: bge.s IL_006a
//IL_0068: ldc.i4.0
//IL_0069: ret
//IL_006a: ldarg.1
//IL_006b: ldloc.2
//IL_006c: stind.i8
//IL_006d: ldc.i4.1
//IL_006e: ret
int V_0; char* V_1; long V_2;
V_0 = number.scale;
if (V_0 <= 19)
{
if (V_0 >= number.precision)
{
V_1 = number.digits;
V_2 = 0;
//IL_0020,无条件跳往IL_0049
for (--V_0;/*IL_0049*/ ; V_0--/*IL_0049*/)
{
if (V_0 >= 0)//IL_004f,跳往IL_0023
{
if ((ulong)V_2 <= 0xcccccccccccccccul)//IL_0023,跳往IL_0031
{
V_2 = V_2 * 10;
if (*V_1 != '\0')
{
V_2 = V_2 + (*V_1 - 48);
V_1 = V_1 + 2;
}
continue;
}
else
{
return false;
}
}
else
{
//IL_0051
if (!number.sign)//跳往IL_0063
{
if (V_2 >= 0)//跳往IL_006a
{
@value = V_2;
return true;
}
else
{
return false;
}
}
else
{
//IL_0059:
V_2 = ~(V_2);
if (V_2 <= 0) //IL_006a
{
@value = V_2;
return true;
}
else
{
return false;
}
}
}
}
}
}
return false;
}
private static bool NumberToUInt32(ref NumberBuffer number, ref uint @value)
{
//.maxstack 4
//.locals init (int32 V_0,
// char* V_1,
// uint32 V_2,
// uint32 V_3)
//IL_0000: ldarg.0
//IL_0001: ldfld int32 System.Number/NumberBuffer::scale
//IL_0006: stloc.0
//IL_0007: ldloc.0
//IL_0008: ldc.i4.s 10
//IL_000a: bgt.s IL_001d
//IL_000c: ldloc.0
//IL_000d: ldarg.0
//IL_000e: ldfld int32 System.Number/NumberBuffer::precision
//IL_0013: blt.s IL_001d
//IL_0015: ldarg.0
//IL_0016: ldfld bool System.Number/NumberBuffer::sign
//IL_001b: brfalse.s IL_001f
//IL_001d: ldc.i4.0
//IL_001e: ret
//IL_001f: ldarg.0
//IL_0020: ldfld char* System.Number/NumberBuffer::digits
//IL_0025: stloc.1
//IL_0026: ldc.i4.0
//IL_0027: stloc.2
//IL_0028: br.s IL_0052
//IL_002a: ldloc.2
//IL_002b: ldc.i4 0x19999999
//IL_0030: ble.un.s IL_0034
//IL_0032: ldc.i4.0
//IL_0033: ret
//IL_0034: ldloc.2
//IL_0035: ldc.i4.s 10
//IL_0037: mul
//IL_0038: stloc.2
//IL_0039: ldloc.1
//IL_003a: ldind.u2
//IL_003b: brfalse.s IL_0052
//IL_003d: ldloc.2
//IL_003e: ldloc.1
//IL_003f: dup
//IL_0040: ldc.i4.2
//IL_0041: conv.i
//IL_0042: add
//IL_0043: stloc.1
//IL_0044: ldind.u2
//IL_0045: ldc.i4.s 48
//IL_0047: sub
//IL_0048: add
//IL_0049: stloc.3
//IL_004a: ldloc.3
//IL_004b: ldloc.2
//IL_004c: bge.un.s IL_0050
//IL_004e: ldc.i4.0
//IL_004f: ret
//IL_0050: ldloc.3
//IL_0051: stloc.2
//IL_0052: ldloc.0
//IL_0053: ldc.i4.1
//IL_0054: sub
//IL_0055: dup
//IL_0056: stloc.0
//IL_0057: ldc.i4.0
//IL_0058: bge.s IL_002a
//IL_005a: ldarg.1
//IL_005b: ldloc.2
//IL_005c: stind.i4
//IL_005d: ldc.i4.1
//IL_005e: ret
int V_0;
char* V_1;
uint V_2, V_3;
V_0 = number.scale;
if (V_0 <= 10)
{
if (V_0 >= number.precision)
{
if (!number.sign)
{
V_1 = number.digits;
V_2 = 0;
//IL_0028,无条件跳往IL_0052
for (--V_0;/*IL_0052*/ ; V_0--/*IL_0052*/)
{
if (V_0 >= 0)//IL_0058,跳往IL_002a
{
if ((uint)V_2 <= (uint)0x19999999)//IL_002a,跳往IL_0034
{
V_2 = V_2 * 10;
if (*V_1 != '\0')
{
V_3 = V_2 + (*V_1 - 48);
V_1 = V_1 + 2;
if(V_3>=V_2)
{
V_2 = V_3;
//IL_0052
}
else
{
return false;
}
}
continue;
}
else
{
return false;
}
}
else
{
//IL_005a
@value = V_2;
return true;
}
}
}
}
}
else
{
return false;
}
}
private static bool NumberToUInt64(ref NumberBuffer number, ref ulong @value)
{
//.maxstack 4
//.locals init (int32 V_0,
// char* V_1,
// uint64 V_2,
// uint64 V_3)
//IL_0000: ldarg.0
//IL_0001: ldfld int32 System.Number/NumberBuffer::scale
//IL_0006: stloc.0
//IL_0007: ldloc.0
//IL_0008: ldc.i4.s 20
//IL_000a: bgt.s IL_001d
//IL_000c: ldloc.0
//IL_000d: ldarg.0
//IL_000e: ldfld int32 System.Number/NumberBuffer::precision
//IL_0013: blt.s IL_001d
//IL_0015: ldarg.0
//IL_0016: ldfld bool System.Number/NumberBuffer::sign
//IL_001b: brfalse.s IL_001f
//IL_001d: ldc.i4.0
//IL_001e: ret
//IL_001f: ldarg.0
//IL_0020: ldfld char* System.Number/NumberBuffer::digits
//IL_0025: stloc.1
//IL_0026: ldc.i4.0
//IL_0027: conv.i8
//IL_0028: stloc.2
//IL_0029: br.s IL_0059
//IL_002b: ldloc.2
//IL_002c: ldc.i8 0x1999999999999999
//IL_0035: ble.un.s IL_0039
//IL_0037: ldc.i4.0
//IL_0038: ret
//IL_0039: ldloc.2
//IL_003a: ldc.i4.s 10
//IL_003c: conv.i8
//IL_003d: mul
//IL_003e: stloc.2
//IL_003f: ldloc.1
//IL_0040: ldind.u2
//IL_0041: brfalse.s IL_0059
//IL_0043: ldloc.2
//IL_0044: ldloc.1
//IL_0045: dup
//IL_0046: ldc.i4.2
//IL_0047: conv.i
//IL_0048: add
//IL_0049: stloc.1
//IL_004a: ldind.u2
//IL_004b: ldc.i4.s 48
//IL_004d: sub
//IL_004e: conv.i8
//IL_004f: add
//IL_0050: stloc.3
//IL_0051: ldloc.3
//IL_0052: ldloc.2
//IL_0053: bge.un.s IL_0057
//IL_0055: ldc.i4.0
//IL_0056: ret
//IL_0057: ldloc.3
//IL_0058: stloc.2
//IL_0059: ldloc.0
//IL_005a: ldc.i4.1
//IL_005b: sub
//IL_005c: dup
//IL_005d: stloc.0
//IL_005e: ldc.i4.0
//IL_005f: bge.s IL_002b
//IL_0061: ldarg.1
//IL_0062: ldloc.2
//IL_0063: stind.i8
//IL_0064: ldc.i4.1
//IL_0065: ret
int V_0;
char* V_1;
ulong V_2, V_3;
V_0 = number.scale;
if (V_0 <= 20)
{
if (V_0 >= number.precision)
{
if (!number.sign)
{
V_1 = number.digits;
V_2 = 0;
//IL_0029,无条件跳往IL_0059
for (--V_0;/*IL_0059*/ ; V_0--/*IL_0059*/)
{
if (V_0 >= 0)//IL_005f,跳往IL_002b
{
if (V_2 <= (ulong)0x1999999999999999)//IL_0035,跳往IL_0039
{
V_2 = V_2 * 10;
if (*V_1 != '\0')
{
V_3 = V_2 + (*V_1 - 48);
V_1 = V_1 + 2;
if (V_3 >= V_2)
{
V_2 = V_3;
//IL_0052
}
else
{
return false;
}
}
continue;
}
else
{
return false;
}
}
else
{
//IL_005a
@value = V_2;
return true;
}
}
}
}
}
else
{
return false;
}
}
private unsafe static char* MatchChars(char* p, string str)
{
//.maxstack 2
//.locals init (char* V_0,
// char* V_1,
// string pinned V_2)
//IL_0000: ldarg.1
//IL_0001: stloc.2
//IL_0002: ldloc.2
//IL_0003: conv.i
//IL_0004: dup
//IL_0005: brfalse.s IL_000d
//IL_0007: call int32 System.Runtime.CompilerServices.RuntimeHelpers::get_OffsetToStringData()
//IL_000c: add
//IL_000d: stloc.0
//IL_000e: ldarg.0
//IL_000f: ldloc.0
//IL_0010: call char* System.Number::MatchChars(char*,
// char*)
//IL_0015: stloc.1
//IL_0016: leave.s IL_0018
//IL_0018: ldloc.1
//IL_0019: ret
char* V_0,V_1;
fixed(string V_2 = str)
{
if(V_2==null)
{
//IL_000d
V_0 = &V_2;
}
else
{
V_0=&V_2+RuntimeHelpers.OffsetToStringData();
}
V_1=Number.MatchChars(p, V_0);
return V_1;
}
}
private unsafe static char* MatchChars(char* p, char* str)
{
//.maxstack 8
//IL_0000: ldarg.1
//IL_0001: ldind.u2
//IL_0002: brtrue.s IL_002b
//IL_0004: ldc.i4.0
//IL_0005: conv.u
//IL_0006: ret
//IL_0007: ldarg.0
//IL_0008: ldind.u2
//IL_0009: ldarg.1
//IL_000a: ldind.u2
//IL_000b: beq.s IL_001f
//IL_000d: ldarg.1
//IL_000e: ldind.u2
//IL_000f: ldc.i4 0xa0
//IL_0014: bne.un.s IL_001c
//IL_0016: ldarg.0
//IL_0017: ldind.u2
//IL_0018: ldc.i4.s 32
//IL_001a: beq.s IL_001f
//IL_001c: ldc.i4.0
//IL_001d: conv.u
//IL_001e: ret
//IL_001f: ldarg.0
//IL_0020: ldc.i4.2
//IL_0021: conv.i
//IL_0022: add
//IL_0023: starg.s p
//IL_0025: ldarg.1
//IL_0026: ldc.i4.2
//IL_0027: conv.i
//IL_0028: add
//IL_0029: starg.s str
//IL_002b: ldarg.1
//IL_002c: ldind.u2
//IL_002d: brtrue.s IL_0007
//IL_002f: ldarg.0
//IL_0030: ret
if (*str != 0) //跳往IL_002b
{
while (*str != 0)
{
if ((*p == *str) || (*str == 0xa0 && *p == 32)) //IL_0007,跳往IL_001f
{
p = p + 2;
str = str + 2;
continue;
}
else
{
//IL_001c
return &null;
}
}
return p;
}
else
{
//IL_0004
return &null;
}
}
internal static decimal ParseDecimal(string @value, NumberStyles options, NumberFormatInfo numfmt)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1,
// valuetype System.Decimal V_2)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localloc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldc.i4.0
//IL_0015: newobj instance void System.Decimal::.ctor(int32)
//IL_001a: stloc.2
//IL_001b: ldarg.0
//IL_001c: ldarg.1
//IL_001d: ldloca.s V_1
//IL_001f: ldarg.2
//IL_0020: ldc.i4.1
//IL_0021: call void System.Number::StringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_0026: ldloca.s V_1
//IL_0028: call instance uint8* System.Number/NumberBuffer::PackForNative()
//IL_002d: ldloca.s V_2
//IL_002f: call bool System.Number::NumberBufferToDecimal(uint8*,
// valuetype System.Decimal&)
//IL_0034: brtrue.s IL_0046
//IL_0036: ldstr "Overflow_Decimal"
//IL_003b: call string System.Environment::GetResourceString(string)
//IL_0040: newobj instance void System.OverflowException::.ctor(string)
//IL_0045: throw
//IL_0046: ldloc.2
//IL_0047: ret
byte* V_0 = stackalloc byte[1 * 114];
NumberBuffer V_1;
decimal V_2;
V_1=new NumberBuffer(V_0);
V_2 = new Decimal(0);
Number.StringToNumber(@value, options, ref V_1, numfmt, true);
if (Number.NumberBufferToDecimal(V_1.PackForNative(), ref V_2))
{
return V_2;
}
else
{
throw new OverflowException(System.Environment.GetResourceString("Overflow_Decimal"));
}
}
internal static double ParseDouble(string @value, NumberStyles options, NumberFormatInfo numfmt)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1,
// float64 V_2)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localloc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldc.r8 0.0
//IL_001d: stloc.2
//IL_001e: ldarg.0
//IL_001f: ldarg.1
//IL_0020: ldloca.s V_1
//IL_0022: ldarg.2
//IL_0023: ldc.i4.0
//IL_0024: call void System.Number::StringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_0029: ldloca.s V_1
//IL_002b: call instance uint8* System.Number/NumberBuffer::PackForNative()
//IL_0030: ldloca.s V_2
//IL_0032: call bool System.Number::NumberBufferToDouble(uint8*,
// float64&)
//IL_0037: brtrue.s IL_0049
//IL_0039: ldstr "Overflow_Double"
//IL_003e: call string System.Environment::GetResourceString(string)
//IL_0043: newobj instance void System.OverflowException::.ctor(string)
//IL_0048: throw
//IL_0049: ldloc.2
//IL_004a: ret
byte* V_0 = stackalloc byte[1 * 114];
NumberBuffer V_1;
double V_2;
V_1 = new System.Number.NumberBuffer(V_0);
V_2 = 0.0d;
System.Number.StringToNumber(@value, options, ref V_1, numfmt, fals);
if (System.Number.NumberBufferToDouble(V_1.PackForNative(), ref V_2))
{
return V_2;
}
else
{
throw new System.OverflowException(System.Environment.GetResourceString("Overflow_Double"));
}
}
internal static int ParseInt32(string s, NumberStyles style, NumberFormatInfo info)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1,
// int32 V_2)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localloc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldc.i4.0
//IL_0015: stloc.2
//IL_0016: ldarg.0
//IL_0017: ldarg.1
//IL_0018: ldloca.s V_1
//IL_001a: ldarg.2
//IL_001b: ldc.i4.0
//IL_001c: call void System.Number::StringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_0021: ldarg.1
//IL_0022: ldc.i4 0x200
//IL_0027: and
//IL_0028: brfalse.s IL_0045
//IL_002a: ldloca.s V_1
//IL_002c: ldloca.s V_2
//IL_002e: call bool System.Number::HexNumberToInt32(valuetype System.Number/NumberBuffer&,
// int32&)
//IL_0033: brtrue.s IL_0060
//IL_0035: ldstr "Overflow_Int32"
//IL_003a: call string System.Environment::GetResourceString(string)
//IL_003f: newobj instance void System.OverflowException::.ctor(string)
//IL_0044: throw
//IL_0045: ldloca.s V_1
//IL_0047: ldloca.s V_2
//IL_0049: call bool System.Number::NumberToInt32(valuetype System.Number/NumberBuffer&,
// int32&)
//IL_004e: brtrue.s IL_0060
//IL_0050: ldstr "Overflow_Int32"
//IL_0055: call string System.Environment::GetResourceString(string)
//IL_005a: newobj instance void System.OverflowException::.ctor(string)
//IL_005f: throw
//IL_0060: ldloc.2
//IL_0061: ret
byte* V_0 = stackalloc byte[1 * 114];
System.Number.NumberBuffer V_1;
int V_2;
V_1=new System.Number.NumberBuffer(V_0);
V_2=0;
System.Number.StringToNumber(s, style, ref V_1, info, false);
if(style&NumberStyles.AllowHexSpecifier!=0)
{
if(System.Number.HexNumberToInt32(ref V_1,ref V_2))
{
return V_2;
}
else
{
throw new System.OverflowException(System.Environment.GetResourceString("Overflow_Int32"));
}
}
else
{
//IL_0045
if (System.Number.NumberToInt32(ref V_1, ref V_2))
{
return V_2;
}
throw new System.OverfowException(System.Environment.GetResourceString("Overflow_Int32"));
}
}
internal static long ParseInt64(string @value, NumberStyles options, NumberFormatInfo numfmt)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1,
// int64 V_2)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localloc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldc.i4.0
//IL_0015: conv.i8
//IL_0016: stloc.2
//IL_0017: ldarg.0
//IL_0018: ldarg.1
//IL_0019: ldloca.s V_1
//IL_001b: ldarg.2
//IL_001c: ldc.i4.0
//IL_001d: call void System.Number::StringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_0022: ldarg.1
//IL_0023: ldc.i4 0x200
//IL_0028: and
//IL_0029: brfalse.s IL_0046
//IL_002b: ldloca.s V_1
//IL_002d: ldloca.s V_2
//IL_002f: call bool System.Number::HexNumberToInt64(valuetype System.Number/NumberBuffer&,
// int64&)
//IL_0034: brtrue.s IL_0061
//IL_0036: ldstr "Overflow_Int64"
//IL_003b: call string System.Environment::GetResourceString(string)
//IL_0040: newobj instance void System.OverflowException::.ctor(string)
//IL_0045: throw
//IL_0046: ldloca.s V_1
//IL_0048: ldloca.s V_2
//IL_004a: call bool System.Number::NumberToInt64(valuetype System.Number/NumberBuffer&,
// int64&)
//IL_004f: brtrue.s IL_0061
//IL_0051: ldstr "Overflow_Int64"
//IL_0056: call string System.Environment::GetResourceString(string)
//IL_005b: newobj instance void System.OverflowException::.ctor(string)
//IL_0060: throw
//IL_0061: ldloc.2
//IL_0062: ret
byte* V_0 = stackalloc byte[1 * 114];
System.Number.NumberBuffer V_1;
long V_2;
V_1 = new System.Number.NumberBuffer(V_0);
V_2 = 0L;
System.Number.StringToNumber(@value, options, ref V_1, numfmt, false);
if (options & NumberStyles.AllowHexSpecifier != 0)
{
if (System.Number.HexNumberToInt64(ref V_1, ref V_2))
{
return V_2;
}
else
{
throw new System.OverflowException(System.Environment.GetResourceString("Overflow_Int64"));
}
}
else
{
if (System.Number.NumberToInt64(ref V_1, ref V_2))
{
return V_2;
}
else
{
throw new System.OverflowException(System.Environment.GetResourceString("Overflow_Int64"));
}
}
}
private static bool ParseNumber(ref char* str, NumberStyls options, ref NumberBuffer number, NumberFormatInfo numfmt, bool parseDecimal)
{
#region IL
//.maxstack 4
//.locals init (string V_0,
// string V_1,
// string V_2,
// string V_3,
// string V_4,
// string V_5,
// bool V_6,
// int32 V_7,
// bool V_8,
// char* V_9,
// char V_10,
// char* V_11,
// int32 V_12,
// int32 V_13,
// bool V_14,
// char* V_15,
// int32 V_16)
//IL_0000: ldarg.2
//IL_0001: ldc.i4.0
//IL_0002: stfld int32 System.Number/NumberBuffer::scale
//IL_0007: ldarg.2
//IL_0008: ldc.i4.0
//IL_0009: stfld bool System.Number/NumberBuffer::sign
//IL_000e: ldnull
//IL_000f: stloc.2
//IL_0010: ldnull
//IL_0011: stloc.3
//IL_0012: ldnull
//IL_0013: stloc.s V_4
//IL_0015: ldnull
//IL_0016: stloc.s V_5
//IL_0018: ldc.i4.0
//IL_0019: stloc.s V_6
//IL_001b: ldarg.1
//IL_001c: ldc.i4 0x100
//IL_0021: and
//IL_0022: brfalse.s IL_005d
//IL_0024: ldarg.3
//IL_0025: callvirt instance string System.Globalization.NumberFormatInfo::get_CurrencySymbol()
//IL_002a: stloc.2
//IL_002b: ldarg.3
//IL_002c: ldfld string System.Globalization.NumberFormatInfo::ansiCurrencySymbol
//IL_0031: brfalse.s IL_003a
//IL_0033: ldarg.3
//IL_0034: ldfld string System.Globalization.NumberFormatInfo::ansiCurrencySymbol
//IL_0039: stloc.3
//IL_003a: ldarg.3
//IL_003b: callvirt instance string System.Globalization.NumberFormatInfo::get_NumberDecimalSeparator()
//IL_0040: stloc.s V_4
//IL_0042: ldarg.3
//IL_0043: callvirt instance string System.Globalization.NumberFormatInfo::get_NumberGroupSeparator()
//IL_0048: stloc.s V_5
//IL_004a: ldarg.3
//IL_004b: callvirt instance string System.Globalization.NumberFormatInfo::get_CurrencyDecimalSeparator()
//IL_0050: stloc.0
//IL_0051: ldarg.3
//IL_0052: callvirt instance string System.Globalization.NumberFormatInfo::get_CurrencyGroupSeparator()
//IL_0057: stloc.1
//IL_0058: ldc.i4.1
//IL_0059: stloc.s V_6
//IL_005b: br.s IL_006b
//IL_005d: ldarg.3
//IL_005e: callvirt instance string System.Globalization.NumberFormatInfo::get_NumberDecimalSeparator()
//IL_0063: stloc.0
//IL_0064: ldarg.3
//IL_0065: callvirt instance string System.Globalization.NumberFormatInfo::get_NumberGroupSeparator()
//IL_006a: stloc.1
//IL_006b: ldc.i4.0
//IL_006c: stloc.s V_7
//IL_006e: ldc.i4.0
//IL_006f: stloc.s V_8
//IL_0071: ldarg.0
//IL_0072: ldind.i
//IL_0073: stloc.s V_9
//IL_0075: ldloc.s V_9
//IL_0077: ldind.u2
//IL_0078: stloc.s V_10
//IL_007a: ldloc.s V_10
//IL_007c: call bool System.Number::IsWhite(char)
//IL_0081: brfalse.s IL_00ad
//IL_0083: ldarg.1
//IL_0084: ldc.i4.1
//IL_0085: and
//IL_0086: brfalse.s IL_00ad
//IL_0088: ldloc.s V_7
//IL_008a: ldc.i4.1
//IL_008b: and
//IL_008c: brfalse IL_016c
//IL_0091: ldloc.s V_7
//IL_0093: ldc.i4.1
//IL_0094: and
//IL_0095: brfalse.s IL_00ad
//IL_0097: ldloc.s V_7
//IL_0099: ldc.i4.s 32
//IL_009b: and
//IL_009c: brtrue IL_016c
//IL_00a1: ldarg.3
//IL_00a2: ldfld int32 System.Globalization.NumberFormatInfo::numberNegativePattern
//IL_00a7: ldc.i4.2
//IL_00a8: beq IL_016c
//IL_00ad: ldarg.1
//IL_00ae: ldc.i4.4
//IL_00af: and
//IL_00b0: brfalse.s IL_00bb
//IL_00b2: ldloc.s V_7
//IL_00b4: ldc.i4.1
//IL_00b5: and
//IL_00b6: ldc.i4.0
//IL_00b7: ceq
//IL_00b9: br.s IL_00bc
//IL_00bb: ldc.i4.0
//IL_00bc: dup
//IL_00bd: stloc.s V_8
//IL_00bf: brfalse.s IL_00e7
//IL_00c1: ldloc.s V_9
//IL_00c3: ldarg.3
//IL_00c4: ldfld string System.Globalization.NumberFormatInfo::positiveSign
//IL_00c9: call char* System.Number::MatchChars(char*,
// string)
//IL_00ce: dup
//IL_00cf: stloc.s V_11
//IL_00d1: ldc.i4.0
//IL_00d2: conv.u
//IL_00d3: beq.s IL_00e7
//IL_00d5: ldloc.s V_7
//IL_00d7: ldc.i4.1
//IL_00d8: or
//IL_00d9: stloc.s V_7
//IL_00db: ldloc.s V_11
//IL_00dd: ldc.i4.2
//IL_00de: conv.i
//IL_00df: sub
//IL_00e0: stloc.s V_9
//IL_00e2: br IL_016c
//IL_00e7: ldloc.s V_8
//IL_00e9: brfalse.s IL_0115
//IL_00eb: ldloc.s V_9
//IL_00ed: ldarg.3
//IL_00ee: ldfld string System.Globalization.NumberFormatInfo::negativeSign
//IL_00f3: call char* System.Number::MatchChars(char*,
// string)
//IL_00f8: dup
//IL_00f9: stloc.s V_11
//IL_00fb: ldc.i4.0
//IL_00fc: conv.u
//IL_00fd: beq.s IL_0115
//IL_00ff: ldloc.s V_7
//IL_0101: ldc.i4.1
//IL_0102: or
//IL_0103: stloc.s V_7
//IL_0105: ldarg.2
//IL_0106: ldc.i4.1
//IL_0107: stfld bool System.Number/NumberBuffer::sign
//IL_010c: ldloc.s V_11
//IL_010e: ldc.i4.2
//IL_010f: conv.i
//IL_0110: sub
//IL_0111: stloc.s V_9
//IL_0113: br.s IL_016c
//IL_0115: ldloc.s V_10
//IL_0117: ldc.i4.s 40
//IL_0119: bne.un.s IL_0136
//IL_011b: ldarg.1
//IL_011c: ldc.i4.s 16
//IL_011e: and
//IL_011f: brfalse.s IL_0136
//IL_0121: ldloc.s V_7
//IL_0123: ldc.i4.1
//IL_0124: and
//IL_0125: brtrue.s IL_0136
//IL_0127: ldloc.s V_7
//IL_0129: ldc.i4.3
//IL_012a: or
//IL_012b: stloc.s V_7
//IL_012d: ldarg.2
//IL_012e: ldc.i.1
//IL_012f: stfld bool System.Number/NumberBuffer::sign
//IL_0134: br.s IL_016c
//IL_0136: ldloc.2
//IL_0137: brfalse.s IL_0148
//IL_0139: ldloc.s V_9
//IL_013b: ldloc.2
//IL_013c: call char* System.Number::MatchChars(char*,
// string)
//IL_0141: dup
//IL_0142: stloc.s V_11
//IL_0144: ldc.i4.0
//IL_0145: conv.u
//IL_0146: bne.un.s IL_015a
//IL_0148: ldloc.3
//IL_0149: brfalse.s IL_017c
//IL_014b: ldloc.s V_9
//IL_014d: ldloc.3
//IL_014e: call char* System.Number::MatchChars(char*,
// string)
//IL_0153: dup
//IL_0154: stloc.s V_11
//IL_0156: ldc.i4.0
//IL_0157: conv.u
//IL_0158: beq.s IL_017c
//IL_015a: ldloc.s V_7
//IL_015c: ldc.i4.s 32
//IL_015e: or
//IL_015f: stloc.s V_7
//IL_0161: ldnull
//IL_0162: stloc.2
//IL_0163: ldnull
//IL_0164: stloc.3
//IL_0165: ldloc.s V_11
//IL_0167: ldc.i4.2
//IL_0168: conv.i
//IL_0169: sub
//IL_016a: stloc.s V_9
//IL_016c: ldloc.s V_9
//IL_016e: ldc.i4.2
//IL_016f: conv.i
//IL_0170: add
//IL_0171: dup
//IL_0172: stloc.s V_9
//IL_0174: ldind.u2
//IL_0175: stloc.s V_10
//IL_0177: br IL_007a
//IL_017c: ldc.i4.0
//IL_017d: stloc.s V_12
//IL_017f: ldc.i4.0
//IL_0180: stloc.s V_13
//IL_0182: ldloc.s V_10
//IL_0184: ldc.i4.s 48
//IL_0186: blt.s IL_018e
//IL_0188: ldloc.s V_10
//IL_018a: ldc.i4.s 57
//IL_018c: ble.s IL_01b2
//IL_018e: ldarg.1
//IL_018f: ldc.i4 0x200
//IL_0194: and
//IL_0195: brfalse IL_0229
//IL_019a: ldloc.s V_10
//IL_019c: ldc.i4.s 97
//IL_019e: blt.s IL_01a6
//IL_01a0: ldloc.s V_10
//IL_01a2: ldc.i4.s 102
//IL_01a4: ble.s IL_01b2
//IL_01a6: ldloc.s V_10
//IL_01a8: ldc.i4.s 65
//IL_01aa: blt.s IL_0229
//IL_01ac: ldloc.s V_10
//IL_01ae: ldc.i4.s 70
//IL_01b0: bgt.s IL_0229
//IL_01b2: ldloc.s V_7
//IL_01b4: ldc.i4.4
//IL_01b5: or
//IL_01b6: stloc.s V_7
//IL_01b8: ldloc.s V_10
//IL_01ba: ldc.i4.s 48
//IL_01bc: bne.un.s IL_01c4
//IL_01be: ldloc.s V_7
//IL_01c0: ldc.i4.8
//IL_01c1: and
//IL_01c2: brfalse.s IL_020c
//IL_01c4: ldloc.s V_12
//IL_01c6: ldc.i4.s 50
//IL_01c8: bge.s IL_01ec
//IL_01ca: ldarg.2
//IL_01cb: ldfld char* System.Number/NumberBuffer::digits
//IL_01d0: ldloc.s V_12
//IL_01d2: dup
//IL_01d3: ldc.i4.1
//IL_01d4: add
//IL_01d5: stloc.s V_12
//IL_01d7: conv.i
//IL_01d8: ldc.i4.2
//IL_01d9: mul
//IL_01da: add
//L_01db: ldloc.s V_10
//IL_01dd: stind.i2
//IL_01de: ldloc.s V_10
//IL_01e0: ldc.i4.s 48
//IL_01e2: bne.un.s IL_01e8
//IL_01e4: ldarg.s parseDecimal
//IL_01e6: brfalse.s IL_01ec
//IL_01e8: ldloc.s V_12
//IL_01ea: stloc.s V_13
//IL_01ec: ldloc.s V_7
//IL_01ee: ldc.i4.s 16
//IL_01f0: and
//IL_01f1: brtrue.s IL_0201
//IL_01f3: ldarg.2
//IL_01f4: dup
//IL_01f5: ldfld int32 System.Number/NumberBuffer::scale
//IL_01fa: ldc.i4.1
//IL_01fb: add
//IL_01fc: stfld int32 System.Number/NumberBuffer::scale
//IL_0201: ldloc.s V_7
//IL_0203: ldc.i4.8
//IL_0204: or
//IL_0205: stloc.s V_7
//IL_0207: br IL_02b4
//IL_020c: ldloc.s V_7
//IL_020e: ldc.i4.s 16
//IL_0210: and
//IL_0211: brfalse IL_02b4
//IL_0216: ldarg.2
//IL_0217: dup
//IL_0218: ldfld int32 System.Number/NumberBuffer::scale
//IL_021d: ldc.i4.1
//IL_021e: sub
//IL_021f: stfld int32 System.Number/NumberBuffer::scale
//IL_0224: br IL_02b4
//IL_0229: ldarg.1
//IL_022a: ldc.i4.s 32
//IL_022c: and
//IL_022d: brfalse.s IL_0270
//IL_022f: ldloc.s V_7
//IL_0231: ldc.i4.s 16
//IL_0233: and
//IL_0234: brtrue.s IL_0270
//IL_0236: ldloc.s V_9
//IL_0238: ldloc.0
//IL_0239: call char* System.Number::MatchChars(char*,
// string)
//IL_023e: dup
//IL_023f: stloc.s V_11
//IL_0241: ldc.i4.0
//IL_0242: conv.u
//IL_0243: bne.un.s IL_0260
//IL_0245: ldloc.s V_6
//IL_0247: brfalse.s IL_0270
//IL_0249: ldloc.s V_7
//IL_024b: ldc.i4.s 32
//IL_024d: and
//IL_024e: brtrue.s IL_0270
//IL_0250: ldloc.s V_9
//IL_0252: ldloc.s V_4
//IL_0254: call char* System.Number::MatchChars(char*,
// string)
//IL_0259: dup
//IL_025a: stloc.s V_11
//IL_025c: ldc.i4.0
//IL_025d: conv.u
//IL_025e: beq.s IL_0270
//IL_0260: ldloc.s V_7
//IL_0262: ldc.i4.s 16
//IL_0264: or
//IL_0265: stloc.s V_7
//IL_0267: ldloc.s V_11
//IL_0269: ldc.i4.2
//IL_026a: conv.i
//IL_026b: sub
//IL_026c: stloc.s V_9
//IL_026e: br.s IL_02b4
//IL_0270: ldarg.1
//IL_0271: ldc.i4.s 64
//IL_0273: and
//IL_0274: brfalse.s IL_02c4
//IL_0276: ldloc.s V_7
//IL_0278: ldc.i4.4
//IL_0279: and
//IL_027a: brfalse.s IL_02c4
//IL_027c: ldloc.s V_7
//IL_027e: ldc.i4.s 16
//IL_0280: and
//IL_0281: brtrue.s IL_02c4
//IL_0283: ldloc.s V_9
//IL_0285: ldloc.1
//IL_0286: call char* System.Number::MatchChars(char*,
// string)
//IL_028b: dup
//IL_028c: stloc.s V_11
//IL_028: ldc.i4.0
//IL_028f: conv.u
//IL_0290: bne.un.s IL_02ad
//IL_0292: ldloc.s V_6
//IL_0294: brfalse.s IL_02c4
//IL_0296: ldloc.s V_7
//IL_0298: ldc.i4.s 32
//IL_029a: and
//IL_029b: brtrue.s IL_02c4
//IL_029d: ldloc.s V_9
//IL_029f: ldloc.s V_5
//IL_02a1: call char* System.Number::MatchChars(char*,
// string)
//IL_02a6: dup
//IL_02a7: stloc.s V_11
//IL_02a9: ldc.i4.0
//IL_02aa: conv.u
//IL_02ab: beq.s IL_02c4
//IL_02ad: ldloc.s V_11
//IL_02af: ldc.i4.2
//IL_02b0: conv.i
//IL_02b1: sub
//IL_02b2: stloc.s V_9
//IL_02b4: ldloc.s V_9
//IL_02b6: ldc.i4.2
//IL_02b7: conv.i
//IL_02b8: add
//IL_02b9: dup
//IL_02ba: stloc.s V_9
//IL_02bc: ldind.u2
//IL_02bd: stloc.s V_10
//IL_02bf: br IL_0182
//IL_02c4: ldc.i4.0
//IL_02c5: stloc.s V_14
//IL_02c7: ldarg.2
//IL_02c8: ldloc.s V_13
//IL_02ca: stfld int32 System.Number/NumberBuffer::precision
//IL_02cf: ldarg.2
//IL_02d0: ldfld char* System.Number/NumberBuffer::digits
//IL_02d5: ldloc.s V_13
//IL_02d7: conv.i
//IL_02d8: ldc.i4.2
//IL_02d9: mul
//IL_02da: add
//IL_02db: ldc.i4.0
//IL_02dc: stind.i2
//IL_02dd: ldloc.s V_7
//IL_02df: ldc.i4.4
//IL_02e0: and
//IL_02e1: brfalse IL_04c1
//IL_02e6: ldloc.s V_10
//IL_02e8: ldc.i4.s 69
//IL_02ea: beq.s IL_02f5
//IL_02ec: ldloc.s V_10
//IL_02ee: ldc.i4.s 101
//IL_02f0: bne.un IL_03cc
//IL_02f5: ldarg.1
//IL_02f6: ldc.i4 0x80
//IL_02fb: and
//IL_02fc: brfalse IL_03cc
//IL_0301: ldloc.s V_9
//IL_0303: stloc.s V_15
//IL_0305: ldloc.s V_9
//IL_0307: ldc.i4.2
//IL_0308: conv.i
//IL_0309: add
//IL_030a: dup
//IL_030b: stloc.s V_9
//IL_030d: ldind.u2
//IL_030e: stloc.s V_10
//IL_0310: ldloc.s V_9
//IL_0312: ldarg.3
//IL_0313: ldfld string System.Globalization.NumberFormatInfo::positiveSign
//IL_0318: call char* System.Number::MatchChars(char*,
// string)
//IL_031d: dup
//IL_031e: stloc.s V_11
//IL_0320: ldc.i4.0
//IL_0321: conv.u
//IL_0322: beq.s IL_032e
//IL_0324: ldloc.s V_11
//IL_0326: dup
//IL_0327: stloc.s V_9
//IL_0329: ldind.u2
//IL_032a: stloc.s V_10
//IL_032c: br.s IL_034d
//IL_032e: ldloc.s V_9
//IL_0330: ldarg.3
//IL_0331: ldfld string System.Globalization.NumberFormatInfo::negativeSign
//IL_0336: call char* System.Number::MatchChars(char*,
// string)
//IL_033b: dup
//IL_033c: stloc.s V_11
//IL_033e: ldc.i4.0
//IL_033f: conv.u
//IL_0340: beq.s IL_034d
//IL_0342: ldloc. V_11
//IL_0344: dup
//IL_0345: stloc.s V_9
//IL_0347: ldind.u2
//IL_0348: stloc.s V_10
//IL_034a: ldc.i4.1
//IL_034b: stloc.s V_14
//IL_034d: ldloc.s V_10
//IL_034f: ldc.i4.s 48
//IL_0351: blt.s IL_03c3
//IL_0353: ldloc.s V_10
//IL_0355: ldc.i4.s 57
//IL_0357: bgt.s IL_03c3
//IL_0359: ldc.i4.0
//IL_035a: stloc.s V_16
//IL_035c: ldloc.s V_16
//IL_035e: ldc.i4.s 10
//IL_0360: mul
//IL_0361: ldloc.s V_10
//IL_0363: ldc.i4.s 48
//IL_0365: sub
//IL_0366: add
//IL_0367: stloc.s V_16
//IL_0369: ldloc.s V_9
//IL_036b: ldc.i4.2
//IL_036c: conv.i
//IL_036d: add
//IL_036e: dup
//IL_036f: stloc.s V_9
//IL_0371: ldind.u2
//IL_0372: stloc.s V_10
//IL_0374: ldloc.s V_16
//IL_0376: ldc.i4 0x3e8
//IL_037b: ble.s IL_039d
//IL_037d: ldc.i4 0x270f
//IL_0382: stloc.s V_16
//IL_0384: br.s IL_0391
//IL_0386: ldloc.s V_9
//IL_0388: ldc.i4.2
//IL_0389: conv.i
//IL_038a: add
//IL_038b: dup
//IL_038c: stloc.s V_9
//IL_038e: ldind.u2
//IL_038f: stloc.s V_10
//IL_0391: ldloc.s V_10
//IL_0393: ldc.i4.s 48
//IL_0395: blt.s IL_039d
//IL_0397: ldloc.s V_10
//IL_0399: ldc.i4.s 57
//IL_039b: ble.s IL_0386
//IL_039d: ldloc.s V_10
//IL_039f: ldc.i4.s 48
//IL_03a1: blt.s IL_03a9
//IL_03a3: ldloc.s V_10
//IL_03a5: ldc.i4.s 57
//IL_03a7: ble.s IL_035c
//IL_03a9: ldloc.s V_14
//IL_03ab: brfalse.s IL_03b2
//IL_03ad: ldloc.s V_16
//IL_03af: neg
//IL_03b0: stloc.s V_16
//IL_03b2: ldarg.2
//IL_03b3: dup
//IL_03b4: ldfld int32 System.Number/NumberBuffer::scale
//IL_03b9: ldloc.s V_16
//IL_03bb: add
//IL_03bc: stfld int32 System.Number/NumberBuffer::scale
//IL_03c1: br.s IL_03cc
//IL_03c3: ldloc.s V_15
//IL_03c5: stloc.s V_9
//IL_03c7: ldloc.s V_9
//IL_03c9: ldind.u2
//IL_03ca: stloc.s V_10
//IL_03cc: ldloc.s V_10
//IL_03ce: call bool System.Number::IsWhite(char)
//IL_03d3: brfalse.s IL_03dd
//IL_03d5: ldarg.1
//IL_03d6: ldc.i4.2
//IL_03d7: and
//IL_03d8: brtrue IL_0486
//IL_03dd: ldarg.1
//IL_03de: ldc.i4.8
//IL_03df: and
//IL_03e0: brfalse.s IL_03eb
//IL_03e2: ldloc.s V_7
//IL_03e4: ldc.i4.1
//IL_03e5: and
//IL_03e6: ldc.i4.0
//IL_03e7: ceq
//IL_03e9: br.s IL_03ec
//IL_03eb: ldc.i4.0
//IL_03ec: dup
//IL_03ed: stloc.s V_8
//IL_03ef: brfalse.s IL_0414
//IL_03f1: ldloc.s V_9
//IL_03f3: ldarg.3
//IL_03f4: ldfld string System.Globalization.NumberFormatInfo::positiveSign
//IL_03f9: call char* System.Number::MtchChars(char*,
// string)
//IL_03fe: dup
//IL_03ff: stloc.s V_11
//IL_0401: ldc.i4.0
//IL_0402: conv.u
//IL_0403: beq.s IL_0414
//IL_0405: ldloc.s V_7
//IL_0407: ldc.i4.1
//IL_0408: or
//IL_0409: stloc.s V_7
//IL_040b: ldloc.s V_11
//IL_040d: ldc.i4.2
//IL_040e: conv.i
//IL_040f: sub
//IL_0410: stloc.s V_9
//IL_0412: br.s IL_0486
//IL_0414: ldloc.s V_8
//IL_0416: brfalse.s IL_0442
//IL_0418: ldloc.s V_9
//IL_041a: ldarg.3
//IL_041b: ldfld string System.Globalization.NumberFormatInfo::negativeSign
//IL_0420: call char* System.Number::MatchChars(char*,
// string)
//IL_0425: dup
//IL_0426: stloc.s V_11
//IL_0428: ldc.i4.0
//IL_0429: conv.u
//IL_042a: beq.s IL_0442
//IL_042c: ldloc.s V_7
//IL_042e: ldc.i4.1
//IL_042f: or
//IL_0430: stloc.s V_7
//IL_0432: ldarg.2
//IL_0433: ldc.i4.1
//IL_0434: stfld bool System.Number/NumberBuffer::sign
//IL_0439: ldloc.s V_11
//IL_043b: ldc.i4.2
//IL_043c: conv.i
//IL_043d: sub
//IL_043e: stloc.s V_9
//IL_0440: br.s IL_0486
//IL_0442: ldloc.s V_10
//IL_0444: ldc.i4.s 41
//IL_0446: bne.un.s IL_0457
//IL_0448: ldloc.s V_7
//IL_044a: ldc.i4.2
//IL_044b: and
//IL_044c: brfalse.s IL_0457
//IL_044e: ldloc.s V_7
//IL_0450: ldc.i4.s -3
//IL_0452: and
//IL_0453: stloc.s V_7
//IL_0455: br.s IL_0486
//IL_0457: ldloc.2
//IL_0458: brfalse.s IL_0469
//IL_045a: ldloc.s V_9
//IL_045c: ldloc.2
//IL_045d: call char* System.Number::MatchChars(char*,
// string)
//IL_0462: dup
//IL_0463: stloc.s V_11
//IL_0465: ldc.i4.0
//IL_0466: conv.u
//IL_0467: bne.un.s IL_047b
//IL_0469: ldloc.3
//IL_046a: brfalse.s IL_0496
//IL_046c: ldloc.s V_9
//IL_046e: ldloc.3
//IL_046f: call char* System.Number::MatchChars(char*,
// string)
//IL_0474: dup
//IL_0475: stloc.s V_11
//IL_0477: ldc.i4.0
//IL_0478: conv.u
//IL_0479: beq.s IL_0496
//IL_047b: ldnull
//IL_047c: stloc.2
//IL_047d: ldnull
//IL_047e: stloc.3
//IL_047f: ldloc.s V_11
//IL_0481: ldc.i4.2
//IL_0482: conv.i
//IL_0483: sub
//IL_0484: stloc.s V_9
//IL_0486: ldloc.s V_9
//IL_0488: ldc.i4.2
//IL_0489: conv.i
//IL_048a: add
//IL_048b: dup
//IL_048c: stloc.s V_9
//IL_048e: ldind.u2
//IL_048f: stloc.s V_10
//IL_0491: br IL_03cc
//IL_0496: ldloc.s V_7
//IL_0498: ldc.i4.2
//IL_0499: and
//IL_049a: brtrue.s IL_04c1
//IL_049c: ldloc.s V_7
//IL_049e: ldc.i4.8
//IL_049f: and
//IL_04a0: brtrue.s IL_04bb
//IL_04a2: ldarg.s parseDecimal
//IL_04a4: brtrue.s IL_04ad
//IL_04a6: ldarg.2
//IL_04a7: ldc.i4.0
//IL_04a8: stfld int32 System.Number/NumberBuffer::scale
//IL_04ad: ldloc.s V_7
//IL_04af: ldc.i4.s 16
//IL_04b1: and
//IL_04b2: brtrue.s IL_04bb
//IL_04b4: ldarg.2
//IL_04b5: ldc.i4.0
//IL_04b6: stfld bool System.Number/NumberBuffer::sign
//IL_04bb: ldarg.0
//IL_04bc: ldloc.s V_9
//IL_04be: stind.i
//IL_04bf: ldc.i4.1
//IL_04c0: ret
//IL_04c1: ldarg.0
//IL_04c2: ldloc.s V_9
//IL_04c4: stind.i
//IL_04c5: ldc.i4.0
//IL_04c6: ret
#endregion
string V_0, V_1, V_2, V_3, V_4, V_5;
bool V_6;
int V_7;
bool V_8;
char* V_9;
char V_10;
char* V_11;
int V_12, V13;
bool V14;
char* V_15;
int V_16;
number.scale=0;
number.sign=0;
V_2=null;
V_3=null;
V_4=null;
V_5=null;
V_6=false;
if ((options & NumberStyles.AllowCurrencySymbol) == 0)//跳往IL_005d
{
V_0 = numfmt.NumberDecimalSeparator;
V_1 = numfmt.NumberGroupSeparator;
//IL_006b
}
else
{
//IL_0024
V_2=numfmt.CurrencySymbol;
if (numfmt.ansiCurrencySymbol != null)//条件不满足跳往//IL_003a
{
//IL_0033
V_3 = numfmt.ansiCurrencySymbol;
}
//IL_003a
V_4 = numfmt.NumberDecimalSeparator;
V_5 = numfmt.NumberGroupSeparator;
V_0 = numfmt.CurrencyDecimalSeparator;
V_1 = numfmt.CurrencyGroupSeparator;
V_6 = true;
//无条件跳往IL_006b
}
//IL_006b
V_7 = 0;
V_8 = false;
V_9 = str;
V_10=*V_9;
#region 循环1
while (1 == 1)
{
if (Number.IsWhite(V_10))//IL_007a,不满足的话跳往IL_00ad
{
if ((options & NumberStyles.AllowLeadingWhite) != 0)//IL_0086,不满足跳往IL_00ad
{
//IL_0088
if ((V_7 & 1) == 0)//跳往IL_016c
{
}
else
{
//IL_0091
if ((V_7 & 1) != 0)//不满足跳往IL_00ad
{
//IL_0097
if ((V_7 & 32) == 0)
{
//IL_00a1
if (numfmt.numberNegativePattern == 2)//跳往IL_016c,不满足跳往IL_00ad
{
//IL_016c
}
}
else
{
//IL_016c
}
}
}
}
}
//IL_00ad
V_8 = (options & NumberStyles.AllowLeadingSign) != 0 ? (V_7 & 1) == 0 : false;
if (V_8)//不满足跳往IL_00e7
{
//IL_00c1
V_11 = Number.MatchChars(V_9, numfmt.positiveSign);
if (V_11 != null)//不满足跳往IL_00e7
{
//IL_00d5
V_7 = V_7 | 1;
V_9 = V_11 - 2;
//直接跳往IL_016c
}
}
//IL_00e7
if (V_8)
{
//IL_00eb
V_11 = Number.MatchChars(V_9, numfmt.negativeSign);
if (V_11 != null)
{
//IL_00ff
V_7 = V_7 | 1;
number.sign = 1;
V_9 = V_11 - 2;
//无条件跳往IL_016c
}
}
//IL_0115
if (V_10 == 40)//不满足跳往IL_0136
{
//IL_011b
if ((options & 16) != 0)//条件不满足跳往IL_0136
{
//IL_0121
if ((V_7 & 1) == 0)//条件不满足跳往IL_0136
{
//IL_0127
V_7 = V_7 | 3;
num.sign = 1;
//直接跳往IL_016c
}
}
}
//IL_0136
if (V_2 != null)//不满足跳往IL_0148
{
//IL_0139
V_11 = Number.MatchChars(V_9, V_2);
if (V_11 != null)//跳往IL_015a,不满足跳往IL_0148
{
//IL_015a
V_7 = V_7 | 32;
V_2 = null;
V_3 = null;
V_9 = V_11 - 2;
}
}
//IL_0148
if (V_3 != null)//不满足跳往IL_017c
{
//IL_014b
V_11 = Number.MatchChars(V_9, V_3);
if (V_11 != null)//不满足跳往IL_017c
{
//IL_015a
V_7 = V_7 | 32;
V_2 = null;
V_3 = null;
V_9 = V_11 - 2;
}
else
{
break;
}
}
else
{
break;
}
//IL_016c
V_9 = V_9 + 2;
V_10 = *V_9;//直接跳往IL_007a
}
#endregion
//IL_017c
V_12=0;
V_13=0;
#region 循环2
while (1 == 1)
{
//IL_0182
if ((V_10 >= 48 && V_10 <= 57) || ((options & NumberStyles.AllowHexSpecifier) != 0 && ((V_10 >= 97 && V_10 <= 102) || (V_10 >= 65 && V_10 <= 70))))
{
//IL_01b2
V_7 = V_7 | 4;
if (V_10 == 48)
{
if (V_7 & 8 == 0)
{
//IL_020c
if (V_7 & 16 != 0)
{
number.scale -= 1;
//直接跳往IL_02b4
}
//IL_02b4
V_9 = V_9 + 2;
V_10 = *V_9;
//直接跳往IL_0182
continue;
}
}
//IL_01c4
if (V_12 < 50)
{
*(number.digits + V_12 * 2) = V_10;
V_12 = V_12 + 1;
//IL_01de
if (V_10 == 48)
{
//IL_01e4
if (parseDecimal)
{
//IL_01e8
V_13 = V_12;
}
}
else
{
//IL_01e8
V_13 = V_12;
}
}
//IL_01ec
if ((V_7 & 16) == 0)
{
number.scale += 1;
//IL_0201
}
//IL_0201
V_7 = V_7 | 8;
//无条件跳往IL_02b4
V_9 = V_9 + 2;
V_10 = *V_9;
//直接跳往IL_0182
continue;
}
else
{
//IL_0229
if (options & 32 != 0)
{
if (V_7 & 16 == 0)
{
V_11 = System.Number.MatchChars(V_9, V_0);
if (V_11 == null)
{
//IL_0245
if (V_6)
{
if (V_7 & 32 == 0)
{
V_11 = System.Number.MatchChars(V_9, V_4);
if (V_11 != null)
{
//IL_0260
V_7 = V_7 | 16;
V_9 = V_11 - 2;
//直接跳往IL_02b4
V_9 = V_9 + 2;
V_10 = *V_9;
//直接跳往IL_0182
continue;
}
}
}
}
else
{
//IL_0260
V_7 = V_7 | 16;
V_9 = V_11 - 2;
//直接跳往IL_02b4
V_9 = V_9 + 2;
V_10 = *V_9;
//直接跳往IL_0182
continue;
}
}
}
//IL_0270
if (options & 64 == 0)
{
break;//IL_02c4
}
else
{
if (V_7 & 4 == 0)
{
break;//IL_02c4
}
else
{
if (V_7 & 16 == 0)
{
//IL_0283
V_11=System.Number.MatchChars(V_9,V_1);
if(V_11==null)
{
if(V_6)
{
//IL_0296
if(V_7&32==0)
{
V_11=System.Number.MatchChars(V_9,V_5);
if(V_11==null)
{
break;//IL_02c4
}
}
else
{
break;//IL_02c4
}
}
else
{
break;//IL_02c4
}
}
//IL_02ad
V_9 = V_11 - 2;
//IL_02b4
V_9 = V_9 + 2;
V_10 = *V_9;
//直接跳往IL_0182
continue;
}
else
{
break;//IL_02c4
}
}
}
}
}
#endregion
//IL_02c4
V_14=false;
number.precision=V_13;
*(number.digits+V_13*2)=0;
if(V_7&4==0)
{
//IL_04c1
str = V_9;
return false;
}
else
{
if (V_10 == 69 || V_10 == 101)
{
//IL_02f5
if (options & 0x80 != 0)//不满足跳往IL_03cc
{
V_15 = V_9;
V_9 = V_9 + 2;
V_10 = *V_9;
V_11 = System.Number.MatchChars(V_9, numfmt.positiveSign);
if (V_11 == null)
{
//IL_032e
V_11 = System.Number.MatchChars(V_9, numfmt.negativeSign);
if (V_11 == null)
{
//IL_034d
}
else
{
V_9 = V_11;
V_10 = *V_9;
V_14 = true;
//IL_034d
}
}
else
{
V_9 = V_11;
V_10 = *V_9;
//直接跳往IL_034d
}
//IL_034d
if (V_10 < 48)
{
//IL_03c3
V_9 = V_15;
V_10 = *V_9;
//IL_03cc
}
else
{
if (V_10 > 57)
{
//IL_03c3
V_9 = V_15;
V_10 = *V_9;
//IL_03cc
}
else
{
V_16 = 0;
do
{
//IL_035c
V_16 = V_16 * 10 + (V_10 - 48);
V_9 += 2;
V_10 = *V_9;
if (V_16 > 0x3e8)
{
//IL_037d
V_16 = 0x270f;
//IL_0391
while (V_10 >= 48 && V_10 <= 57)
{
//IL_0386
V_9 += 2;
V_10 = *V_9;
//IL_0391
}
}
} while (V_10 >= 48 && V_10 <= 57);//IL_039d,满足条件跳往//IL_035c
//IL_03a9
if (V_14)
{
V_16 = ~V_16;
}
//IL_03b2
number.scale += V_16;
//直接跳往IL_03cc
}
}
}
else
{
//IL_03cc
}
}
#region 循环3
while (1 == 1)
{
//IL_03cc
if (System.Number.IsWhite(V_10))
{
if (options & 2 != 0)
{
//IL_0486
V_9 += 2;
V_10 = *V_9;
//直接跳往IL_03cc
continue;
}
}
//IL_03dd
V_8 = options & 8 ? V_7 & 1 == 0 : false;
if (V_8)
{
//IL_03f1
V_11 = System.Number.MatchChars(V_9, numfmt.positiveSign);
if (V_11 != null)
{
V_7 = V_7 | 1;
V_9 = V_11 - 2;
//无条件跳往IL_0486
V_9 += 2;
V_10 = *V_9;
//直接跳往IL_03cc
continue;
}
}
//IL_0414
if (V_8)
{
V_11 = System.Number.MatchChars(V_9, numfmt.negativeSign);
if (V_11 != null)
{
//IL_042c
V_7 = V_7 | 1;
number.sign = true;
V_9 = V_11 - 2;
//直接跳往IL_0486
V_9 += 2;
V_10 = *V_9;
//直接跳往IL_03cc
continue;
}
}
//IL_0442
if (V_10 == 41)
{
if (V_7 & 2 != 0)
{
V_7 = V_7 & -3;
//无条件跳完IL_0486
V_9 += 2;
V_10 = *V_9;
//直接跳往IL_03cc
continue;
}
}
//IL_0457
if (V_2 != null)
{
V_11 = System.Number.MatchChars(V_9, V_2);
if (V_11 == null)//不满足跳往IL_047b
{
//IL_0469
if (V_3 == null)
{
break;
//IL_0496
}
else
{
V_11 = System.Number.MatchChars(V_9, V_3);
if (V_11 == null)//不满足跳往IL_047b
{
break;
//IL_0496
}
}
}
}
else
{
//IL_0469
if (V_3 == null)
{
break;
//IL_0496
}
else
{
V_11 = System.Number.MatchChars(V_9, V_3);
if (V_11 == null)//不满足跳往IL_047b
{
break;
//IL_0496
}
}
}
//IL_047b
V_2 = null;
V_3 = null;
V_9 = V_11 - 2;
V_9 = V_9 + 2;
V_10 = *V_9;
//直接跳往IL_03cc
}
#endregion
//IL_0496
if(V_7&2!=0)
{
//IL_04c1
str = V_9;
return false;
}
else
{
if (V_7 & 8 == 0)//不满足跳往IL_04bb
{
if (!parseDecimal)//不满足跳往IL_04ad
{
number.scale = 0;
//IL_04ad
}
//IL_04ad
if (V_7 & 16 == 0)//不满足跳往IL_04bb
{
//IL_04b4
number.sign = 0;
//IL_04bb
}
}
//IL_04bb
str = V_9;
return true;
}
}
}
internal static float ParseSingle(string @value, NumberStyles options, NumberFormatInfo numfmt)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1,
// float64 V_2,
// float32 V_3)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localloc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldc.r8 0.0
//IL_001d: stloc.2
//IL_001e: ldarg.0
//IL_001f: ldarg.1
//IL_0020: ldloca.s V_1
//IL_0022: ldarg.2
//IL_0023: ldc.i4.0
//IL_0024: call void System.Number::StringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_0029: ldloca.s V_1
//IL_002b: call instance uint8* System.Number/NumberBuffer::PackForNative()
//IL_0030: ldloca.s V_2
//IL_0032: call bool System.Number::NumberBufferToDouble(uint8*,
// float64&)
//IL_0037: brtrue.s IL_0049
//IL_0039: ldstr "Overflow_Single"
//IL_003e: call string System.Environment::GetResourceString(string)
//IL_0043: newobj instance void System.OverflowException::.ctor(string)
//IL_0048: throw
//IL_0049: ldloc.2
//IL_004a: conv.r4
//IL_004b: stloc.3
//IL_004c: ldloc.3
//IL_004d: call bool System.Single::IsInfinity(float32)
//IL_0052: brfalse.s IL_0064
//IL_0054: ldstr "Overflow_Single"
//IL_0059: call string System.Environment::GetResourceString(string)
//IL_005e: newobj instance void System.OverflowException::.ctor(string)
//IL_0063: throw
//IL_0064: ldloc.3
//IL_0065: ret
byte* V_0 = stackalloc byte[1 * 114];
System.Number.NumberBuffer V_1;
double V_2;
float V_3;
V_1 = new System.Number.NumberBuffer(V_0);
V_2 = 0.0d;
System.Number.StringToNumber(@value, options, ref V_1, numfmt, false);
if (System.Number.NumberBufferToDouble(V_1.PackForNative(), ref V_2))
{
V_3 = (float)V_2;
if (System.Single.IsInfinity(V_3))
{
throw new System.OverflowException(System.Environment.GetResourceString("Overflow_Single"));
}
else
{
return V_3;
}
}
else
{
throw new System.OverflowException(System.Environment.GetResourceString("Overflow_Single"));
}
}
internal static uint ParseUInt32(string @value, NumberStyles options, NumberFormatInfo numfmt)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1,
// uint32 V_2)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localloc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldc.i4.0
//IL_0015: stloc.2
//IL_0016: ldarg.0
//IL_0017: ldarg.1
//IL_0018: ldloca.s V_1
//IL_001a: ldarg.2
//IL_001b: ldc.i4.0
//IL_001c: call void System.Number::StringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_0021: ldarg.1
//IL_0022: ldc.i4 0x200
//IL_0027: and
//IL_0028: brfalse.s IL_0045
//IL_002a: ldloca.s V_1
//IL_002c: ldloca.s V_2
//IL_002e: call bool System.Number::HexNumberToUInt32(valuetype System.Number/NumberBuffer&,
// uint32&)
//IL_0033: brtrue.s IL_0060
//IL_0035: ldstr "Overflow_UInt32"
//IL_003a: call string System.Environment::GetResourceString(string)
//IL_003f: newobj instance void System.OverflowException::.ctor(string)
//IL_0044: throw
//IL_0045: ldloca.s V_1
//IL_0047: ldloca.s V_2
//IL_0049: call bool System.Number::NumberToUInt32(valuetype System.Number/NumberBuffer&,
// uint32&)
//IL_004e: brtrue.s IL_0060
//IL_0050: ldstr "Overflow_UInt32"
//IL_0055: call string System.Environment::GetResourceString(string)
//IL_005a: newobj instance void System.OverflowException::.ctor(string)
//IL_005f: throw
//IL_0060: ldloc.2
//IL_0061: ret
byte* V_0 = stackalloc byte[1 * 114];
System.Number.NumberBuffer V_1;
uint V_2;
V_1 = new System.Number.NumberBuffer(V_0);
V_2 = 0;
System.Number.StringToNumber(s, style, ref V_1, info, false);
if (style & NumberStyles.AllowHexSpecifier != 0)
{
if (System.Number.HexNumberToUInt32(ref V_1, ref V_2))
{
return V_2;
}
else
{
throw new System.OverflowException(System.Environment.GetResourceString("Overflow_UInt32"));
}
}
else
{
//IL_0045
if (System.Number.NumberToUInt32(ref V_1, ref V_2))
{
return V_2;
}
throw new System.OverflowException(System.Environment.GetResourceString("Overflow_UInt32"));
}
}
internal static ulong ParseUInt64(string @value, NumberStyles options, NumberFormatInfo numfmt)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1,
// uint64 V_2)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localloc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldc.i4.0
//IL_0015: conv.i8
//IL_0016: stloc.2
//IL_0017: ldarg.0
//IL_0018: ldarg.1
//IL_0019: ldloca.s V_1
//IL_001b: ldarg.2
//IL_001c: ldc.i4.0
//IL_001d: call void System.Number::StringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_0022: ldarg.1
//IL_0023: ldc.i4 0x200
//IL_0028: and
//IL_0029: brfalse.s IL_0046
//IL_002b: ldloca.s V_1
//IL_002d: ldloca.s V_2
//IL_002f: call bool System.Number::HexNumberToUInt64(valuetype System.Number/NumberBuffer&,
// uint64&)
//IL_0034: brtrue.s IL_0061
//IL_0036: ldstr "Overflow_UInt64"
//IL_003b: call string System.Enviroment::GetResourceString(string)
//IL_0040: newobj instance void System.OverflowException::.ctor(string)
//IL_0045: throw
//IL_0046: ldloca.s V_1
//IL_0048: ldloca.s V_2
//IL_004a: call bool System.Number::NumberToUInt64(valuetype System.Number/NumberBuffer&,
// uint64&)
//IL_004f: brtrue.s IL_0061
//IL_0051: ldstr "Overflow_UInt64"
//IL_0056: call string System.Environment::GetResourceString(string)
//IL_005b: newobj instance void System.OverflowException::.ctor(string)
//IL_0060: throw
//IL_0061: ldloc.2
//IL_0062: ret
byte* V_0 = stackalloc byte[1 * 114];
System.Number.NumberBuffer V_1;
ulong V_2;
V_1 = new System.Number.NumberBuffer(V_0);
V_2 = 0L;
System.Number.StringToNumber(@value, options, ref V_1, numfmt, false);
if (options & NumberStyles.AllowHexSpecifier != 0)
{
if (System.Number.HexNumberToUInt64(ref V_1, ref V_2))
{
return V_2;
}
else
{
throw new System.OverflowException(System.Environment.GetResourceString("Overflow_UInt64"));
}
}
else
{
if (System.Number.NumberToUInt64(ref V_1, ref V_2))
{
return V_2;
}
else
{
throw new System.OverflowException(System.Environment.GetResourceString("Overflow_UInt64"));
}
}
}
private static void StringToNumber(string str, NumberStyles options, ref NumberBuffer number, NumberFormatInfo info, bool parseDecimal)
{
//.maxstack 5
//.locals init (char* V_0,
// char* V_1,
// string pinned V_2)
//IL_0000: ldarg.0
//IL_0001: brtrue.s IL_000e
//IL_0003: ldstr "String"
//IL_0008: newobj instance void System.ArgumentNullException::.ctor(string)
//IL_000d: throw
//IL_000e: ldarg.0
//IL_000f: stloc.2
//IL_0010: ldloc.2
//IL_0011: conv.i
//IL_0012: dup
//IL_0013: brfalse.s IL_001b
//IL_0015: call int32 System.Runtime.CompilerServices.RuntimeHelpers::get_OffsetToStringData()
//IL_001a: add
//IL_001b: stloc.0
//IL_001c: ldloc.0
//IL_001d: stloc.1
//IL_001e: ldloca.s V_1
//IL_0020: ldarg.1
//IL_0021: ldarg.2
//IL_0022: ldarg.3
//IL_0023: ldarg.s parseDecimal
//IL_0025: call bool System.Number::ParseNumber(char*&,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_002a: brfalse.s IL_004a
//IL_002c: ldloc.1
//IL_002d: ldloc.0
//IL_002e: sub
//IL_002f: ldc.i4.2
//IL_0030: div
//IL_0031: conv.i8
//IL_0032: ldarg.0
//IL_0033: callvirt instance int32 System.String::get_Length()
//IL_0038: conv.i8
//IL_0039: bge.s IL_005a
//IL_003b: ldarg0
//IL_003c: ldloc.1
//IL_003d: ldloc.0
//IL_003e: sub
//IL_003f: ldc.i4.2
//IL_0040: div
//IL_0041: conv.i8
//IL_0042: conv.i4
//IL_0043: call bool System.Number::TrailingZeros(string,
// int32)
//IL_0048: brtrue.s IL_005a
//IL_004a: ldstr "Format_InvalidString"
//IL_004f: call string System.Environment::GetResourceString(string)
//IL_0054: newobj instance void System.FormatException::.ctor(string)
//IL_0059: throw
//IL_005a: ldnull
//IL_005b: stloc.2
//IL_005c: ret
char* V_0, V_1;
if (str == null)
{
throw new ArgumentNullException("String");
}
else
{
fixed (char* V_2 = str)
{
V_0 = V_2 != null ? V_2 + RuntimeHelpers.OffsetToStringData : V_2;
V_1 = V_0;
if (Number.ParseNumber(ref V_1, options, ref number, info, parseDecimal))
{
if ( (long)((V_1 - V_0) / 2) >= (long)str.Length ||Number.TrailingZeros(str, (int)(long)((V_1 - V_0) / 2)) )
{
//V_2 = null;
return;
}
}
throw new FormatException(System.Environment.GetResourceString("Format_InvalidString"));
}
}
}
private static bool TrailingZeros(string s, int index)
{
//.maxstack 2
//.locals init (int32 V_0)
//IL_0000: ldarg.1
//IL_0001: stloc.0
//IL_0002: br.s IL_0013
//IL_0004: ldarg.0
//IL_0005: ldloc.0
//IL_0006: callvirt instance char System.String::get_Chars(int32)
//IL_000b: brfalse.s IL_000f
//IL_000d: ldc.i4.0
//IL_000e: ret
//IL_000f: ldloc.0
//IL_0010: ldc.i4.1
//IL_0011: add
//IL_0012: stloc.0
//IL_0013: ldloc.0
//IL_0014: ldarg.0
//IL_0015: callvirt instance int32 System.String::get_Length()
//IL_001a: blt.s IL_0004
//IL_001c: ldc.i4.1
//IL_001d: ret
for (int V_0 = index; V_0 < s.Length;V_0++ )
{
if (s[V_0] != '\0') return false;
}
return true;
}
internal static bool TryParseDecimal(string @value, NumberStyles options, NumberFormatInfo numfmt, out decimal result)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localloc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldarg.3
//IL_0015: ldc.i4.0
//IL_0016: newobj instance void System.Decimal::.ctor(int32)
//IL_001b: stobj System.Decimal
//IL_0020: ldarg.0
//IL_0021: ldarg.1
//IL_0022: ldloca.s V_1
//IL_0024: ldarg.2
//IL_0025: ldc.i4.1
//IL_0026: call bool System.Number::TryStringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_002b: brtrue.s IL_002f
//IL_002d: ldc.i4.0
//IL_002e: ret
//IL_002f: ldloca.s V_1
//IL_0031: call instance uint8* System.Number/NumberBuffer::PackForNative()
//IL_0036: ldarg.3
//IL_0037: call bool System.Number::NumberBufferToDecimal(uint8*,
// valuetype System.Decimal&)
//IL_003c: brtrue.s IL_0040
//IL_003e: ldc.i4.0
//IL_003f: ret
//IL_0040: ldc.i4.1
//IL_0041: ret
byte* V_0=stackalloc byte[1*114];
System.Number.NumberBuffer V_1;
V_1=new System.Number.NumberBuffer(V_0);
result=new decimal(0);
if(System.Number.TryStringToNumber(@value,options,ref V_1,numfmt,true))
{
//IL_002f
if (System.Number.NumberBufferToDecimal(V_1.PackForNative(), out result))
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
}
internal static bool TryParseDouble(string @value, NumberStyles options, NumberFormatInfo numfmt, out double result)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localloc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldarg.3
//IL_0015: ldc.r8 0.0
//IL_001e: stind.r8
//IL_001f: ldarg.0
//IL_0020: ldarg.1
//IL_0021: ldloca.s V_1
//IL_0023: ldarg.2
//IL_0024: ldc.i4.0
//IL_0025: call bool System.Number::TryStringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_002a: brtrue.s IL_002e
//IL_002c: ldc.i4.0
//IL_002d: ret
//IL_002e: ldloca.s V_1
//IL_0030: call instance uint8* System.Number/NumberBuffer::PackForNative()
//IL_0035: ldarg.3
//IL_0036: call bool System.Number::NumberBufferToDouble(uint8*,
// float64&)
//IL_003b: brtrue.s IL_003f
//IL_003d: ldc.i4.0
//IL_003e: ret
//IL_003f: ldc.i4.1
//IL_0040: ret
byte* V_0=stackalloc byte[1*114];
System.Number.NumberBuffer V_1;
V_1=new System.Number.NumberBuffer(V_0);
result=0.0d;
if(System.Number.TryStringToNumber(@value,options,ref V_1,numfmt,false))
{
//IL_002e
if (System.Number.NumberBufferToDouble(V_1.PackForNative(), out result))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
internal static bool TryParseInt32(string s, NumberStyles style, NumberFormatInfo info, out int result)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localloc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldarg.3
//IL_0015: ldc.i4.0
//IL_0016: stind.i4
//IL_0017: ldarg.0
//IL_0018: ldarg.1
//IL_0019: ldloca.s V_1
//IL_001b: ldarg.2
//IL_001c: ldc.i4.0
//IL_001d: call bool System.Number::TryStringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_0022: brtrue.s IL_0026
//IL_0024: ldc.i4.0
//IL_0025: ret
//IL_0026: ldarg.1
//IL_0027: ldc.i4 0x200
//IL_002c: and
//IL_002d: brfalse.s IL_003b
//IL_002f: ldloca.s V_1
//IL_0031: ldarg.3
//IL_0032: call bool System.Number::HexNumberToInt32(valuetype System.Number/NumberBuffer&,
// int32&)
//IL_0037: brtrue.s IL_0047
//IL_0039: ldc.i4.0
//IL_003a: ret
//IL_003b: ldloca.s V_1
//IL_003d: ldarg.3
//IL_003e: call bool System.Number::NumberToInt32(valuetype System.Number/NumberBuffer&,
// int32&)
//IL_0043: brtrue.s IL_0047
//IL_0045: ldc.i4.0
//IL_0046: ret
//IL_0047: ldc.i4.1
//IL_0048: ret
byte* V_0=stackalloc byte[1*114];
System.Number.NumberBuffer V_1;
V_1=new System.Number.NumberBuffer(V_0);
result=0;
if(System.Number.TryStringToNumber(s,style,ref V_1,info,false))
{
//IL_0026
if ((style & NumberStyles.AllowHexSpecifier) == 0)
{
if (System.Number.NumberToInt32(ref V_1, out result))
{
return true;
}
else
{
return false;
}
}
else
{
if (System.Number.HexNumberToInt32(ref V_1, out result))
{
return true;
}
else
{
return false;
}
}
}
else
{
return false;
}
}
internal static bool TryParseInt64(strin s, NumberStyles style, NumberFormatInfo info, out long result)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localloc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldarg.3
//IL_0015: ldc.i4.0
//IL_0016: conv.i8
//IL_0017: stind.i8
//IL_0018: ldarg.0
//IL_0019: ldarg.1
//IL_001a: ldloca.s V_1
//IL_001c: ldarg.2
//IL_001d: ldc.i4.0
//IL_001e: call bool System.Number::TryStringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_0023: brtrue.s IL_0027
//IL_0025: ldc.i4.0
//IL_0026: ret
//IL_0027: ldarg.1
//IL_0028: ldc.i4 0x200
//IL_002d: and
//IL_002e: brfalse.s IL_003c
//IL_0030: ldloca.s V_1
//IL_0032: ldarg.3
//IL_0033: call bool System.Number::HexNumberToInt64(valuetype System.Number/NumberBuffer&,
// int64&)
//IL_0038: brtrue.s IL_0048
//IL_003a: ldc.i4.0
//IL_003b: ret
//IL_003c: ldloca.s V_1
//IL_003e: ldarg.3
//IL_003f: call bool System.Number::NumberToInt64(valuetype System.Number/NumberBuffer&,
// int64&)
//IL_0044: brtrue.s IL_0048
//IL_0046: ldc.i4.0
//IL_0047: ret
//IL_0048: ldc.i4.1
//IL_0049: ret
byte* V_0 = stackalloc byte[1 * 114];
System.Number.NumberBuffer V_1;
V_1 = new System.Number.NumberBuffer(V_0);
result = 0L;
if (System.Number.TryStringToNumber(s, style, ref V_1, info, false))
{
//IL_0026
if ((style & NumberStyles.AllowHexSpecifier) == 0)
{
if (System.Number.NumberToInt64(ref V_1, out result))
{
return true;
}
else
{
return false;
}
}
else
{
if (System.Number.HexNumberToInt64(ref V_1, out result))
{
return true;
}
else
{
return false;
}
}
}
else
{
return false;
}
}
internal static bool TryParseSingle(string @value, NumberStyles options, NumberFormatInfo numfmt, out float result)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1,
// float64 V_2,
// float32 V_3)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localoc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldarg.3
//IL_0015: ldc.r4 0.0
//IL_001a: stind.r4
//IL_001b: ldc.r8 0.0
//IL_0024: stloc.2
//IL_0025: ldarg.0
//IL_0026: ldarg.1
//IL_0027: ldloca.s V_1
//IL_0029: ldarg.2
//IL_002a: ldc.i4.0
//IL_002b: call bool System.Number::TryStringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_0030: brtrue.s IL_0034
//IL_0032: ldc.i4.0
//IL_0033: ret
//IL_0034: ldloca.s V_1
//IL_0036: call instance uint8* System.Number/NumberBuffer::PackForNative()
//IL_003b: ldloca.s V_2
//IL_003d: call bool System.Number::NumberBufferToDouble(uint8*,
// float64&)
//IL_0042: brtrue.s IL_0046
//IL_0044: ldc.i4.0
//IL_0045: ret
//IL_0046: ldloc.2
//IL_0047: conv.r4
//IL_0048: stloc.3
//IL_0049: ldloc.3
//IL_004a: call bool System.Single::IsInfinity(float32)
//IL_004f: brfalse.s IL_0053
//IL_0051: ldc.i4.0
//IL_0052: ret
//IL_0053: ldarg.3
//IL_0054: ldloc.3
//IL_0055: stind.r4
//IL_0056: ldc.i4.1
//IL_0057: ret
}
internal static bool TryParseUInt32(string s, NumberStyles style, NumberFormatInfo info, out uint result)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localloc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldarg.3
//IL_0015: ldc.i4.0
//IL_0016: stind.i4
//IL_0017: ldarg.0
//IL_0018: ldarg.1
//IL_0019: ldloca.s V_1
//IL_001b: ldarg.2
//IL_001c: ldc.i4.0
//IL_001d: call bool System.Number::TryStringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_0022: brtrue.s IL_0026
//IL_0024: ldc.i4.0
//IL_0025: ret
//IL_0026: ldarg.1
//IL_0027: ldc.i4 0x200
//IL_002c: and
//IL_002d: brfalse.s IL_003b
//IL_002f: ldloca.s V_1
//IL_0031: ldarg.3
//IL_0032: call bool System.Number::HexNumberToUInt32(valuetype System.Number/NumberBuffer&,
// uint32&)
//IL_0037: brtrue.s IL_0047
//IL_0039: ldc.i4.0
//IL_003a: ret
//IL_003b: ldloca.s V_1
//IL_003d: ldarg.3
//IL_003e: call bool System.Number::NumberToUInt32(valuetype System.Number/NumberBuffer&,
// uint32&)
//IL_0043: brtrue.s IL_0047
//IL_0045: ldc.i4.0
//IL_0046: ret
//IL_0047: ldc.i4.1
//IL_0048: ret
byte* V_0 = stackalloc byte[1 * 114];
System.Number.NumberBuffer V_1;
V_1 = new System.Number.NumberBuffer(V_0);
result = 0;
if (System.Number.TryStringToNumber(s, style, ref V_1, info, false))
{
//IL_0026
if ((style & NumberStyles.AllowHexSpecifier) == 0)
{
if (System.Number.NumberToUInt32(ref V_1, out result))
{
return true;
}
else
{
return false;
}
}
else
{
if (System.Number.HexNumberToUInt32(ref V_1, out result))
{
return true;
}
else
{
return false;
}
}
}
else
{
return false;
}
}
internal static bool TryParseUInt64(string s, NumberStyles style, NumberFormatInfo info, out ulong result)
{
//.maxstack 5
//.locals init (uint8* V_0,
// valuetype System.Number/NumberBuffer V_1)
//IL_0000: ldc.i4.1
//IL_0001: ldc.i4.s 114
//IL_0003: mul
//IL_0004: localloc
//IL_0006: stloc.0
//IL_0007: ldloca.s V_1
//IL_0009: ldloc.0
//IL_000a: newobj instance void System.Number/NumberBuffer::.ctor(uint8*)
//IL_000f: stobj System.Number/NumberBuffer
//IL_0014: ldarg.3
//IL_0015: ldc.i4.0
//IL_0016: conv.i8
//IL_0017: stind.i8
//IL_0018: ldarg.0
//IL_0019: ldarg.1
//IL_001a: ldloca.s V_1
//IL_001c: ldarg.2
//IL_001d: ldc.i4.0
//IL_001e: call bool System.Number::TryStringToNumber(string,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_0023: brtrue.s IL_0027
//IL_0025: ldc.i4.0
//IL_0026: ret
//IL_0027: ldarg.1
//IL_0028: ldc.i4 0x200
//IL_002d: and
//IL_002e: brfalse.s IL_003c
//IL_0030: ldloca.s V_1
//IL_0032: ldarg.3
//IL_0033: call bool System.Number::HexNumberToUInt64(valuetype System.Number/NumberBuffer&,
// uint64&)
//IL_0038: brtrue.s IL_0048
//IL_003a: ldc.i4.0
//IL_003b: ret
//IL_003c: ldloca.s V_1
//IL_003e: ldarg.3
//IL_003f: call bool System.Number::NumberToUInt64(valuetype System.Number/NumberBuffer&,
// uint64&)
//IL_0044: brtrue.s IL_0048
//IL_0046: ldc.i4.0
//IL_0047: ret
//IL_0048: ldc.i4.1
//IL_0049: ret
byte* V_0 = stackalloc byte[1 * 114];
System.Number.NumberBuffer V_1;
V_1 = new System.Number.NumberBuffer(V_0);
result = 0uL;
if (System.Number.TryStringToNumber(s, style, ref V_1, info, false))
{
//IL_0026
if ((style & NumberStyles.AllowHexSpecifier) == 0)
{
if (System.Number.NumberToUInt64(ref V_1, out result))
{
return true;
}
else
{
return false;
}
}
else
{
if (System.Number.HexNumberToUInt64(ref V_1, out result))
{
return true;
}
else
{
return false;
}
}
}
else
{
return false;
}
}
private static bool TryStringToNumber(string str, NumberStyles options, ref NumberBuffer number, NumberFormatInfo numfmt, bool parseDecimal)
{
//.maxstack 5
//.locals init (char* V_0,
// char* V_1,
// bool V_2,
// string pinned V_3)
//IL_0000: ldarg.0
//IL_0001: brtrue.s IL_0005
//IL_0003: ldc.i4.0
//IL_0004: ret
//IL_0005: ldarg.0
//IL_0006: stloc.3
//IL_0007: ldloc.3
//IL_0008: conv.i
//IL_0009: dup
//IL_000a: brfalse.s IL_0012
//IL_000c: call int32 System.Runtime.CompilerServices.RuntimeHelpers::get_OffsetToStringData()
//IL_0011: add
//IL_0012: stloc.0
//IL_0013: ldloc.0
//IL_0014: stloc.1
//IL_0015: ldloca.s V_1
//IL_0017: ldarg.1
//IL_0018: ldarg.2
//IL_0019: ldarg.3
//IL_001a: ldarg.s parseDecimal
//IL_001c: call bool System.Number::ParseNumber(char*&,
// valuetype System.Globalization.NumberStyles,
// valuetype System.Number/NumberBuffer&,
// class System.Globalization.NumberFormatInfo,
// bool)
//IL_0021: brfalse.s IL_0041
//IL_0023: ldloc.1
//IL_0024: ldloc.0
//IL_0025: sub
//IL_0026: ldc.i4.2
//IL_0027: div
//IL_0028: conv.i8
//IL_0029: ldarg.0
//IL_002a: callvirt instance int32 System.String::get_Length()
//IL_002f: conv.i8
//IL_0030: bge.s IL_0045
//IL_0032: ldarg.0
//IL_0033: ldloc.1
//IL_0034: ldloc.0
//IL_0035: sub
//IL_0036: ldc.i4.2
//IL_0037: div
//IL_0038: conv.i8
//IL_0039: conv.i4
//IL_003a: call bool System.Number::TrailingZeros(string,
// int32)
//IL_003f: brtrue.s IL_0045
//IL_0041: ldc.i4.0
//IL_0042: stloc.2
//IL_0043: leave.s IL_0049
//IL_0045: ldnull
//IL_0046: stloc.
//IL_0047: ldc.i4.1
//IL_0048: ret
//IL_0049: ldloc.2
//IL_004a: ret
char* V_0, V_1;
bool V_2;
if (str == null)
{
return false;
}
else
{
fixed (char* V_3 = str)
{
V_0 = V_3 == null ? V_3 : V_3 + System.Runtime.CompilerServices.RuntimeHelpers.OffsetToStringData;
V_1 = V_0;
if (ParseNumber(ref V_1, options, ref number, numfmt, parseDecimal))
{
//IL_0023
if ((int)(long)((V_1 - V_0) / 2) >= (long)str.Length)
{
//IL_0045
//V_3 = null;
return true;
}
else
{
//IL_0032
if (TrailingZeros(str, (int)(long)((V_1 - V_0) / 2)))
{
//IL_0045
//V_3 = null;
return true;
}
else
{
V_2 = false;
return V_2;
}
}
}
else
{
//IL_0041
V_2 = false;
return V_2;
}
}
}
}
}
}