示例#1
0
文件: Heaps.cs 项目: yang73137/corefx
        internal string GetString(StringHandle handle, MetadataStringDecoder utf8Decoder)
        {
            byte[] prefix;

            if (handle.IsVirtual)
            {
                switch (handle.StringKind)
                {
                case StringKind.Virtual:
                    return(s_virtualValues[(int)handle.GetVirtualIndex()]);

                case StringKind.WinRTPrefixed:
                    prefix = MetadataReader.WinRTPrefix;
                    break;

                default:
                    Debug.Assert(false, "We should not get here");
                    return(null);
                }
            }
            else
            {
                prefix = null;
            }

            int  bytesRead;
            char otherTerminator = handle.StringKind == StringKind.DotTerminated ? '.' : '\0';

            return(this.Block.PeekUtf8NullTerminated(handle.GetHeapOffset(), prefix, utf8Decoder, out bytesRead, otherTerminator));
        }
示例#2
0
        private MemoryBlock GetVirtualHandleMemoryBlock(StringHandle handle)
        {
            Debug.Assert(handle.IsVirtual);
            var heap = VirtualHeap.GetOrCreateVirtualHeap(ref _lazyVirtualHeap);

            lock (heap)
            {
                if (!heap.TryGetMemoryBlock(handle.RawValue, out var block))
                {
                    byte[] bytes;
                    switch (handle.StringKind)
                    {
                    case StringKind.Virtual:
                        bytes = Encoding.UTF8.GetBytes(GetVirtualString(handle.GetVirtualIndex()));
                        break;

                    case StringKind.WinRTPrefixed:
                        bytes = GetNonVirtualStringBytes(handle, MetadataReader.WinRTPrefix);
                        break;

                    default:
                        throw ExceptionUtilities.UnexpectedValue(handle.StringKind);
                    }

                    block = heap.AddBlob(handle.RawValue, bytes);
                }

                return(block);
            }
        }
示例#3
0
        private string GetVirtualHandleString(StringHandle handle, MetadataStringDecoder utf8Decoder)
        {
            Debug.Assert(handle.IsVirtual);

            return(handle.StringKind switch
            {
                StringKind.Virtual => GetVirtualString(handle.GetVirtualIndex()),
                StringKind.WinRTPrefixed => GetNonVirtualString(handle, utf8Decoder, MetadataReader.WinRTPrefix),
                _ => throw ExceptionUtilities.UnexpectedValue(handle.StringKind),
            });
示例#4
0
        private string GetVirtualHandleString(StringHandle handle, MetadataStringDecoder utf8Decoder)
        {
            Debug.Assert(handle.IsVirtual);

            switch (handle.StringKind)
            {
            case StringKind.Virtual:
                return(GetVirtualString(handle.GetVirtualIndex()));
            }

            throw ExceptionUtilities.UnexpectedValue(handle.StringKind);
        }
示例#5
0
        internal string GetString(StringHandle handle, MetadataStringDecoder utf8Decoder)
        {
            byte[] prefix;

            if (handle.IsVirtual)
            {
                switch (handle.StringKind)
                {
                    case StringKind.Virtual:
                        return s_virtualValues[(int)handle.GetVirtualIndex()];

                    case StringKind.WinRTPrefixed:
                        prefix = MetadataReader.WinRTPrefix;
                        break;

                    default:
                        Debug.Assert(false, "We should not get here");
                        return null;
                }
            }
            else
            {
                prefix = null;
            }

            int bytesRead;
            char otherTerminator = handle.StringKind == StringKind.DotTerminated ? '.' : '\0';
            return this.Block.PeekUtf8NullTerminated(handle.GetHeapOffset(), prefix, utf8Decoder, out bytesRead, otherTerminator);
        }
示例#6
0
        private MemoryBlock GetVirtualHandleMemoryBlock(StringHandle handle)
        {
            Debug.Assert(handle.IsVirtual);
            var heap = VirtualHeap.GetOrCreateVirtualHeap(ref _lazyVirtualHeap);

            VirtualHeapBlob virtualBlob;
            lock (heap)
            {
                if (!heap.Table.TryGetValue(handle.RawValue, out virtualBlob))
                {
                    byte[] bytes;
                    switch (handle.StringKind)
                    {
                        case StringKind.Virtual:
                            bytes = Encoding.UTF8.GetBytes(GetVirtualString(handle.GetVirtualIndex()));
                            break;

                        case StringKind.WinRTPrefixed:
                            bytes = GetNonVirtualStringBytes(handle, MetadataReader.WinRTPrefix);
                            break;

                        default:
                            throw ExceptionUtilities.UnexpectedValue(handle.StringKind);
                    }
            
                    virtualBlob = new VirtualHeapBlob(bytes);
                    heap.Table.Add(handle.RawValue, virtualBlob);
                }
            }

            return virtualBlob.GetMemoryBlock();
        }
示例#7
0
        private string GetVirtualHandleString(StringHandle handle, MetadataStringDecoder utf8Decoder)
        {
            Debug.Assert(handle.IsVirtual);

            switch (handle.StringKind)
            {
                case StringKind.Virtual:
                    return GetVirtualString(handle.GetVirtualIndex());

                case StringKind.WinRTPrefixed:
                    return GetNonVirtualString(handle, utf8Decoder, MetadataReader.WinRTPrefix);
            }

            throw ExceptionUtilities.UnexpectedValue(handle.StringKind);
        }