// stack trace helper static ProfileStackTrace getStackTrace() { ProfileStackTrace trace; if (g_context.isNull()) return trace; VMRegAnchor _; ActRec *fp = vmfp(); if (!fp) return trace; PC pc = vmpc(); const Func *f = fp->m_func; Unit *u = f->unit(); Offset off = pc - u->entry(); for (;;) { trace.push_back({ f, off, fp->resumed() }); fp = g_context->getPrevVMStateUNSAFE(fp, &off); if (!fp) break; f = fp->m_func; } return trace; }
// stack trace helper static ProfileStackTrace getStackTrace() { ProfileStackTrace trace; if (g_context.isNull()) return trace; JIT::VMRegAnchor _; ActRec *fp = g_vmContext->getFP(); if (!fp) return trace; PC pc = g_vmContext->getPC(); const Func *f = fp->m_func; Unit *u = f->unit(); Offset off = pc - u->entry(); for (;;) { trace.push_back({ f, off }); fp = g_vmContext->getPrevVMState(fp, &off); if (!fp) break; f = fp->m_func; } return trace; }