System.Utf8String
using System.Runtime.CompilerServices;
using System.Reflection;
namespace System
{
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
internal struct Utf8String
{
private void* m_pStringHeap;
private int m_StringHeapByteLength;
[MethodImpl(MethodImplAttributes.InternalCall)]
private static bool EqualsCaseSensitive(void* szLhs,void* szRhs,int cSz)
{
}
[MethodImpl(MethodImplAttributes.InternalCall)]
private static bool EqualsCaseInsensitive(void* szLhs,void* szRhs,int cSz)
{
}
private static int GetUtf8StringByteLength(void* pUtf8String)
{
//.maxstack 2
//.locals init (int32 V_0,
//uint8* V_1)
//IL_0000: ldc.i4.0
//IL_0001: stloc.0
//IL_0002: ldarg.0
//IL_0003: stloc.1
//IL_0004: br.s IL_000f
//IL_0006: ldloc.0
//IL_0007: ldc.i4.1
//IL_0008: add
//IL_0009: stloc.0
//IL_000a: ldloc.1
//IL_000b: ldc.i4.1
//IL_000c: conv.i
//IL_000d: add
//IL_000e: stloc.1
//IL_000f: ldloc.1
//IL_0010: ldind.u1
//IL_0011: brtrue.s IL_0006
//IL_0013: ldloc.0
//IL_0014: ret
int V_0;
byte* V_1;
V_0 = 0;
V_1=(byte*)pUtf8String;
//IL_000f
while(*V_1!=0)
{
V_0 += 1;
V_1 += 1;
//IL_000f
}
return V_0;
}
internal Utf8String(void* pStringHeap)
{
//.maxstack 8
//IL_0000: ldarg.0
//IL_0001: ldarg.1
//IL_0002: stfld void* System.Utf8String::m_pStringHeap
//IL_0007: ldarg.1
//IL_0008: ldc.i4.0
//IL_0009: conv.u
//IL_000a: beq.s IL_0019
//IL_000c: ldarg.0
//IL_000d: ldarg.1
//IL_000e: call int32 System.Utf8String::GetUtf8StringByteLength(void*)
//IL_0013: stfld int32 System.Utf8String::m_StringHeapByteLength
//IL_0018: ret
//IL_0019: ldarg.0
//IL_001a: ldc.i4.0
//IL_001b: stfld int32 System.Utf8String::m_StringHeapByteLength
//IL_0020: ret
this.m_pStringHeap = pStringHeap;
if (pStringHeap == System.IntPtr.Zero)
{
this.m_StringHeapByteLength = 0;
}
else
{
this.m_StringHeapByteLength = System.Utf8String.GetUtf8StringByteLength(pStringHeap);
}
}
internal Utf8String(void* pUtf8String,int cUtf8String)
{
//.maxstack 8
//IL_0000: ldarg.0
//IL_0001: ldarg.1
//IL_0002: stfld void* System.Utf8String::m_pStringHeap
//IL_0007: ldarg.0
//IL_0008: ldarg.2
//IL_0009: stfld int32 System.Utf8String::m_StringHeapByteLength
//IL_000e: ret
this.m_pStringHeap = pUtf8String;
this.m_StringHeapByteLength = cUtf8String;
}
internal bool Equals(System.Utf8String s)
{
//.maxstack 3
//IL_0000: ldarg.0
//IL_0001: ldfld void* System.Utf8String::m_pStringHeap
//IL_0006: ldc.i4.0
//IL_0007: conv.u
//IL_0008: bne.un.s IL_0015
//IL_000a: ldarga.s s
//IL_000c: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_0011: ldc.i4.0
//IL_0012: ceq
//IL_0014: ret
//IL_0015: ldarga.s s
//IL_0017: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_001c: ldarg.0
//IL_001d: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_0022: bne.un.s IL_0045
//IL_0024: ldarg.0
//IL_0025: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_002a: brfalse.s IL_0045
//IL_002c: ldarga.s s
//IL_002e: ldfld void* System.Utf8String::m_pStringHeap
//IL_0033: ldarg.0
//IL_0034: ldfld void* System.Utf8String::m_pStringHeap
//IL_0039: ldarg.0
//IL_003a: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_003f: call bool System.Utf8String::EqualsCaseSensitive(void*,
//void*,
//int32)
//IL_0044: ret
//IL_0045: ldc.i4.0
//IL_0046: ret
if (this.m_pStringHeap == System.IntPtr.Zero)
{
return s.m_StringHeapByteLength == 0;
}
else
{
if (s.m_StringHeapByteLength == this.m_StringHeapByteLength && this.m_StringHeapByteLength != 0)
{
return System.Utf8String.EqualsCaseSensitive(s.m_pStringHeap, this.m_pStringHeap, this.m_StringHeapByteLength);
}
else
{
return false;
}
}
}
internal bool EqualsCaseInsensitive(System.Utf8String s)
{
//.maxstack 3
//IL_0000: ldarg.0
//IL_0001: ldfld void* System.Utf8String::m_pStringHeap
//IL_0006: ldc.i4.0
//IL_0007: conv.u
//IL_0008: bne.un.s IL_0015
//IL_000a: ldarga.s s
//IL_000c: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_0011: ldc.i4.0
//IL_0012: ceq
//IL_0014: ret
//IL_0015: ldarga.s s
//IL_0017: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_001c: ldarg.0
//IL_001d: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_0022: bne.un.s IL_0045
//IL_0024: ldarg.0
//IL_0025: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_002a: brfalse.s IL_0045
//IL_002c: ldarga.s s
//IL_002e: ldfld void* System.Utf8String::m_pStringHeap
//IL_0033: ldarg.0
//IL_0034: ldfld void* System.Utf8String::m_pStringHeap
//IL_0039: ldarg.0
//IL_003a: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_003f: call bool System.Utf8String::EqualsCaseInsensitive(void*,
//void*,
//int32)
//IL_0044: ret
//IL_0045: ldc.i4.0
//IL_0046: ret
if (this.m_pStringHeap == System.IntPtr.Zero)
{
return s.m_StringHeapByteLength == 0;
}
else
{
if (s.m_StringHeapByteLength == this.m_StringHeapByteLength && this.m_StringHeapByteLength != 0)
{
return System.Utf8String.EqualsCaseInsensitive(s.m_pStringHeap, this.m_pStringHeap, this.m_StringHeapByteLength);
}
else
{
return false;
}
}
}
public override string ToString()
{
//.maxstack 5
//.locals init (uint8* V_0,
//uint8* V_1,
//int32 V_2,
//int32 V_3,
//char* V_4)
//IL_0000: ldc.i4.1
//IL_0001: ldarg.0
//IL_0002: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_0007: mul
//IL_0008: localloc
//IL_000a: stloc.0
//IL_000b: ldarg.0
//IL_000c: ldfld void* System.Utf8String::m_pStringHeap
//IL_0011: stloc.1
//IL_0012: ldc.i4.0
//IL_0013: stloc.2
//IL_0014: br.s IL_0025
//IL_0016: ldloc.0
//IL_0017: ldloc.2
//IL_0018: add
//IL_0019: ldloc.1
//IL_001a: ldind.u1
//IL_001b: stind.i1
//IL_001c: ldloc.1
//IL_001d: ldc.i4.1
//IL_001e: conv.i
//IL_001f: add
//IL_0020: stloc.1
//IL_0021: ldloc.2
//IL_0022: ldc.i4.1
//IL_0023: add
//IL_0024: stloc.2
//IL_0025: ldloc.2
//IL_0026: ldarg.0
//IL_0027: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_002c: blt.s IL_0016
//IL_002e: ldarg.0
//IL_002f: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_0034: brtrue.s IL_003c
//IL_0036: ldstr ""
//IL_003b: ret
//IL_003c: call class System.Text.Encoding System.Text.Encoding::get_UTF8()
//IL_0041: ldloc.0
//IL_0042: ldarg.0
//IL_0043: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_0048: callvirt instance int32 System.Text.Encoding::GetCharCount(uint8*,
//int32)
//IL_004d: stloc.3
//IL_004e: ldc.i4.2
//IL_004f: ldloc.3
//IL_0050: mul
//IL_0051: localloc
//IL_0053: stloc.s V_4
//IL_0055: call class System.Text.Encoding System.Text.Encoding::get_UTF8()
//IL_005a: ldloc.0
//IL_005b: ldarg.0
//IL_005c: ldfld int32 System.Utf8String::m_StringHeapByteLength
//IL_0061: ldloc.s V_4
//IL_0063: ldloc.3
//IL_0064: callvirt instance int32 System.Text.Encoding::GetChars(uint8*,
//int32,
//char*,
//int32)
//IL_0069: pop
//IL_006a: ldloc.s V_4
//IL_006c: ldc.i4.0
//IL_006d: ldloc.3
//IL_006e: newobj instance void System.String::.ctor(char*,
//int32,
//int32)
//IL_0073: ret
byte* V_1;
int V_2, V_3;
char* V_4;
byte* V_0 = stackalloc byte[1 * this.m_StringHeapByteLength];
V_1 = this.m_pStringHeap;
V_2 = 0;
//直接跳往IL_0025
while(V_2<this.m_StringHeapByteLength)
{
//IL_0016
*(V_0 + V_2) = *V_1;
V_1 += 1;
V_2 += 1;
//IL_0025
continue;
}
//IL_002e
if(this.m_StringHeapByteLength==0)
{
return "";
}
else
{
V_3=System.Text.Encoding.UTF8.GetCharCount(V_0,this.m_StringHeapByteLength);
//IL_004e
char* V_4=stackalloc char[V_3];
System.Text.Encoding.UTF8.GetChars(V_0, this.m_StringHeapByteLength, V_4, V_3);
return new string(V_4, 0, V_3);
}
}
}
}