diff options
author | Sergey Andreenko <seandree@microsoft.com> | 2019-05-07 14:55:22 -0700 |
---|---|---|
committer | Sergey Andreenko <seandree@microsoft.com> | 2019-05-07 14:56:11 -0700 |
commit | 1dc55132deac51eeb265b086a96ee5b96d68254a (patch) | |
tree | 21205f3c5d0633189887016973cbbef6e5ae81af /src | |
parent | 4e8ee8653b40062fd220a3a6f492356dd20df198 (diff) | |
download | coreclr-1dc55132deac51eeb265b086a96ee5b96d68254a.tar.gz coreclr-1dc55132deac51eeb265b086a96ee5b96d68254a.tar.bz2 coreclr-1dc55132deac51eeb265b086a96ee5b96d68254a.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/vm/frames.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
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<PTR_PTR_Object>(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))); } } |