bool TraceLoggerThread::enable(JSContext* cx) { if (!enable()) return fail(cx, "internal error"); if (enabled_ == 1) { // Get the top Activation to log the top script/pc (No inlined frames). ActivationIterator iter(cx->runtime()); Activation* act = iter.activation(); if (!act) return fail(cx, "internal error"); JSScript* script = nullptr; int32_t engine = 0; if (act->isJit()) { JitFrameIterator it(iter); while (!it.isScripted() && !it.done()) ++it; MOZ_ASSERT(!it.done()); MOZ_ASSERT(it.isIonJS() || it.isBaselineJS()); script = it.script(); engine = it.isIonJS() ? TraceLogger_IonMonkey : TraceLogger_Baseline; } else if (act->isWasm()) { JS_ReportErrorNumber(cx, GetErrorMessage, nullptr, JSMSG_TRACELOGGER_ENABLE_FAIL, "not yet supported in wasm code"); return false; } else { MOZ_ASSERT(act->isInterpreter()); InterpreterFrame* fp = act->asInterpreter()->current(); MOZ_ASSERT(!fp->runningInJit()); script = fp->script(); engine = TraceLogger_Interpreter; if (script->compartment() != cx->compartment()) return fail(cx, "compartment mismatch"); } TraceLoggerEvent event(this, TraceLogger_Scripts, script); startEvent(event); startEvent(engine); } return true; }