From 1dc55132deac51eeb265b086a96ee5b96d68254a Mon Sep 17 00:00:00 2001 From: Sergey Andreenko Date: Tue, 7 May 2019 14:55:22 -0700 Subject: Save OBJECTREF_TO_UNCHECKED_OBJECTREF and use auto. On x86 OBJECTREF_TO_UNCHECKED_OBJECTREF expands to `((UINT_PTR)((*((_UNCHECKED_OBJECTREF*)&(fromAddress)))))` where `*((_UNCHECKED_OBJECTREF*)` call contructor of `OBJECTREF` that call `Object->Validate` that fails for `fromAddress` because it is not longer a valid address. --- src/vm/frames.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/vm/frames.cpp b/src/vm/frames.cpp index 03570a2de8..222047bdbf 100644 --- a/src/vm/frames.cpp +++ b/src/vm/frames.cpp @@ -967,18 +967,21 @@ void GCFrame::GcScanRoots(promote_func *fn, ScanContext* sc) PTR_PTR_Object pRefs = dac_cast(m_pObjRefs); - for (UINT i = 0;i < m_numObjRefs; i++) + for (UINT i = 0; i < m_numObjRefs; i++) { - OBJECTREF fromAddress = m_pObjRefs[i]; + auto fromAddress = OBJECTREF_TO_UNCHECKED_OBJECTREF(m_pObjRefs[i]); if (m_MaybeInterior) - PromoteCarefully(fn, pRefs + i, sc, GC_CALL_INTERIOR|CHECK_APP_DOMAIN); + { + PromoteCarefully(fn, pRefs + i, sc, GC_CALL_INTERIOR | CHECK_APP_DOMAIN); + } else + { (*fn)(pRefs + i, sc, 0); + } - OBJECTREF toAddress = m_pObjRefs[i]; + auto toAddress = OBJECTREF_TO_UNCHECKED_OBJECTREF(m_pObjRefs[i]); LOG((LF_GC, INFO3, "GC Protection Frame promoted" FMT_ADDR "to" FMT_ADDR "\n", - DBG_ADDR(OBJECTREF_TO_UNCHECKED_OBJECTREF(fromAddress)), - DBG_ADDR(OBJECTREF_TO_UNCHECKED_OBJECTREF(toAddress)))); + DBG_ADDR(fromAddress), DBG_ADDR(toAddress))); } } -- cgit v1.2.3