-
-
Notifications
You must be signed in to change notification settings - Fork 39
Expand file tree
/
Copy pathV8Runtime.h
More file actions
229 lines (193 loc) · 9.37 KB
/
V8Runtime.h
File metadata and controls
229 lines (193 loc) · 9.37 KB
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
/*
* Copyright (c) Kudo Chien.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
// #include <cxxreact/MessageQueueThread.h>
#include "V8RuntimeConfig.h"
#include "jsi/jsi.h"
#include "libplatform/libplatform.h"
#include "v8.h"
namespace rnv8 {
class V8Runtime;
class V8PointerValue;
class InspectorClient;
class V8Runtime : public facebook::jsi::Runtime {
public:
V8Runtime();
// V8Runtime(
// std::unique_ptr<V8RuntimeConfig> config,
// std::shared_ptr<facebook::react::MessageQueueThread> jsQueue);
// V8Runtime(
// const V8Runtime *v8Runtime,
// std::unique_ptr<V8RuntimeConfig> config);
~V8Runtime();
// Calling this function when the platform main runloop is idle
void OnMainLoopIdle();
private:
v8::Local<v8::Context> CreateGlobalContext(v8::Isolate* isolate);
facebook::jsi::Value ExecuteScript(v8::Isolate* isolate,
const v8::Local<v8::String>& script,
const std::string& sourceURL);
void ReportException(v8::Isolate* isolate, v8::TryCatch* tryCatch) const;
std::unique_ptr<v8::ScriptCompiler::CachedData> LoadCodeCacheIfNeeded(
const std::string& sourceURL);
bool SaveCodeCacheIfNeeded(const v8::Local<v8::Script>& script,
const std::string& sourceURL,
v8::ScriptCompiler::CachedData* cachedData);
std::unique_ptr<v8::ScriptCompiler::Source> UseFakeSourceIfNeeded(
const v8::ScriptOrigin& origin,
v8::ScriptCompiler::CachedData* cachedData);
enum InternalFieldType {
kInvalid = 0,
kHostObject = 1,
kNativeState = 2,
kMaxValue = kNativeState,
};
InternalFieldType GetInternalFieldType(v8::Local<v8::Object> object) const;
static v8::Platform* GetPlatform();
//
// facebook::jsi::Runtime implementations
//
public:
facebook::jsi::Value evaluateJavaScript(
const std::shared_ptr<const facebook::jsi::Buffer>& buffer,
const std::string& sourceURL) override;
std::shared_ptr<const facebook::jsi::PreparedJavaScript> prepareJavaScript(
const std::shared_ptr<const facebook::jsi::Buffer>& buffer,
std::string sourceURL) override;
facebook::jsi::Value evaluatePreparedJavaScript(
const std::shared_ptr<const facebook::jsi::PreparedJavaScript>& js)
override;
void queueMicrotask(const facebook::jsi::Function& callback) override;
bool drainMicrotasks(int maxMicrotasksHint = -1) override;
facebook::jsi::Object global() override;
std::string description() override;
bool isInspectable() override;
protected:
PointerValue* cloneSymbol(const Runtime::PointerValue* pv) override;
PointerValue* cloneBigInt(const Runtime::PointerValue* pv) override;
PointerValue* cloneString(const Runtime::PointerValue* pv) override;
PointerValue* cloneObject(const Runtime::PointerValue* pv) override;
PointerValue* clonePropNameID(const Runtime::PointerValue* pv) override;
facebook::jsi::PropNameID createPropNameIDFromAscii(const char* str,
size_t length) override;
facebook::jsi::PropNameID createPropNameIDFromUtf8(const uint8_t* utf8,
size_t length) override;
facebook::jsi::PropNameID createPropNameIDFromString(
const facebook::jsi::String& str) override;
facebook::jsi::PropNameID createPropNameIDFromSymbol(
const facebook::jsi::Symbol& sym) override;
std::string utf8(const facebook::jsi::PropNameID&) override;
bool compare(const facebook::jsi::PropNameID&,
const facebook::jsi::PropNameID&) override;
std::string symbolToString(const facebook::jsi::Symbol&) override;
facebook::jsi::BigInt createBigIntFromInt64(int64_t) override;
facebook::jsi::BigInt createBigIntFromUint64(uint64_t) override;
bool bigintIsInt64(const facebook::jsi::BigInt&) override;
bool bigintIsUint64(const facebook::jsi::BigInt&) override;
uint64_t truncate(const facebook::jsi::BigInt&) override;
facebook::jsi::String bigintToString(const facebook::jsi::BigInt&,
int) override;
facebook::jsi::String createStringFromAscii(const char* str,
size_t length) override;
facebook::jsi::String createStringFromUtf8(const uint8_t* utf8,
size_t length) override;
std::string utf8(const facebook::jsi::String&) override;
facebook::jsi::Object createObject() override;
facebook::jsi::Object createObject(
std::shared_ptr<facebook::jsi::HostObject> hostObject) override;
std::shared_ptr<facebook::jsi::HostObject> getHostObject(
const facebook::jsi::Object&) override;
facebook::jsi::HostFunctionType& getHostFunction(
const facebook::jsi::Function&) override;
bool hasNativeState(const facebook::jsi::Object&) override;
std::shared_ptr<facebook::jsi::NativeState> getNativeState(
const facebook::jsi::Object&) override;
void setNativeState(
const facebook::jsi::Object&,
std::shared_ptr<facebook::jsi::NativeState> state) override;
facebook::jsi::Value getProperty(
const facebook::jsi::Object&,
const facebook::jsi::PropNameID& name) override;
facebook::jsi::Value getProperty(const facebook::jsi::Object&,
const facebook::jsi::String& name) override;
bool hasProperty(const facebook::jsi::Object&,
const facebook::jsi::PropNameID& name) override;
bool hasProperty(const facebook::jsi::Object&,
const facebook::jsi::String& name) override;
void setPropertyValue(const facebook::jsi::Object&,
const facebook::jsi::PropNameID& name,
const facebook::jsi::Value& value) override;
void setPropertyValue(const facebook::jsi::Object&,
const facebook::jsi::String& name,
const facebook::jsi::Value& value) override;
bool isArray(const facebook::jsi::Object&) const override;
bool isArrayBuffer(const facebook::jsi::Object&) const override;
bool isFunction(const facebook::jsi::Object&) const override;
bool isHostObject(const facebook::jsi::Object&) const override;
bool isHostFunction(const facebook::jsi::Function&) const override;
facebook::jsi::Array getPropertyNames(const facebook::jsi::Object&) override;
facebook::jsi::WeakObject createWeakObject(
const facebook::jsi::Object&) override;
facebook::jsi::Value lockWeakObject(
const facebook::jsi::WeakObject&) override;
facebook::jsi::Array createArray(size_t length) override;
facebook::jsi::ArrayBuffer createArrayBuffer(
std::shared_ptr<facebook::jsi::MutableBuffer> buffer) override;
size_t size(const facebook::jsi::Array&) override;
size_t size(const facebook::jsi::ArrayBuffer&) override;
uint8_t* data(const facebook::jsi::ArrayBuffer&) override;
facebook::jsi::Value getValueAtIndex(const facebook::jsi::Array&,
size_t i) override;
void setValueAtIndexImpl(const facebook::jsi::Array&, size_t i,
const facebook::jsi::Value& value) override;
facebook::jsi::Function createFunctionFromHostFunction(
const facebook::jsi::PropNameID& name, unsigned int paramCount,
facebook::jsi::HostFunctionType func) override;
facebook::jsi::Value call(const facebook::jsi::Function&,
const facebook::jsi::Value& jsThis,
const facebook::jsi::Value* args,
size_t count) override;
facebook::jsi::Value callAsConstructor(const facebook::jsi::Function&,
const facebook::jsi::Value* args,
size_t count) override;
bool strictEquals(const facebook::jsi::Symbol& a,
const facebook::jsi::Symbol& b) const override;
bool strictEquals(const facebook::jsi::BigInt& a,
const facebook::jsi::BigInt& b) const override;
bool strictEquals(const facebook::jsi::String& a,
const facebook::jsi::String& b) const override;
bool strictEquals(const facebook::jsi::Object& a,
const facebook::jsi::Object& b) const override;
bool instanceOf(const facebook::jsi::Object& o,
const facebook::jsi::Function& f) override;
void setExternalMemoryPressure(const facebook::jsi::Object& obj,
size_t amount) override;
private:
friend class V8PointerValue;
friend class JSIV8ValueConverter;
//
// JS function/object handler callbacks
//
private:
// For `global._v8runtime()`
static void GetRuntimeInfo(const v8::FunctionCallbackInfo<v8::Value>& args);
// For `HostFunctionContainer()`, will call underlying HostFunction
static void OnHostFuncionContainerCallback(
const v8::FunctionCallbackInfo<v8::Value>& args);
private:
static std::unique_ptr<v8::Platform> s_platform;
private:
std::unique_ptr<V8RuntimeConfig> config_;
std::unique_ptr<v8::ArrayBuffer::Allocator> arrayBufferAllocator_;
std::unique_ptr<v8::StartupData> snapshotBlob_;
v8::Isolate* isolate_;
v8::Global<v8::Context> context_;
std::shared_ptr<InspectorClient> inspectorClient_;
bool isSharedRuntime_ = false;
// std::shared_ptr<facebook::react::MessageQueueThread> jsQueue_;
};
} // namespace rnv8