diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/inc/corcompile.h | 3 | ||||
-rw-r--r-- | src/inc/readytorun.h | 4 | ||||
-rw-r--r-- | src/vm/codeman.cpp | 14 | ||||
-rw-r--r-- | src/vm/compile.cpp | 6 | ||||
-rw-r--r-- | src/vm/compile.h | 7 | ||||
-rw-r--r-- | src/vm/genericdict.cpp | 52 | ||||
-rw-r--r-- | src/vm/jitinterface.cpp | 7 | ||||
-rw-r--r-- | src/vm/zapsig.cpp | 48 | ||||
-rw-r--r-- | src/vm/zapsig.h | 62 | ||||
-rw-r--r-- | src/zap/zapimport.cpp | 8 | ||||
-rw-r--r-- | src/zap/zapimport.h | 2 |
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); |