summaryrefslogtreecommitdiff
path: root/src/vm/genericdict.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/genericdict.cpp')
-rw-r--r--src/vm/genericdict.cpp52
1 files changed, 33 insertions, 19 deletions
diff --git a/src/vm/genericdict.cpp b/src/vm/genericdict.cpp
index 70a4b8a627..4aca9e140b 100644
--- a/src/vm/genericdict.cpp
+++ b/src/vm/genericdict.cpp
@@ -690,6 +690,7 @@ Dictionary::PopulateEntry(
switch (signatureKind)
{
case ENCODE_TYPE_HANDLE: kind = TypeHandleSlot; break;
+ case ENCODE_FIELD_HANDLE: kind = FieldDescSlot; break;
case ENCODE_METHOD_HANDLE: kind = MethodDescSlot; break;
case ENCODE_METHOD_ENTRY: kind = MethodEntrySlot; break;
case ENCODE_VIRTUAL_ENTRY: kind = DispatchStubAddrSlot; break;
@@ -1124,30 +1125,43 @@ Dictionary::PopulateEntry(
case FieldDescSlot:
{
- TypeHandle th = ptr.GetTypeHandleThrowing(
- pLookupModule,
- &typeContext,
- (nonExpansive ? ClassLoader::DontLoadTypes : ClassLoader::LoadTypes),
- CLASS_LOADED,
- FALSE,
- NULL,
- pZapSigContext);
- if (th.IsNull())
+ TypeHandle ownerType;
+
+ if (isReadyToRunModule)
{
- _ASSERTE(nonExpansive);
- return NULL;
+ FieldDesc* pField = ZapSig::DecodeField((Module*)pZapSigContext->pModuleContext, pZapSigContext->pInfoModule, ptr.GetPtr(), &typeContext, &ownerType);
+ _ASSERTE(!ownerType.IsNull());
+
+ if (!IsCompilationProcess())
+ ownerType.AsMethodTable()->EnsureInstanceActive();
+
+ result = (CORINFO_GENERIC_HANDLE)pField;
}
- IfFailThrow(ptr.SkipExactlyOne());
+ else
+ {
+ ownerType = ptr.GetTypeHandleThrowing(
+ pLookupModule,
+ &typeContext,
+ (nonExpansive ? ClassLoader::DontLoadTypes : ClassLoader::LoadTypes),
+ CLASS_LOADED,
+ FALSE,
+ NULL,
+ pZapSigContext);
+ if (ownerType.IsNull())
+ {
+ _ASSERTE(nonExpansive);
+ return NULL;
+ }
+ IfFailThrow(ptr.SkipExactlyOne());
- DWORD fieldIndex;
- IfFailThrow(ptr.GetData(&fieldIndex));
+ DWORD fieldIndex;
+ IfFailThrow(ptr.GetData(&fieldIndex));
- if (!IsCompilationProcess())
- {
- th.AsMethodTable()->EnsureInstanceActive();
- }
+ if (!IsCompilationProcess())
+ ownerType.AsMethodTable()->EnsureInstanceActive();
- result = (CORINFO_GENERIC_HANDLE)th.AsMethodTable()->GetFieldDescByIndex(fieldIndex);
+ result = (CORINFO_GENERIC_HANDLE)ownerType.AsMethodTable()->GetFieldDescByIndex(fieldIndex);
+ }
break;
}