Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/coreclr/runtime/portable/AllocFast.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,9 @@ EXTERN_C FCDECL2(Object*, RhpNewArrayFast, MethodTable* pMT, INT_PTR size)
EXTERN_C FCDECL2(Object*, RhpNewPtrArrayFast, MethodTable* pMT, INT_PTR size)
{
WRAPPER_NO_CONTRACT;
return RhpNewArrayFast(pMT, size);
// Since we know the implementation of RhpNewArrayFast is native we don't need to actually
// pass a stack pointer or portable entry point context, so we can just specify 0 for those parameters.
return RhpNewArrayFast(0 /* stack_pointer */, pMT, size, 0 /* portableEntryPointContext */);
}

EXTERN_C FCDECL1(Object*, RhpNewFast, MethodTable* pMT)
Expand Down
7 changes: 7 additions & 0 deletions src/coreclr/vm/callhelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@
#ifndef __CALLHELPERS_H__
#define __CALLHELPERS_H__

#ifdef TARGET_WASM
// A sentinel value to indicate to the stack walker that this frame is NOT R2R generated managed code,
// and it should look for the next Frame in the Frame chain to make further progress.
#define TERMINATE_R2R_STACK_WALK 1

#endif

struct CallDescrData
{
// Input arguments
Expand Down
5 changes: 4 additions & 1 deletion src/coreclr/vm/callingconvention.h
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,10 @@ struct TransitionBlock
TADDR m_ReturnAddress;
};
};
ArgumentRegisters m_argumentRegisters;
union {
ArgumentRegisters m_argumentRegisters;
TADDR m_StackPointer;
};
#else
PORTABILITY_ASSERT("TransitionBlock");
#endif
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/vm/eetwain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1899,6 +1899,7 @@ DWORD_PTR InterpreterCodeManager::CallFunclet(OBJECTREF throwable, void* pHandle
#else
// For WASM, create the TransitionBlock in C++ and call the worker directly
TransitionBlock transitionBlock{};
transitionBlock.m_StackPointer = 0;
transitionBlock.m_ReturnAddress = (TADDR)&CallInterpreterFuncletWorker;
return CallInterpreterFuncletWorker(throwable, pHandler, pRD, pExInfo, isFilter, &transitionBlock);
#endif
Expand Down
7 changes: 7 additions & 0 deletions src/coreclr/vm/excep.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10795,6 +10795,13 @@ void SoftwareExceptionFrame::UpdateContextFromTransitionBlock(TransitionBlock *p
memset(&m_Context, 0, sizeof(m_Context));
memset(&m_ContextPointers, 0, sizeof(m_ContextPointers));
m_ReturnAddress = 0;
if (pTransitionBlock != nullptr)
{
m_Context.InterpreterSP = pTransitionBlock->m_StackPointer;
m_Context.InterpreterFP = 0;
m_Context.InterpreterIP = 0;
m_Context.InterpreterWalkFramePointer = 0;
}
}

#endif // TARGET_X86
Expand Down
75 changes: 75 additions & 0 deletions src/coreclr/vm/fcall.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,38 @@

#endif // !SWIZZLE_REGARG_ORDER

#elif defined(TARGET_WASM)

#define FCDECL0(rettype, funcname) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, int32_t portableEntryPointContext)
#define FCDECL1(rettype, funcname, a1) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, int32_t portableEntryPointContext)
#define FCDECL1_V(rettype, funcname, a1) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, int32_t portableEntryPointContext)
#define FCDECL2(rettype, funcname, a1, a2) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, int32_t portableEntryPointContext)
#define FCDECL2VA(rettype, funcname, a1, a2) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, int32_t portableEntryPointContext, ...)
#define FCDECL2_VV(rettype, funcname, a1, a2) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, int32_t portableEntryPointContext)
#define FCDECL2_VI(rettype, funcname, a1, a2) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, int32_t portableEntryPointContext)
#define FCDECL2_IV(rettype, funcname, a1, a2) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, int32_t portableEntryPointContext)
#define FCDECL3(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext)
#define FCDECL3_IIV(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext)
#define FCDECL3_VII(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext)
#define FCDECL3_IVV(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext)
#define FCDECL3_IVI(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext)
#define FCDECL3_VVI(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext)
#define FCDECL3_VVV(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext)
#define FCDECL4(rettype, funcname, a1, a2, a3, a4) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, int32_t portableEntryPointContext)
#define FCDECL5(rettype, funcname, a1, a2, a3, a4, a5) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, int32_t portableEntryPointContext)
#define FCDECL6(rettype, funcname, a1, a2, a3, a4, a5, a6) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, int32_t portableEntryPointContext)
#define FCDECL7(rettype, funcname, a1, a2, a3, a4, a5, a6, a7) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, int32_t portableEntryPointContext)
#define FCDECL8(rettype, funcname, a1, a2, a3, a4, a5, a6, a7, a8) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, int32_t portableEntryPointContext)
#define FCDECL9(rettype, funcname, a1, a2, a3, a4, a5, a6, a7, a8, a9) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, a9, int32_t portableEntryPointContext)
#define FCDECL10(rettype,funcname, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, int32_t portableEntryPointContext)
#define FCDECL11(rettype,funcname, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, int32_t portableEntryPointContext)
#define FCDECL12(rettype,funcname, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, int32_t portableEntryPointContext)
#define FCDECL13(rettype,funcname, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, int32_t portableEntryPointContext)
#define FCDECL14(rettype,funcname, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, int32_t portableEntryPointContext)

#define FCDECL5_IVI(rettype, funcname, a1, a2, a3, a4, a5) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, int32_t portableEntryPointContext)
#define FCDECL5_VII(rettype, funcname, a1, a2, a3, a4, a5) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, int32_t portableEntryPointContext)

#else // !SWIZZLE_STKARG_ORDER

#define FCDECL0(rettype, funcname) rettype F_CALL_CONV funcname()
Expand Down Expand Up @@ -366,6 +398,37 @@ struct FCSigCheck {

#endif // !SWIZZLE_REGARG_ORDER

#elif defined(TARGET_WASM)
#define FCIMPL0(rettype, funcname) rettype funcname(uintptr_t callersStackPointer, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL1(rettype, funcname, a1) rettype funcname(uintptr_t callersStackPointer, a1, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL1_V(rettype, funcname, a1) rettype funcname(uintptr_t callersStackPointer, a1, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL2(rettype, funcname, a1, a2) rettype funcname(uintptr_t callersStackPointer, a1, a2, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL2VA(rettype, funcname, a1, a2) rettype funcname(uintptr_t callersStackPointer, a1, a2, int32_t portableEntryPointContext, ...) { FCIMPL_PROLOG(funcname)
#define FCIMPL2_VV(rettype, funcname, a1, a2) rettype funcname(uintptr_t callersStackPointer, a1, a2, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL2_VI(rettype, funcname, a1, a2) rettype funcname(uintptr_t callersStackPointer, a1, a2, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL2_IV(rettype, funcname, a1, a2) rettype funcname(uintptr_t callersStackPointer, a1, a2, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL3(rettype, funcname, a1, a2, a3) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL3_IIV(rettype, funcname, a1, a2, a3) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL3_IVV(rettype, funcname, a1, a2, a3) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL3_VII(rettype, funcname, a1, a2, a3) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL3_IVI(rettype, funcname, a1, a2, a3) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL3_VVI(rettype, funcname, a1, a2, a3) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL3_VVV(rettype, funcname, a1, a2, a3) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL4(rettype, funcname, a1, a2, a3, a4) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL5(rettype, funcname, a1, a2, a3, a4, a5) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL6(rettype, funcname, a1, a2, a3, a4, a5, a6) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL7(rettype, funcname, a1, a2, a3, a4, a5, a6, a7) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL8(rettype, funcname, a1, a2, a3, a4, a5, a6, a7, a8) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL9(rettype, funcname, a1, a2, a3, a4, a5, a6, a7, a8, a9) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, a9, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL10(rettype,funcname, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL11(rettype,funcname, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL12(rettype,funcname, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL13(rettype,funcname, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL14(rettype,funcname, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)

#define FCIMPL5_IVI(rettype, funcname, a1, a2, a3, a4, a5) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)
#define FCIMPL5_VII(rettype, funcname, a1, a2, a3, a4, a5) rettype funcname(uintptr_t callersStackPointer, a1, a2, a3, a4, a5, int32_t portableEntryPointContext) { FCIMPL_PROLOG(funcname)

#else // SWIZZLE_STKARG_ORDER

#define FCIMPL0(rettype, funcname) rettype funcname() { FCIMPL_PROLOG(funcname)
Expand Down Expand Up @@ -435,6 +498,18 @@ struct FCSigCheck {
#define HCIMPL3(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(a1, a2, a3) { HCIMPL_PROLOG(funcname)
#define HCIMPL3_RAW(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(a1, a2, a3) {
#endif // !SWIZZLE_REGARG_ORDER
#elif defined(TARGET_WASM)

#define HCIMPL0(rettype, funcname) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, int32_t portableEntryPointContext) { HCIMPL_PROLOG(funcname)
#define HCIMPL1(rettype, funcname, a1) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, int32_t portableEntryPointContext) { HCIMPL_PROLOG(funcname)
#define HCIMPL1_RAW(rettype, funcname, a1) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, int32_t portableEntryPointContext) {
#define HCIMPL1_V(rettype, funcname, a1) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, int32_t portableEntryPointContext) { HCIMPL_PROLOG(funcname)
#define HCIMPL2(rettype, funcname, a1, a2) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, int32_t portableEntryPointContext) { HCIMPL_PROLOG(funcname)
#define HCIMPL2_RAW(rettype, funcname, a1, a2) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, int32_t portableEntryPointContext) {
#define HCIMPL2_VV(rettype, funcname, a1, a2) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, int32_t portableEntryPointContext) { HCIMPL_PROLOG(funcname)
#define HCIMPL3(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext) { HCIMPL_PROLOG(funcname)
#define HCIMPL3_RAW(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(uintptr_t callersStackPointer, a1, a2, a3, int32_t portableEntryPointContext) {

#else // SWIZZLE_STKARG_ORDER

#define HCIMPL0(rettype, funcname) rettype F_CALL_CONV funcname() { HCIMPL_PROLOG(funcname)
Expand Down
11 changes: 6 additions & 5 deletions src/coreclr/vm/frames.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1114,7 +1114,7 @@ void DynamicHelperFrame::GcScanRoots_Impl(promote_func *fn, ScanContext* sc)
//--------------------------------------------------------------------
// This constructor pushes a new GCFrame on the frame chain.
//--------------------------------------------------------------------
GCFrame::GCFrame(Thread *pThread, OBJECTREF *pObjRefs, UINT numObjRefs, BOOL maybeInterior)
GCFrame::GCFrame(Thread *pThread, OBJECTREF *pObjRefs, UINT numObjRefs, UINT gcFlags)
{
CONTRACTL
{
Expand All @@ -1130,7 +1130,7 @@ GCFrame::GCFrame(Thread *pThread, OBJECTREF *pObjRefs, UINT numObjRefs, BOOL may
#endif

#ifdef USE_CHECKED_OBJECTREFS
if (!maybeInterior) {
if (!gcFlags) {
UINT i;
for(i = 0; i < numObjRefs; i++)
Thread::ObjectRefProtected(&pObjRefs[i]);
Expand Down Expand Up @@ -1159,7 +1159,7 @@ GCFrame::GCFrame(Thread *pThread, OBJECTREF *pObjRefs, UINT numObjRefs, BOOL may

m_pObjRefs = pObjRefs;
m_numObjRefs = numObjRefs;
m_MaybeInterior = maybeInterior;
m_gcFlags = gcFlags;

Push(pThread);
}
Expand Down Expand Up @@ -1314,9 +1314,10 @@ void GCFrame::GcScanRoots(promote_func *fn, ScanContext* sc)
for (UINT i = 0; i < m_numObjRefs; i++)
{
auto fromAddress = OBJECTREF_TO_UNCHECKED_OBJECTREF(m_pObjRefs[i]);
if (m_MaybeInterior)
if (m_gcFlags != 0)
{
PromoteCarefully(fn, pRefs + i, sc, GC_CALL_INTERIOR | CHECK_APP_DOMAIN);
_ASSERTE(m_gcFlags & GC_CALL_INTERIOR);
PromoteCarefully(fn, pRefs + i, sc, m_gcFlags | CHECK_APP_DOMAIN);
}
Comment on lines +1317 to 1321
else
{
Expand Down
19 changes: 9 additions & 10 deletions src/coreclr/vm/frames.h
Original file line number Diff line number Diff line change
Expand Up @@ -1602,13 +1602,13 @@ class GCFrame
//--------------------------------------------------------------------
// This constructor pushes a new GCFrame on the GC frame chain.
//--------------------------------------------------------------------
GCFrame(OBJECTREF *pObjRefs, UINT numObjRefs, BOOL maybeInterior)
: GCFrame(GetThread(), pObjRefs, numObjRefs, maybeInterior)
GCFrame(OBJECTREF *pObjRefs, UINT numObjRefs, UINT gcFlags)
: GCFrame(GetThread(), pObjRefs, numObjRefs, gcFlags)
{
WRAPPER_NO_CONTRACT;
}

GCFrame(Thread *pThread, OBJECTREF *pObjRefs, UINT numObjRefs, BOOL maybeInterior);
GCFrame(Thread *pThread, OBJECTREF *pObjRefs, UINT numObjRefs, UINT gcFlags);
~GCFrame();

// Push and pop this frame from the thread's stack.
Expand Down Expand Up @@ -1663,7 +1663,7 @@ class GCFrame
PTR_Thread m_pCurThread;
PTR_OBJECTREF m_pObjRefs;
UINT m_numObjRefs;
BOOL m_MaybeInterior;
UINT m_gcFlags;
#ifdef FEATURE_INTERPRETER
PTR_VOID m_osStackLocation;
#endif
Expand Down Expand Up @@ -2383,22 +2383,22 @@ class InterpreterFrame : public FramedMethodFrame
GCFrame __gcframe( \
(OBJECTREF*)&(ObjRefStruct), \
sizeof(ObjRefStruct)/sizeof(OBJECTREF), \
FALSE); \
0); \
{

#define GCPROTECT_BEGIN_THREAD(pThread, ObjRefStruct) do { \
GCFrame __gcframe( \
pThread, \
(OBJECTREF*)&(ObjRefStruct), \
sizeof(ObjRefStruct)/sizeof(OBJECTREF), \
FALSE); \
0); \
{

#define GCPROTECT_ARRAY_BEGIN(ObjRefArray,cnt) do { \
GCFrame __gcframe( \
(OBJECTREF*)&(ObjRefArray), \
cnt * sizeof(ObjRefArray) / sizeof(OBJECTREF), \
FALSE); \
0); \
{

#define GCPROTECT_BEGININTERIOR(ObjRefStruct) do { \
Expand All @@ -2408,17 +2408,16 @@ class InterpreterFrame : public FramedMethodFrame
GCFrame __gcframe( \
(OBJECTREF*)&(ObjRefStruct), \
subjectSize/sizeof(OBJECTREF), \
TRUE); \
GC_CALL_INTERIOR); \
{

#define GCPROTECT_BEGININTERIOR_ARRAY(ObjRefArray,cnt) do { \
GCFrame __gcframe( \
(OBJECTREF*)&(ObjRefArray), \
cnt, \
TRUE); \
GC_CALL_INTERIOR); \
{


#define GCPROTECT_END() \
} \
} while(0)
Expand Down
Loading
Loading