blob: b4299cb0265353ab5b57f51c3909282713234d55 [file] [log] [blame]
--- BytecodeCompiler.cpp
+++ BytecodeCompiler.cpp
@@ -22,16 +22,36 @@
#include "frontend/Parser-inl.h"
#include "vm/ScopeObject-inl.h"
using namespace js;
using namespace js::frontend;
using mozilla::Maybe;
+class MOZ_STACK_CLASS AutoCompilationTraceLogger
+{
+ public:
+ AutoCompilationTraceLogger(ExclusiveContext* cx, const TraceLoggerTextId id);
+
+ private:
+ TraceLoggerThread* logger;
+ TraceLoggerEvent event;
+ AutoTraceLog scriptLogger;
+ AutoTraceLog typeLogger;
+};
+
+AutoCompilationTraceLogger::AutoCompilationTraceLogger(ExclusiveContext* cx, const TraceLoggerTextId id)
+ : logger(cx->isJSContext() ? TraceLoggerForMainThread(cx->asJSContext()->runtime())
+ : TraceLoggerForCurrentThread()),
+ event(logger, TraceLogger_AnnotateScripts),
+ scriptLogger(logger, event),
+ typeLogger(logger, id)
+{}
+
static bool
CheckLength(ExclusiveContext* cx, SourceBufferHolder& srcBuf)
{
// Note this limit is simply so we can store sourceStart and sourceEnd in
// JSScript as 32-bits. It could be lifted fairly easily, since the compiler
// is using size_t internally already.
if (srcBuf.length() > UINT32_MAX) {
if (cx->isJSContext())
@@ -218,24 +238,17 @@ frontend::CompileScript(ExclusiveContext
JSString* source_ /* = nullptr */,
unsigned staticLevel /* = 0 */,
SourceCompressionTask* extraSct /* = nullptr */)
{
MOZ_ASSERT(srcBuf.get());
RootedString source(cx, source_);
- js::TraceLoggerThread* logger = nullptr;
- if (cx->isJSContext())
- logger = TraceLoggerForMainThread(cx->asJSContext()->runtime());
- else
- logger = TraceLoggerForCurrentThread();
- js::TraceLoggerEvent event(logger, TraceLogger_AnnotateScripts, options);
- js::AutoTraceLog scriptLogger(logger, event);
- js::AutoTraceLog typeLogger(logger, TraceLogger_ParserCompileScript);
+ AutoCompilationTraceLogger traceLogger(cx, TraceLogger_ParserCompileScript);
/*
* The scripted callerFrame can only be given for compile-and-go scripts
* and non-zero static level requires callerFrame.
*/
MOZ_ASSERT_IF(evalCaller, options.isRunOnce);
MOZ_ASSERT_IF(evalCaller, options.forEval);
MOZ_ASSERT_IF(evalCaller && evalCaller->strict(), options.strictOption);
@@ -467,20 +480,17 @@ frontend::CompileLazyFunction(JSContext*
CompileOptions options(cx, lazy->version());
options.setMutedErrors(lazy->mutedErrors())
.setFileAndLine(lazy->filename(), lazy->lineno())
.setColumn(lazy->column())
.setNoScriptRval(false)
.setSelfHostingMode(false);
- js::TraceLoggerThread* logger = js::TraceLoggerForMainThread(cx->runtime());
- js::TraceLoggerEvent event(logger, TraceLogger_AnnotateScripts, options);
- js::AutoTraceLog scriptLogger(logger, event);
- js::AutoTraceLog typeLogger(logger, TraceLogger_ParserCompileLazy);
+ AutoCompilationTraceLogger traceLogger(cx, TraceLogger_ParserCompileLazy);
Parser<FullParseHandler> parser(cx, &cx->tempLifoAlloc(), options, chars, length,
/* foldConstants = */ true, nullptr, lazy);
if (!parser.checkOptions())
return false;
uint32_t staticLevel = lazy->staticLevel(cx);
@@ -534,20 +544,17 @@ frontend::CompileLazyFunction(JSContext*
// handler attribute in an HTML <INPUT> tag, or in a Function() constructor.
static bool
CompileFunctionBody(JSContext* cx, MutableHandleFunction fun, const ReadOnlyCompileOptions& options,
const AutoNameVector& formals, SourceBufferHolder& srcBuf,
HandleObject enclosingStaticScope, GeneratorKind generatorKind)
{
MOZ_ASSERT(!options.isRunOnce);
- js::TraceLoggerThread* logger = js::TraceLoggerForMainThread(cx->runtime());
- js::TraceLoggerEvent event(logger, TraceLogger_AnnotateScripts, options);
- js::AutoTraceLog scriptLogger(logger, event);
- js::AutoTraceLog typeLogger(logger, TraceLogger_ParserCompileFunction);
+ AutoCompilationTraceLogger traceLogger(cx, TraceLogger_ParserCompileFunction);
// FIXME: make Function pass in two strings and parse them as arguments and
// ProgramElements respectively.
if (!CheckLength(cx, srcBuf))
return false;
RootedScriptSource sourceObject(cx, CreateScriptSourceObject(cx, options));