• 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 "jerryscript_native_engine_impl.h"
17 
18 #include "jerryscript-ext/handler.h"
19 #include "jerryscript_native_deferred.h"
20 #include "jerryscript_native_reference.h"
21 
22 #include "native_value/jerryscript_native_array.h"
23 #include "native_value/jerryscript_native_array_buffer.h"
24 #include "native_value/jerryscript_native_big_int.h"
25 #include "native_value/jerryscript_native_boolean.h"
26 #include "native_value/jerryscript_native_buffer.h"
27 #include "native_value/jerryscript_native_data_view.h"
28 #include "native_value/jerryscript_native_date.h"
29 #include "native_value/jerryscript_native_external.h"
30 #include "native_value/jerryscript_native_function.h"
31 #include "native_value/jerryscript_native_number.h"
32 #include "native_value/jerryscript_native_object.h"
33 #include "native_value/jerryscript_native_string.h"
34 #include "native_value/jerryscript_native_typed_array.h"
35 #include "utils/log.h"
36 
JerryScriptNativeEngineImpl(NativeEngine * engine,void * jsEngineInterface)37 JerryScriptNativeEngineImpl::JerryScriptNativeEngineImpl(NativeEngine* engine,
38     void* jsEngineInterface) : NativeEngineInterface(engine, jsEngineInterface)
39 {
40     HILOG_INFO("JerryScriptNativeEngineImpl::JerryScriptNativeEngineImpl begin");
41     jerry_add_external();
42     jerry_value_t global = jerry_get_global_object();
43     jerry_value_t require = jerry_create_external_function([](const jerry_value_t function, const jerry_value_t thisVal,
44                                                                const jerry_value_t args[],
45                                                                const jerry_length_t argc) -> jerry_value_t {
46         JerryScriptNativeEngineImpl* that = nullptr;
47         jerry_get_object_native_pointer(function, (void**)&that, nullptr);
48         jerry_value_t result = jerry_create_undefined();
49 
50         if (!(argc >= 1 && jerry_value_is_string(args[0]))) {
51             return result;
52         }
53 
54         jerry_size_t moduleNameSize = jerry_get_utf8_string_size(args[0]);
55         if (moduleNameSize == 0) {
56             return result;
57         }
58 
59         char* moduleName = new char[moduleNameSize + 1] { 0 };
60         uint32_t moduleNameLength = jerry_string_to_char_buffer(args[0], (jerry_char_t*)moduleName, moduleNameSize + 1);
61         moduleName[moduleNameLength] = '\0';
62         NativeModule* module = that->GetModuleManager()->LoadNativeModule(moduleName, nullptr, false);
63 
64         if (module != nullptr) {
65             std::string strModuleName(moduleName);
66             JerryScriptNativeEngine* nativeEngine = new JerryScriptNativeEngine(that, that->GetJsEngine(), false);
67             auto jsNativeEngine = static_cast<JerryScriptNativeEngine*>(that->GetRootNativeEngine());
68             if (!jsNativeEngine) {
69                 HILOG_ERROR("init module failed");
70                 return result;
71             }
72             NativeValue* value = that->CreateObject(static_cast<JerryScriptNativeEngine*>(nativeEngine));
73             module->registerCallback(jsNativeEngine, value);
74             result = jerry_acquire_value(*value);
75             nativeEngine->SetModuleFileName(strModuleName);
76         }
77         return result;
78     });
79     jerry_set_object_native_pointer(require, this, nullptr);
80     jerryx_set_property_str(global, "requireNapi", require);
81 
82     jerry_release_value(require);
83     jerry_release_value(global);
84     HILOG_INFO("JerryScriptNativeEngineImpl::JerryScriptNativeEngineImpl end");
85     Init();
86 }
87 
~JerryScriptNativeEngineImpl()88 JerryScriptNativeEngineImpl::~JerryScriptNativeEngineImpl()
89 {
90     HILOG_INFO("JerryScriptNativeEngineImpl::~JerryScriptNativeEngineImpl");
91     Deinit();
92 }
93 
Loop(LoopMode mode,bool needSync)94 void JerryScriptNativeEngineImpl::Loop(LoopMode mode, bool needSync)
95 {
96     NativeEngineInterface::Loop(mode, needSync);
97     jerry_value_t retVal = jerry_run_all_enqueued_jobs();
98     jerry_release_value(retVal);
99 }
100 
GetGlobal(NativeEngine * engine)101 NativeValue* JerryScriptNativeEngineImpl::GetGlobal(NativeEngine* engine)
102 {
103     return new JerryScriptNativeObject(static_cast<JerryScriptNativeEngine*>(engine), jerry_get_global_object());
104 }
105 
CreateNull(NativeEngine * engine)106 NativeValue* JerryScriptNativeEngineImpl::CreateNull(NativeEngine* engine)
107 {
108     return new JerryScriptNativeValue(static_cast<JerryScriptNativeEngine*>(engine), jerry_create_null());
109 }
110 
CreateUndefined(NativeEngine * engine)111 NativeValue* JerryScriptNativeEngineImpl::CreateUndefined(NativeEngine* engine)
112 {
113     return new JerryScriptNativeValue(static_cast<JerryScriptNativeEngine*>(engine), jerry_create_undefined());
114 }
115 
CreateBoolean(NativeEngine * engine,bool value)116 NativeValue* JerryScriptNativeEngineImpl::CreateBoolean(NativeEngine* engine, bool value)
117 {
118     return new JerryScriptNativeBoolean(static_cast<JerryScriptNativeEngine*>(engine), value);
119 }
120 
CreateNumber(NativeEngine * engine,int32_t value)121 NativeValue* JerryScriptNativeEngineImpl::CreateNumber(NativeEngine* engine, int32_t value)
122 {
123     return new JerryScriptNativeNumber(static_cast<JerryScriptNativeEngine*>(engine), (double)value);
124 }
125 
CreateNumber(NativeEngine * engine,uint32_t value)126 NativeValue* JerryScriptNativeEngineImpl::CreateNumber(NativeEngine* engine, uint32_t value)
127 {
128     return new JerryScriptNativeNumber(static_cast<JerryScriptNativeEngine*>(engine), (double)value);
129 }
130 
CreateNumber(NativeEngine * engine,int64_t value)131 NativeValue* JerryScriptNativeEngineImpl::CreateNumber(NativeEngine* engine, int64_t value)
132 {
133     return new JerryScriptNativeNumber(static_cast<JerryScriptNativeEngine*>(engine), (double)value);
134 }
135 
CreateNumber(NativeEngine * engine,double value)136 NativeValue* JerryScriptNativeEngineImpl::CreateNumber(NativeEngine* engine, double value)
137 {
138     return new JerryScriptNativeNumber(static_cast<JerryScriptNativeEngine*>(engine), (double)value);
139 }
140 
CreateString(NativeEngine * engine,const char * value,size_t length)141 NativeValue* JerryScriptNativeEngineImpl::CreateString(NativeEngine* engine, const char* value, size_t length)
142 {
143     return new JerryScriptNativeString(static_cast<JerryScriptNativeEngine*>(engine), value, length);
144 }
145 
CreateSymbol(NativeEngine * engine,NativeValue * value)146 NativeValue* JerryScriptNativeEngineImpl::CreateSymbol(NativeEngine* engine, NativeValue* value)
147 {
148     return new JerryScriptNativeValue(static_cast<JerryScriptNativeEngine*>(engine), jerry_create_symbol(*value));
149 }
150 
CreateExternal(NativeEngine * engine,void * value,NativeFinalize callback,void * hint,size_t nativeBindingSize)151 NativeValue* JerryScriptNativeEngineImpl::CreateExternal(
152     NativeEngine* engine, void* value, NativeFinalize callback, void* hint, [[maybe_unused]] size_t nativeBindingSize)
153 {
154     return new JerryScriptNativeExternal(static_cast<JerryScriptNativeEngine*>(engine), value, callback, hint);
155 }
156 
CreateObject(NativeEngine * engine)157 NativeValue* JerryScriptNativeEngineImpl::CreateObject(NativeEngine* engine)
158 {
159     return new JerryScriptNativeObject(static_cast<JerryScriptNativeEngine*>(engine));
160 }
161 
CreateNativeBindingObject(NativeEngine * engine,void * detach,void * attach)162 NativeValue* JerryScriptNativeEngineImpl::CreateNativeBindingObject(
163     NativeEngine* engine, void* detach, void* attach)
164 {
165     return nullptr;
166 }
167 
CreateFunction(NativeEngine * engine,const char * name,size_t length,NativeCallback cb,void * value)168 NativeValue* JerryScriptNativeEngineImpl::CreateFunction(
169     NativeEngine* engine, const char* name, size_t length, NativeCallback cb, void* value)
170 {
171     return new JerryScriptNativeFunction(static_cast<JerryScriptNativeEngine*>(engine), name, cb, value);
172 }
173 
CreateArray(NativeEngine * engine,size_t length)174 NativeValue* JerryScriptNativeEngineImpl::CreateArray(NativeEngine* engine, size_t length)
175 {
176     return new JerryScriptNativeArray(static_cast<JerryScriptNativeEngine*>(engine), (int)length);
177 }
178 
CreateArrayBuffer(NativeEngine * engine,void ** value,size_t length)179 NativeValue* JerryScriptNativeEngineImpl::CreateArrayBuffer(NativeEngine* engine, void** value, size_t length)
180 {
181     return new JerryScriptNativeArrayBuffer(static_cast<JerryScriptNativeEngine*>(engine), value, length);
182 }
183 
CreateArrayBufferExternal(NativeEngine * engine,void * value,size_t length,NativeFinalize cb,void * hint)184 NativeValue* JerryScriptNativeEngineImpl::CreateArrayBufferExternal(
185     NativeEngine* engine, void* value, size_t length, NativeFinalize cb, void* hint)
186 {
187     return new JerryScriptNativeArrayBuffer(
188         static_cast<JerryScriptNativeEngine*>(engine), (unsigned char*)value, length, cb, hint);
189 }
190 
CreateBuffer(NativeEngine * engine,void ** value,size_t length)191 NativeValue* JerryScriptNativeEngineImpl::CreateBuffer(NativeEngine* engine, void** value, size_t length)
192 {
193     return new JerryScriptNativeBuffer(static_cast<JerryScriptNativeEngine*>(engine), (uint8_t**)value, length);
194 }
195 
CreateBufferCopy(NativeEngine * engine,void ** value,size_t length,const void * data)196 NativeValue* JerryScriptNativeEngineImpl::CreateBufferCopy(
197     NativeEngine* engine, void** value, size_t length, const void* data)
198 {
199     return new JerryScriptNativeBuffer(
200         static_cast<JerryScriptNativeEngine*>(engine), (uint8_t**)value, length, (uint8_t*)data);
201 }
202 
CreateBufferExternal(NativeEngine * engine,void * value,size_t length,NativeFinalize cb,void * hint)203 NativeValue* JerryScriptNativeEngineImpl::CreateBufferExternal(
204     NativeEngine* engine, void* value, size_t length, NativeFinalize cb, void* hint)
205 {
206     return new JerryScriptNativeBuffer(
207         static_cast<JerryScriptNativeEngine*>(engine), (uint8_t*)value, length, cb, hint);
208 }
209 
CreateTypedArray(NativeEngine * engine,NativeTypedArrayType type,NativeValue * value,size_t length,size_t offset)210 NativeValue* JerryScriptNativeEngineImpl::CreateTypedArray(
211     NativeEngine* engine, NativeTypedArrayType type, NativeValue* value, size_t length, size_t offset)
212 {
213     return new JerryScriptNativeTypedArray(static_cast<JerryScriptNativeEngine*>(engine), type, value, length, offset);
214 }
215 
CreateDataView(NativeEngine * engine,NativeValue * value,size_t length,size_t offset)216 NativeValue* JerryScriptNativeEngineImpl::CreateDataView(
217     NativeEngine* engine, NativeValue* value, size_t length, size_t offset)
218 {
219     return new JerryScriptNativeDataView(static_cast<JerryScriptNativeEngine*>(engine), value, length, offset);
220 }
221 
CreatePromise(NativeEngine * engine,NativeDeferred ** deferred)222 NativeValue* JerryScriptNativeEngineImpl::CreatePromise(NativeEngine* engine, NativeDeferred** deferred)
223 {
224     jerry_value_t promise = jerry_create_promise();
225     *deferred = new JerryScriptNativeDeferred(promise);
226     return new JerryScriptNativeValue(static_cast<JerryScriptNativeEngine*>(engine), promise);
227 }
228 
CreateError(NativeEngine * engine,NativeValue * code,NativeValue * message)229 NativeValue* JerryScriptNativeEngineImpl::CreateError(NativeEngine* engine, NativeValue* code, NativeValue* message)
230 {
231     jerry_value_t jerror = 0;
232 
233     jerror = jerry_create_error_sz(JERRY_ERROR_COMMON, nullptr, 0);
234     jerror = jerry_get_value_from_error(jerror, true);
235 
236     if (message) {
237         jerry_value_t jreturn = jerryx_set_property_str(jerror, "message", *message);
238         jerry_release_value(jreturn);
239     }
240     if (code) {
241         jerry_value_t jreturn = jerryx_set_property_str(jerror, "code", *code);
242         jerry_release_value(jreturn);
243     }
244     jerror = jerry_create_error_from_value(jerror, true);
245 
246     return new JerryScriptNativeObject(static_cast<JerryScriptNativeEngine*>(engine), jerror);
247 }
248 
CallFunction(NativeEngine * engine,NativeValue * thisVar,NativeValue * function,NativeValue * const * argv,size_t argc)249 NativeValue* JerryScriptNativeEngineImpl::CallFunction(
250     NativeEngine* engine, NativeValue* thisVar, NativeValue* function, NativeValue* const *argv, size_t argc)
251 {
252     jerry_value_t* args = nullptr;
253     if (argc > 0) {
254         args = new jerry_value_t[argc];
255         for (size_t i = 0; i < argc; i++) {
256             if (argv[i] == nullptr) {
257                 args[i] = jerry_create_undefined();
258             } else {
259                 args[i] = *argv[i];
260             }
261         }
262     }
263     NativeScope* scope = scopeManager_->Open();
264     jerry_value_t result = jerry_call_function(*function, thisVar ? *thisVar : 0, (const jerry_value_t*)args, argc);
265     scopeManager_->Close(scope);
266     if (args != nullptr) {
267         delete[] args;
268     }
269 
270     if (jerry_value_is_error(result)) {
271         jerry_value_t errorObj = jerry_get_value_from_error(result, true);
272         jerry_value_t propName = jerry_create_string_from_utf8((const jerry_char_t*)"message");
273         jerry_property_descriptor_t propDescriptor = { 0 };
274         jerry_get_own_property_descriptor(errorObj, propName, &propDescriptor);
275         jerry_value_t setResult = jerry_set_property(errorObj, propName, propDescriptor.value);
276         jerry_release_value(propName);
277         jerry_release_value(setResult);
278         Throw(JerryValueToNativeValue(static_cast<JerryScriptNativeEngine*>(engine), errorObj));
279         return JerryValueToNativeValue(static_cast<JerryScriptNativeEngine*>(engine), jerry_create_undefined());
280     } else {
281         return JerryValueToNativeValue(static_cast<JerryScriptNativeEngine*>(engine), result);
282     }
283 }
284 
RunScript(NativeEngine * engine,NativeValue * script)285 NativeValue* JerryScriptNativeEngineImpl::RunScript(NativeEngine* engine, NativeValue* script)
286 {
287     NativeString* pscript = (NativeString*)script->GetInterface(NativeString::INTERFACE_ID);
288 
289     size_t length = pscript->GetLength();
290     if (length == 0) {
291         return nullptr;
292     }
293     char* strScript = new char[length] { 0 };
294     pscript->GetCString(strScript, length, &length);
295     jerry_value_t result = jerry_eval((const unsigned char*)strScript, pscript->GetLength(), JERRY_PARSE_NO_OPTS);
296     if (jerry_value_is_error(result)) {
297         result = jerry_get_value_from_error(result, true);
298     }
299     delete[] strScript;
300     return JerryValueToNativeValue(static_cast<JerryScriptNativeEngine*>(engine), result);
301 }
302 
RunBufferScript(NativeEngine * engine,std::vector<uint8_t> & buffer)303 NativeValue* JerryScriptNativeEngineImpl::RunBufferScript(NativeEngine* engine, std::vector<uint8_t>& buffer)
304 {
305     return nullptr;
306 }
307 
RunActor(NativeEngine * engine,std::vector<uint8_t> & buffer,const char * descriptor)308 NativeValue* JerryScriptNativeEngineImpl::RunActor(
309     NativeEngine* engine, std::vector<uint8_t>& buffer, const char *descriptor)
310 {
311     return RunBufferScript(engine, buffer);
312 }
313 
DefineClass(NativeEngine * engine,const char * name,NativeCallback callback,void * data,const NativePropertyDescriptor * properties,size_t length)314 NativeValue* JerryScriptNativeEngineImpl::DefineClass(
315     NativeEngine* engine, const char* name, NativeCallback callback,
316     void* data, const NativePropertyDescriptor* properties, size_t length)
317 {
318     auto classConstructor = new JerryScriptNativeFunction(
319         static_cast<JerryScriptNativeEngine*>(engine), name, callback, data);
320     auto classProto = new JerryScriptNativeObject(static_cast<JerryScriptNativeEngine*>(engine));
321 
322     jerryx_set_property_str(*classConstructor, "prototype", *classProto);
323 
324     for (size_t i = 0; i < length; ++i) {
325         if (properties[i].attributes & NATIVE_STATIC) {
326             classConstructor->DefineProperty(properties[i]);
327         } else {
328             classProto->DefineProperty(properties[i]);
329         }
330     }
331     return classConstructor;
332 }
333 
CreateInstance(NativeEngine * engine,NativeValue * constructor,NativeValue * const * argv,size_t argc)334 NativeValue* JerryScriptNativeEngineImpl::CreateInstance(
335     NativeEngine* engine, NativeValue* constructor, NativeValue* const *argv, size_t argc)
336 {
337     return JerryValueToNativeValue(static_cast<JerryScriptNativeEngine*>(engine), jerry_construct_object(
338         *constructor, (const jerry_value_t*)argv, argc));
339 }
340 
CreateReference(NativeEngine * engine,NativeValue * value,uint32_t initialRefcount,NativeFinalize callback,void * data,void * hint)341 NativeReference* JerryScriptNativeEngineImpl::CreateReference(
342     NativeEngine* engine, NativeValue* value, uint32_t initialRefcount,
343     NativeFinalize callback, void* data, void* hint)
344 {
345     return new JerryScriptNativeReference(
346         static_cast<JerryScriptNativeEngine*>(engine), value, initialRefcount, callback, data, hint);
347 }
348 
Throw(NativeValue * error)349 bool JerryScriptNativeEngineImpl::Throw(NativeValue* error)
350 {
351     this->lastException_ = error;
352     return true;
353 }
354 
Throw(NativeEngine * engine,NativeErrorType type,const char * code,const char * message)355 bool JerryScriptNativeEngineImpl::Throw(
356     NativeEngine* engine, NativeErrorType type, const char* code, const char* message)
357 {
358     jerry_value_t jerror = 0;
359     jerry_error_t jtype;
360     switch (type) {
361         case NATIVE_COMMON_ERROR:
362             jtype = JERRY_ERROR_COMMON;
363             break;
364         case NATIVE_TYPE_ERROR:
365             jtype = JERRY_ERROR_TYPE;
366             break;
367         case NATIVE_RANGE_ERROR:
368             jtype = JERRY_ERROR_RANGE;
369             break;
370         default:
371             return false;
372     }
373     jerror = jerry_create_error(jtype, (const unsigned char*)message);
374     jerror = jerry_get_value_from_error(jerror, true);
375     if (code) {
376         jerry_value_t jcode = jerry_create_string_from_utf8((const unsigned char*)code);
377         jerryx_set_property_str(jerror, "code", jcode);
378     }
379     jerror = jerry_create_error_from_value(jerror, true);
380     this->lastException_ = new JerryScriptNativeObject(static_cast<JerryScriptNativeEngine*>(engine), jerror);
381     return true;
382 }
383 
CreateRuntime(NativeEngine * engine)384 void* JerryScriptNativeEngineImpl::CreateRuntime(NativeEngine* engine)
385 {
386     return nullptr;
387 }
388 
Serialize(NativeEngine * context,NativeValue * value,NativeValue * transfer)389 NativeValue* JerryScriptNativeEngineImpl::Serialize(NativeEngine* context, NativeValue* value,
390     NativeValue* transfer)
391 {
392     return nullptr;
393 }
394 
Deserialize(NativeEngine * engine,NativeEngine * context,NativeValue * recorder)395 NativeValue* JerryScriptNativeEngineImpl::Deserialize(
396     NativeEngine* engine, NativeEngine* context, NativeValue* recorder)
397 {
398     return nullptr;
399 }
400 
LoadModule(NativeEngine * engine,NativeValue * str,const std::string & fileName)401 NativeValue* JerryScriptNativeEngineImpl::LoadModule(
402     NativeEngine* engine, NativeValue* str, const std::string& fileName)
403 {
404     return nullptr;
405 }
406 
JerryValueToNativeValue(JerryScriptNativeEngine * engine,jerry_value_t value)407 NativeValue* JerryScriptNativeEngineImpl::JerryValueToNativeValue(
408     JerryScriptNativeEngine* engine, jerry_value_t value)
409 {
410     NativeValue* result = nullptr;
411     switch (jerry_value_get_type(value)) {
412         case JERRY_TYPE_NONE:
413             result = new JerryScriptNativeValue(engine, value);
414             break;
415         case JERRY_TYPE_UNDEFINED:
416             result = new JerryScriptNativeValue(engine, value);
417             break;
418         case JERRY_TYPE_NULL:
419             result = new JerryScriptNativeValue(engine, value);
420             break;
421         case JERRY_TYPE_BOOLEAN:
422             result = new JerryScriptNativeBoolean(engine, value);
423             break;
424         case JERRY_TYPE_NUMBER:
425             result = new JerryScriptNativeNumber(engine, value);
426             break;
427         case JERRY_TYPE_STRING:
428             result = new JerryScriptNativeString(engine, value);
429             break;
430         case JERRY_TYPE_OBJECT:
431             if (jerry_value_is_array(value)) {
432                 result = new JerryScriptNativeArray(engine, value);
433             } else if (jerry_value_is_arraybuffer(value)) {
434                 result = new JerryScriptNativeArrayBuffer(engine, value);
435             } else if (jerry_value_is_dataview(value)) {
436                 result = new JerryScriptNativeDataView(engine, value);
437             } else if (jerry_value_is_typedarray(value)) {
438                 result = new JerryScriptNativeTypedArray(engine, value);
439             } else if (jerry_value_is_external(value)) {
440                 result = new JerryScriptNativeExternal(engine, value);
441             } else if (jerry_is_date(value)) {
442                 result = new JerryScriptNativeDate(engine, value);
443             } else {
444                 result = new JerryScriptNativeObject(engine, value);
445             }
446             break;
447         case JERRY_TYPE_FUNCTION:
448             result = new JerryScriptNativeFunction(engine, value);
449             break;
450         case JERRY_TYPE_ERROR:
451             result = new JerryScriptNativeObject(engine, value);
452             break;
453         case JERRY_TYPE_SYMBOL:
454             result = new JerryScriptNativeValue(engine, value);
455             break;
456 #if JERRY_API_MINOR_VERSION > 3
457         case JERRY_TYPE_BIGINT:
458                 result = new JerryScriptNativeBigInt(engine, value);
459                 break;
460 #endif
461         default:;
462     }
463     return result;
464 }
465 
ValueToNativeValue(NativeEngine * engine,JSValueWrapper & value)466 NativeValue* JerryScriptNativeEngineImpl::ValueToNativeValue(NativeEngine* engine, JSValueWrapper& value)
467 {
468     jerry_value_t jerryValue = value;
469     return JerryValueToNativeValue(static_cast<JerryScriptNativeEngine*>(engine), jerryValue);
470 }
471 
TriggerFatalException(NativeValue * error)472 bool JerryScriptNativeEngineImpl::TriggerFatalException(NativeValue* error)
473 {
474     return false;
475 }
476 
AdjustExternalMemory(int64_t ChangeInBytes,int64_t * AdjustedValue)477 bool JerryScriptNativeEngineImpl::AdjustExternalMemory(int64_t ChangeInBytes, int64_t* AdjustedValue)
478 {
479     HILOG_INFO("L1: napi_adjust_external_memory not supported!");
480     return true;
481 }
482 
CreateDate(NativeEngine * engine,double time)483 NativeValue* JerryScriptNativeEngineImpl::CreateDate(NativeEngine* engine, double time)
484 {
485     jerry_value_t value = jerry_strict_date(time);
486     return JerryValueToNativeValue(static_cast<JerryScriptNativeEngine*>(engine), value);
487 }
488 
SetPromiseRejectCallback(NativeEngine * engine,NativeReference * rejectCallbackRef,NativeReference * checkCallbackRef)489 void JerryScriptNativeEngineImpl::SetPromiseRejectCallback(
490     NativeEngine* engine, NativeReference* rejectCallbackRef, NativeReference* checkCallbackRef) {}
491 
CreateBigWords(NativeEngine * engine,int sign_bit,size_t word_count,const uint64_t * words)492 NativeValue* JerryScriptNativeEngineImpl::CreateBigWords(
493     NativeEngine* engine, int sign_bit, size_t word_count, const uint64_t* words)
494 {
495 #if JERRY_API_MINOR_VERSION > 3 // jerryscript2.3: 3,  jerryscript2.4: 4
496     constexpr int bigintMod = 2;
497     bool sign = false;
498     if ((sign_bit % bigintMod) == 1) {
499         sign = true;
500     }
501     uint32_t size = (uint32_t)word_count;
502 
503     jerry_value_t jerryValue = jerry_create_bigint(words, size, sign);
504 
505     return new JerryScriptNativeBigInt(static_cast<JerryScriptNativeEngine*>(engine), jerryValue);
506 #else
507     return nullptr;
508 #endif
509 }
510 
CreateBigInt(NativeEngine * engine,int64_t value)511 NativeValue* JerryScriptNativeEngineImpl::CreateBigInt(NativeEngine* engine, int64_t value)
512 {
513     return new JerryScriptNativeBigInt(static_cast<JerryScriptNativeEngine*>(engine), value);
514 }
515 
CreateBigInt(NativeEngine * engine,uint64_t value)516 NativeValue* JerryScriptNativeEngineImpl::CreateBigInt(NativeEngine* engine, uint64_t value)
517 {
518 #if JERRY_API_MINOR_VERSION > 3 // jerryscript2.3: 3,  jerryscript2.4: 4
519     return new JerryScriptNativeBigInt(static_cast<JerryScriptNativeEngine*>(engine), value, true);
520 #else
521     return nullptr;
522 #endif
523 }
524 
CreateString16(NativeEngine * engine,const char16_t * value,size_t length)525 NativeValue* JerryScriptNativeEngineImpl::CreateString16(NativeEngine* engine, const char16_t* value, size_t length)
526 {
527     return new JerryScriptNativeString(static_cast<JerryScriptNativeEngine*>(engine), value, length);
528 }
529