1# Migration guide 2 3This guide intends to describe the major changes between the JerryScript 1.0 and 2.0 versions. 4In addtion it is designed to provide a guide on how to modify the 1.0 version code to a 52.0 compliant code. 6 7During the development it was important to minimize the changes in the API functions and types. 8Each API method removal or chang is described below providing a ***before*** and ***after*** 9code example. 10For more information on the current API methods please check the [API reference](02.API-REFERENCE.md) document. 11 12# Short list of removed/renamed headers, types, functions, and macros 13 14***Removed legacy headers*** 15 16- `jerry-internal.h` 17 18***Renamed headers*** 19 20- `jerry-api.h` to `jerryscript.h` 21- `jerry-port.h` to `jerryscript-port.h` 22 23***Removed API types*** 24 25- `jerry_char_ptr_t` usage replaced with `jerry_char_t *` 26- `jerry_object_free_callback_t` replaced by `jerry_object_native_free_callback_t` 27 28***Removed API methods*** 29 30- `jerry_get_memory_limits` 31- `jerry_get_object_native_handle` replaced by `jerry_get_object_native_pointer` 32- `jerry_set_object_native_handle` replaced by `jerry_set_object_native_pointer` 33- `jerry_value_set_abort_flag` replaced by `jerry_create_abort_from_value` 34- `jerry_value_has_abort_flag` replaced by `jerry_value_is_abort` 35- `jerry_value_set_error_flag` replaced by `jerry_create_error_from_value` 36- `jerry_value_has_error_flag` replaced by `jerry_value_is_error` 37- `jerry_value_clear_error_flag` replaced by `jerry_get_value_from_error` 38- `jerry_get_value_without_error_flag` replaced by `jerry_get_value_from_error` 39- `jerry_parse_and_save_snapshot` replaced by `jerry_generate_snapshot` 40- `jerry_parse_and_save_function_snapshot` replaced by `jerry_generate_function_snapshot` 41 42 43***Removed unused configuration macros*** 44 45- `CONFIG_MEM_DATA_LIMIT_MINUS_HEAP_SIZE` 46- `CONFIG_MEM_STACK_LIMIT` 47- `CONFIG_VM_STACK_FRAME_INLINED_VALUES_NUMBER` 48- `CONFIG_ECMA_GLOBAL_ENVIRONMENT_DECLARATIVE` 49- All `CONFIG_..` macros have been renamed to use the `JERRY_` prefix format. 50 51 52# Modified API functions 53 54## Error manipulating functions 55 56The most important changes in the API are releated to error handling and manipulation. 57 58### jerry_value_set_abort_flag 59 60This function was replaced with [`jerry_create_abort_from_value`](02.API-REFERENCE.md#jerry_create_abort_from_value). 61Take note of the second argument of the new `jerry_create_abort_from_value` function which controls if the 62first argument should be usable after the call or not. 63 64**Before** 65 66```c 67{ 68 jerry_value_t value; 69 // create or acquire value 70 // ... 71 72 jerry_value_set_abort_flag (&value); 73 74 jerry_release_value (value); 75} 76``` 77 78**After** 79 80```c 81{ 82 jerry_value_t value; 83 // create or acquire value 84 // ... 85 86 jerry_value_t abort = jerry_create_abort_from_value (value, true); 87 // using the 'value' variable after release is invalid 88 89 jerry_release_value (abort); 90} 91``` 92 93- OR 94 95```c 96{ 97 jerry_value_t value; 98 ... // create or acquire value 99 100 jerry_value_t abort = jerry_create_abort_from_value (value, false); 101 // both 'abort' and 'value' can be used and must be released when they are no longer needed 102 103 jerry_release_value (abort); 104 jerry_release_value (value); 105} 106``` 107 108### jerry_value_has_abort_flag 109 110This function was renamed to [`jerry_value_is_abort`](02.API-REFERENCE.md#jerry_value_is_abort). 111 112**Before** 113 114```c 115{ 116 jerry_value_t value; 117 // create or acquire value 118 // ... 119 120 if (jerry_value_has_abort_flag (value)) 121 { 122 // ... 123 } 124 125 jerry_release_value (value); 126} 127``` 128 129**After** 130 131```c 132{ 133 jerry_value_t value; 134 // create or acquire value 135 // ... 136 137 if (jerry_value_is_abort (value)) 138 { 139 // ... 140 } 141 142 jerry_release_value (value); 143} 144``` 145 146### jerry_value_set_error_flag 147 148This function was replaced with [`jerry_create_error_from_value`](02.API-REFERENCE.md#jerry_create_error_from_value). 149Take note of the second argument of the new `jerry_create_error_from_value` function which controls if the 150first argument should be usable after the call or not. 151 152**Before** 153 154```c 155{ 156 jerry_value_t value; 157 // create or acquire value 158 // ... 159 160 jerry_value_set_error_flag (&value); 161 162 jerry_release_value (value); 163} 164``` 165 166**After** 167 168```c 169{ 170 jerry_value_t value; 171 // create or acquire value 172 // ... 173 174 jerry_value_t error = jerry_create_error_from_value (value, true); 175 // using the 'value' variable after release is invalid 176 177 jerry_release_value (error); 178} 179``` 180 181- OR 182 183```c 184{ 185 jerry_value_t value; 186 // create or acquire value 187 // ... 188 189 jerry_value_t error = jerry_create_error_from_value (value, false); 190 // both 'error' and 'value' can be used and must be released when they are no longer needed 191 192 jerry_release_value (error); 193 jerry_release_value (value); 194} 195``` 196 197### jerry_value_has_error_flag 198 199This function was renamed to [`jerry_value_is_error`](02.API-REFERENCE.md#jerry_value_is_error). 200 201**Before** 202 203```c 204{ 205 jerry_value_t value; 206 // create or acquire value 207 // ... 208 209 if (jerry_value_has_error_flag (value)) 210 { 211 // ... 212 } 213 214 jerry_release_value (value); 215} 216``` 217 218**After** 219 220```c 221{ 222 jerry_value_t value; 223 // create or acquire value 224 // ... 225 226 if (jerry_value_is_error (value)) 227 { 228 // ... 229 } 230 231 jerry_release_value (value); 232} 233``` 234 235### jerry_value_clear_error_flag AND jerry_get_value_without_error_flag 236 237These functions were merged into [`jerry_get_value_from_error`](02.API-REFERENCE.md#jerry_get_value_from_error). 238Please note the second argument of the new function which controls if the first argument passed should be released 239or not. 240 241**Before** 242 243```c 244{ 245 jerry_value_t value; 246 // create or acquire value 247 // ... 248 249 jerry_value_set_error_flag (&value); 250 jerry_value_clear_error_flag (&value); 251 // or 252 jerry_value_t real_value = jerry_get_value_without_error_flag (value); 253 254 jerry_release_value (value); 255 jerry_release_value (real_value); 256} 257``` 258 259**After** 260 261```c 262{ 263 jerry_value_t value; 264 // create or acquire value 265 // ... 266 267 jerry_value_t error = jerry_create_error_from_value (value, true); 268 269 jerry_value_t real_value = jerry_get_value_from_error (error, true); 270 271 jerry_release_value (real_value); 272} 273``` 274 275## Other functions changed 276 277### jerry_register_magic_strings 278 279In case of the `jerry_register_magic_strings` function the change is that 280the first argument's base type `jerry_char_ptr_t` was changed to `jerry_char_t*`. 281For more details see: [`jerry_register_magic_strings`](02.API-REFERENCE.md#jerry_register_magic_strings). 282 283In the following code parts please take note of the type used for the `magic_string_items` array. 284 285**Before** 286 287```c 288{ 289 // must be static, because 'jerry_register_magic_strings' does not copy 290 // the items must be sorted by size at first, then lexicographically 291 static const jerry_char_ptr_t magic_string_items[] = { 292 (const jerry_char_ptr_t) "magicstring1", 293 (const jerry_char_ptr_t) "magicstring2", 294 (const jerry_char_ptr_t) "magicstring3" 295 }; 296 uint32_t num_magic_string_items = (uint32_t) (sizeof (magic_string_items) / sizeof (jerry_char_ptr_t)); 297 298 // must be static, because 'jerry_register_magic_strings' does not copy 299 static const jerry_length_t magic_string_lengths[] = { 12, 12, 12 }; 300 jerry_register_magic_strings (magic_string_items, num_magic_string_items, magic_string_lengths); 301} 302``` 303 304**After** 305 306```c 307{ 308 // must be static, because 'jerry_register_magic_strings' does not copy 309 // the items must be sorted by size at first, then lexicographically 310 static const jerry_char_t *magic_string_items[] = { 311 (const jerry_char_t *) "magicstring1", 312 (const jerry_char_t *) "magicstring2", 313 (const jerry_char_t *) "magicstring3" 314 }; 315 uint32_t num_magic_string_items = (uint32_t) (sizeof (magic_string_items) / sizeof (jerry_char_t *)); 316 317 // must be static, because 'jerry_register_magic_strings' does not copy 318 static const jerry_length_t magic_string_lengths[] = { 12, 12, 12 }; 319 jerry_register_magic_strings (magic_string_items, num_magic_string_items, magic_string_lengths); 320} 321``` 322 323## Snapshot generating API 324 325### jerry_parse_and_save_snapshot 326 327This function was replaced with [`jerry_generate_snapshot`](02.API-REFERENCE.md#jerry_generate_snapshot). 328The function returns an error object if there was any problem during snapshot generation and 329if there was no problem the return value is a number value containing the snapshot size in bytes. 330 331**Before** 332 333```c 334{ 335 static uint32_t global_mode_snapshot_buffer[256]; 336 const jerry_char_t *code_to_snapshot_p = (const jerry_char_t *) "(function () { return 'string from snapshot'; }) ();"; 337 338 size_t global_mode_snapshot_size = 339 jerry_parse_and_save_snapshot (code_to_snapshot_p, 340 strlen ((const char *) code_to_snapshot_p), 341 true, 342 false, 343 global_mode_snapshot_buffer, 344 sizeof (global_mode_snapshot_buffer) / sizeof (uint32_t)); 345 // use "global_mode_snapshot_buffer" 346} 347``` 348 349**After** 350 351```c 352{ 353 static uint32_t global_mode_snapshot_buffer[256]; 354 const jerry_char_t *code_to_snapshot_p = (const jerry_char_t *) "(function () { return 'string from snapshot'; }) ();"; 355 356 jerry_value_t generate_result; 357 generate_result = jerry_generate_snapshot (NULL, 358 0, 359 code_to_snapshot_p, 360 strlen ((const char *) code_to_snapshot_p), 361 global_mode_snapshot_buffer, 362 sizeof (global_mode_snapshot_buffer) / sizeof (uint32_t)); 363 if (jerry_value_is_error (generate_result)) 364 { 365 // There was a problem during snapshot generation, for example there is a SyntaxError. 366 // Use the "generate_result" to check the error. 367 } 368 else 369 { 370 size_t snapshot_size = (size_t) jerry_get_number_value (generate_result); 371 // use "global_mode_snapshot_buffer" 372 } 373 jerry_release_value (generate_result); 374} 375``` 376 377### jerry_parse_and_save_function_snapshot 378 379This function was replaced with [`jerry_generate_function_snapshot`](02.API-REFERENCE.md#jerry_parse_and_save_function_snapshot). 380The function returns an error object if there was any problem during snapshot generation and 381if there was no problem the return value is a number value containing the snapshot size in bytes. 382 383**Before** 384 385```c 386{ 387 static uint32_t func_snapshot_buffer[1024]; 388 389 const jerry_char_t *args_p = (const jerry_char_t *) "a, b"; 390 const jerry_char_t *src_p = (const jerry_char_t *) "return a + b;"; 391 392 size_t func_snapshot_size = 393 jerry_parse_and_save_function_snapshot (src_p, 394 strlen ((const char *) src_p), 395 args_p, 396 strlen ((const char *) args_p), 397 false, 398 func_snapshot_buffer, 399 sizeof (func_snapshot_buffer) / sizeof (uint32_t)); 400 // check "function_snapshot_size" and use "func_snapshot_buffer" 401} 402``` 403 404**After** 405 406```c 407{ 408 static uint32_t func_snapshot_buffer[1024]; 409 410 const jerry_char_t *args_p = (const jerry_char_t *) "a, b"; 411 const jerry_char_t *src_p = (const jerry_char_t *) "return a + b;"; 412 413 jerry_value_t generate_result; 414 generate_result = jerry_generate_function_snapshot (NULL, 415 0, 416 src_p, 417 strlen ((const char *) src_p), 418 args_p, 419 strlen ((const char *) args_p), 420 0, 421 func_snapshot_buffer, 422 sizeof (func_snapshot_buffer) / sizeof (uint32_t)); 423 if (jerry_value_is_error (generate_result)) 424 { 425 // There was a problem during snapshot generation, for example there is a SyntaxError. 426 // Use the "generate_result" to check the error. 427 } 428 else 429 { 430 size_t snapshot_size = (size_t) jerry_get_number_value (generate_result); 431 // use "func_snapshot_buffer" 432 } 433 434 jerry_release_value (generate_result) 435} 436``` 437 438## Garbage collection 439 440### jerry_gc 441 442The [`jerry_gc`](02.API-REFERENCE.md#jerry_gc) function was modified to handle an argument which represents the pressure for the garbage collector. 443For more information checkout the [`jerry_gc_mode_t`](02.API-REFERENCE.md#jerry_gc_mode_t) reference. 444 445**Before** 446 447```c 448{ 449 jerry_gc (); 450} 451``` 452 453**After** 454 455```c 456{ 457 jerry_gc (JERRY_GC_PRESSURE_LOW); 458} 459``` 460 461## jerry_eval 462 463The third argument of [`jerry_eval`](02.API-REFERENCE.md#jerry_eval) has been changed 464from `bool` to [`jerry_parse_opts_t`](02.API-REFERENCE.md#jerry_parse_opts_t). 465 466**Before** 467 468```c 469const jerry_char_t *str_to_eval = (const jerry_char_t *) "1 + 1"; 470jerry_value_t ret_val = jerry_eval (str_to_eval, 471 strlen ((const char *) str_to_eval), 472 false); 473``` 474 475**After** 476 477```c 478const jerry_char_t *str_to_eval = (const jerry_char_t *) "1 + 1"; 479jerry_value_t ret_val = jerry_eval (str_to_eval, 480 strlen ((const char *) str_to_eval), 481 JERRY_PARSE_NO_OPTS); 482``` 483 484## Port API 485 486### jerry_port_get_time_zone 487 488The port API of handling timezones has been changed. The previous interface did not 489allow timezones to be handled correctly, even if the host system was up to the task. 490Check [the related issue](https://github.com/jerryscript-project/jerryscript/issues/1661) 491for more details. 492 493The new port API function name is [jerry_port_get_local_time_zone_adjustment](05.PORT-API.md#date-1]. 494 495Below is the default implementations for both versions: 496 497**Before** 498 499```c 500bool jerry_port_get_time_zone (jerry_time_zone_t *tz_p) 501{ 502 struct timeval tv; 503 struct timezone tz; 504 505 /* gettimeofday may not fill tz, so zero-initializing */ 506 tz.tz_minuteswest = 0; 507 tz.tz_dsttime = 0; 508 509 if (gettimeofday (&tv, &tz) != 0) 510 { 511 return false; 512 } 513 514 tz_p->offset = tz.tz_minuteswest; 515 tz_p->daylight_saving_time = tz.tz_dsttime > 0 ? 1 : 0; 516 517 return true; 518} /* jerry_port_get_time_zone */ 519``` 520 521**After** 522 523```c 524double jerry_port_get_local_time_zone_adjustment (double unix_ms, 525 bool is_utc) 526{ 527 struct tm tm; 528 time_t now = (time_t) (unix_ms / 1000); 529 localtime_r (&now, &tm); 530 if (!is_utc) 531 { 532 now -= tm.tm_gmtoff; 533 localtime_r (&now, &tm); 534 } 535 return ((double) tm.tm_gmtoff) * 1000; 536} /* jerry_port_get_local_time_zone_adjustment */ 537``` 538 539## Native pointers 540 541The assignment of native pointers (previously called handles) have been changed 542since v1.0. In the previous version only one native pointer could be assigned to 543a `jerry_value_t`. Now it is allowed to register multiple native infos, which 544can be accessed with the corresponding 545[`jerry_object_native_info_t`](02.API-REFERENCE.md#jerry_object_native_info_t). 546The old functions were removed and replaced by new ones. 547 548- `jerry_object_free_callback_t` callback type is replaced by `jerry_object_native_info_t` 549- `jerry_get_object_native_handle` is replaced by [`jerry_get_object_native_pointer`](02.API-REFERENCE.md#jerry_get_object_native_pointer) 550- `jerry_set_object_native_handle` is replaced by [`jerry_set_object_native_pointer`](02.API-REFERENCE.md#jerry_set_object_native_pointer) 551 552**Before** 553 554```c 555struct 556{ 557 int data; 558} my_info; 559 560static void 561handler_construct_freecb (uintptr_t native_p) 562{ 563 // Invoked when the JS object is released and the 564 // native data should be freed. 565 566 struct my_info *info = (struct my_info *) native_p; 567 free (info); 568} 569 570void 571demo (void) 572{ 573 jerry_value_t this_val; 574 // create or acquire this_val 575 // ... 576 577 struct my_info *info = (struct my_info *) malloc (sizeof (struct my_info)); 578 info->data = 11; 579 580 // setting the native handle 581 jerry_set_object_native_handle (this_val, 582 (uintptr_t) info, 583 handler_construct_freecb); 584 // ... 585 // reading back the native handle 586 uintptr_t ptr = (uintptr_t) NULL; 587 bool is_ok = jerry_get_object_native_handle (this_val, &ptr); 588 if (is_ok) 589 { 590 struct my_info *obj_info = (struct my_info *) ptr; 591 // use "obj_info" 592 } 593} 594``` 595 596 597**After** 598 599```c 600struct 601{ 602 int data; 603} my_info; 604 605static void 606handler_construct_freecb (void *native_p) 607{ 608 // Invoked when the JS object is released and the 609 // native data should be freed. 610 611 struct my_info *info = (struct my_info *) native_p; 612 free (info); 613} 614 615static const jerry_object_native_info_t my_info_type_info = 616{ 617 .free_cb = handler_construct_freecb 618}; 619 620void 621demo (void) 622{ 623 jerry_value_t this_val; 624 // create or acquire this_val 625 // ... 626 627 struct my_info *info = (struct my_info *) malloc (sizeof (struct my_info)); 628 info->data = 11; 629 630 // setting the native handle 631 jerry_set_object_native_pointer (this_val, 632 info, 633 &my_info_type_info); 634 // ... 635 // reading back the native handle pointed by the "my_info_type_info" variable 636 void *ptr = NULL; 637 bool has_p = jerry_get_object_native_pointer (this_val, &ptr, &my_info_type_info); 638 if (has_p) 639 { 640 struct my_info *obj_info = (struct my_info *) ptr; 641 // use "obj_info" 642 } 643} 644``` 645 646# New API functions 647 648In this section the new API functions are listed. 649 650## Built-in objects 651 652***ArrayBuffer*** 653 654- [`jerry_create_arraybuffer`](02.API-REFERENCE.md#jerry_create_arraybuffer) 655- [`jerry_create_arraybuffer_external`](02.API-REFERENCE.md#jerry_create_arraybuffer_external) 656- [`jerry_get_arraybuffer_pointer`](02.API-REFERENCE.md#jerry_get_arraybuffer_pointer) 657 658***DataView*** 659 660- [`jerry_create_dataview`](02.API-REFERENCE.md#jerry_create_dataview) 661- [`jerry_value_is_dataview`](02.API-REFERENCE.md#jerry_value_is_dataview) 662- [`jerry_get_dataview_buffer`](02.API-REFERENCE.md#jerry_get_dataview_buffer) 663 664***JSON*** 665 666- [`jerry_json_parse`](02.API-REFERENCE.md#jerry_json_parse) 667- [`jerry_json_stringify`](02.API-REFERENCE.md#jerry_json_stringify) 668 669***Number*** 670 671- [`jerry_create_number_infinity`](02.API-REFERENCE.md#jerry_create_number_infinity) 672- [`jerry_create_number_nan`](02.API-REFERENCE.md#jerry_create_number_nan) 673 674***Promise*** 675 676- [`jerry_run_all_enqueued_jobs`](02.API-REFERENCE.md#jerry_run_all_enqueued_jobs) 677- [`jerry_create_promise`](02.API-REFERENCE.md#jerry_create_promise) 678- [`jerry_resolve_or_reject_promise`](02.API-REFERENCE.md#jerry_resolve_or_reject_promise) 679- [`jerry_value_is_promise`](02.API-REFERENCE.md#jerry_value_is_promise) 680 681***RegExp*** 682 683- [`jerry_create_regexp`](02.API-REFERENCE.md#jerry_create_regexp) 684- [`jerry_create_regexp_sz`](02.API-REFERENCE.md#jerry_create_regexp_sz) 685 686***String*** 687 688- [`jerry_substring_to_utf8_char_buffer`](02.API-REFERENCE.md#jerry_substring_to_utf8_char_buffer) 689- [`jerry_get_utf8_string_size`](02.API-REFERENCE.md#jerry_get_utf8_string_size) 690- [`jerry_get_utf8_string_length`](02.API-REFERENCE.md#jerry_get_utf8_string_length) 691- [`jerry_create_string_from_utf8`](02.API-REFERENCE.md#jerry_create_string_from_utf8) 692- [`jerry_create_string_sz_from_utf8`](02.API-REFERENCE.md#jerry_create_string_sz_from_utf8) 693 694***Symbol*** 695 696- [`jerry_create_symbol`](02.API-REFERENCE.md#jerry_create_symbol) 697- [`jerry_get_symbol_descriptive_string`](02.API-REFERENCE.md#jerry_get_symbol_descriptive_string) 698- [`jerry_value_is_symbol`](02.API-REFERENCE.md#jerry_value_is_symbol) 699 700***TypedArray*** 701 702- [`jerry_create_typedarray`](02.API-REFERENCE.md#jerry_create_typedarray) 703- [`jerry_create_typedarray_for_arraybuffer`](02.API-REFERENCE.md#jerry_create_typedarray_for_arraybuffer) 704- [`jerry_create_typedarray_for_arraybuffer_sz`](02.API-REFERENCE.md#jerry_create_typedarray_for_arraybuffer_sz) 705- [`jerry_get_typedarray_type`](02.API-REFERENCE.md#jerry_get_typedarray_type) 706- [`jerry_get_typedarray_length`](02.API-REFERENCE.md#jerry_get_typedarray_length) 707- [`jerry_get_typedarray_buffer`](02.API-REFERENCE.md#jerry_get_typedarray_buffer) 708- [`jerry_value_is_typedarray`](02.API-REFERENCE.md#jerry_value_is_typedarray) 709 710 711## Instances and memory management 712 713***JerryScript instances*** 714 715- [`jerry_create_context`](02.API-REFERENCE.md#jerry_create_context) 716- [`jerry_get_context_data`](02.API-REFERENCE.md#jerry_get_context_data) 717 718***Memory management*** 719 720- [`jerry_heap_alloc`](02.API-REFERENCE.md#jerry_heap_alloc) 721- [`jerry_heap_free`](02.API-REFERENCE.md#jerry_heap_free) 722 723 724## Operations with JavaScript values 725 726***Binary operations*** 727 728- [`jerry_binary_operation`](02.API-REFERENCE.md#jerry_binary_operation) 729 730***Error manipulating*** 731 732- [`jerry_get_error_type`](02.API-REFERENCE.md#jerry_get_error_type) 733- [`jerry_get_backtrace`](02.API-REFERENCE.md#jerry_get_backtrace) 734 735***Native pointers*** 736 737- [`jerry_delete_object_native_pointer`](02.API-REFERENCE.md#jerry_delete_object_native_pointer) 738- [`jerry_objects_foreach_by_native_info`](02.API-REFERENCE.md#jerry_objects_foreach_by_native_info) 739 740***Property*** 741 742- [`jerry_delete_property_by_index`](02.API-REFERENCE.md#jerry_delete_property_by_index) 743- [`jerry_objects_foreach`](02.API-REFERENCE.md#jerry_objects_foreach) 744 745 746## Debugger 747 748- [`jerry_debugger_is_connected`](07.DEBUGGER.md#jerry_debugger_is_connected) 749- [`jerry_debugger_stop`](07.DEBUGGER.md#jerry_debugger_stop) 750- [`jerry_debugger_continue`](07.DEBUGGER.md#jerry_debugger_continue) 751- [`jerry_debugger_stop_at_breakpoint`](07.DEBUGGER.md#jerry_debugger_stop_at_breakpoint) 752- [`jerry_debugger_wait_for_client_source`](07.DEBUGGER.md#jerry_debugger_wait_for_client_source) 753- [`jerry_debugger_send_output`](07.DEBUGGER.md#jerry_debugger_send_output) 754- [`jerry_debugger_send_log`](07.DEBUGGER.md#jerry_debugger_send_log) 755 756 757## Other 758 759- [`jerry_is_feature_enabled`](02.API-REFERENCE.md#jerry_is_feature_enabled) 760- [`jerry_parse_and_save_literals`](02.API-REFERENCE.md#jerry_parse_and_save_literals) 761- [`jerry_set_vm_exec_stop_callback`](02.API-REFERENCE.md#jerry_set_vm_exec_stop_callback) 762 763 764## Port API functions 765 766- [`jerry_port_normalize_path`](05.PORT-API.md#jerry_port_normalize_path) 767- [`jerry_port_read_source`](05.PORT-API.md#jerry_port_read_source) 768- [`jerry_port_release_source`](05.PORT-API.md#jerry_port_release_source) 769- [`jerry_port_print_char`](05.PORT-API.md#jerry_port_print_char) 770- [`jerry_port_get_current_context`](05.PORT-API.md#jerry_port_get_current_context) 771- [`jerry_port_fatal`](05.PORT-API.md#jerry_port_fatal) 772- [`jerry_port_sleep`](05.PORT-API.md#jerry_port_sleep) 773