• 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