summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/inc/corcompile.h3
-rw-r--r--src/inc/readytorun.h4
-rw-r--r--src/vm/codeman.cpp14
-rw-r--r--src/vm/compile.cpp6
-rw-r--r--src/vm/compile.h7
-rw-r--r--src/vm/genericdict.cpp52
-rw-r--r--src/vm/jitinterface.cpp7
-rw-r--r--src/vm/zapsig.cpp48
-rw-r--r--src/vm/zapsig.h62
-rw-r--r--src/zap/zapimport.cpp8
-rw-r--r--src/zap/zapimport.h2
11 files changed, 131 insertions, 82 deletions
diff --git a/src/inc/corcompile.h b/src/inc/corcompile.h
index d3120d44dd..965de2845f 100644
--- a/src/inc/corcompile.h
+++ b/src/inc/corcompile.h
@@ -1784,7 +1784,8 @@ class ICorCompileInfo
SigBuilder * pSigBuilder,
LPVOID encodeContext,
ENCODEMODULE_CALLBACK pfnEncodeModule,
- CORINFO_RESOLVED_TOKEN * pResolvedToken = NULL) = 0;
+ CORINFO_RESOLVED_TOKEN * pResolvedToken = NULL,
+ BOOL fEncodeUsingResolvedTokenSpecStreams = FALSE) = 0;
// Encode generic dictionary signature
diff --git a/src/inc/readytorun.h b/src/inc/readytorun.h
index 0fa1a1410e..fbcfc22046 100644
--- a/src/inc/readytorun.h
+++ b/src/inc/readytorun.h
@@ -15,8 +15,8 @@
#define READYTORUN_SIGNATURE 0x00525452 // 'RTR'
-#define READYTORUN_MAJOR_VERSION 0x0001
-#define READYTORUN_MINOR_VERSION 0x0002
+#define READYTORUN_MAJOR_VERSION 0x0002
+#define READYTORUN_MINOR_VERSION 0x0000
struct READYTORUN_HEADER
{
diff --git a/src/vm/codeman.cpp b/src/vm/codeman.cpp
index 8e1800d24f..9ce6bb2a20 100644
--- a/src/vm/codeman.cpp
+++ b/src/vm/codeman.cpp
@@ -6412,18 +6412,12 @@ UINT32 ReadyToRunJitManager::JitTokenToGCInfoVersion(const METHODTOKEN& MethodTo
{
CONTRACTL{
NOTHROW;
- GC_NOTRIGGER;
- HOST_NOCALLS;
- SUPPORTS_DAC;
+ GC_NOTRIGGER;
+ HOST_NOCALLS;
+ SUPPORTS_DAC;
} CONTRACTL_END;
- READYTORUN_HEADER * header = JitTokenToReadyToRunInfo(MethodToken)->GetImage()->GetReadyToRunHeader();
- UINT32 gcInfoVersion = header->MajorVersion;
-
- // Currently there's only one version of GCInfo.
- _ASSERTE(gcInfoVersion == GCINFO_VERSION);
-
- return gcInfoVersion;
+ return GCINFO_VERSION;
}
PTR_RUNTIME_FUNCTION ReadyToRunJitManager::JitTokenToRuntimeFunction(const METHODTOKEN& MethodToken)
diff --git a/src/vm/compile.cpp b/src/vm/compile.cpp
index 7a3507eed6..b381b3f074 100644
--- a/src/vm/compile.cpp
+++ b/src/vm/compile.cpp
@@ -2368,7 +2368,8 @@ void CEECompileInfo::EncodeField(
SigBuilder * pSigBuilder,
LPVOID encodeContext,
ENCODEMODULE_CALLBACK pfnEncodeModule,
- CORINFO_RESOLVED_TOKEN * pResolvedToken)
+ CORINFO_RESOLVED_TOKEN * pResolvedToken,
+ BOOL fEncodeUsingResolvedTokenSpecStreams)
{
STANDARD_VM_CONTRACT;
@@ -2379,7 +2380,8 @@ void CEECompileInfo::EncodeField(
pSigBuilder,
encodeContext,
pfnEncodeModule,
- pResolvedToken);
+ pResolvedToken,
+ fEncodeUsingResolvedTokenSpecStreams);
COOPERATIVE_TRANSITION_END();
}
diff --git a/src/vm/compile.h b/src/vm/compile.h
index c7a2d06ce9..19bbac3228 100644
--- a/src/vm/compile.h
+++ b/src/vm/compile.h
@@ -281,8 +281,8 @@ class CEECompileInfo : public ICorCompileInfo
SigBuilder *pSigBuilder,
LPVOID encodeContext,
ENCODEMODULE_CALLBACK pfnEncodeModule,
- CORINFO_RESOLVED_TOKEN * pResolvedToken,
- CORINFO_RESOLVED_TOKEN * pConstrainedResolvedToken,
+ CORINFO_RESOLVED_TOKEN *pResolvedToken,
+ CORINFO_RESOLVED_TOKEN *pConstrainedResolvedToken,
BOOL fEncodeUsingResolvedTokenSpecStreams);
virtual mdToken TryEncodeMethodAsToken(CORINFO_METHOD_HANDLE handle,
@@ -296,7 +296,8 @@ class CEECompileInfo : public ICorCompileInfo
SigBuilder *pSigBuilder,
LPVOID encodeContext,
ENCODEMODULE_CALLBACK pfnEncodeModule,
- CORINFO_RESOLVED_TOKEN * pResolvedToken);
+ CORINFO_RESOLVED_TOKEN *pResolvedToken,
+ BOOL fEncodeUsingResolvedTokenSpecStreams);
// Encode generic dictionary signature
virtual void EncodeGenericSignature(
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;
}
diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp
index b72eaf3826..59172fe220 100644
--- a/src/vm/jitinterface.cpp
+++ b/src/vm/jitinterface.cpp
@@ -3137,10 +3137,8 @@ void CEEInfo::ComputeRuntimeLookupForSharedGenericToken(DictionaryEntryKind entr
switch (entryKind)
{
case TypeHandleSlot:
- {
pResultLookup->lookupKind.runtimeLookupFlags = READYTORUN_FIXUP_TypeHandle;
break;
- }
case MethodDescSlot:
case MethodEntrySlot:
@@ -3161,8 +3159,11 @@ void CEEInfo::ComputeRuntimeLookupForSharedGenericToken(DictionaryEntryKind entr
break;
}
- case DeclaringTypeHandleSlot:
case FieldDescSlot:
+ pResultLookup->lookupKind.runtimeLookupFlags = READYTORUN_FIXUP_FieldHandle;
+ break;
+
+ case DeclaringTypeHandleSlot:
case ConstrainedMethodEntrySlot:
ThrowHR(E_NOTIMPL);
diff --git a/src/vm/zapsig.cpp b/src/vm/zapsig.cpp
index 93b34db31e..c619610f42 100644
--- a/src/vm/zapsig.cpp
+++ b/src/vm/zapsig.cpp
@@ -836,7 +836,7 @@ MethodDesc *ZapSig::DecodeMethod(Module *pReferencingModule,
Module *pInfoModule,
PCCOR_SIGNATURE pBuffer,
SigTypeContext *pContext,
- TypeHandle * ppTH, /*=NULL*/
+ TypeHandle *ppTH, /*=NULL*/
PCCOR_SIGNATURE *ppOwnerTypeSpecWithVars, /*=NULL*/
PCCOR_SIGNATURE *ppMethodSpecWithVars /*=NULL*/)
{
@@ -1013,7 +1013,20 @@ MethodDesc *ZapSig::DecodeMethod(Module *pReferencingModule,
FieldDesc * ZapSig::DecodeField(Module *pReferencingModule,
Module *pInfoModule,
PCCOR_SIGNATURE pBuffer,
- TypeHandle * ppTH /*=NULL*/)
+ TypeHandle *ppTH /*=NULL*/)
+{
+ STANDARD_VM_CONTRACT;
+
+ SigTypeContext typeContext; // empty context is OK: encoding should not contain type variables.
+
+ return DecodeField(pReferencingModule, pInfoModule, pBuffer, &typeContext, ppTH);
+}
+
+FieldDesc * ZapSig::DecodeField(Module *pReferencingModule,
+ Module *pInfoModule,
+ PCCOR_SIGNATURE pBuffer,
+ SigTypeContext *pContext,
+ TypeHandle *ppTH /*=NULL*/)
{
CONTRACTL
{
@@ -1037,10 +1050,8 @@ FieldDesc * ZapSig::DecodeField(Module *pReferencingModule,
ZapSig::Context zapSigContext(pInfoModule, pReferencingModule);
ZapSig::Context * pZapSigContext = &zapSigContext;
- SigTypeContext typeContext; // empty context is OK: encoding should not contain type variables.
-
pOwnerMT = sig.GetTypeHandleThrowing(pInfoModule,
- &typeContext,
+ pContext,
ClassLoader::LoadTypes,
CLASS_LOADED,
FALSE,
@@ -1371,7 +1382,8 @@ void ZapSig::EncodeField(
SigBuilder *pSigBuilder,
LPVOID pEncodeModuleContext,
ENCODEMODULE_CALLBACK pfnEncodeModule,
- CORINFO_RESOLVED_TOKEN * pResolvedToken)
+ CORINFO_RESOLVED_TOKEN *pResolvedToken,
+ BOOL fEncodeUsingResolvedTokenSpecStreams)
{
CONTRACTL
{
@@ -1452,15 +1464,23 @@ void ZapSig::EncodeField(
if (fieldFlags & ENCODE_FIELD_SIG_OwnerType)
{
- ZapSig zapSig(pInfoModule, pEncodeModuleContext, ZapSig::NormalTokens,
- (EncodeModuleCallback) pfnEncodeModule, NULL);
+ if (fEncodeUsingResolvedTokenSpecStreams && pResolvedToken != NULL && pResolvedToken->pTypeSpec != NULL)
+ {
+ _ASSERTE(pResolvedToken->cbTypeSpec > 0);
+ pSigBuilder->AppendBlob((PVOID)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec);
+ }
+ else
+ {
+ ZapSig zapSig(pInfoModule, pEncodeModuleContext, ZapSig::NormalTokens,
+ (EncodeModuleCallback)pfnEncodeModule, NULL);
- //
- // Write class
- //
- BOOL fSuccess;
- fSuccess = zapSig.GetSignatureForTypeHandle(pMT, pSigBuilder);
- _ASSERTE(fSuccess);
+ //
+ // Write class
+ //
+ BOOL fSuccess;
+ fSuccess = zapSig.GetSignatureForTypeHandle(pMT, pSigBuilder);
+ _ASSERTE(fSuccess);
+ }
}
if ((fieldFlags & ENCODE_FIELD_SIG_IndexInsteadOfToken) == 0)
diff --git a/src/vm/zapsig.h b/src/vm/zapsig.h
index ef837ad2d2..258e821aa8 100644
--- a/src/vm/zapsig.h
+++ b/src/vm/zapsig.h
@@ -154,28 +154,39 @@ public:
// fromModule is the module in which the type is defined.
// pBuffer contains the signature encoding for the type.
// level is the class load level (see classloadlevel.h) to which the type should be loaded
- static TypeHandle DecodeType(Module *referencingModule,
- Module *fromModule,
- PCCOR_SIGNATURE pBuffer,
- ClassLoadLevel level = CLASS_LOADED);
-
- static MethodDesc *DecodeMethod(Module *referencingModule,
- Module *fromModule,
- PCCOR_SIGNATURE pBuffer,
- TypeHandle * ppTH = NULL);
-
- static MethodDesc *DecodeMethod(Module *referencingModule,
- Module *fromModule,
- PCCOR_SIGNATURE pBuffer,
- SigTypeContext *pContext,
- TypeHandle * ppTH = NULL,
- PCCOR_SIGNATURE *ppOwnerTypeSpecWithVars = NULL,
- PCCOR_SIGNATURE *ppMethodSpecWithVars = NULL);
-
- static FieldDesc *DecodeField(Module *referencingModule,
- Module *fromModule,
- PCCOR_SIGNATURE pBuffer,
- TypeHandle * ppTH = NULL);
+ static TypeHandle DecodeType(
+ Module *referencingModule,
+ Module *fromModule,
+ PCCOR_SIGNATURE pBuffer,
+ ClassLoadLevel level = CLASS_LOADED);
+
+ static MethodDesc *DecodeMethod(
+ Module *referencingModule,
+ Module *fromModule,
+ PCCOR_SIGNATURE pBuffer,
+ TypeHandle *ppTH = NULL);
+
+ static MethodDesc *DecodeMethod(
+ Module *referencingModule,
+ Module *fromModule,
+ PCCOR_SIGNATURE pBuffer,
+ SigTypeContext *pContext,
+ TypeHandle *ppTH = NULL,
+ PCCOR_SIGNATURE *ppOwnerTypeSpecWithVars = NULL,
+ PCCOR_SIGNATURE *ppMethodSpecWithVars = NULL);
+
+ static FieldDesc *DecodeField(
+ Module *referencingModule,
+ Module *fromModule,
+ PCCOR_SIGNATURE pBuffer,
+ TypeHandle *ppTH = NULL);
+
+ static FieldDesc *DecodeField(
+ Module *pReferencingModule,
+ Module *pInfoModule,
+ PCCOR_SIGNATURE pBuffer,
+ SigTypeContext *pContext,
+ TypeHandle *ppTH = NULL);
static BOOL EncodeMethod(
MethodDesc *pMethod,
@@ -184,8 +195,8 @@ public:
LPVOID pReferencingModule,
ENCODEMODULE_CALLBACK pfnEncodeModule,
DEFINETOKEN_CALLBACK pfnDefineToken,
- CORINFO_RESOLVED_TOKEN * pResolvedToken = NULL,
- CORINFO_RESOLVED_TOKEN * pConstrainedResolvedToken = NULL,
+ CORINFO_RESOLVED_TOKEN *pResolvedToken = NULL,
+ CORINFO_RESOLVED_TOKEN *pConstrainedResolvedToken = NULL,
BOOL fEncodeUsingResolvedTokenSpecStreams = FALSE);
static void EncodeField(
@@ -194,7 +205,8 @@ public:
SigBuilder *pSigBuilder,
LPVOID pReferencingModule,
ENCODEMODULE_CALLBACK pfnEncodeModule,
- CORINFO_RESOLVED_TOKEN * pResolvedToken = NULL);
+ CORINFO_RESOLVED_TOKEN *pResolvedToken = NULL,
+ BOOL fEncodeUsingResolvedTokenSpecStreams = FALSE);
};
diff --git a/src/zap/zapimport.cpp b/src/zap/zapimport.cpp
index 1412adcbf3..400ea7884d 100644
--- a/src/zap/zapimport.cpp
+++ b/src/zap/zapimport.cpp
@@ -999,13 +999,13 @@ void ZapImportTable::EncodeClassInContext(CORINFO_MODULE_HANDLE context, CORINFO
}
void ZapImportTable::EncodeField(CORCOMPILE_FIXUP_BLOB_KIND kind, CORINFO_FIELD_HANDLE handle, SigBuilder * pSigBuilder,
- CORINFO_RESOLVED_TOKEN * pResolvedToken)
+ CORINFO_RESOLVED_TOKEN * pResolvedToken, BOOL fEncodeUsingResolvedTokenSpecStreams)
{
CORINFO_CLASS_HANDLE clsHandle = GetJitInfo()->getFieldClass(handle);
CORINFO_MODULE_HANDLE referencingModule = GetJitInfo()->getClassModule(clsHandle);
referencingModule = TryEncodeModule(kind, referencingModule, pSigBuilder);
GetCompileInfo()->EncodeField(referencingModule, handle, pSigBuilder, this, EncodeModuleHelper,
- pResolvedToken);
+ pResolvedToken, fEncodeUsingResolvedTokenSpecStreams);
}
void ZapImportTable::EncodeMethod(CORCOMPILE_FIXUP_BLOB_KIND kind, CORINFO_METHOD_HANDLE handle, SigBuilder * pSigBuilder,
@@ -1834,6 +1834,10 @@ ZapImport * ZapImportTable::GetDictionaryLookupCell(CORCOMPILE_FIXUP_BLOB_KIND k
EncodeMethod(ENCODE_VIRTUAL_ENTRY, pResolvedToken->hMethod, &sigBuilder, pResolvedToken, NULL, TRUE);
break;
+ case READYTORUN_FIXUP_FieldHandle:
+ EncodeField(ENCODE_FIELD_HANDLE, pResolvedToken->hField, &sigBuilder, pResolvedToken, TRUE);
+ break;
+
// TODO: support for the rest of the dictionary signature kinds
default:
diff --git a/src/zap/zapimport.h b/src/zap/zapimport.h
index b1a5fbbe95..34a673ecf5 100644
--- a/src/zap/zapimport.h
+++ b/src/zap/zapimport.h
@@ -339,7 +339,7 @@ public:
void EncodeClass(CORCOMPILE_FIXUP_BLOB_KIND kind, CORINFO_CLASS_HANDLE handle, SigBuilder * pSigBuilder);
void EncodeClassInContext(CORINFO_MODULE_HANDLE context, CORINFO_CLASS_HANDLE handle, SigBuilder * pSigBuilder);
void EncodeField(CORCOMPILE_FIXUP_BLOB_KIND kind, CORINFO_FIELD_HANDLE handle, SigBuilder * pSigBuilder,
- CORINFO_RESOLVED_TOKEN * pResolvedToken = NULL);
+ CORINFO_RESOLVED_TOKEN * pResolvedToken = NULL, BOOL fEncodeUsingResolvedTokenSpecStreams = FALSE);
void EncodeMethod(CORCOMPILE_FIXUP_BLOB_KIND kind, CORINFO_METHOD_HANDLE handle, SigBuilder * pSigBuilder,
CORINFO_RESOLVED_TOKEN * pResolvedToken = NULL, CORINFO_RESOLVED_TOKEN * pConstrainedResolvedToken = NULL,
BOOL fEncodeUsingResolvedTokenSpecStreams = FALSE);