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);
            }
}
}
}

posted @ 2010-08-28 21:23  Aegis  阅读(299)  评论(0编辑  收藏  举报