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