summaryrefslogtreecommitdiffstats
path: root/js/src/frontend/BytecodeCompilation.h
blob: 25737a559f9bb9beb4069252a97fdbdbba25b49c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* -*- 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 <stddef.h>  // size_t
#include <stdint.h>  // 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 <typename Unit>
class SourceAwareCompiler;
template <typename Unit>
class ScriptCompiler;
template <typename Unit>
class ModuleCompiler;
template <typename Unit>
class StandaloneFunctionCompiler;

extern bool CompileGlobalScriptToStencil(JSContext* cx,
                                         CompilationStencil& stencil,
                                         JS::SourceText<char16_t>& srcBuf,
                                         ScopeKind scopeKind);

extern bool CompileGlobalScriptToStencil(
    JSContext* cx, CompilationStencil& stencil,
    JS::SourceText<mozilla::Utf8Unit>& srcBuf, ScopeKind scopeKind);

extern UniquePtr<CompilationStencil> CompileGlobalScriptToStencil(
    JSContext* cx, const JS::ReadOnlyCompileOptions& options,
    JS::SourceText<char16_t>& srcBuf, ScopeKind scopeKind);

extern UniquePtr<CompilationStencil> CompileGlobalScriptToStencil(
    JSContext* cx, const JS::ReadOnlyCompileOptions& options,
    JS::SourceText<mozilla::Utf8Unit>& 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<char16_t>& srcBuf,
                                     ScopeKind scopeKind);

extern JSScript* CompileGlobalScript(JSContext* cx,
                                     const JS::ReadOnlyCompileOptions& options,
                                     JS::SourceText<mozilla::Utf8Unit>& srcBuf,
                                     ScopeKind scopeKind);

extern JSScript* CompileEvalScript(JSContext* cx,
                                   const JS::ReadOnlyCompileOptions& options,
                                   JS::SourceText<char16_t>& srcBuf,
                                   JS::Handle<js::Scope*> enclosingScope,
                                   JS::Handle<JSObject*> enclosingEnv);

extern void FillCompileOptionsForLazyFunction(JS::CompileOptions& options,
                                              Handle<BaseScript*> lazy);

extern MOZ_MUST_USE bool CompileLazyFunctionToStencil(
    JSContext* cx, CompilationStencil& stencil, JS::Handle<BaseScript*> lazy,
    const char16_t* units, size_t length);

extern MOZ_MUST_USE bool CompileLazyFunctionToStencil(
    JSContext* cx, CompilationStencil& stencil, JS::Handle<BaseScript*> 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