void EventHook::RunUserProfiler(const ActRec* ar, int mode) { // Don't do anything if we are running the profiling function itself // or if we haven't set up a profiler. if (g_vmContext->m_executingSetprofileCallback || g_vmContext->m_setprofileCallback.isNull()) { return; } Transl::VMRegAnchor _; ExecutingSetprofileCallbackGuard guard; Array params; Array frameinfo; if (mode == ProfileEnter) { params.append(s_enter); frameinfo.set(s_args, hhvm_get_frame_args(ar)); } else { params.append(s_exit); if (!g_vmContext->m_faults.empty()) { Fault fault = g_vmContext->m_faults.back(); if (fault.m_faultType == Fault::UserException) { frameinfo.set(s_exception, fault.m_userException); } } else if (!ar->m_func->isBuiltin() && !ar->m_func->isGenerator()) { // TODO (#1131400) This is wrong for builtins frameinfo.set(s_return, tvAsCVarRef(g_vmContext->m_stack.topTV())); } } params.append(VarNR(ar->m_func->fullName())); params.append(frameinfo); f_call_user_func_array(g_vmContext->m_setprofileCallback, params); }
void EventHook::RunUserProfiler(const ActRec* ar, int mode) { // Don't do anything if we are running the profiling function itself // or if we haven't set up a profiler. if (g_context->m_executingSetprofileCallback || g_context->m_setprofileCallback.isNull()) { return; } // Don't profile 86ctor, since its an implementation detail, // and we dont guarantee to call it if (ar->m_func->cls() && ar->m_func == ar->m_func->cls()->getCtor() && Func::isSpecial(ar->m_func->name())) { return; } JIT::VMRegAnchor _; ExecutingSetprofileCallbackGuard guard; Array params; Array frameinfo; if (mode == ProfileEnter) { params.append(s_enter); frameinfo.set(s_args, hhvm_get_frame_args(ar, 0)); } else { params.append(s_exit); if (!g_context->m_faults.empty()) { Fault fault = g_context->m_faults.back(); if (fault.m_faultType == Fault::Type::UserException) { frameinfo.set(s_exception, fault.m_userException); } } else if (!ar->m_func->isCPPBuiltin() && !ar->inGenerator()) { // TODO (#1131400) This is wrong for builtins frameinfo.set(s_return, tvAsCVarRef(g_context->m_stack.topTV())); } } params.append(VarNR(ar->m_func->fullName())); params.append(frameinfo); vm_call_user_func(g_context->m_setprofileCallback, params); }