/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- * vim: set ts=8 sts=2 et sw=2 tw=80: * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef frontend_BytecodeCompilation_h #define frontend_BytecodeCompilation_h #include "mozilla/Assertions.h" // MOZ_ASSERT #include "mozilla/Attributes.h" // MOZ_MUST_USE, MOZ_STACK_CLASS #include "mozilla/Maybe.h" // mozilla::Maybe, mozilla::Nothing #include "mozilla/Utf8.h" // mozilla::Utf8Unit #include // size_t #include // uint32_t #include "jstypes.h" // JS_PUBLIC_API #include "frontend/CompilationInfo.h" // CompilationStencil, CompilationStencilSet, CompilationGCOutput #include "frontend/ParseContext.h" // js::frontend::UsedNameTracker #include "frontend/SharedContext.h" // js::frontend::Directives, js::frontend::{,Eval,Global}SharedContext #include "js/CompileOptions.h" // JS::ReadOnlyCompileOptions #include "js/RootingAPI.h" // JS::{,Mutable}Handle, JS::Rooted #include "js/SourceText.h" // JS::SourceText #include "js/UniquePtr.h" // js::UniquePtr #include "vm/JSScript.h" // js::{FunctionAsync,Generator}Kind, js::BaseScript, JSScript, js::ScriptSource, js::ScriptSourceObject #include "vm/Scope.h" // js::ScopeKind class JS_PUBLIC_API JSFunction; class JS_PUBLIC_API JSObject; class JSObject; namespace js { class Scope; namespace frontend { struct BytecodeEmitter; class EitherParser; template class SourceAwareCompiler; template class ScriptCompiler; template class ModuleCompiler; template class StandaloneFunctionCompiler; extern bool CompileGlobalScriptToStencil(JSContext* cx, CompilationStencil& stencil, JS::SourceText& srcBuf, ScopeKind scopeKind); extern bool CompileGlobalScriptToStencil( JSContext* cx, CompilationStencil& stencil, JS::SourceText& srcBuf, ScopeKind scopeKind); extern UniquePtr CompileGlobalScriptToStencil( JSContext* cx, const JS::ReadOnlyCompileOptions& options, JS::SourceText& srcBuf, ScopeKind scopeKind); extern UniquePtr CompileGlobalScriptToStencil( JSContext* cx, const JS::ReadOnlyCompileOptions& options, JS::SourceText& srcBuf, ScopeKind scopeKind); // Perform some operation to reduce the time taken by instantiation. // // Part of InstantiateStencils can be done by calling PrepareForInstantiate. // PrepareForInstantiate is GC-free operation that can be performed // off-main-thread without parse global. extern bool PrepareForInstantiate(JSContext* cx, CompilationStencil& stencil, CompilationGCOutput& gcOutput); extern bool PrepareForInstantiate( JSContext* cx, CompilationStencilSet& stencilSet, CompilationGCOutput& gcOutput, CompilationGCOutput& gcOutputForDelazification); extern bool InstantiateStencils(JSContext* cx, CompilationStencil& stencil, CompilationGCOutput& gcOutput); extern bool InstantiateStencils(JSContext* cx, CompilationStencilSet& stencilSet, CompilationGCOutput& gcOutput, CompilationGCOutput& gcOutputForDelazification); extern JSScript* CompileGlobalScript(JSContext* cx, const JS::ReadOnlyCompileOptions& options, JS::SourceText& srcBuf, ScopeKind scopeKind); extern JSScript* CompileGlobalScript(JSContext* cx, const JS::ReadOnlyCompileOptions& options, JS::SourceText& srcBuf, ScopeKind scopeKind); extern JSScript* CompileEvalScript(JSContext* cx, const JS::ReadOnlyCompileOptions& options, JS::SourceText& srcBuf, JS::Handle enclosingScope, JS::Handle enclosingEnv); extern void FillCompileOptionsForLazyFunction(JS::CompileOptions& options, Handle lazy); extern MOZ_MUST_USE bool CompileLazyFunctionToStencil( JSContext* cx, CompilationStencil& stencil, JS::Handle lazy, const char16_t* units, size_t length); extern MOZ_MUST_USE bool CompileLazyFunctionToStencil( JSContext* cx, CompilationStencil& stencil, JS::Handle lazy, const mozilla::Utf8Unit* units, size_t length); extern bool InstantiateStencilsForDelazify(JSContext* cx, CompilationStencil& stencil); // Certain compile options will disable the syntax parser entirely. inline bool CanLazilyParse(const JS::ReadOnlyCompileOptions& options) { return !options.discardSource && !options.sourceIsLazy && !options.forceFullParse(); } } // namespace frontend } // namespace js #endif // frontend_BytecodeCompilation_h