• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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