Skip to content
4 changes: 4 additions & 0 deletions src/coreclr/interpreter/compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3438,6 +3438,10 @@ void InterpCompiler::EmitPushUnboxAny(const CORINFO_GENERICHANDLE_RESULT& arg1,

m_pLastNewIns->SetSVar(arg2);
m_pLastNewIns->SetDVar(resultVar);

AddIns(INTOP_UNBOX_END);
m_pLastNewIns->data[1] = handleData.dataItemIndex;
m_pLastNewIns->SetDVar(resultVar);
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/interpreter/inc/intops.def
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,8 @@ OPDEF(INTOP_UNBOX_ANY, "unbox.any", 5, 1, 1, InterpOpHelperFtn) // [class handle
OPDEF(INTOP_UNBOX_ANY_GENERIC, "unbox.any.generic", 6, 1, 2, InterpOpGenericHelperFtn) // [class handle data item] [helper data item]
// Unary operations end

OPDEF(INTOP_UNBOX_END, "unbox.end", 3, 1, 0, InterpOpInt)

OPDEF(INTOP_ADD_I4_IMM, "add.i4.imm", 4, 1, 1, InterpOpInt)
OPDEF(INTOP_ADD_I8_IMM, "add.i8.imm", 4, 1, 1, InterpOpInt)

Expand Down
34 changes: 30 additions & 4 deletions src/coreclr/vm/interpexec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2673,18 +2673,44 @@ void InterpExecMethod(InterpreterFrame *pInterpreterFrame, InterpMethodContextFr
int opcode = *ip;
int dreg = ip[1];
int sreg = ip[2];
HELPER_FTN_BOX_UNBOX helper = GetPossiblyIndirectHelper<HELPER_FTN_BOX_UNBOX>(pMethod, ip[3]);
void** dest = LOCAL_VAR_ADDR(dreg, void*);
MethodDesc *pILTargetMethod = NULL;
HELPER_FTN_BOX_UNBOX helper = GetPossiblyIndirectHelper<HELPER_FTN_BOX_UNBOX>(pMethod, ip[3], &pILTargetMethod);
MethodTable *pMT = (MethodTable*)pMethod->pDataItems[ip[4]];
Object *src = LOCAL_VAR(sreg, Object*);

if (pILTargetMethod != NULL)
{
callArgsOffset = pMethod->allocaSize;
returnOffset = ip[1];

// Pass arguments to the target method
LOCAL_VAR(callArgsOffset, void*) = pMT;
LOCAL_VAR(callArgsOffset + INTERP_STACK_SLOT_SIZE, void*) = src;

targetMethod = pILTargetMethod;
ip += 5;

goto CALL_INTERP_METHOD;
}

// private static ref byte Unbox(MethodTable* toTypeHnd, object obj)
Object *src = LOCAL_VAR(sreg, Object*);
void *unboxedData = helper(pMT, src);
CopyValueClassUnchecked(LOCAL_VAR_ADDR(dreg, void), unboxedData, pMT);
*dest = helper(pMT, src);

ip += 5;
break;
}
case INTOP_UNBOX_END:
{
MethodTable *pMT = (MethodTable*)pMethod->pDataItems[ip[2]];
void *dest = LOCAL_VAR_ADDR(ip[1], void);
void *src = LOCAL_VAR(ip[1], void*);
NULL_CHECK(dest);
CopyValueClassUnchecked(dest, src, pMT);

ip += 3;
break;
}
case INTOP_UNBOX_ANY_GENERIC:
{
int opcode = *ip;
Expand Down
Loading