diff options
author | Yi Zhang <yzha@microsoft.com> | 2016-05-18 23:05:53 -0700 |
---|---|---|
committer | Yi Zhang <yzha@microsoft.com> | 2016-05-19 15:44:36 -0700 |
commit | aa08b53d25088dd9c2b7c9a8aa483b413906c7d4 (patch) | |
tree | 5853f6e09387551b36231ec34081b77a044ca0a7 /src/vm/virtualcallstub.cpp | |
parent | e78338ef715dc6fd89d9cbd0bf93c7f88d211c20 (diff) | |
download | coreclr-aa08b53d25088dd9c2b7c9a8aa483b413906c7d4.tar.gz coreclr-aa08b53d25088dd9c2b7c9a8aa483b413906c7d4.tar.bz2 coreclr-aa08b53d25088dd9c2b7c9a8aa483b413906c7d4.zip |
Fix x86 only ICastable feature bug.
When we call ICastable.IsInstanceOfInterface, we treat RuntimeTypeHandle as a OBJECTREF, which is incorrect as-per x86 calling convention since RuntimeTypehandle is a struct that contains a RuntimeType ref field and needs to be passed in stack. Our VM simple call helpers CALL_MANAGED_METHOD doesn't handle this correctly (it does the simple thing that always assume all the arguments are passed in register first). I'm fixing this by using a static method that takes RuntimeType instead of RuntimeTypeHandle, then convert it to RuntimeTypehandle.
Also switch to use PREPARE_NONVIRTUAL_CALLSITE(METHODID) as per Jan's suggestion.
ICastable test is now enabled in x86 for both JITs.
Diffstat (limited to 'src/vm/virtualcallstub.cpp')
-rw-r--r-- | src/vm/virtualcallstub.cpp | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/src/vm/virtualcallstub.cpp b/src/vm/virtualcallstub.cpp index 82de5ac388..512b4f2b36 100644 --- a/src/vm/virtualcallstub.cpp +++ b/src/vm/virtualcallstub.cpp @@ -2277,12 +2277,11 @@ VirtualCallStubManager::Resolver( // It allows objects that implement ICastable to mimic behavior of other types. MethodTable * pTokenMT = GetTypeFromToken(token); - // Make call to obj.GetImplType(interfaceTypeObj) - MethodDesc *pGetImplTypeMD = pMT->GetMethodDescForInterfaceMethod(MscorlibBinder::GetMethod(METHOD__ICASTABLE__GETIMPLTYPE)); - OBJECTREF tokenManagedType = pTokenMT->GetManagedClassObject(); //GC triggers - - PREPARE_NONVIRTUAL_CALLSITE_USING_METHODDESC(pGetImplTypeMD); + // Make call to ICastableHelpers.GetImplType(this, interfaceTypeObj) + PREPARE_NONVIRTUAL_CALLSITE(METHOD__ICASTABLEHELPERS__GETIMPLTYPE); + OBJECTREF tokenManagedType = pTokenMT->GetManagedClassObject(); //GC triggers + DECLARE_ARGHOLDER_ARRAY(args, 2); args[ARGNUM_0] = OBJECTREF_TO_ARGHOLDER(*protectedObj); args[ARGNUM_1] = OBJECTREF_TO_ARGHOLDER(tokenManagedType); |