internal BlobReader GetBlobReader(BlobHandle handle) { if (handle.IsVirtual) { if (_lazyVirtualHeapBlobs == null) { Interlocked.CompareExchange(ref _lazyVirtualHeapBlobs, new VirtualHeapBlobTable(), null); } int index = (int)handle.GetVirtualIndex(); int length = s_virtualHeapBlobs[index].Length; VirtualHeapBlob virtualBlob; lock (_lazyVirtualHeapBlobs) { if (!_lazyVirtualHeapBlobs.Table.TryGetValue(handle, out virtualBlob)) { virtualBlob = new VirtualHeapBlob(GetVirtualBlobArray(handle, unique: false)); _lazyVirtualHeapBlobs.Table.Add(handle, virtualBlob); } } return(new BlobReader(new MemoryBlock((byte *)virtualBlob.Pinned.AddrOfPinnedObject(), length))); } int offset, size; Block.PeekHeapValueOffsetAndSize(handle.Index, out offset, out size); return(new BlobReader(this.Block.GetMemoryBlockAt(offset, size))); }
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()); }
private MemoryBlock GetVirtualHandleMemoryBlock(BlobHandle handle) { var heap = VirtualHeap.GetOrCreateVirtualHeap(ref _lazyVirtualHeap); VirtualHeapBlob virtualBlob; lock (heap) { if (!heap.Table.TryGetValue(handle.RawValue, out virtualBlob)) { virtualBlob = new VirtualHeapBlob(GetVirtualBlobBytes(handle, unique: false)); heap.Table.Add(handle.RawValue, virtualBlob); } } return(virtualBlob.GetMemoryBlock()); }
private MemoryBlock GetVirtualHandleMemoryBlock(BlobHandle handle) { var heap = VirtualHeap.GetOrCreateVirtualHeap(ref _lazyVirtualHeap); VirtualHeapBlob virtualBlob; lock (heap) { if (!heap.Table.TryGetValue(handle.RawValue, out virtualBlob)) { virtualBlob = new VirtualHeapBlob(GetVirtualBlobBytes(handle, unique: false)); heap.Table.Add(handle.RawValue, virtualBlob); } } return virtualBlob.GetMemoryBlock(); }
internal BlobReader GetBlobReader(BlobHandle handle) { if (handle.IsVirtual) { if (_lazyVirtualHeapBlobs == null) { Interlocked.CompareExchange(ref _lazyVirtualHeapBlobs, new VirtualHeapBlobTable(), null); } int index = (int)handle.GetVirtualIndex(); int length = s_virtualHeapBlobs[index].Length; VirtualHeapBlob virtualBlob; lock (_lazyVirtualHeapBlobs) { if (!_lazyVirtualHeapBlobs.Table.TryGetValue(handle, out virtualBlob)) { virtualBlob = new VirtualHeapBlob(GetVirtualBlobArray(handle, unique: false)); _lazyVirtualHeapBlobs.Table.Add(handle, virtualBlob); } } return new BlobReader(new MemoryBlock((byte*)virtualBlob.Pinned.AddrOfPinnedObject(), length)); } int offset, size; Block.PeekHeapValueOffsetAndSize(handle.Index, out offset, out size); return new BlobReader(this.Block.GetMemoryBlockAt(offset, size)); }
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(); }