public NativeParser GetNext() { for (;;) { while (_parser.Offset < _endOffset) { byte lowHashcode = _parser.GetUInt8(); return(_parser.GetParserFromRelativeOffset()); } if (_currentBucket >= _table._bucketMask) { return(new NativeParser()); } _currentBucket++; _parser = _table.GetParserForBucket(_currentBucket, out _endOffset); } }
public NativeParser GetNext() { while (_parser.Offset < _endOffset) { byte lowHashcode = _parser.GetUInt8(); if (lowHashcode == _lowHashcode) { return(_parser.GetParserFromRelativeOffset()); } // The entries are sorted by hashcode within the bucket. It allows us to terminate the lookup prematurely. if (lowHashcode > _lowHashcode) { _endOffset = _parser.Offset; // Ensure that extra call to GetNext returns null parser again break; } _parser.SkipInteger(); } return(default);
public NativeHashtable(NativeParser parser) { uint header = parser.GetUInt8(); _reader = parser.Reader; _baseOffset = parser.Offset; int numberOfBucketsShift = (int)(header >> 2); if (numberOfBucketsShift > 31) { _reader.ThrowBadImageFormatException(); } _bucketMask = (uint)((1 << numberOfBucketsShift) - 1); byte entryIndexSize = (byte)(header & 3); if (entryIndexSize > 2) { _reader.ThrowBadImageFormatException(); } _entryIndexSize = entryIndexSize; }
/// <summary> /// Build an array of GenericDictionaryCell from a NativeParser stream that has the appropriate metadata /// Return null if there are no cells to describe /// </summary> internal unsafe static GenericDictionaryCell[] BuildDictionaryFromMetadataTokensAndContext(TypeBuilder typeBuilder, NativeParser parser, NativeFormatMetadataUnit nativeMetadataUnit, FixupCellMetadataResolver resolver) { uint parserStartOffset = parser.Offset; uint count = parser.GetSequenceCount(); // An empty dictionary isn't interesting if (count == 0) return null; Debug.Assert(count > 0); TypeLoaderLogger.WriteLine("Parsing dictionary layout @ " + parserStartOffset.LowLevelToString() + " (" + count.LowLevelToString() + " entries)"); GenericDictionaryCell[] dictionary = new GenericDictionaryCell[count]; for (uint i = 0; i < count; i++) { MetadataFixupKind fixupKind = (MetadataFixupKind)parser.GetUInt8(); Internal.Metadata.NativeFormat.Handle token = parser.GetUnsigned().AsHandle(); Internal.Metadata.NativeFormat.Handle token2 = new Internal.Metadata.NativeFormat.Handle(); switch (fixupKind) { case MetadataFixupKind.GenericConstrainedMethod: case MetadataFixupKind.NonGenericConstrainedMethod: case MetadataFixupKind.NonGenericDirectConstrainedMethod: token2 = parser.GetUnsigned().AsHandle(); break; } GenericDictionaryCell cell = CreateCellFromFixupKindAndToken(fixupKind, resolver, token, token2); cell.Prepare(typeBuilder); dictionary[i] = cell; } return dictionary; }
public NativeHashtable(NativeParser parser) { uint header = parser.GetUInt8(); _reader = parser.Reader; _baseOffset = parser.Offset; int numberOfBucketsShift = (int)(header >> 2); if (numberOfBucketsShift > 31) _reader.ThrowBadImageFormatException(); _bucketMask = (uint)((1 << numberOfBucketsShift) - 1); byte entryIndexSize = (byte)(header & 3); if (entryIndexSize > 2) _reader.ThrowBadImageFormatException(); _entryIndexSize = entryIndexSize; }