• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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