prestub: fix ExternalMethodFixupWorker (#22519)
authorKonstantin Baladurin <k.baladurin@samsung.com>
Mon, 11 Feb 2019 16:20:50 +0000 (19:20 +0300)
committerJan Kotas <jkotas@microsoft.com>
Mon, 11 Feb 2019 16:20:50 +0000 (08:20 -0800)
Use DispatchToken::CreateDispatchToken to get token to resolve
virtual method in case of non interface MT.

src/vm/prestub.cpp

index 0f3d96d..d04a5d0 100644 (file)
@@ -2378,7 +2378,11 @@ EXTERN_C PCODE STDCALL ExternalMethodFixupWorker(TransitionBlock * pTransitionBl
             DispatchToken token;
             if (pMT->IsInterface() || MethodTable::VTableIndir_t::isRelative)
             {
-                token = pMT->GetLoaderAllocator()->GetDispatchToken(pMT->GetTypeID(), slot);
+                if (pMT->IsInterface())
+                    token = pMT->GetLoaderAllocator()->GetDispatchToken(pMT->GetTypeID(), slot);
+                else
+                    token = DispatchToken::CreateDispatchToken(slot);
+
                 StubCallSite callSite(pIndirection, pEMFrame->GetReturnAddress());
                 pCode = pMgr->ResolveWorker(&callSite, protectedObj, token, VirtualCallStubManager::SK_LOOKUP);
             }