From bc62955491a970934e0b67d0d91c7f4148e40c89 Mon Sep 17 00:00:00 2001 From: Fei Peng Date: Tue, 20 Nov 2018 17:05:25 -0800 Subject: [PATCH] Update JIT/EE getMethodNameFromMetadata to get enclosing class name --- src/inc/corinfo.h | 20 +++++++++++--------- src/jit/ICorJitInfo_API_wrapper.hpp | 9 +++++---- src/vm/interpreter.cpp | 2 +- src/vm/jitinterface.cpp | 20 ++++++++++++++++---- src/vm/jitinterface.h | 2 +- src/zap/zapinfo.cpp | 4 ++-- src/zap/zapinfo.h | 3 ++- 7 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/inc/corinfo.h b/src/inc/corinfo.h index 68eec6b..9b7a2f9 100644 --- a/src/inc/corinfo.h +++ b/src/inc/corinfo.h @@ -213,11 +213,11 @@ TODO: Talk about initializing strutures before use #define SELECTANY extern __declspec(selectany) #endif -SELECTANY const GUID JITEEVersionIdentifier = { /* 09F7AAE2-07DF-4433-B8C5-BA864CCABDA3 */ - 0x9f7aae2, - 0x7df, - 0x4433, - {0xb8, 0xc5, 0xba, 0x86, 0x4c, 0xca, 0xbd, 0xa3} +SELECTANY const GUID JITEEVersionIdentifier = { /* FF09DB9F-26A8-4A0B-AF2C-78E32A516FE1 */ + 0xff09db9f, + 0x26a8, + 0x4a0b, + {0xaf, 0x2c, 0x78, 0xe3, 0x2a, 0x51, 0x6f, 0xe1} }; ////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -2894,12 +2894,14 @@ public: ) = 0; // Return method name as in metadata, or nullptr if there is none, - // and optionally return the class and namespace names as in metadata. + // and optionally return the class, enclosing class, and namespace names + // as in metadata. // Suitable for non-debugging use. virtual const char* getMethodNameFromMetadata( - CORINFO_METHOD_HANDLE ftn, /* IN */ - const char **className, /* OUT */ - const char **namespaceName /* OUT */ + CORINFO_METHOD_HANDLE ftn, /* IN */ + const char **className, /* OUT */ + const char **namespaceName, /* OUT */ + const char **enclosingClassName /* OUT */ ) = 0; // this function is for debugging only. It returns a value that diff --git a/src/jit/ICorJitInfo_API_wrapper.hpp b/src/jit/ICorJitInfo_API_wrapper.hpp index 6d93f5a..8a9abb4 100644 --- a/src/jit/ICorJitInfo_API_wrapper.hpp +++ b/src/jit/ICorJitInfo_API_wrapper.hpp @@ -1079,12 +1079,13 @@ const char* WrapICorJitInfo::getMethodName( } const char* WrapICorJitInfo::getMethodNameFromMetadata( - CORINFO_METHOD_HANDLE ftn, /* IN */ - const char **className, /* OUT */ - const char **namespaceName /* OUT */) + CORINFO_METHOD_HANDLE ftn, /* IN */ + const char **className, /* OUT */ + const char **namespaceName, /* OUT */ + const char **enclosingClassName /* OUT */) { API_ENTER(getMethodNameFromMetadata); - const char* temp = wrapHnd->getMethodNameFromMetaData(ftn, moduleName, namespaceName); + const char* temp = wrapHnd->getMethodNameFromMetaData(ftn, className, namespaceName, enclosingClassName); API_LEAVE(getMethodNameFromMetadata); return temp; } diff --git a/src/vm/interpreter.cpp b/src/vm/interpreter.cpp index f435cda..bdadc32 100644 --- a/src/vm/interpreter.cpp +++ b/src/vm/interpreter.cpp @@ -9131,7 +9131,7 @@ void Interpreter::DoCallWork(bool virtualCall, void* thisArg, CORINFO_RESOLVED_T // SIMD intrinsics are recognized by name. const char* namespaceName = NULL; const char* className = NULL; - const char* methodName = m_interpCeeInfo.getMethodNameFromMetadata((CORINFO_METHOD_HANDLE)methToCall, &className, &namespaceName); + const char* methodName = m_interpCeeInfo.getMethodNameFromMetadata((CORINFO_METHOD_HANDLE)methToCall, &className, &namespaceName, NULL); if (strcmp(methodName, "get_IsHardwareAccelerated") == 0) { GCX_COOP(); diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp index 77054f9..81f2980 100644 --- a/src/vm/jitinterface.cpp +++ b/src/vm/jitinterface.cpp @@ -6607,7 +6607,7 @@ const char* CEEInfo::getMethodName (CORINFO_METHOD_HANDLE ftnHnd, const char** s return result; } -const char* CEEInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftnHnd, const char** className, const char** namespaceName) +const char* CEEInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftnHnd, const char** className, const char** namespaceName, const char **enclosingClassName) { CONTRACTL { SO_TOLERANT; @@ -6619,6 +6619,7 @@ const char* CEEInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftnHnd, con const char* result = NULL; const char* classResult = NULL; const char* namespaceResult = NULL; + const char* enclosingResult = NULL; JIT_TO_EE_TRANSITION(); @@ -6627,10 +6628,16 @@ const char* CEEInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftnHnd, con if (!IsNilToken(token)) { - if (!FAILED(ftn->GetMDImport()->GetNameOfMethodDef(token, &result))) + MethodTable* pMT = ftn->GetMethodTable(); + IMDInternalImport* pMDImport = pMT->GetMDImport(); + + IfFailThrow(pMDImport->GetNameOfMethodDef(token, &result)); + IfFailThrow(pMDImport->GetNameOfTypeDef(pMT->GetCl(), &classResult, &namespaceResult)); + // Query enclosingClassName when the method is in a nested class + // and get the namespace of enclosing classes (nested class's namespace is empty) + if (pMT->GetClass()->IsNested()) { - MethodTable* pMT = ftn->GetMethodTable(); - classResult = pMT->GetFullyQualifiedNameInfo(&namespaceResult); + IfFailThrow(pMDImport->GetNameOfTypeDef(pMT->GetEnclosingCl(), &enclosingResult, &namespaceResult)); } } @@ -6644,6 +6651,11 @@ const char* CEEInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftnHnd, con *namespaceName = namespaceResult; } + if (enclosingClassName != NULL) + { + *enclosingClassName = enclosingResult; + } + EE_TO_JIT_TRANSITION(); return result; diff --git a/src/vm/jitinterface.h b/src/vm/jitinterface.h index dae6352..4c23de9 100644 --- a/src/vm/jitinterface.h +++ b/src/vm/jitinterface.h @@ -689,7 +689,7 @@ public: // ICorMethodInfo stuff const char* getMethodName (CORINFO_METHOD_HANDLE ftnHnd, const char** scopeName); - const char* getMethodNameFromMetadata (CORINFO_METHOD_HANDLE ftnHnd, const char** className, const char** namespaceName); + const char* getMethodNameFromMetadata (CORINFO_METHOD_HANDLE ftnHnd, const char** className, const char** namespaceName, const char **enclosingClassName); unsigned getMethodHash (CORINFO_METHOD_HANDLE ftnHnd); DWORD getMethodAttribs (CORINFO_METHOD_HANDLE ftnHnd); diff --git a/src/zap/zapinfo.cpp b/src/zap/zapinfo.cpp index b94809f..7c0200b 100644 --- a/src/zap/zapinfo.cpp +++ b/src/zap/zapinfo.cpp @@ -3605,9 +3605,9 @@ const char* ZapInfo::getMethodName(CORINFO_METHOD_HANDLE ftn, const char **modul return m_pEEJitInfo->getMethodName(ftn, moduleName); } -const char* ZapInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftn, const char **className, const char** namespaceName) +const char* ZapInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftn, const char **className, const char** namespaceName, const char **enclosingClassName) { - return m_pEEJitInfo->getMethodNameFromMetadata(ftn, className, namespaceName); + return m_pEEJitInfo->getMethodNameFromMetadata(ftn, className, namespaceName, enclosingClassName); } unsigned ZapInfo::getMethodHash(CORINFO_METHOD_HANDLE ftn) diff --git a/src/zap/zapinfo.h b/src/zap/zapinfo.h index 0e4a84e..a79319e 100644 --- a/src/zap/zapinfo.h +++ b/src/zap/zapinfo.h @@ -634,7 +634,8 @@ public: const char **moduleName); const char* getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftn, const char **className, - const char **namespaceName); + const char **namespaceName, + const char **enclosingClassName); unsigned getMethodHash(CORINFO_METHOD_HANDLE ftn); DWORD getMethodAttribs(CORINFO_METHOD_HANDLE ftn); -- 2.7.4