diff options
author | Fadi Hanna <fadim@microsoft.com> | 2016-08-04 12:51:18 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-04 12:51:18 -0700 |
commit | 010f42a541f9d1e787774a538d9b923a506ea8f2 (patch) | |
tree | 74fbcb4c733adfe6d57f5f352433345355289d56 /src/zap | |
parent | c166c0ec0156e905c722889a84c815e802b47cbd (diff) | |
download | coreclr-010f42a541f9d1e787774a538d9b923a506ea8f2.tar.gz coreclr-010f42a541f9d1e787774a538d9b923a506ea8f2.tar.bz2 coreclr-010f42a541f9d1e787774a538d9b923a506ea8f2.zip |
Adding support to the following generic dictionary entry slots for R2R: (#6291)
DeclaringTypeHandleSlot
ConstrainedMethodEntrySlot
Diffstat (limited to 'src/zap')
-rw-r--r-- | src/zap/zapimport.cpp | 17 | ||||
-rw-r--r-- | src/zap/zapreadytorun.cpp | 2 |
2 files changed, 15 insertions, 4 deletions
diff --git a/src/zap/zapimport.cpp b/src/zap/zapimport.cpp index 400ea7884d..47d0def2c1 100644 --- a/src/zap/zapimport.cpp +++ b/src/zap/zapimport.cpp @@ -1808,6 +1808,7 @@ ZapImport * ZapImportTable::GetDictionaryLookupCell(CORCOMPILE_FIXUP_BLOB_KIND k switch (pLookup->runtimeLookupFlags) { case READYTORUN_FIXUP_TypeHandle: + case READYTORUN_FIXUP_DeclaringTypeHandle: { if (pResolvedToken->pTypeSpec == NULL) { @@ -1815,7 +1816,17 @@ ZapImport * ZapImportTable::GetDictionaryLookupCell(CORCOMPILE_FIXUP_BLOB_KIND k ThrowHR(E_NOTIMPL); } - sigBuilder.AppendData(ENCODE_TYPE_HANDLE); + if (pLookup->runtimeLookupFlags == READYTORUN_FIXUP_DeclaringTypeHandle) + { + _ASSERTE(pLookup->runtimeLookupArgs != NULL); + sigBuilder.AppendData(ENCODE_DECLARINGTYPE_HANDLE); + GetCompileInfo()->EncodeClass(m_pImage->GetModuleHandle(), (CORINFO_CLASS_HANDLE)pLookup->runtimeLookupArgs, &sigBuilder, NULL, NULL); + } + else + { + sigBuilder.AppendData(ENCODE_TYPE_HANDLE); + } + if (pResolvedToken->tokenType == CORINFO_TOKENKIND_Newarr) sigBuilder.AppendElementType(ELEMENT_TYPE_SZARRAY); sigBuilder.AppendBlob((PVOID)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec); @@ -1827,7 +1838,7 @@ ZapImport * ZapImportTable::GetDictionaryLookupCell(CORCOMPILE_FIXUP_BLOB_KIND k break; case READYTORUN_FIXUP_MethodEntry: - EncodeMethod(ENCODE_METHOD_ENTRY, pResolvedToken->hMethod, &sigBuilder, pResolvedToken, NULL, TRUE); + EncodeMethod(ENCODE_METHOD_ENTRY, pResolvedToken->hMethod, &sigBuilder, pResolvedToken, (CORINFO_RESOLVED_TOKEN*)pLookup->runtimeLookupArgs, TRUE); break; case READYTORUN_FIXUP_VirtualEntry: @@ -1838,8 +1849,6 @@ ZapImport * ZapImportTable::GetDictionaryLookupCell(CORCOMPILE_FIXUP_BLOB_KIND k EncodeField(ENCODE_FIELD_HANDLE, pResolvedToken->hField, &sigBuilder, pResolvedToken, TRUE); break; - // TODO: support for the rest of the dictionary signature kinds - default: _ASSERTE(!"Invalid R2R fixup kind!"); ThrowHR(E_NOTIMPL); diff --git a/src/zap/zapreadytorun.cpp b/src/zap/zapreadytorun.cpp index 7a9a802c76..ea42a25b8d 100644 --- a/src/zap/zapreadytorun.cpp +++ b/src/zap/zapreadytorun.cpp @@ -515,6 +515,8 @@ static_assert_no_msg((int)READYTORUN_FIXUP_Check_FieldOffset == (int)ENC static_assert_no_msg((int)READYTORUN_FIXUP_DelegateCtor == (int)ENCODE_DELEGATE_CTOR); +static_assert_no_msg((int)READYTORUN_FIXUP_DeclaringTypeHandle == (int)ENCODE_DECLARINGTYPE_HANDLE); + // // READYTORUN_EXCEPTION // |