prestub: fix ExternalMethodFixupWorker accepted/tizen/unified/20190422.045933 submit/tizen/20190312.102237 submit/tizen/20190312.123654 submit/tizen/20190312.130143 submit/tizen/20190327.110559 submit/tizen/20190405.141848 submit/tizen/20190410.105333 submit/tizen/20190416.152950 submit/tizen/20190419.042330 submit/tizen/20190419.143735
authorKonstantin Baladurin <k.baladurin@samsung.com>
Mon, 11 Feb 2019 13:11:09 +0000 (16:11 +0300)
committerAlexander Soldatov/AI Ecosystem Lab /SRR/Staff Engineer/삼성전자 <soldatov.a@samsung.com>
Thu, 14 Feb 2019 17:24:48 +0000 (20:24 +0300)
Use DispatchToken::CreateDispatchToken to get token to resolve
virtual method in case of non interface MT.

src/vm/prestub.cpp

index 5c08bec..c068893 100644 (file)
@@ -2356,7 +2356,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);
             }