1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "quickjs_native_engine.h"
17
18 #include <js_native_api.h>
19
20 #include "quickjs_native_engine_impl.h"
21 #include "native_engine/native_engine.h"
22 #include "native_engine/native_property.h"
23 #include "native_value/quickjs_native_array.h"
24 #include "native_value/quickjs_native_array_buffer.h"
25 #include "native_value/quickjs_native_big_int.h"
26 #include "native_value/quickjs_native_boolean.h"
27 #include "native_value/quickjs_native_buffer.h"
28 #include "native_value/quickjs_native_data_view.h"
29 #include "native_value/quickjs_native_date.h"
30 #include "native_value/quickjs_native_external.h"
31 #include "native_value/quickjs_native_function.h"
32 #include "native_value/quickjs_native_number.h"
33 #include "native_value/quickjs_native_object.h"
34 #include "native_value/quickjs_native_string.h"
35 #include "native_value/quickjs_native_typed_array.h"
36 #include "quickjs_native_deferred.h"
37 #include "quickjs_native_reference.h"
38 #include "securec.h"
39 #include "utils/assert.h"
40 #include "utils/log.h"
41
QuickJSNativeEngine(JSRuntime * runtime,JSContext * context,void * jsEngine)42 QuickJSNativeEngine::QuickJSNativeEngine(JSRuntime* runtime, JSContext* context, void* jsEngine)
43 : NativeEngine(jsEngine)
44 {
45 jsEngine_ = jsEngine;
46 nativeEngineImpl_ = new QuickJSNativeEngineImpl(runtime, context, this, jsEngine);
47 HILOG_INFO("QuickJSNativeEngine::QuickJSNativeEngine");
48 }
49
QuickJSNativeEngine(NativeEngineInterface * engineImpl,void * jsEngine,bool isAppModule)50 QuickJSNativeEngine::QuickJSNativeEngine(NativeEngineInterface* engineImpl, void* jsEngine, bool isAppModule)
51 : NativeEngine(jsEngine)
52 {
53 nativeEngineImpl_ = engineImpl;
54 isAppModule_ = isAppModule;
55 HILOG_INFO("QuickJSNativeEngine::QuickJSNativeEngine 2");
56 }
57
~QuickJSNativeEngine()58 QuickJSNativeEngine::~QuickJSNativeEngine()
59 {
60 HILOG_INFO("QuickJSNativeEngine::~QuickJSNativeEngine");
61 }
62
GetModuleFromName(const std::string & moduleName,bool isAppModule,const std::string & id,const std::string & param,const std::string & instanceName,void ** instance)63 JSValue QuickJSNativeEngine::GetModuleFromName(
64 const std::string& moduleName, bool isAppModule, const std::string& id, const std::string& param,
65 const std::string& instanceName, void** instance)
66 {
67 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
68 return qjsNativeEngineImpl->GetModuleFromName(this, moduleName, isAppModule, id, param, instanceName, instance);
69 }
70
LoadModuleByName(const std::string & moduleName,bool isAppModule,const std::string & param,const std::string & instanceName,void * instance)71 JSValue QuickJSNativeEngine::LoadModuleByName(
72 const std::string& moduleName, bool isAppModule, const std::string& param,
73 const std::string& instanceName, void* instance)
74 {
75 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
76 return qjsNativeEngineImpl->LoadModuleByName(this, moduleName, isAppModule, param, instanceName, instance);
77 }
78
GetRuntime()79 JSRuntime* QuickJSNativeEngine::GetRuntime()
80 {
81 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
82 return qjsNativeEngineImpl->GetRuntime();
83 }
84
GetContext()85 JSContext* QuickJSNativeEngine::GetContext()
86 {
87 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
88 return qjsNativeEngineImpl->GetContext();
89 }
90
Loop(LoopMode mode,bool needSync)91 void QuickJSNativeEngine::Loop(LoopMode mode, bool needSync)
92 {
93 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
94 return qjsNativeEngineImpl->Loop(mode, needSync);
95 }
96
GetGlobal()97 NativeValue* QuickJSNativeEngine::GetGlobal()
98 {
99 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
100 return qjsNativeEngineImpl->GetGlobal(this);
101 }
102
CreateNull()103 NativeValue* QuickJSNativeEngine::CreateNull()
104 {
105 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
106 return qjsNativeEngineImpl->CreateNull(this);
107 }
108
CreateUndefined()109 NativeValue* QuickJSNativeEngine::CreateUndefined()
110 {
111 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
112 return qjsNativeEngineImpl->CreateUndefined(this);
113 }
114
CreateBoolean(bool value)115 NativeValue* QuickJSNativeEngine::CreateBoolean(bool value)
116 {
117 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
118 return qjsNativeEngineImpl->CreateBoolean(this, value);
119 }
120
CreateNumber(int32_t value)121 NativeValue* QuickJSNativeEngine::CreateNumber(int32_t value)
122 {
123 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
124 return qjsNativeEngineImpl->CreateNumber(this, value);
125 }
126
CreateNumber(uint32_t value)127 NativeValue* QuickJSNativeEngine::CreateNumber(uint32_t value)
128 {
129 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
130 return qjsNativeEngineImpl->CreateNumber(this, value);
131 }
132
CreateNumber(int64_t value)133 NativeValue* QuickJSNativeEngine::CreateNumber(int64_t value)
134 {
135 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
136 return qjsNativeEngineImpl->CreateNumber(this, value);
137 }
138
CreateNumber(double value)139 NativeValue* QuickJSNativeEngine::CreateNumber(double value)
140 {
141 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
142 return qjsNativeEngineImpl->CreateNumber(this, value);
143 }
144
CreateBigInt(int64_t value)145 NativeValue* QuickJSNativeEngine::CreateBigInt(int64_t value)
146 {
147 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
148 return qjsNativeEngineImpl->CreateBigInt(this, value);
149 }
150
CreateBigInt(uint64_t value)151 NativeValue* QuickJSNativeEngine::CreateBigInt(uint64_t value)
152 {
153 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
154 return qjsNativeEngineImpl->CreateBigInt(this, value);
155 }
156
CreateString(const char * value,size_t length)157 NativeValue* QuickJSNativeEngine::CreateString(const char* value, size_t length)
158 {
159 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
160 return qjsNativeEngineImpl->CreateString(this, value, length);
161 }
162
CreateString16(const char16_t * value,size_t length)163 NativeValue* QuickJSNativeEngine::CreateString16(const char16_t* value, size_t length)
164 {
165 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
166 return qjsNativeEngineImpl->CreateString16(this, value, length);
167 }
168
CreateSymbol(NativeValue * value)169 NativeValue* QuickJSNativeEngine::CreateSymbol(NativeValue* value)
170 {
171 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
172 return qjsNativeEngineImpl->CreateSymbol(this, value);
173 }
174
CreateFunction(const char * name,size_t length,NativeCallback cb,void * value)175 NativeValue* QuickJSNativeEngine::CreateFunction(const char* name, size_t length, NativeCallback cb, void* value)
176 {
177 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
178 return qjsNativeEngineImpl->CreateFunction(this, name, length, cb, value);
179 }
180
CreateExternal(void * value,NativeFinalize callback,void * hint,size_t nativeBindingSize)181 NativeValue* QuickJSNativeEngine::CreateExternal(void* value, NativeFinalize callback, void* hint,
182 size_t nativeBindingSize)
183 {
184 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
185 return qjsNativeEngineImpl->CreateExternal(this, value, callback, hint, nativeBindingSize);
186 }
187
CreateObject()188 NativeValue* QuickJSNativeEngine::CreateObject()
189 {
190 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
191 return qjsNativeEngineImpl->CreateObject(this);
192 }
193
CreateNativeBindingObject(void * detach,void * attach)194 NativeValue* QuickJSNativeEngine::CreateNativeBindingObject(void* detach, void* attach)
195 {
196 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
197 return qjsNativeEngineImpl->CreateNativeBindingObject(this, detach, attach);
198 }
199
CreateArrayBuffer(void ** value,size_t length)200 NativeValue* QuickJSNativeEngine::CreateArrayBuffer(void** value, size_t length)
201 {
202 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
203 return qjsNativeEngineImpl->CreateArrayBuffer(this, value, length);
204 }
205
CreateArrayBufferExternal(void * value,size_t length,NativeFinalize cb,void * hint)206 NativeValue* QuickJSNativeEngine::CreateArrayBufferExternal(void* value, size_t length, NativeFinalize cb, void* hint)
207 {
208 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
209 return qjsNativeEngineImpl->CreateArrayBufferExternal(this, value, length, cb, hint);
210 }
211
CreateArray(size_t length)212 NativeValue* QuickJSNativeEngine::CreateArray(size_t length)
213 {
214 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
215 return qjsNativeEngineImpl->CreateArray(this, length);
216 }
217
CreateDataView(NativeValue * value,size_t length,size_t offset)218 NativeValue* QuickJSNativeEngine::CreateDataView(NativeValue* value, size_t length, size_t offset)
219 {
220 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
221 return qjsNativeEngineImpl->CreateDataView(this, value, length, offset);
222 }
223
CreateTypedArray(NativeTypedArrayType type,NativeValue * value,size_t length,size_t offset)224 NativeValue* QuickJSNativeEngine::CreateTypedArray(NativeTypedArrayType type,
225 NativeValue* value,
226 size_t length,
227 size_t offset)
228 {
229 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
230 return qjsNativeEngineImpl->CreateTypedArray(this, type, value, length, offset);
231 }
232
CreatePromise(NativeDeferred ** deferred)233 NativeValue* QuickJSNativeEngine::CreatePromise(NativeDeferred** deferred)
234 {
235 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
236 return qjsNativeEngineImpl->CreatePromise(this, deferred);
237 }
238
CreateError(NativeValue * code,NativeValue * message)239 NativeValue* QuickJSNativeEngine::CreateError(NativeValue* code, NativeValue* message)
240 {
241 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
242 return qjsNativeEngineImpl->CreateError(this, code, message);
243 }
244
CreateInstance(NativeValue * constructor,NativeValue * const * argv,size_t argc)245 NativeValue* QuickJSNativeEngine::CreateInstance(NativeValue* constructor, NativeValue* const *argv, size_t argc)
246 {
247 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
248 return qjsNativeEngineImpl->CreateInstance(this, constructor, argv, argc);
249 }
250
CreateReference(NativeValue * value,uint32_t initialRefcount,NativeFinalize callback,void * data,void * hint)251 NativeReference* QuickJSNativeEngine::CreateReference(NativeValue* value, uint32_t initialRefcount,
252 NativeFinalize callback, void* data, void* hint)
253 {
254 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
255 return qjsNativeEngineImpl->CreateReference(this, value, initialRefcount, callback, data, hint);
256 }
257
CallFunction(NativeValue * thisVar,NativeValue * function,NativeValue * const * argv,size_t argc)258 NativeValue* QuickJSNativeEngine::CallFunction(NativeValue* thisVar,
259 NativeValue* function,
260 NativeValue* const *argv,
261 size_t argc)
262 {
263 return nativeEngineImpl_->CallFunction(this, thisVar, function, argv, argc);
264 }
265
RunScript(NativeValue * script)266 NativeValue* QuickJSNativeEngine::RunScript(NativeValue* script)
267 {
268 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
269 return qjsNativeEngineImpl->RunScript(this, script);
270 }
271
SetPackagePath(const std::vector<std::string> & packagePath)272 void QuickJSNativeEngine::SetPackagePath(const std::vector<std::string>& packagePath)
273 {
274 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
275 return qjsNativeEngineImpl->SetPackagePath(packagePath);
276 }
277
RunBufferScript(std::vector<uint8_t> & buffer)278 NativeValue* QuickJSNativeEngine::RunBufferScript(std::vector<uint8_t>& buffer)
279 {
280 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
281 return qjsNativeEngineImpl->RunBufferScript(this, buffer);
282 }
283
RunActor(std::vector<uint8_t> & buffer,const char * descriptor)284 NativeValue* QuickJSNativeEngine::RunActor(std::vector<uint8_t>& buffer, const char *descriptor)
285 {
286 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
287 return qjsNativeEngineImpl->RunActor(this, buffer, descriptor);
288 }
289
LoadModule(NativeValue * str,const std::string & fileName)290 NativeValue* QuickJSNativeEngine::LoadModule(NativeValue* str, const std::string& fileName)
291 {
292 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
293 return qjsNativeEngineImpl->LoadModule(this, str, fileName);
294 }
295
DefineClass(const char * name,NativeCallback callback,void * data,const NativePropertyDescriptor * properties,size_t length)296 NativeValue* QuickJSNativeEngine::DefineClass(
297 const char* name, NativeCallback callback, void* data, const NativePropertyDescriptor* properties, size_t length)
298 {
299 auto qjsNativeEngineImpl = reinterpret_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
300 return qjsNativeEngineImpl->DefineClass(this, name, callback, data, properties, length);
301 }
302
Throw(NativeValue * error)303 bool QuickJSNativeEngine::Throw(NativeValue* error)
304 {
305 return nativeEngineImpl_->Throw(error);
306 }
307
Throw(NativeErrorType type,const char * code,const char * message)308 bool QuickJSNativeEngine::Throw(NativeErrorType type, const char* code, const char* message)
309 {
310 return nativeEngineImpl_->Throw(this, type, code, message);
311 }
312
JSValueToNativeValue(QuickJSNativeEngine * engine,JSValue value)313 NativeValue* QuickJSNativeEngine::JSValueToNativeValue(QuickJSNativeEngine* engine, JSValue value)
314 {
315 NativeValue* result = nullptr;
316 int tag = JS_VALUE_GET_NORM_TAG(value);
317 switch (tag) {
318 case JS_TAG_BIG_INT:
319 result = new QuickJSNativeBigInt(engine, value);
320 break;
321 case JS_TAG_BIG_FLOAT:
322 result = new QuickJSNativeObject(engine, value);
323 break;
324 case JS_TAG_SYMBOL:
325 result = new QuickJSNativeValue(engine, value);
326 break;
327 case JS_TAG_STRING:
328 result = new QuickJSNativeString(engine, value);
329 break;
330 case JS_TAG_OBJECT:
331 if (JS_IsArray(engine->GetContext(), value)) {
332 result = new QuickJSNativeArray(engine, value);
333 } else if (JS_IsError(engine->GetContext(), value)) {
334 result = new QuickJSNativeValue(engine, value);
335 } else if (JS_IsPromise(engine->GetContext(), value)) {
336 result = new QuickJSNativeValue(engine, value);
337 } else if (JS_IsArrayBuffer(engine->GetContext(), value)) {
338 result = new QuickJSNativeArrayBuffer(engine, value);
339 } else if (JS_IsBuffer(engine->GetContext(), value)) {
340 result = new QuickJSNativeBuffer(engine, value);
341 } else if (JS_IsDataView(engine->GetContext(), value)) {
342 result = new QuickJSNativeDataView(engine, value);
343 } else if (JS_IsTypedArray(engine->GetContext(), value)) {
344 result = new QuickJSNativeTypedArray(engine, value);
345 } else if (JS_IsExternal(engine->GetContext(), value)) {
346 result = new QuickJSNativeExternal(engine, value);
347 } else if (JS_IsFunction(engine->GetContext(), value)) {
348 result = new QuickJSNativeFunction(engine, value);
349 } else if (JS_IsDate(engine->GetContext(), value)) {
350 result = new QuickJSNativeDate(engine, value);
351 } else {
352 result = new QuickJSNativeObject(engine, value);
353 }
354 break;
355 case JS_TAG_BOOL:
356 result = new QuickJSNativeBoolean(engine, value);
357 break;
358 case JS_TAG_NULL:
359 case JS_TAG_UNDEFINED:
360 case JS_TAG_UNINITIALIZED:
361 case JS_TAG_CATCH_OFFSET:
362 case JS_TAG_EXCEPTION:
363 result = new QuickJSNativeValue(engine, value);
364 break;
365 case JS_TAG_INT:
366 case JS_TAG_FLOAT64:
367 result = new QuickJSNativeNumber(engine, value);
368 break;
369 default:
370 HILOG_DEBUG("JS_VALUE_GET_NORM_TAG %{public}d", tag);
371 }
372 return result;
373 }
374
CreateRuntime()375 void* QuickJSNativeEngine::CreateRuntime()
376 {
377 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
378 return qjsNativeEngineImpl->CreateRuntime(this);
379 }
380
CheckTransferList(JSValue transferList)381 bool QuickJSNativeEngine::CheckTransferList(JSValue transferList)
382 {
383 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
384 return qjsNativeEngineImpl->CheckTransferList(transferList);
385 }
386
DetachTransferList(JSValue transferList)387 bool QuickJSNativeEngine::DetachTransferList(JSValue transferList)
388 {
389 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
390 return qjsNativeEngineImpl->DetachTransferList(transferList);
391 }
392
Serialize(NativeEngine * context,NativeValue * value,NativeValue * transfer)393 NativeValue* QuickJSNativeEngine::Serialize(NativeEngine* context, NativeValue* value, NativeValue* transfer)
394 {
395 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
396 return qjsNativeEngineImpl->Serialize(context, value, transfer);
397 }
398
Deserialize(NativeEngine * context,NativeValue * recorder)399 NativeValue* QuickJSNativeEngine::Deserialize(NativeEngine* context, NativeValue* recorder)
400 {
401 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
402 return qjsNativeEngineImpl->Deserialize(this, context, recorder);
403 }
404
DeleteSerializationData(NativeValue * value) const405 void QuickJSNativeEngine::DeleteSerializationData(NativeValue* value) const
406 {
407 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
408 return qjsNativeEngineImpl->DeleteSerializationData(value);
409 }
410
GetExceptionForWorker() const411 ExceptionInfo* QuickJSNativeEngine::GetExceptionForWorker() const
412 {
413 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
414 return qjsNativeEngineImpl->GetExceptionForWorker();
415 }
416
ValueToNativeValue(JSValueWrapper & value)417 NativeValue* QuickJSNativeEngine::ValueToNativeValue(JSValueWrapper& value)
418 {
419 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
420 return qjsNativeEngineImpl->ValueToNativeValue(this, value);
421 }
422
CreateBuffer(void ** value,size_t length)423 NativeValue* QuickJSNativeEngine::CreateBuffer(void** value, size_t length)
424 {
425 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
426 return qjsNativeEngineImpl->CreateBuffer(this, value, length);
427 }
428
CreateBufferCopy(void ** value,size_t length,const void * data)429 NativeValue* QuickJSNativeEngine::CreateBufferCopy(void** value, size_t length, const void* data)
430 {
431 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
432 return qjsNativeEngineImpl->CreateBufferCopy(this, value, length, data);
433 }
434
CreateBufferExternal(void * value,size_t length,NativeFinalize cb,void * hint)435 NativeValue* QuickJSNativeEngine::CreateBufferExternal(void* value, size_t length, NativeFinalize cb, void* hint)
436 {
437 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
438 return qjsNativeEngineImpl->CreateBufferExternal(this, value, length, cb, hint);
439 }
440
CreateDate(double time)441 NativeValue* QuickJSNativeEngine::CreateDate(double time)
442 {
443 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
444 return qjsNativeEngineImpl->CreateDate(this, time);
445 }
446
CreateBigWords(int sign_bit,size_t word_count,const uint64_t * words)447 NativeValue* QuickJSNativeEngine::CreateBigWords(int sign_bit, size_t word_count, const uint64_t* words)
448 {
449 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
450 return qjsNativeEngineImpl->CreateBigWords(this, sign_bit, word_count, words);
451 }
452
TriggerFatalException(NativeValue * error)453 bool QuickJSNativeEngine::TriggerFatalException(NativeValue* error)
454 {
455 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
456 return qjsNativeEngineImpl->TriggerFatalException(error);
457 }
458
AdjustExternalMemory(int64_t ChangeInBytes,int64_t * AdjustedValue)459 bool QuickJSNativeEngine::AdjustExternalMemory(int64_t ChangeInBytes, int64_t* AdjustedValue)
460 {
461 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
462 return qjsNativeEngineImpl->AdjustExternalMemory(ChangeInBytes, AdjustedValue);
463 }
464
SetPromiseRejectCallback(NativeReference * rejectCallbackRef,NativeReference * checkCallbackRef)465 void QuickJSNativeEngine::SetPromiseRejectCallback(NativeReference* rejectCallbackRef,
466 NativeReference* checkCallbackRef)
467 {
468 auto qjsNativeEngineImpl = static_cast<QuickJSNativeEngineImpl*>(nativeEngineImpl_);
469 return qjsNativeEngineImpl->SetPromiseRejectCallback(this, rejectCallbackRef, checkCallbackRef);
470 }
471
StartCpuProfiler(const std::string & fileName)472 void QuickJSNativeEngine::StartCpuProfiler(const std::string& fileName)
473 {
474 nativeEngineImpl_->StartCpuProfiler();
475 }
StopCpuProfiler()476 void QuickJSNativeEngine::StopCpuProfiler()
477 {
478 nativeEngineImpl_->StopCpuProfiler();
479 }
480
ResumeVM()481 void QuickJSNativeEngine::ResumeVM()
482 {
483 nativeEngineImpl_->ResumeVM();
484 }
SuspendVM()485 bool QuickJSNativeEngine::SuspendVM()
486 {
487 return nativeEngineImpl_->SuspendVM();
488 }
IsSuspended()489 bool QuickJSNativeEngine::IsSuspended()
490 {
491 return nativeEngineImpl_->IsSuspended();
492 }
CheckSafepoint()493 bool QuickJSNativeEngine::CheckSafepoint()
494 {
495 return nativeEngineImpl_->CheckSafepoint();
496 }
497
DumpHeapSnapshot(const std::string & path,bool isVmMode,DumpFormat dumpFormat)498 void QuickJSNativeEngine::DumpHeapSnapshot(const std::string& path, bool isVmMode, DumpFormat dumpFormat)
499 {
500 nativeEngineImpl_->DumpHeapSnapshot(path, isVmMode, dumpFormat);
501 }
502
DumpHeapSnapshot(bool isVmMode,DumpFormat dumpFormat,bool isPrivate)503 void QuickJSNativeEngine::DumpHeapSnapshot(bool isVmMode, DumpFormat dumpFormat, bool isPrivate)
504 {
505 nativeEngineImpl_->DumpHeapSnapshotExt(isVmMode, dumpFormat, isPrivate);
506 }
507
BuildNativeAndJsStackTrace(std::string & stackTraceStr)508 bool QuickJSNativeEngine::BuildNativeAndJsStackTrace(std::string& stackTraceStr)
509 {
510 return nativeEngineImpl_->BuildNativeAndJsStackTrace(stackTraceStr);
511 }
BuildJsStackTrace(std::string & stackTraceStr)512 bool QuickJSNativeEngine::BuildJsStackTrace(std::string& stackTraceStr)
513 {
514 return nativeEngineImpl_->BuildJsStackTrace(stackTraceStr);
515 }
BuildJsStackInfoList(uint32_t tid,std::vector<JsFrameInfo> & jsFrames)516 bool QuickJSNativeEngine::BuildJsStackInfoList(uint32_t tid, std::vector<JsFrameInfo>& jsFrames)
517 {
518 return nativeEngineImpl_->BuildJsStackInfoList(tid, jsFrames);
519 }
DeleteWorker(NativeEngine * hostEngine,NativeEngine * workerEngine)520 bool QuickJSNativeEngine::DeleteWorker(NativeEngine* hostEngine, NativeEngine* workerEngine)
521 {
522 return nativeEngineImpl_->DeleteWorker(hostEngine, workerEngine);
523 }
StartHeapTracking(double timeInterval,bool isVmMode)524 bool QuickJSNativeEngine::StartHeapTracking(double timeInterval, bool isVmMode)
525 {
526 return nativeEngineImpl_->StartHeapTracking(timeInterval, isVmMode);
527 }
StopHeapTracking(const std::string & filePath)528 bool QuickJSNativeEngine::StopHeapTracking(const std::string& filePath)
529 {
530 return nativeEngineImpl_->StopHeapTracking(filePath);
531 }
532
PrintStatisticResult()533 void QuickJSNativeEngine::PrintStatisticResult()
534 {
535 nativeEngineImpl_->PrintStatisticResult();
536 }
StartRuntimeStat()537 void QuickJSNativeEngine::StartRuntimeStat()
538 {
539 nativeEngineImpl_->StartRuntimeStat();
540 }
StopRuntimeStat()541 void QuickJSNativeEngine::StopRuntimeStat()
542 {
543 nativeEngineImpl_->StopRuntimeStat();
544 }
GetArrayBufferSize()545 size_t QuickJSNativeEngine::GetArrayBufferSize()
546 {
547 return nativeEngineImpl_->GetArrayBufferSize();
548 }
GetHeapTotalSize()549 size_t QuickJSNativeEngine::GetHeapTotalSize()
550 {
551 return nativeEngineImpl_->GetHeapTotalSize();
552 }
GetHeapUsedSize()553 size_t QuickJSNativeEngine::GetHeapUsedSize()
554 {
555 return nativeEngineImpl_->GetHeapUsedSize();
556 }
557
RegisterUncaughtExceptionHandler(UncaughtExceptionCallback callback)558 void QuickJSNativeEngine::RegisterUncaughtExceptionHandler(UncaughtExceptionCallback callback)
559 {
560 nativeEngineImpl_->RegisterUncaughtExceptionHandler(callback);
561 }
HandleUncaughtException()562 void QuickJSNativeEngine::HandleUncaughtException()
563 {
564 nativeEngineImpl_->HandleUncaughtException(this);
565 }
566