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
|
/* -*- 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/. */
/* JavaScript API for compiling scripts to stencil without depending on
* JSContext. */
#ifndef js_experimental_CompileScript_h
#define js_experimental_CompileScript_h
#include "jspubtd.h"
#include "js/experimental/JSStencil.h"
#include "js/GCAnnotations.h"
#include "js/Modules.h"
#include "js/Stack.h"
#include "js/UniquePtr.h"
namespace js {
class FrontendContext;
namespace frontend {
struct CompilationInput;
} // namespace frontend
} // namespace js
namespace JS {
using FrontendContext = js::FrontendContext;
// Create a new front-end context.
JS_PUBLIC_API JS::FrontendContext* NewFrontendContext();
// Destroy a front-end context allocated with NewFrontendContext.
JS_PUBLIC_API void DestroyFrontendContext(JS::FrontendContext* fc);
JS_PUBLIC_API void SetNativeStackQuota(JS::FrontendContext* fc,
JS::NativeStackSize stackSize);
/*
* Set supported import assertions on a FrontendContext to be used with
* CompileModuleScriptToStencil. May only be set once for each FrontendContext.
* The default list of supported import assertions is empty.
*/
JS_PUBLIC_API bool SetSupportedImportAssertions(
JS::FrontendContext* fc,
const JS::ImportAssertionVector& supportedImportAssertions);
// Temporary storage used during compiling and preparing to instantiate a
// Stencil.
//
// Off-thread consumers can allocate this instance off main thread, and pass it
// back to the main thread, in order to reduce the main thread allocation.
struct CompilationStorage {
private:
// Owned CompilationInput.
//
// This uses raw pointer instead of UniquePtr because CompilationInput
// is opaque.
JS_HAZ_NON_GC_POINTER js::frontend::CompilationInput* input_ = nullptr;
bool isBorrowed_ = false;
public:
CompilationStorage() = default;
explicit CompilationStorage(js::frontend::CompilationInput* input)
: input_(input), isBorrowed_(true) {}
CompilationStorage(CompilationStorage&& other)
: input_(other.input_), isBorrowed_(other.isBorrowed_) {
other.input_ = nullptr;
}
~CompilationStorage();
private:
CompilationStorage(const CompilationStorage& other) = delete;
void operator=(const CompilationStorage& aOther) = delete;
public:
bool hasInput() { return !!input_; }
// Internal function that initializes the CompilationInput. It should only be
// called once.
bool allocateInput(FrontendContext* fc,
const JS::ReadOnlyCompileOptions& options);
js::frontend::CompilationInput& getInput() {
MOZ_ASSERT(hasInput());
return *input_;
}
// Size of dynamic data. Note that GC data is counted by GC and not here.
size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const;
void trace(JSTracer* trc);
};
extern JS_PUBLIC_API already_AddRefed<JS::Stencil> CompileGlobalScriptToStencil(
JS::FrontendContext* fc, const JS::ReadOnlyCompileOptions& options,
JS::SourceText<mozilla::Utf8Unit>& srcBuf,
JS::CompilationStorage& compileStorage);
extern JS_PUBLIC_API already_AddRefed<JS::Stencil> CompileGlobalScriptToStencil(
JS::FrontendContext* fc, const JS::ReadOnlyCompileOptions& options,
JS::SourceText<char16_t>& srcBuf, JS::CompilationStorage& compileStorage);
extern JS_PUBLIC_API already_AddRefed<JS::Stencil> CompileModuleScriptToStencil(
JS::FrontendContext* fc, const JS::ReadOnlyCompileOptions& options,
JS::SourceText<mozilla::Utf8Unit>& srcBuf,
JS::CompilationStorage& compileStorage);
extern JS_PUBLIC_API already_AddRefed<JS::Stencil> CompileModuleScriptToStencil(
JS::FrontendContext* fc, const JS::ReadOnlyCompileOptions& options,
JS::SourceText<char16_t>& srcBuf, JS::CompilationStorage& compileStorage);
extern JS_PUBLIC_API bool PrepareForInstantiate(
JS::FrontendContext* fc, JS::CompilationStorage& compileStorage,
JS::Stencil& stencil, JS::InstantiationStorage& storage);
} // namespace JS
#endif // js_experimental_CompileScript_h
|