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