• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# JerryScript types
2
3## jerry_init_flag_t
4
5Enum that contains the following elements:
6
7 - JERRY_INIT_EMPTY - empty flag set
8 - JERRY_INIT_SHOW_OPCODES - dump byte-code to log after parse
9 - JERRY_INIT_SHOW_REGEXP_OPCODES - dump regexp byte-code to log after compilation
10 - JERRY_INIT_MEM_STATS - dump memory statistics
11 - JERRY_INIT_MEM_STATS_SEPARATE - **deprecated**, dump memory statistics and reset peak values after parse
12 - JERRY_INIT_DEBUGGER - **deprecated**, an unused placeholder now
13
14*Changed in version 2.0*: JERRY_INIT_MEM_STATS_SEPARATE and JERRY_INIT_DEBUGGER are now deprecated and not used internally.
15
16## jerry_type_t
17
18Enum that contains JerryScript API value types:
19
20 - JERRY_TYPE_NONE - no type information
21 - JERRY_TYPE_UNDEFINED - undefined type
22 - JERRY_TYPE_NULL - null type
23 - JERRY_TYPE_BOOLEAN - boolean type
24 - JERRY_TYPE_NUMBER - number type
25 - JERRY_TYPE_STRING - string type
26 - JERRY_TYPE_OBJECT - object type
27 - JERRY_TYPE_FUNCTION - function type
28 - JERRY_TYPE_ERROR - error/abort type
29 - JERRY_TYPE_SYMBOL - symbol type
30
31*New in version 2.0*.
32
33## jerry_error_t
34
35Possible types of an error:
36
37 - JERRY_ERROR_COMMON - common error
38 - JERRY_ERROR_EVAL - eval error
39 - JERRY_ERROR_RANGE - range error
40 - JERRY_ERROR_REFERENCE - reference error
41 - JERRY_ERROR_SYNTAX - syntax error
42 - JERRY_ERROR_TYPE - type error
43 - JERRY_ERROR_URI - URI error
44
45There is also a special value `JERRY_ERROR_NONE` which is not an error type
46this value can only be returned by the [jerry_get_error_type](#jerry_get_error_type).
47
48*Changed in version 2.0*: The `JERRY_ERROR_NONE` was added to be used by the [jerry_get_error_type](#jerry_get_error_type) method.
49
50## jerry_feature_t
51
52Possible compile time enabled feature types:
53
54 - JERRY_FEATURE_CPOINTER_32_BIT - 32 bit compressed pointers
55 - JERRY_FEATURE_ERROR_MESSAGES - error messages
56 - JERRY_FEATURE_JS_PARSER - js-parser
57 - JERRY_FEATURE_MEM_STATS - memory statistics
58 - JERRY_FEATURE_PARSER_DUMP - parser byte-code dumps
59 - JERRY_FEATURE_REGEXP_DUMP - regexp byte-code dumps
60 - JERRY_FEATURE_SNAPSHOT_SAVE - saving snapshot files
61 - JERRY_FEATURE_SNAPSHOT_EXEC - executing snapshot files
62 - JERRY_FEATURE_DEBUGGER - debugging
63 - JERRY_FEATURE_VM_EXEC_STOP - stopping ECMAScript execution
64 - JERRY_FEATURE_JSON - JSON support
65 - JERRY_FEATURE_PROMISE - promise support
66 - JERRY_FEATURE_TYPEDARRAY - Typedarray support
67 - JERRY_FEATURE_DATE - Date support
68 - JERRY_FEATURE_REGEXP - RegExp support
69 - JERRY_FEATURE_LINE_INFO - line info available
70 - JERRY_FEATURE_LOGGING - logging
71 - JERRY_FEATURE_SYMBOL - symbol support
72 - JERRY_FEATURE_DATAVIEW - DataView support
73 - JERRY_FEATURE_PROXY - Proxy support
74 - JERRY_FEATURE_MAP - Map support
75 - JERRY_FEATURE_SET - Set support
76 - JERRY_FEATURE_WEAKMAP - WeakMap support
77 - JERRY_FEATURE_WEAKSET - WeakSet support
78
79*New in version 2.0*.
80*Changed in version 2.3* : Added `JERRY_FEATURE_WEAKMAP`, `JERRY_FEATURE_WEAKSET` values.
81
82## jerry_container_type_t
83
84Container object types:
85
86 - JERRY_CONTAINER_TYPE_INVALID - Invalid container
87 - JERRY_CONTAINER_TYPE_MAP - Map type
88 - JERRY_CONTAINER_TYPE_SET - Set type
89 - JERRY_CONTAINER_TYPE_WEAKMAP - WeakMap type
90 - JERRY_CONTAINER_TYPE_WEAKSET - WeakSet type
91
92 *New in version 2.3*.
93
94## jerry_regexp_flags_t
95
96RegExp object optional flags:
97
98  - JERRY_REGEXP_FLAG_GLOBAL - global match; find all matches rather than stopping after the first match
99  - JERRY_REGEXP_FLAG_IGNORE_CASE - ignore case
100  - JERRY_REGEXP_FLAG_MULTILINE - multiline; treat beginning and end characters (^ and $) as working over
101  multiple lines (i.e., match the beginning or end of each line (delimited by \n or \r), not only the
102  very beginning or end of the whole input string)
103
104*New in version 2.0*.
105
106## jerry_parse_opts_t
107
108Option bits for [jerry_parse](#jerry_parse) and
109[jerry_parse_function](#jerry_parse_function) functions:
110
111 - JERRY_PARSE_NO_OPTS - no options passed
112 - JERRY_PARSE_STRICT_MODE - enable strict mode
113
114*New in version 2.0*.
115
116## jerry_gc_mode_t
117
118Set garbage collection operational mode
119
120 - JERRY_GC_PRESSURE_LOW - free unused objects
121 - JERRY_GC_PRESSURE_HIGH - free as much memory as possible
122
123The difference between `JERRY_GC_PRESSURE_LOW` and `JERRY_GC_PRESSURE_HIGH`
124is that the former keeps memory allocated for performance improvements such
125as property hash tables for large objects. The latter frees all possible
126memory blocks but the performance may drop after the garbage collection.
127
128*New in version 2.0*.
129
130## jerry_generate_snapshot_opts_t
131
132Flags for [jerry_generate_snapshot](#jerry_generate_snapshot) and
133[jerry_generate_function_snapshot](#jerry_generate_function_snapshot) functions:
134
135 - JERRY_SNAPSHOT_SAVE_STATIC - generate static snapshot (see below)
136 - JERRY_SNAPSHOT_SAVE_STRICT - strict source code provided
137
138**Generate static snapshots**
139Snapshots contain literal pools, and these literal pools contain references
140to constant literals (strings, numbers, etc.). When a snapshot is executed,
141these literals are converted to jerry values and the literal pool entries
142are changed to their corresponding jerry value. To support this conversion,
143the literals and literal pools are copied into RAM even if the
144`JERRY_SNAPSHOT_EXEC_COPY_DATA` option is passed to
145[jerry_exec_snapshot](#jerry_exec_snapshot). This non-negligible memory
146consumption can be avoided by using static snapshots. The literals of
147these snapshots are limited to magic strings and 28 bit signed integers,
148so their constant pools do not need to be loaded into the memory.
149Hence these snapshots can be executed from ROM.
150
151***Important note:*** The [jerry_exec_snapshot](#jerry_exec_snapshot)
152function rejects static snaphots unless the `JERRY_SNAPSHOT_EXEC_ALLOW_STATIC`
153option bit is set. The caller must also ensure that the same magic
154strings are set by [jerry_register_magic_strings](#jerry_register_magic_strings)
155when the snapshot is generated and executed. Furthermore the
156`JERRY_SNAPSHOT_EXEC_COPY_DATA` option is not allowed.
157
158*New in version 2.0*.
159
160## jerry_exec_snapshot_opts_t
161
162Flags for [jerry_exec_snapshot](#jerry_exec_snapshot) and
163[jerry_load_function_snapshot](#jerry_load_function_snapshot) functions:
164
165 - JERRY_SNAPSHOT_EXEC_COPY_DATA - copy snapshot data into memory (see below)
166 - JERRY_SNAPSHOT_EXEC_ALLOW_STATIC - allow executing static snapshots
167
168**Copy snapshot data into memory**
169
170By default the snapshot buffer is expected to be present in memory until
171[jerry_cleanup](#jerry_cleanup) is called. For example `static const` buffers
172compiled into the application binary satisfy this requirement.
173
174If the snapshot buffer is freed after [jerry_exec_snapshot](#jerry_exec_snapshot)
175is called the `JERRY_SNAPSHOT_EXEC_COPY_DATA` must be passed to copy the necessary
176parts of the snapshot buffer into memory.
177
178The `JERRY_SNAPSHOT_EXEC_COPY_DATA` option is not allowed for static snapshots.
179
180*New in version 2.0*.
181
182## jerry_char_t
183
184**Summary**
185
186Jerry's char value
187
188**Prototype**
189
190```c
191typedef uint8_t jerry_char_t;
192```
193
194## jerry_size_t
195
196**Summary**
197
198Jerry's size
199
200**Prototype**
201
202```c
203typedef uint32_t jerry_size_t;
204```
205
206## jerry_length_t
207
208**Summary**
209
210Jerry's length
211
212**Prototype**
213
214```c
215typedef uint32_t jerry_length_t;
216```
217
218## jerry_value_t
219
220**Summary**
221
222JerryScript value can be a boolean, number, null, object, string or undefined. The value has an error flag,
223that indicates whether is an error or not. Every type has an error flag not only objects. The error flag should
224be cleared before the value is passed as an argument, otherwise it can lead to a type error. The error objects
225created by API functions has the error flag set.
226
227Returned and created values by the API functions must be freed with
228[jerry_release_value](#jerry_release_value) when they are no longer needed.
229
230**Prototype**
231
232```c
233typedef uint32_t jerry_value_t;
234```
235
236## jerry_context_data_manager_t
237
238**Summary**
239
240Structure that defines how a context data item will be initialized and deinitialized. JerryScript zeroes out the memory
241for the item by default, and if the `init_cb` field is not NULL, it will be called with the pointer to the memory as
242an additional custom initializer. The `deinit_cb` (if non-`NULL`) is called during a call to `jerry_cleanup ()` to run
243any custom deinitialization *before* the VM has been fully cleaned up. The `finalize_cb` (if non-`NULL`) is also called
244during a call to `jerry_cleanup ()` to run any custom deinitialization *after* the VM has been fully cleaned up.
245If bytes_needed field is 0, no buffer is allocated for the manager, callback functions are called with NULL pointer.
246
247**Prototype**
248
249```c
250typedef struct
251{
252  /**
253   * Callback responsible for initializing a context item, or NULL to zero out the memory. This is called lazily, the
254   * first time jerry_get_context_data () is called with this manager.
255   *
256   * @param [in] data The buffer that JerryScript allocated for the manager. The buffer is zeroed out. The size is
257   * determined by the bytes_needed field. The buffer is kept alive until jerry_cleanup () is called.
258   */
259  void (*init_cb) (void *data);
260
261  /**
262   * Callback responsible for deinitializing a context item, or NULL. This is called as part of jerry_cleanup (),
263   * right *before* the VM has been cleaned up. This is a good place to release strong references to jerry_value_t's
264   * that the manager may be holding.
265   * Note: because the VM has not been fully cleaned up yet, jerry_object_native_info_t free_cb's can still get called
266   * *after* all deinit_cb's have been run. See finalize_cb for a callback that is guaranteed to run *after* all
267   * free_cb's have been run.
268   *
269   * @param [in] data The buffer that JerryScript allocated for the manager.
270   */
271  void (*deinit_cb) (void *data);
272
273  /**
274   * Callback responsible for finalizing a context item, or NULL. This is called as part of jerry_cleanup (),
275   * right *after* the VM has been cleaned up and destroyed and jerry_... APIs cannot be called any more. At this point,
276   * all values in the VM have been cleaned up. This is a good place to clean up native state that can only be cleaned
277   * up at the very end when there are no more VM values around that may need to access that state.
278   *
279   * @param [in] data The buffer that JerryScript allocated for the manager. After returning from this callback,
280   * the data pointer may no longer be used.
281   */
282  void (*finalize_cb) (void *data);
283
284  /**
285   * Number of bytes to allocate for this manager. This is the size of the buffer that JerryScript will allocate on
286   * behalf of the manager. The pointer to this buffer is passed into init_cb, deinit_cb and finalize_cb. It is also
287   * returned from the jerry_get_context_data () API.
288   */
289  size_t bytes_needed;
290} jerry_context_data_manager_t;
291```
292
293*New in version 2.0*.
294
295## jerry_context_alloc_t
296
297**Summary**
298
299Function type for allocating buffer for JerryScript context.
300
301**Prototype**
302
303```c
304typedef void *(*jerry_context_alloc_t) (size_t size, void *cb_data_p);
305```
306
307- `size` - allocation size
308- `cb_data_p` - pointer to user data
309
310*New in version 2.0*.
311
312## jerry_context_t
313
314**Summary**
315
316An opaque declaration of the JerryScript context structure.
317
318**Prototype**
319
320```c
321typedef struct jerry_context_t jerry_context_t;
322```
323
324*New in version 2.0*.
325
326
327## jerry_binary_operation_t
328
329Enum that contains the supported binary operation types
330 - JERRY_BIN_OP_EQUAL - equal comparison (==)
331 - JERRY_BIN_OP_STRICT_EQUAL - strict equal comparison (===)
332 - JERRY_BIN_OP_LESS - less relation (<)
333 - JERRY_BIN_OP_LESS_EQUAL - less or equal relation (<=)
334 - JERRY_BIN_OP_GREATER - greater relation (>)
335 - JERRY_BIN_OP_GREATER_EQUAL - greater or equal relation (>=)
336 - JERRY_BIN_OP_INSTANCEOF - instanceof operation
337 - JERRY_BIN_OP_ADD - addition operator (+)
338 - JERRY_BIN_OP_SUB - subtraction operator (-)
339 - JERRY_BIN_OP_MUL - multiplication operator (*)
340 - JERRY_BIN_OP_DIV - division operator (/)
341 - JERRY_BIN_OP_REM - remainder operator (%)
342
343*New in version 2.0*.
344
345**See also**
346
347- [jerry_binary_operation](#jerry_binary_operation)
348
349## jerry_property_descriptor_t
350
351**Summary**
352
353Description of ECMA property descriptor. This struct can be used
354for the [jerry_define_own_property](#jerry_define_own_property) method to
355configure how the property should be registered.
356
357The naming scheme is similar to the JavaScript `Object.defineProperty` method.
358
359Fields should be used in pairs. That is if the `is_value_defined` is set to `true`
360the `value` field should contain the value for the property.
361
362**Prototype**
363
364```c
365typedef struct
366{
367  /** Is [[Value]] defined? */
368  bool is_value_defined;
369
370  /** Is [[Get]] defined? */
371  bool is_get_defined;
372
373  /** Is [[Set]] defined? */
374  bool is_set_defined;
375
376  /** Is [[Writable]] defined? */
377  bool is_writable_defined;
378
379  /** [[Writable]] */
380  bool is_writable;
381
382  /** Is [[Enumerable]] defined? */
383  bool is_enumerable_defined;
384
385  /** [[Enumerable]] */
386  bool is_enumerable;
387
388  /** Is [[Configurable]] defined? */
389  bool is_configurable_defined;
390
391  /** [[Configurable]] */
392  bool is_configurable;
393
394  /** [[Value]] */
395  jerry_value_t value;
396
397  /** [[Get]] */
398  jerry_value_t getter;
399
400  /** [[Set]] */
401  jerry_value_t setter;
402} jerry_property_descriptor_t;
403```
404
405**See also**
406
407- [jerry_define_own_property](#jerry_define_own_property)
408
409## jerry_heap_stats_t
410
411**Summary**
412
413Description of JerryScript heap memory stats.
414It is for memory profiling.
415
416**Prototype**
417
418```c
419typedef struct
420{
421  size_t version /**< the version of the stats struct */
422  size_t size; /**< heap total size */
423  size_t allocated_bytes; /**< currently allocated bytes */
424  size_t peak_allocated_bytes; /**< peak allocated bytes */
425  size_t reserved[4]; /**< padding for future extensions */
426} jerry_heap_stats_t;
427```
428
429*New in version 2.0*.
430
431**See also**
432
433- [jerry_get_memory_stats](#jerry_get_memory_stats)
434
435## jerry_external_handler_t
436
437**Summary**
438
439Type of an external function handler
440
441**Prototype**
442
443```c
444typedef jerry_value_t (*jerry_external_handler_t) (const jerry_value_t function_obj,
445                                                   const jerry_value_t this_val,
446                                                   const jerry_value_t args_p[],
447                                                   const jerry_length_t args_count);
448```
449
450- `function_object` - the JavaScript function object which was invoked.
451- `this_val` - the `this` value provided for the function call.
452- `args_p` - the function arguments, array of JavaScript values.
453- `args_count` - the number of arguments.
454- return value
455  - The function's return value. If there is no return value, use [jerry_create_undefined()](#jerry_create_undefined).
456
457**See also**
458
459- [jerry_create_external_function](#jerry_create_external_function)
460
461## jerry_object_native_free_callback_t
462
463**Summary**
464
465Native free callback of an object. It is used in `jerry_object_native_info_t` and for external Array buffers.
466
467*Note*:
468 - Referred values by this method must have at least 1 reference. (Correct API usage satisfies this condition)
469
470**Prototype**
471
472```c
473typedef void (*jerry_object_native_free_callback_t) (void *native_p);
474```
475
476*New in version 2.0*: Renamed from `jerry_object_free_callback_t`.
477*Changed in version 2.2*: API calls are once again allowed. (See note)
478
479**See also**
480
481- [jerry_object_native_info_t](#jerry_object_native_info_t)
482- [jerry_create_arraybuffer_external](#jerry_create_arraybuffer_external)
483
484## jerry_object_native_info_t
485
486**Summary**
487
488The type information of the native pointer.
489It includes the free callback that will be called when associated JavaScript object is garbage collected. It can be left NULL in case it is not needed.
490
491Typically, one would create a `static const jerry_object_native_info_t` for
492each distinct C type for which a pointer is used with
493`jerry_set_object_native_pointer ()` and `jerry_get_object_native_pointer ()`.
494This way, each `const jerry_object_native_info_t *` pointer address value itself
495uniquely identifies the C type of the native pointer.
496
497See [jerry_get_object_native_pointer](#jerry_get_object_native_pointer)
498for a best-practice code example.
499
500**Prototype**
501
502```c
503typedef struct
504{
505  jerry_object_native_free_callback_t free_cb;
506} jerry_object_native_info_t;
507```
508
509*New in version 2.0*.
510
511**See also**
512
513- [jerry_set_object_native_pointer](#jerry_set_object_native_pointer)
514- [jerry_get_object_native_pointer](#jerry_get_object_native_pointer)
515
516## jerry_object_property_foreach_t
517
518**Summary**
519
520Function type used as a callback for the [jerry_foreach_object_property](#jerry_foreach_object_property)
521method. A function with this type must return "true" to continue the iteration or "false" to finish the
522iteration on the object's properties.
523
524**Prototype**
525
526```c
527typedef bool (*jerry_object_property_foreach_t) (const jerry_value_t property_name,
528                                                 const jerry_value_t property_value,
529                                                 void *user_data_p);
530```
531
532- `property_name` - a property name, this is not always a string.
533- `property_value` - the value for the given property.
534- `user_data_p` - optional user data pointer supplied via the (jerry_foreach_object_property)[#jerry_foreach_object_property] method.
535- return value
536  - true, to continue the iteration
537  - false, to stop the iteration
538
539**See also**
540
541- [jerry_foreach_object_property](#jerry_foreach_object_property)
542
543## jerry_objects_foreach_t
544
545**Summary**
546
547Function type used as a callback for the (jerry_objects_foreach)[#jerry_objects_foreach] method.
548A function with this type must return "true" to continue the iteration or "false" to finish the
549iteration on the object's properties.
550
551**Prototype**
552
553```c
554typedef bool (*jerry_objects_foreach_t) (const jerry_value_t object,
555                                         void *user_data_p);
556```
557
558- `object` - the current JavaScript object in the for-each iteration.
559- `user_data_p` - optional user data pointer supplied via the (jerry_objects_foreach)[#jerry_objects_foreach] method.
560- return value
561  - true, to continue the iteration
562  - false, to stop the iteration
563
564*New in version 2.0*.
565
566**See also**
567
568- [jerry_objects_foreach](#jerry_objects_foreach)
569
570## jerry_objects_foreach_by_native_info_t
571
572**Summary**
573
574Function type used as a callback for the (jerry_objects_foreach_by_native_info)[#jerry_objects_foreach_by_native_info]
575method. A function with this type must return "true" to continue the iteration or "false" to finish the
576iteration on the object's properties.
577
578**Prototype**
579
580```c
581typedef bool (*jerry_objects_foreach_by_native_info_t) (const jerry_value_t object,
582                                                        void *object_data_p,
583                                                        void *user_data_p);
584```
585
586- `object` - the current JavaScript object in the for-each iteration.
587- `object_data_p` - the current object's native data pointer.
588- `user_data_p` - optional user data pointer supplied via the (jerry_objects_foreach_by_native_info)[#jerry_objects_foreach_by_native_info] method.
589- return value
590  - true, to continue the iteration
591  - false, to stop the iteration
592
593*New in version 2.0*.
594
595**See also**
596
597- [jerry_objects_foreach_by_native_info](#jerry_objects_foreach_by_native_info)
598
599## jerry_vm_exec_stop_callback_t
600
601**Summary**
602
603Callback which tells whether the ECMAScript execution should be stopped.
604If it returns with undefined value the ECMAScript execution continues.
605Otherwise the result is thrown by the engine (if the error flag is not
606set for the returned value the engine automatically sets it). The
607callback function might be called again even if it threw an error.
608In this case the function must throw the same error again.
609
610**Prototype**
611
612```c
613typedef jerry_value_t (*jerry_vm_exec_stop_callback_t) (void *user_p);
614```
615
616*New in version 2.0*.
617
618**See also**
619
620- [jerry_set_vm_exec_stop_callback](#jerry_set_vm_exec_stop_callback)
621
622## jerry_promise_state_t
623
624Enum which describes the state of a Promise.
625
626Possible values:
627
628 - JERRY_PROMISE_STATE_NONE - Invalid/Unknown state (possibly called on a non-promise object).
629 - JERRY_PROMISE_STATE_PENDING - Promise is in "Pending" state.
630 - JERRY_PROMISE_STATE_FULFILLED - Promise is in "Fulfilled" state.
631 - JERRY_PROMISE_STATE_REJECTED - Promise is in "Rejected" state.
632
633*New in version 2.2*.
634
635**See also**
636
637- [jerry_get_promise_result](#jerry_get_promise_result)
638
639## jerry_typedarray_type_t
640
641Enum which describes the TypedArray types.
642Possible values:
643
644 - JERRY_TYPEDARRAY_UINT8 - represents the Uint8Array TypedArray
645 - JERRY_TYPEDARRAY_UINT8CLAMPED - represents the Uint8ClampedArray TypedArray
646 - JERRY_TYPEDARRAY_INT8 - represents the Int8Array TypedArray
647 - JERRY_TYPEDARRAY_UINT16 - represents the Uint16Array TypedArray
648 - JERRY_TYPEDARRAY_INT16 - represents the Int16Array TypedArray
649 - JERRY_TYPEDARRAY_UINT32 - represents the Uint32Array TypedArray
650 - JERRY_TYPEDARRAY_INT32 - represents the Int32Array TypedArray
651 - JERRY_TYPEDARRAY_FLOAT32 - represents the Float32Array TypedArray
652 - JERRY_TYPEDARRAY_FLOAT64 - represents the Float64Array TypedArray
653 - JERRY_TYPEDARRAY_INVALID - represents an invalid TypedArray
654
655API functions can return the `JERRY_TYPEDARRAY_INVALID` value if the
656TypedArray support is not in the engine.
657
658*New in version 2.0*.
659
660**See also**
661
662- [jerry_get_typedarray_type](#jerry_get_typedarray_type)
663
664
665# General engine functions
666
667## jerry_init
668
669**Summary**
670
671Initializes the JerryScript engine, making it possible to run JavaScript code and perform operations
672on JavaScript values. This is required for almost all API functions.
673
674**Prototype**
675
676```c
677void
678jerry_init (jerry_init_flag_t flags)
679```
680
681`flags` - combination of various engine configuration flags [jerry_init_flag_t](#jerry_init_flag_t).
682
683**Example**
684
685[doctest]: # ()
686
687```c
688#include "jerryscript.h"
689
690int
691main (void)
692{
693  jerry_init (JERRY_INIT_SHOW_OPCODES | JERRY_INIT_SHOW_REGEXP_OPCODES);
694
695  // ...
696
697  jerry_cleanup ();
698  return 0;
699}
700```
701
702**See also**
703
704- [jerry_init_flag_t](#jerry_init_flag_t)
705- [jerry_cleanup](#jerry_cleanup)
706
707
708## jerry_cleanup
709
710**Summary**
711
712Finish JavaScript engine execution, freeing memory and JavaScript values.
713
714*Note*: JavaScript values, received from engine, will be inaccessible after the cleanup.
715
716**Prototype**
717
718```c
719void
720jerry_cleanup (void);
721```
722
723**See also**
724
725- [jerry_init](#jerry_init)
726
727
728## jerry_get_context_data
729
730**Summary**
731
732Retrieve a pointer to the item stored within the current context by the given manager.
733
734*Note*: Since internally the pointer to a manager's context data item is linked to the next such pointer in a linked
735        list, it is inadvisable to invoke too many different managers, because doing so will increase the time it takes
736        to retrieve a manager's context data item, degrading performance. For example, try to keep the number of
737        managers below five.
738
739**Prototype**
740
741```c
742void *
743jerry_get_context_data (const jerry_context_data_manager *manager_p);
744```
745
746- `manager_p`: the manager of this context data item.
747- return value: the item created by `manager_p` when `jerry_get_context_data ()` was first called, or a new item created
748  by `manager_p`, which will be stored for future identical calls to `jerry_get_context_data ()`, and which will be
749  deinitialized using the `deinit_cb` callback provided by `manager_p` when the context will be destroyed.
750
751*New in version 2.0*.
752
753**Example**
754
755[doctest]: # (test="compile")
756
757```c
758#include "jerryscript.h"
759
760typedef struct
761{
762  int my_data1;
763  double my_data2;
764  char *my_data3;
765} my_context_data_t;
766
767/* Define how context items will be initialized. */
768static void
769my_context_data_new (void *user_data_p)
770{
771  my_context_data_t *my_data_p = (my_context_data_t *) user_data_p;
772
773  /*
774   * Initialize my_data_p. JerryScript will store it on the current context and return it whenever
775   * jerry_get_context_data () is called with a pointer to my_manager as defined below.
776   */
777}
778
779/* Define how context items will be deinitialized */
780static void
781my_context_data_free (void *user_data_p)
782{
783  my_context_data_t *my_data_p = ((my_context_data_t *) user_data_p);
784
785  /* Perform any necessary cleanup on my_data. JerryScript will free the pointer after this function completes. */
786}
787
788/* Wrap the creation and destruction functions into a manager */
789static const jerry_context_data_manager_t my_manager =
790{
791  .init_cb = my_context_data_new,
792  .deinit_cb = my_context_data_free,
793  .bytes_needed = sizeof (my_context_data_t)
794};
795
796/*
797 * Then, in some function in your code, you can retrieve an item of type my_context_data_t from the currently active
798 * context such that JerryScript will create and store such an item if one was not previously created
799 */
800static void
801someplace_in_the_code (void)
802{
803  my_context_data_t *my_data = (my_context_data_t *) jerry_get_context_data (&my_manager);
804  /* Perform useful things using the data found in my_data */
805}
806```
807
808
809## jerry_register_magic_strings
810
811**Summary**
812
813Registers an external magic string array.
814
815*Notes*:
816  - The strings in the array must be sorted by size at first, then lexicographically.
817  - The maximum number of external magic strings is limited to 2147483648 (UINT32_MAX / 2).
818    If there are more than 2147483648 external magic strings the extra is cropped.
819
820**Prototype**
821
822```c
823void
824jerry_register_magic_strings  (const jerry_char_t * const *ex_str_items_p,
825                               uint32_t count,
826                               const jerry_length_t *str_lengths_p);
827```
828
829- `ex_str_items_p` - character arrays, representing external magic strings' contents
830- `count` - number of elements in `ext_str_items_p` array
831- `str_lengths_p` - array of lengths for each magic string
832
833*Changed in version 2.0*: The first function argument type was changed.
834
835**Example**
836
837[doctest]: # ()
838
839```c
840#include "jerryscript.h"
841
842int
843main (void)
844{
845  jerry_init (JERRY_INIT_EMPTY);
846
847  // must be static, because 'jerry_register_magic_strings' does not copy
848  // the items must be sorted by size at first, then lexicographically
849  static const jerry_char_t * const magic_string_items[] = {
850                                                             (const jerry_char_t *) "magicstring1",
851                                                             (const jerry_char_t *) "magicstring2",
852                                                             (const jerry_char_t *) "magicstring3"
853                                                           };
854  uint32_t num_magic_string_items = (uint32_t) (sizeof (magic_string_items) / sizeof (jerry_char_t *));
855
856  // must be static, because 'jerry_register_magic_strings' does not copy
857  static const jerry_length_t magic_string_lengths[] = {
858                                                         12,
859                                                         12,
860                                                         12
861                                                       };
862  jerry_register_magic_strings (magic_string_items, num_magic_string_items, magic_string_lengths);
863}
864```
865
866**See also**
867
868- [jerry_init](#jerry_init)
869- [jerry_cleanup](#jerry_cleanup)
870- [jerry_get_literals_from_snapshot](#jerry_get_literals_from_snapshot)
871
872
873## jerry_get_memory_stats
874
875**Summary**
876
877Get heap memory stats.
878
879**Notes**:
880- The engine must be initialized with the `JERRY_INIT_MEM_STATS` option to allow
881  heap statistic collections. See [jerry_init](#jerry_init)
882- This API depends on a build option (`JERRY_MEM_STATS`) and can be checked
883  in runtime with the `JERRY_FEATURE_MEM_STATS` feature enum value,
884  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
885
886
887**Prototype**
888
889```c
890bool
891jerry_get_memory_stats (jerry_heap_stats_t *out_stats_p);
892```
893
894- `out_stats_p` - out parameter, that provides the heap statistics.
895- return value
896  - true, if stats were written into the `out_stats_p` pointer.
897  - false, otherwise. Usually it is because the `JERRY_FEATURE_MEM_STATS` feature is not enabled.
898
899*New in version 2.0*.
900
901**Example**
902
903```c
904jerry_init (JERRY_INIT_MEM_STATS);
905// ...
906
907jerry_heap_stats_t stats = {0};
908bool get_stats_ret = jerry_get_memory_stats (&stats);
909```
910
911**See also**
912
913- [jerry_init](#jerry_init)
914
915
916## jerry_gc
917
918**Summary**
919
920Performs garbage collection.
921
922**Prototype**
923
924```c
925void
926jerry_gc (jerry_gc_mode_t mode);
927```
928
929- `mode` - operational mode, see [jerry_gc_mode_t](#jerry_gc_mode_t)
930
931*Changed in version 2.0*: Added `mode` argument.
932
933**Example**
934
935[doctest]: # ()
936
937```c
938#include "jerryscript.h"
939
940int
941main (void)
942{
943  jerry_init (JERRY_INIT_EMPTY);
944
945  jerry_value_t object_value = jerry_create_object ();
946  jerry_release_value (object_value);
947
948  jerry_gc (JERRY_GC_PRESSURE_LOW);
949
950  jerry_cleanup ();
951}
952```
953
954**See also**
955
956- [jerry_gc_mode_t](#jerry_gc_mode_t)
957- [jerry_init](#jerry_init)
958- [jerry_cleanup](#jerry_cleanup)
959
960# Parser and executor functions
961
962Functions to parse and run JavaScript source code.
963
964## jerry_run_simple
965
966**Summary**
967
968The simplest way to run JavaScript.
969
970**Prototype**
971
972```c
973bool
974jerry_run_simple (const jerry_char_t *script_source_p,
975                  size_t script_source_size,
976                  jerry_init_flag_t flags);
977```
978
979- `script_source_p` - source code, it must be a valid utf8 string.
980- `script_source_size` - size of source code buffer, in bytes.
981- `jerry_init_flag_t` - combination of various engine configuration flags
982- return value
983  - true, if run was successful
984  - false, otherwise
985
986**Example**
987
988[doctest]: # ()
989
990```c
991#include "jerryscript.h"
992
993int
994main (void)
995{
996  const jerry_char_t script[] = "print ('Hello, World!');";
997
998  jerry_run_simple (script, sizeof (script) - 1, JERRY_INIT_EMPTY);
999  return 0;
1000}
1001```
1002
1003**See also**
1004
1005- [jerry_init](#jerry_init)
1006- [jerry_cleanup](#jerry_cleanup)
1007- [jerry_parse](#jerry_parse)
1008- [jerry_run](#jerry_run)
1009
1010
1011## jerry_parse
1012
1013**Summary**
1014
1015Parse script and construct an EcmaScript function. The lexical environment is
1016set to the global lexical environment. The resource name can be used by
1017debugging systems to provide line / backtrace info.
1018
1019*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
1020is no longer needed.
1021
1022**Prototype**
1023
1024```c
1025jerry_value_t
1026jerry_parse (const jerry_char_t *resource_name_p, /**< resource name (usually a file name) */
1027             size_t resource_name_length, /**< length of resource name */
1028             const jerry_char_t *source_p,
1029             size_t source_size,
1030             uint32_t parse_opts);
1031```
1032
1033- `resource_name_p` - resource name, usually a file name (must be a valid UTF8 string).
1034- `resource_name_length` - size of the resource name, in bytes.
1035- `source_p` - string, containing source code to parse (must be a valid UTF8 string).
1036- `source_size` - size of the string, in bytes.
1037- `parse_opts` - any combination of [jerry_parse_opts_t](#jerry_parse_opts_t) flags.
1038- return value
1039  - function object value, if script was parsed successfully,
1040  - thrown error, otherwise
1041
1042*Changed in version 2.0*: Added `resource_name_p`, and `resource_name_length` arguments.
1043
1044**Example**
1045
1046[doctest]: # ()
1047
1048```c
1049#include "jerryscript.h"
1050
1051int
1052main (void)
1053{
1054  jerry_init (JERRY_INIT_EMPTY);
1055
1056  const jerry_char_t script[] = "print ('Hello, World!');";
1057
1058  jerry_value_t parsed_code = jerry_parse (NULL, 0, script, sizeof (script) - 1, JERRY_PARSE_NO_OPTS);
1059  jerry_release_value (parsed_code);
1060
1061  jerry_cleanup ();
1062  return 0;
1063}
1064```
1065
1066**See also**
1067
1068- [jerry_run](#jerry_run)
1069- [jerry_parse_function](#jerry_parse_function)
1070
1071## jerry_parse_function
1072
1073**Summary**
1074
1075Parse function source code and construct an ECMAScript
1076function. The function arguments and function body are
1077passed as separated arguments. The lexical environment
1078is set to the global lexical environment. The resource
1079name (usually a file name) is also passed to this function
1080which is used by the debugger to find the source code.
1081
1082*Note*: The returned value must be freed with [jerry_release_value](#jerry_release_value) when it
1083is no longer needed.
1084
1085**Prototype**
1086
1087```c
1088jerry_value_t
1089jerry_parse_function (const jerry_char_t *resource_name_p, /**< resource name (usually a file name) */
1090                      size_t resource_name_length, /**< length of resource name */
1091                      const jerry_char_t *arg_list_p, /**< script source */
1092                      size_t arg_list_size, /**< script source size */
1093                      const jerry_char_t *source_p, /**< script source */
1094                      size_t source_size, /**< script source size */
1095                      uint32_t parse_opts) /**< strict mode */
1096```
1097
1098- `resource_name_p` - resource name, usually a file name (must be a valid UTF8 string).
1099- `resource_name_length` - size of the resource name, in bytes.
1100- `arg_list_p` - argument list of the function (must be a valid UTF8 string).
1101- `arg_list_size` - size of the argument list, in bytes.
1102- `source_p` - string, containing source code to parse (must be a valid UTF8 string).
1103- `source_size` - size of the string, in bytes.
1104- `parse_opts` - any combination of [jerry_parse_opts_t](#jerry_parse_opts_t) flags.
1105- return value
1106  - function object value, if script was parsed successfully,
1107  - thrown error, otherwise
1108
1109*New in version 2.0*.
1110
1111**Example**
1112
1113[doctest]: # (name="02.API-REFERENCE-parse-func.c")
1114
1115```c
1116#include <stdio.h>
1117#include <string.h>
1118#include "jerryscript.h"
1119
1120int
1121main (void)
1122{
1123  int return_value = 1;
1124
1125  /* Initialize engine */
1126  jerry_init (JERRY_INIT_EMPTY);
1127
1128  /* Parse the 'function (a,b) { return a + b; }' function */
1129  const char function_args[] = "a, b";
1130  const char function_source[] = "return a + b";
1131
1132  jerry_value_t parsed_function = jerry_parse_function (NULL,
1133                                                        0,
1134                                                        (const jerry_char_t *) function_args,
1135                                                        strlen (function_args),
1136                                                        (const jerry_char_t *) function_source,
1137                                                        strlen (function_source),
1138                                                        JERRY_PARSE_NO_OPTS);
1139
1140  if (!jerry_value_is_error (parsed_function))
1141  {
1142    /* Run the parsed function */
1143    jerry_value_t args[] = {
1144        jerry_create_number (3),
1145        jerry_create_number (55),
1146    };
1147    jerry_size_t argc = sizeof (args) / sizeof (args[0]);
1148    jerry_value_t ret_value = jerry_call_function (parsed_function,
1149                                                   jerry_create_undefined(),
1150                                                   args,
1151                                                   argc);
1152
1153    /* Process result value */
1154    if (jerry_value_is_number (ret_value)) {
1155        double value = jerry_get_number_value (ret_value);
1156        printf ("Function result: %lf\n", value);
1157
1158        return_value = !(value == (3 + 55));
1159    }
1160
1161    /* Release the function arguments */
1162    for (jerry_size_t idx = 0; idx < argc; idx++) {
1163        jerry_release_value (args[idx]);
1164    }
1165
1166    /* Returned value must be freed */
1167    jerry_release_value (ret_value);
1168  }
1169
1170  /* Parsed function must be freed */
1171  jerry_release_value (parsed_function);
1172
1173  /* Cleanup engine */
1174  jerry_cleanup ();
1175
1176  return return_value;
1177}
1178```
1179
1180**See also**
1181
1182- [jerry_call_function](#jerry_call_function)
1183
1184
1185## jerry_run
1186
1187**Summary**
1188
1189Run an EcmaScript function created by `jerry_parse`.
1190
1191*Notes*:
1192  - The code should be previously parsed with `jerry_parse`.
1193  - Returned value must be freed with [jerry_release_value](#jerry_release_value)
1194    when it is no longer needed.
1195
1196**Prototype**
1197
1198```c
1199jerry_value_t
1200jerry_run (const jerry_value_t func_val);
1201```
1202
1203- `func_val` - function to run
1204- return value
1205  - result of bytecode, if run was successful
1206  - thrown error, otherwise
1207
1208**Example**
1209
1210[doctest]: # ()
1211
1212```c
1213#include "jerryscript.h"
1214
1215int
1216main (void)
1217{
1218  const jerry_char_t script[] = "print ('Hello, World!');";
1219
1220  /* Initialize engine */
1221  jerry_init (JERRY_INIT_EMPTY);
1222
1223  /* Setup Global scope code */
1224  jerry_value_t parsed_code = jerry_parse (NULL, 0, script, sizeof (script) - 1, JERRY_PARSE_NO_OPTS);
1225
1226  if (!jerry_value_is_error (parsed_code))
1227  {
1228    /* Execute the parsed source code in the Global scope */
1229    jerry_value_t ret_value = jerry_run (parsed_code);
1230
1231    /* Returned value must be freed */
1232    jerry_release_value (ret_value);
1233  }
1234
1235  /* Parsed source code must be freed */
1236  jerry_release_value (parsed_code);
1237
1238  /* Cleanup engine */
1239  jerry_cleanup ();
1240}
1241```
1242
1243**See also**
1244
1245- [jerry_parse](#jerry_parse)
1246
1247
1248## jerry_eval
1249
1250**Summary**
1251
1252Perform JavaScript `eval` function call (ECMA-262 v5.1 sec-15.1.2.1).
1253
1254*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
1255is no longer needed.
1256
1257**Prototype**
1258
1259```c
1260jerry_value_t
1261jerry_eval (const jerry_char_t *source_p,
1262            size_t source_size,
1263            uint32_t parse_opts);
1264```
1265
1266- `source_p` - source code to evaluate, it must be a valid utf8 string.
1267- `source_size` - length of the source code
1268- `parse_opts` - any combination of [jerry_parse_opts_t](#jerry_parse_opts_t) flags.
1269- return value - result of eval, may be an error value.
1270
1271**Example**
1272
1273```c
1274{
1275  jerry_value_t ret_val = jerry_eval (str_to_eval,
1276                                      strlen (str_to_eval),
1277                                      JERRY_PARSE_NO_OPTS);
1278}
1279```
1280
1281**See also**
1282
1283- [jerry_create_external_function](#jerry_create_external_function)
1284- [jerry_external_handler_t](#jerry_external_handler_t)
1285
1286## jerry_run_all_enqueued_jobs
1287
1288**Summary**
1289
1290Run enqueued Promise jobs until the first thrown error or until all get executed.
1291
1292*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
1293is no longer needed.
1294
1295**Prototype**
1296
1297```c
1298jerry_value_t
1299jerry_run_all_enqueued_jobs (void)
1300```
1301
1302- return value - result of last executed job, may be error value.
1303
1304*New in version 2.0*.
1305
1306**Example**
1307
1308[doctest]: # ()
1309
1310```c
1311#include "jerryscript.h"
1312
1313int
1314main (void)
1315{
1316  jerry_init (JERRY_INIT_EMPTY);
1317
1318  const jerry_char_t script[] = "new Promise(function(f,r) { f('Hello, World!'); }).then(function(x) { print(x); });";
1319
1320  jerry_value_t parsed_code = jerry_parse (NULL, 0, script, sizeof (script) - 1, JERRY_PARSE_NO_OPTS);
1321  jerry_value_t script_value = jerry_run (parsed_code);
1322  jerry_value_t job_value = jerry_run_all_enqueued_jobs ();
1323
1324  jerry_release_value (job_value);
1325  jerry_release_value (script_value);
1326  jerry_release_value (parsed_code);
1327
1328  jerry_cleanup ();
1329  return 0;
1330}
1331```
1332
1333
1334# Get the global context
1335
1336## jerry_get_global_object
1337
1338**Summary**
1339
1340Get the Global object.
1341
1342*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
1343is no longer needed.
1344
1345**Prototype**
1346
1347```c
1348jerry_value_t
1349jerry_get_global_object (void);
1350```
1351
1352- return value - api value of global object
1353
1354**Example**
1355
1356```c
1357{
1358  jerry_value_t glob_obj_val = jerry_get_global_object ();
1359
1360  ... // Do something with global object, ex: add properties
1361
1362  jerry_release_value (glob_obj_val);
1363}
1364```
1365
1366**See also**
1367
1368- [jerry_release_value](#jerry_release_value)
1369- [jerry_define_own_property](#jerry_define_own_property)
1370
1371
1372# Checker functions
1373
1374Functions to check the type of an API value ([jerry_value_t](#jerry_value_t)).
1375
1376## jerry_value_is_abort
1377
1378**Summary**
1379
1380Returns whether the given `jerry_value_t` has the error and abort value set.
1381
1382**Prototype**
1383
1384```c
1385bool
1386jerry_value_is_abort (const jerry_value_t value);
1387```
1388
1389- `value` - api value
1390- return value
1391  - true, if the given `jerry_value_t` has the error and abort value set
1392  - false, otherwise
1393
1394*New in version 2.0*.
1395
1396**Example**
1397
1398```c
1399{
1400  jerry_value_t value;
1401  ... // create or acquire value
1402
1403  if (jerry_value_is_abort (value))
1404  {
1405    ...
1406  }
1407
1408  jerry_release_value (value);
1409}
1410```
1411
1412**See also**
1413
1414- [jerry_value_t](#jerry_value_t)
1415- [jerry_value_is_error](#jerry_value_is_error)
1416
1417## jerry_value_is_array
1418
1419**Summary**
1420
1421Returns whether the given `jerry_value_t` is an array.
1422
1423**Prototype**
1424
1425```c
1426bool
1427jerry_value_is_array (const jerry_value_t value)
1428```
1429
1430- `value` - api value
1431- return value
1432  - true, if the given `jerry_value_t` is an array
1433  - false, otherwise
1434
1435**Example**
1436
1437```c
1438{
1439  jerry_value_t value;
1440  ... // create or acquire value
1441
1442  if (jerry_value_is_array (value))
1443  {
1444    ...
1445  }
1446
1447  jerry_release_value (value);
1448}
1449```
1450
1451**See also**
1452
1453- [jerry_release_value](#jerry_release_value)
1454
1455## jerry_value_is_arraybuffer
1456
1457**Summary**
1458
1459Returns whether the given `jerry_value_t` is an ArrayBuffer object.
1460
1461*Notes*:
1462- This API depends on a build option (`JERRY_ES2015_BUILTIN_TYPEDARRAY`) and can be checked
1463  in runtime with the `JERRY_FEATURE_TYPEDARRAY` feature enum value,
1464  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
1465- The ES2015-subset profile enables this by default.
1466
1467**Prototype**
1468
1469```c
1470bool
1471jerry_value_is_arraybuffer (const jerry_value_t value)
1472```
1473
1474- `value` - api value to check.
1475- return value
1476  - true, if the given `jerry_value_t` is an ArrayBuffer object.
1477  - false, otherwise
1478
1479*New in version 2.0*.
1480
1481**Example**
1482
1483```c
1484{
1485  jerry_value_t value;
1486  ... // create or acquire value
1487
1488  if (jerry_value_is_arraybuffer (value))
1489  {
1490    ...
1491  }
1492
1493  jerry_release_value (value);
1494}
1495```
1496
1497**See also**
1498
1499- [jerry_create_arraybuffer](#jerry_create_arraybuffer)
1500- [jerry_create_arraybuffer_external](#jerry_create_arraybuffer_external)
1501
1502
1503## jerry_value_is_boolean
1504
1505**Summary**
1506
1507Returns whether the given `jerry_value_t` is a boolean value.
1508
1509**Prototype**
1510
1511```c
1512bool
1513jerry_value_is_boolean (const jerry_value_t value)
1514```
1515
1516- `value` - api value
1517- return value
1518  - true, if the given `jerry_value_t` is a boolean value
1519  - false, otherwise
1520
1521**Example**
1522
1523```c
1524{
1525  jerry_value_t value;
1526  ... // create or acquire value
1527
1528  if (jerry_value_is_boolean (value))
1529  {
1530    ...
1531  }
1532
1533  jerry_release_value (value);
1534}
1535```
1536
1537**See also**
1538
1539- [jerry_release_value](#jerry_release_value)
1540
1541
1542## jerry_value_is_constructor
1543
1544**Summary**
1545
1546Returns whether the given `jerry_value_t` is a constructor function.
1547
1548**Prototype**
1549
1550```c
1551bool
1552jerry_value_is_constructor (const jerry_value_t value)
1553```
1554
1555- `value` - api value
1556- return value
1557  - true, if the given `jerry_value_t` is a constructor
1558  - false, otherwise
1559
1560**Example**
1561
1562```c
1563{
1564  jerry_value_t value;
1565  ... // create or acquire value
1566
1567  if (jerry_value_is_constructor (value))
1568  {
1569    ...
1570  }
1571
1572  jerry_release_value (value);
1573}
1574```
1575
1576**See also**
1577
1578- [jerry_release_value](#jerry_release_value)
1579
1580## jerry_value_is_dataview
1581
1582**Summary**
1583
1584Returns whether the given `jerry_value_t` is a DataView object value.
1585
1586*Notes*:
1587- This API depends on a build option (`JERRY_ES2015_BUILTIN_DATAVIEW`) and can be checked
1588  in runtime with the `JERRY_FEATURE_DATAVIEW` feature enum value,
1589  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
1590- The ES2015-subset profile enables this by default.
1591
1592**Prototype**
1593
1594```c
1595bool
1596jerry_value_is_dataview (const jerry_value_t value)
1597```
1598
1599- `value` - API value
1600- return value
1601  - true, if the given `jerry_value_t` is a DataView object
1602  - false, otherwise
1603
1604*New in version 2.0*.
1605
1606**Example**
1607
1608[doctest]: # ()
1609
1610```c
1611#include "jerryscript.h"
1612
1613int
1614main (void)
1615{
1616  jerry_init (JERRY_INIT_EMPTY);
1617
1618  jerry_value_t arraybuffer = jerry_create_arraybuffer (16);
1619  jerry_value_t dataview = jerry_create_dataview (arraybuffer, 0, 16);
1620
1621  if (jerry_value_is_dataview (dataview))
1622  {
1623    // usage of dataview
1624  }
1625
1626  jerry_release_value (dataview);
1627  jerry_release_value (arraybuffer);
1628
1629  jerry_cleanup ();
1630  return 0;
1631}
1632```
1633
1634**See also**
1635
1636- [jerry_release_value](#jerry_release_value)
1637- [jerry_create_dataview](#jerry_create_dataview)
1638
1639
1640## jerry_value_is_error
1641
1642**Summary**
1643
1644Returns whether the given `jerry_value_t` is error value.
1645
1646**Prototype**
1647
1648```c
1649bool
1650jerry_value_is_error (const jerry_value_t value);
1651```
1652
1653- `value` - api value
1654- return value
1655  - true, if the given `jerry_value_t` is error value.
1656  - false, otherwise
1657
1658*New in version 2.0*.
1659
1660**Example**
1661
1662```c
1663{
1664  jerry_value_t value;
1665  ... // create or acquire value
1666
1667  if (jerry_value_is_error (value))
1668  {
1669    ...
1670  }
1671
1672  jerry_release_value (value);
1673}
1674```
1675
1676**See also**
1677
1678- [jerry_value_t](#jerry_value_t)
1679- [jerry_value_is_abort](#jerry_value_is_abort)
1680
1681## jerry_value_is_function
1682
1683**Summary**
1684
1685Returns whether the given `jerry_value_t` is a function.
1686
1687**Prototype**
1688
1689```c
1690bool
1691jerry_value_is_function (const jerry_value_t value)
1692```
1693
1694- `value` - api value
1695- return value
1696  - true, if the given `jerry_value_t` is a function
1697  - false, otherwise
1698
1699**Example**
1700
1701```c
1702{
1703  jerry_value_t value;
1704  ... // create or acquire value
1705
1706  if (jerry_value_is_function (value))
1707  {
1708    ...
1709  }
1710
1711  jerry_release_value (value);
1712}
1713```
1714
1715**See also**
1716
1717- [jerry_release_value](#jerry_release_value)
1718
1719
1720## jerry_value_is_number
1721
1722**Summary**
1723
1724Returns whether the given `jerry_value_t` is a number.
1725
1726**Prototype**
1727
1728```c
1729bool
1730jerry_value_is_number (const jerry_value_t value)
1731```
1732
1733- `value` - api value
1734- return value
1735  - true, if the given `jerry_value_t` is a number
1736  - false, otherwise
1737
1738**Example**
1739
1740```c
1741{
1742  jerry_value_t value;
1743  ... // create or acquire value
1744
1745  if (jerry_value_is_number (value))
1746  {
1747    ...
1748  }
1749
1750  jerry_release_value (value);
1751}
1752```
1753
1754**See also**
1755
1756- [jerry_release_value](#jerry_release_value)
1757
1758
1759## jerry_value_is_null
1760
1761**Summary**
1762
1763Returns whether the given `jerry_value_t` is a null value.
1764
1765**Prototype**
1766
1767```c
1768bool
1769jerry_value_is_null (const jerry_value_t value)
1770```
1771
1772- `value` - api value
1773- return value
1774  - true, if the given `jerry_value_t` is a null
1775  - false, otherwise
1776
1777**Example**
1778
1779```c
1780{
1781  jerry_value_t value;
1782  ... // create or acquire value
1783
1784  if (jerry_value_is_null (value))
1785  {
1786    ...
1787  }
1788
1789  jerry_release_value (value);
1790}
1791```
1792
1793**See also**
1794
1795- [jerry_release_value](#jerry_release_value)
1796
1797
1798## jerry_value_is_object
1799
1800**Summary**
1801
1802Returns whether the given `jerry_value_t` is an object value.
1803
1804**Prototype**
1805
1806```c
1807bool
1808jerry_value_is_object (const jerry_value_t value)
1809```
1810
1811- `value` - api value
1812- return value
1813  - true, if the given `jerry_value_t` is an object
1814  - false, otherwise
1815
1816**Example**
1817
1818```c
1819{
1820  jerry_value_t value;
1821  ... // create or acquire value
1822
1823  if (jerry_value_is_object (value))
1824  {
1825    ...
1826  }
1827
1828  jerry_release_value (value);
1829}
1830```
1831
1832**See also**
1833
1834- [jerry_release_value](#jerry_release_value)
1835
1836
1837## jerry_value_is_promise
1838
1839**Summary**
1840
1841Returns whether the given `jerry_value_t` is a promise value.
1842
1843*Notes*:
1844- This API depends on a build option (`JERRY_ES2015_BUILTIN_PROMISE`) and can be checked
1845  in runtime with the `JERRY_FEATURE_PROMISE` feature enum value,
1846  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
1847- The ES2015-subset profile enables this by default.
1848
1849
1850**Prototype**
1851
1852```c
1853bool
1854jerry_value_is_promise (const jerry_value_t value)
1855```
1856
1857- `value` - api value
1858- return value
1859  - true, if the given `jerry_value_t` is a promise
1860  - false, otherwise
1861
1862*New in version 2.0*.
1863
1864**Example**
1865
1866```c
1867{
1868  jerry_value_t value;
1869  ... // create or acquire value
1870
1871  if (jerry_value_is_promise (value))
1872  {
1873    ...
1874  }
1875
1876  jerry_release_value (value);
1877}
1878```
1879
1880**See also**
1881
1882- [jerry_release_value](#jerry_release_value)
1883- [jerry_create_promise](#jerry_create_promise)
1884
1885
1886## jerry_value_is_proxy
1887
1888**Summary**
1889
1890Returns whether the given `jerry_value_t` is a proxy value.
1891
1892*Notes*:
1893- This API depends on a build option (`JERRY_ES2015_BUILTIN_PROXY`) and can be checked
1894  in runtime with the `JERRY_FEATURE_PROXY` feature enum value,
1895  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
1896- The ES2015-subset profile enables this by default.
1897
1898
1899**Prototype**
1900
1901```c
1902bool
1903jerry_value_is_proxy (const jerry_value_t value)
1904```
1905
1906- `value` - api value
1907- return value
1908  - true, if the given `jerry_value_t` is a proxy object
1909  - false, otherwise
1910
1911**Example**
1912
1913*New in version 2.3*.
1914
1915```c
1916{
1917  jerry_value_t value;
1918  ... // create or acquire value
1919
1920  if (jerry_value_is_proxy (value))
1921  {
1922    ...
1923  }
1924
1925  jerry_release_value (value);
1926}
1927```
1928
1929**See also**
1930
1931- [jerry_release_value](#jerry_release_value)
1932- [jerry_create_proxy](#jerry_create_proxy)
1933
1934
1935## jerry_value_is_string
1936
1937**Summary**
1938
1939Returns whether the given `jerry_value_t` is a string value.
1940
1941**Prototype**
1942
1943```c
1944bool
1945jerry_value_is_string (const jerry_value_t value)
1946```
1947
1948- `value` - api value
1949- return value
1950  - true, if the given `jerry_value_t` is a string
1951  - false, otherwise
1952
1953**Example**
1954
1955```c
1956{
1957  jerry_value_t value;
1958  ... // create or acquire value
1959
1960  if (jerry_value_is_string (value))
1961  {
1962    ...
1963  }
1964
1965  jerry_release_value (value);
1966}
1967```
1968
1969**See also**
1970
1971- [jerry_release_value](#jerry_release_value)
1972
1973
1974## jerry_value_is_symbol
1975
1976**Summary**
1977
1978Returns whether the given `jerry_value_t` is a symbol value.
1979
1980*Notes*:
1981- This API depends on a build option (`JERRY_ES2015_BUILTIN_SYMBOL`) and can be checked
1982  in runtime with the `JERRY_FEATURE_SYMBOL` feature enum value,
1983  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
1984- The ES2015-subset profile enables this by default.
1985
1986**Prototype**
1987
1988```c
1989bool
1990jerry_value_is_symbol (const jerry_value_t value)
1991```
1992
1993- `value` - API value
1994- return value
1995  - true, if the given `jerry_value_t` is a symbol
1996  - false, otherwise
1997
1998*New in version 2.0*.
1999
2000**Example**
2001
2002[doctest]: # ()
2003
2004```c
2005#include "jerryscript.h"
2006
2007int
2008main (void)
2009{
2010  jerry_init (JERRY_INIT_EMPTY);
2011
2012  jerry_value_t string_value = jerry_create_string ((const jerry_char_t *) "Symbol description string");
2013  jerry_value_t symbol_value = jerry_create_symbol (string_value);
2014
2015  jerry_release_value (string_value);
2016
2017  if (jerry_value_is_symbol (symbol_value))
2018  {
2019    // usage of symbol_value
2020  }
2021
2022  jerry_release_value (symbol_value);
2023
2024  jerry_cleanup ();
2025  return 0;
2026}
2027```
2028
2029**See also**
2030
2031- [jerry_release_value](#jerry_release_value)
2032- [jerry_create_symbol](#jerry_create_symbol)
2033
2034## jerry_value_is_typedarray
2035
2036**Summary**
2037
2038Checks whether the given `jerry_value_t` is a TypedArray object or not.
2039
2040*Notes*:
2041- This API depends on a build option (`JERRY_ES2015_BUILTIN_TYPEDARRAY`) and can be checked
2042  in runtime with the `JERRY_FEATURE_TYPEDARRAY` feature enum value,
2043  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
2044- The ES2015-subset profile enables this by default.
2045
2046**Prototype**
2047
2048```c
2049bool
2050jerry_value_is_typedarray (const jerry_value_t value)
2051```
2052
2053- `value` - object to check
2054- return value
2055  - true, if the given `jerry_value_t` is a TypedArray object.
2056  - false, otherwise
2057
2058*New in version 2.0*.
2059
2060**Example**
2061
2062[doctest]: # ()
2063
2064```c
2065#include "jerryscript.h"
2066
2067int
2068main (void)
2069{
2070  jerry_init (JERRY_INIT_EMPTY);
2071
2072  jerry_value_t value = jerry_create_typedarray (JERRY_TYPEDARRAY_UINT16, 15);
2073
2074  if (jerry_value_is_typedarray (value))
2075  {
2076    /* "value" is a typedarray. */
2077  }
2078
2079  jerry_release_value (value);
2080
2081  jerry_cleanup ();
2082
2083  return 0;
2084}
2085```
2086
2087**See also**
2088
2089- [jerry_create_typedarray](#jerry_create_typedarray)
2090
2091
2092## jerry_get_container_type
2093
2094**Summary**
2095
2096Checks whether the given `jerry_value_t` is the given `jerry_container_type_t` type container object.
2097
2098*Notes*
2099- This API function depends on a build option (`JERRY_ES2015_BUILTIN_CONTAINER`) and can be checked
2100  runtime with the `JERRY_FEATURE_MAP, JERRY_FEATURE_SET, JERRY_FEATURE_WEAKMAP, JERRY_FEATURE_WEAKSET`
2101  feature enum values.
2102  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
2103- The ES2015-subset profile enables this by default.
2104
2105*New in version 2.3*.
2106
2107**Prototype**
2108
2109```c
2110jerry_container_type_t
2111jerry_get_container_type (const jerry_value_t value)
2112```
2113
2114- `value` - Container object
2115- return value
2116  - The corresponding enum value of `jerry_container_type_t`, or `JERRY_CONTAINER_TYPE_INVALID` if the container
2117    was not a valid container object.
2118**Example**
2119
2120[doctest]: # ()
2121
2122```c
2123#include "jerryscript.h"
2124int
2125main (void)
2126{
2127  jerry_init (JERRY_INIT_EMPTY);
2128
2129  jerry_value_t value = jerry_create_container (JERRY_CONTAINER_TYPE_MAP, NULL, 0);
2130
2131  if (jerry_get_container_type (value) == JERRY_CONTAINER_TYPE_MAP)
2132  {
2133    /* "value" is a map. */
2134  }
2135
2136  jerry_release_value (value);
2137
2138  jerry_cleanup ();
2139
2140  return 0;
2141}
2142```
2143
2144**See also**
2145
2146- [jerry_create_container](#jerry_create_container)
2147- [jerry_container_type_t](#jerry_container_type_t)
2148
2149
2150## jerry_value_is_undefined
2151
2152**Summary**
2153
2154Returns whether the given `jerry_value_t` is an undefined value.
2155
2156**Prototype**
2157
2158```c
2159bool
2160jerry_value_is_undefined (const jerry_value_t value)
2161```
2162
2163- `value` - api value
2164- return value
2165  - true, if the given `jerry_value_t` is an undefined value
2166  - false, otherwise
2167
2168**Example**
2169
2170```c
2171{
2172  jerry_value_t value;
2173  ... // create or acquire value
2174
2175  if (jerry_value_is_undefined (value))
2176  {
2177    ...
2178  }
2179
2180  jerry_release_value (value);
2181}
2182```
2183
2184**See also**
2185
2186- [jerry_release_value](#jerry_release_value)
2187
2188## jerry_value_get_type
2189
2190**Summary**
2191
2192Returns the JavaScript type
2193for a given value as a [jerry_type_t](#jerry_type_t) enum value.
2194
2195This is a similar operation to the 'typeof' operator
2196in the standard with an exception that the 'null'
2197value has its own enum value.
2198
2199**Prototype**
2200
2201```c
2202jerry_type_t
2203jerry_value_get_type (const jerry_value_t value);
2204```
2205
2206- `value` - JavaScript value to check.
2207- return value
2208  - One of the [jerry_type_t](#jerry_type_t) value.
2209
2210*New in version 2.0*.
2211
2212**Example**
2213
2214```c
2215{
2216  jerry_value_t number = jerry_create_number (3.3);
2217
2218  jerry_type_t type_info = jerry_value_get_type (number);
2219
2220  if (type_info == JERRY_TYPE_NUMBER)
2221  {
2222    /* ... */
2223  }
2224
2225  jerry_release_value (number);
2226}
2227```
2228
2229**See also**
2230
2231- [jerry_type_t](#jerry_type_t)
2232
2233## jerry_is_feature_enabled
2234
2235**Summary**
2236
2237Returns whether the specified compile time feature is enabled.
2238
2239**Prototype**
2240
2241```c
2242bool
2243jerry_is_feature_enabled (const jerry_feature_t feature);
2244```
2245
2246- `feature` - jerry feature
2247- return value
2248  - true, if the given `jerry_feature_t` is enabled
2249  - false, otherwise
2250
2251*New in version 2.0*.
2252
2253**Example**
2254
2255```c
2256{
2257  /* ... */
2258  jerry_feature_t feature = JERRY_FEATURE_SNAPSHOT_SAVE;
2259
2260  if (jerry_is_feature_enabled (feature))
2261  {
2262    /* ... */
2263  }
2264
2265}
2266```
2267
2268**See also**
2269
2270- [jerry_feature_t](#jerry_feature_t)
2271
2272
2273# Binary operations
2274
2275## jerry_binary_operation
2276
2277**Summary**
2278
2279Perform binary operation on the given operands (==, ===, <, >, etc.).
2280
2281*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
2282is no longer needed.
2283
2284**Prototype**
2285
2286```c
2287jerry_value_t
2288jerry_binary_operation (jerry_binary_operation_t op,
2289                        const jerry_value_t lhs,
2290                        const jerry_value_t rhs);
2291```
2292
2293- `op` - binary operation
2294- `lhs` - left-hand side operand
2295- `rhs` - right-hand side operand
2296- return value
2297  - error, if argument has an error flag or operation is unsuccessful or unsupported
2298  - true/false, the result of the binary operation on the given operands otherwise
2299
2300*New in version 2.0*.
2301
2302**Example - JERRY_BIN_OP_EQUAL**
2303
2304```c
2305{
2306  jerry_value_t value1;
2307  jerry_value_t value2;
2308  ... // create or acquire value
2309  jerry_value_t result = jerry_binary_operation (JERRY_BIN_OP_EQUAL, value1, value2)
2310
2311  if (!jerry_value_is_error (result))
2312  {
2313    if (jerry_get_boolean_value (result))
2314    {
2315       // value1 and value2 are equal
2316    }
2317    else
2318    {
2319      // value1 and value2 are NOT equal
2320    }
2321  }
2322  else
2323  {
2324    ... // handle error
2325  }
2326
2327  jerry_release_value (value1);
2328  jerry_release_value (value2);
2329  jerry_release_value (result);
2330}
2331```
2332
2333**Example - JERRY_BIN_OP_INSTANCEOF**
2334
2335[doctest]: # ()
2336
2337```c
2338#include "jerryscript.h"
2339
2340static jerry_value_t
2341my_constructor (const jerry_value_t func_val,
2342                const jerry_value_t this_val,
2343                const jerry_value_t argv[],
2344                const jerry_length_t argc)
2345{
2346  return jerry_create_undefined ();
2347}
2348
2349int
2350main (void)
2351{
2352  jerry_init (JERRY_INIT_EMPTY);
2353
2354  jerry_value_t base_obj = jerry_create_object ();
2355  jerry_value_t constructor = jerry_create_external_function (my_constructor);
2356
2357  /* External functions does not have a prototype by default, so we need to create one */
2358  jerry_value_t prototype_str = jerry_create_string ((const jerry_char_t *) ("prototype"));
2359  jerry_release_value (jerry_set_property (constructor, prototype_str, base_obj));
2360  jerry_release_value (prototype_str);
2361
2362  /* Construct the instance. */
2363  jerry_value_t instance_val = jerry_construct_object (constructor, NULL, 0);
2364
2365  /* Call the API function of 'instanceof'. */
2366  jerry_value_t is_instance = jerry_binary_operation (JERRY_BIN_OP_INSTANCEOF,
2367                                                      instance_val,
2368                                                      constructor);
2369  if (!jerry_value_is_error (is_instance)
2370      && jerry_get_boolean_value (is_instance) == true)
2371  {
2372    /* ... */
2373  }
2374
2375  /* Free all of the jerry values and cleanup the engine. */
2376  jerry_release_value (base_obj);
2377  jerry_release_value (constructor);
2378  jerry_release_value (instance_val);
2379  jerry_release_value (is_instance);
2380
2381  jerry_cleanup ();
2382  return 0;
2383}
2384```
2385
2386**See also**
2387
2388- [jerry_binary_operation_t](#jerry_binary_operation_t)
2389
2390
2391# Error manipulation functions
2392
2393*Changed in version 2.0*: The error handling and manipulation was modified and the old methods were replaced.
2394
2395## jerry_create_abort_from_value
2396
2397**Summary**
2398
2399Create (api) abort from a value.
2400
2401This function creates an API abort value from an API value. The second argument defines
2402whether the input value must be released or not. If it is set to `true`,
2403then a [`jerry_release_value`](#jerry_release_value) function will be called
2404for the first argument, so the api value won't be available after the call of
2405`jerry_create_abort_from_value`. The second argument should be false if both value
2406and created abort value are needed.
2407
2408**Prototype**
2409
2410```c
2411jerry_value_t
2412jerry_create_abort_from_value (jerry_value_t value, bool release);
2413```
2414
2415- `value` - api value
2416- `release` - raw boolean, defines whether input value must be released
2417- return value - abort (api) value
2418
2419*New in version 2.0*.
2420
2421**Example 1**
2422
2423```c
2424{
2425  jerry_value_t value;
2426  ... // create or acquire value
2427
2428  jerry_value_t abort = jerry_create_abort_from_value (value, true);
2429  // using the 'value' variable after release is invalid.
2430
2431  jerry_release_value (abort);
2432}
2433```
2434
2435**Example 2**
2436
2437```c
2438{
2439  jerry_value_t value;
2440  ... // create or acquire value
2441
2442  jerry_value_t abort = jerry_create_abort_from_value (value, false);
2443  // both 'abort' and 'value' can be used and must be released when they are no longer needed
2444
2445  jerry_release_value (abort);
2446  jerry_release_value (value);
2447}
2448```
2449
2450**See also**
2451
2452- [jerry_value_t](#jerry_value_t)
2453- [jerry_get_value_from_error](#jerry_get_value_from_error)
2454- [jerry_create_error_from_value](#jerry_create_error_from_value)
2455
2456## jerry_create_error_from_value
2457
2458**Summary**
2459
2460Create (api) error from a value.
2461
2462This function creates an API error value from an API value. The second argument defines
2463whether the input value must be released or not. If it is set to `true`,
2464then a [`jerry_release_value`](#jerry_release_value) function will be called
2465for the first argument, so the api value won't be available after the call of
2466`jerry_create_error_from_value`. The second argument should be false if both value
2467and created error value are needed.
2468
2469**Prototype**
2470
2471```c
2472jerry_value_t
2473jerry_create_error_from_value (jerry_value_t value, bool release);
2474```
2475
2476- `value` - api value
2477- `release` - raw boolean, defines whether input value must be released
2478- return value - error (api) value
2479
2480*New in version 2.0*.
2481
2482**Example 1**
2483
2484```c
2485{
2486  jerry_value_t value;
2487  ... // create or acquire value
2488
2489  jerry_value_t error = jerry_create_error_from_value (value, true);
2490  // using the 'value' variable after release is invalid.
2491
2492
2493  jerry_release_value (error);
2494}
2495```
2496
2497**Example 2**
2498
2499```c
2500{
2501  jerry_value_t value;
2502  ... // create or acquire value
2503
2504  jerry_value_t error = jerry_create_error_from_value (value, false);
2505  // both 'error' and 'value' can be used and must be released when they are no longer needed
2506
2507  jerry_release_value (error);
2508  jerry_release_value (value);
2509}
2510```
2511
2512**See also**
2513
2514- [jerry_value_t](#jerry_value_t)
2515- [jerry_get_value_from_error](#jerry_get_value_from_error)
2516- [jerry_create_abort_from_value](#jerry_create_abort_from_value)
2517
2518## jerry_get_error_type
2519
2520**Summary**
2521
2522Returns the type of the Error object if possible.
2523
2524If a non-error object is used as the input for the function the method
2525will return `JERRY_ERROR_NONE` indicating that the value was not
2526an Error object. However it is still possible that the value contains
2527error semantics. To correctly detect if a value have error use the
2528[jerry_value_is_error](#jerry_value_is_error) method.
2529
2530**Prototype**
2531
2532```c
2533jerry_error_t
2534jerry_get_error_type (const jerry_value_t value);
2535```
2536
2537- `value` - api value (possible error object)
2538- return value
2539  - JERRY_ERROR_NONE if the input is not an error object
2540  - one of the [jerry_error_t](#jerry_error_t) value
2541
2542*New in version 2.0*.
2543
2544**Example**
2545
2546```c
2547{
2548  jerry_value_t error_obj = jerry_create_error (JERRY_ERROR_RANGE,
2549                                                (const jerry_char_t *) "error msg");
2550  jerry_error_t error_type = jerry_get_error_type (error_obj);
2551
2552  // error_type is now JERRY_ERROR_RANGE.
2553
2554  jerry_release_value (error_obj);
2555}
2556```
2557
2558**See also**
2559
2560- [jerry_create_error](#jerry_create_error)
2561- [jerry_value_is_error](#jerry_value_is_error)
2562
2563## jerry_get_value_from_error
2564
2565**Summary**
2566
2567Get the value from an error.
2568
2569Many API functions cannot be called with an error value.
2570This function extracts the API value from an error. The second argument defines
2571whether the input error value must be released or not. If it is set to `true`,
2572then a [`jerry_release_value`](#jerry_release_value) function will be called
2573for the first argument, so the error value won't be available after the call of
2574`jerry_get_value_from_error`. The second argument should be false if both error
2575and its represented value are needed.
2576
2577*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
2578is no longer needed.
2579
2580**Prototype**
2581
2582```c
2583jerry_value_t
2584jerry_get_value_from_error (jerry_value_t value, bool release)
2585```
2586
2587- `value` - error (api) value
2588- `release` - raw boolean, defines whether input value must be released
2589- return value - api value
2590
2591*New in version 2.0*.
2592
2593**Example 1**
2594
2595```c
2596{
2597  jerry_value_t value;
2598  ... // create or acquire value
2599
2600  jerry_value_t error = jerry_create_error_from_value (value, true);
2601  jerry_value_t value_from_error = jerry_get_value_from_error (error, true);
2602  // using the 'error' variable after release is invalid.
2603
2604  jerry_release_value (value_from_error);
2605}
2606```
2607
2608**Example 2**
2609
2610```c
2611{
2612  jerry_value_t value;
2613  ... // create or acquire value
2614
2615  jerry_value_t error = jerry_create_error_from_value (value, true);
2616  jerry_value_t value_from_error = jerry_get_value_from_error (error, false);
2617  // both 'error' and 'value_from_error' can be used and must be released when they are no longer needed
2618
2619  jerry_release_value (value_from_error);
2620  jerry_release_value (error);
2621}
2622```
2623
2624**See also**
2625
2626- [jerry_value_t](#jerry_value_t)
2627- [jerry_create_error_from_value](#jerry_create_error_from_value)
2628- [jerry_create_abort_from_value](#jerry_create_abort_from_value)
2629
2630# Getter functions of 'jerry_value_t'
2631
2632Get raw data from API values.
2633
2634## jerry_get_boolean_value
2635
2636**Summary**
2637
2638Gets the raw bool value from a `jerry_value_t`.
2639
2640**Prototype**
2641
2642```c
2643bool
2644jerry_get_boolean_value (const jerry_value_t value);
2645```
2646
2647- `value` - api value
2648- return value - boolean value represented by the argument.
2649
2650**Example**
2651
2652```c
2653{
2654  jerry_value_t value;
2655  ... // create or acquire value
2656
2657  if (jerry_value_is_boolean (value))
2658  {
2659    bool raw_value = jerry_get_boolean_value (value);
2660
2661    ... // usage of raw value
2662
2663  }
2664
2665  jerry_release_value (value);
2666}
2667
2668```
2669
2670**See also**
2671
2672- [jerry_value_is_boolean](#jerry_value_is_boolean)
2673- [jerry_release_value](#jerry_release_value)
2674
2675
2676## jerry_get_number_value
2677
2678**Summary**
2679
2680Gets the number value of the given `jerry_value_t` parameter as a raw double.
2681
2682If the argument passed is not a number `0.0` will be returned.
2683
2684**Prototype**
2685
2686```c
2687double
2688jerry_get_number_value (const jerry_value_t value);
2689```
2690
2691- `value` - api value
2692- return value
2693  - the number value of the given `jerry_value_t` parameter as a raw double.
2694  - `0.0` if the api value passed is not a number.
2695
2696**Example**
2697
2698```c
2699{
2700  jerry_value_t value;
2701  ... // create or acquire value
2702
2703  if (jerry_value_is_number (value))
2704  {
2705    double raw_value = jerry_get_number_value (value);
2706
2707    ... // usage of raw value
2708
2709  }
2710
2711  jerry_release_value (value);
2712}
2713```
2714
2715**See also**
2716
2717- [jerry_value_is_number](#jerry_value_is_number)
2718- [jerry_release_value](#jerry_release_value)
2719
2720
2721# Functions for string values
2722
2723## jerry_get_string_size
2724
2725**Summary**
2726
2727Get the size of a string. Returns zero, if the value parameter is not a string.
2728This is effectively the number of bytes required to store the string's characters.
2729
2730**Prototype**
2731
2732```c
2733jerry_size_t
2734jerry_get_string_size (const jerry_value_t value);
2735```
2736- `value` - api value
2737- return value - number of bytes in the buffer needed to represent the string.
2738
2739**Example**
2740
2741```c
2742{
2743  const jerry_char_t char_array[] = "a string";
2744  jerry_value_t string = jerry_create_string (char_array);
2745
2746  jerry_size_t string_size = jerry_get_string_size (string);
2747
2748  ... // usage of string_size
2749
2750  jerry_release_value (string);
2751}
2752```
2753
2754**See also**
2755
2756- [jerry_create_string](#jerry_create_string)
2757- [jerry_get_string_length](#jerry_get_string_length)
2758- [jerry_is_valid_cesu8_string](#jerry_is_valid_cesu8_string)
2759
2760
2761## jerry_get_utf8_string_size
2762
2763**Summary**
2764
2765Get the size of an utf8-encoded string. Returns zero, if the value parameter is not a string.
2766This is effectively the number of bytes required to store the utf8 encoded string's characters.
2767
2768*Note*: The difference from [jerry_get_string_size](#jerry_get_string_size) is that it returns with utf-8 string size
2769instead of the cesu-8 string size.
2770
2771**Prototype**
2772
2773```c
2774jerry_size_t
2775jerry_get_utf8_string_size (const jerry_value_t value);
2776```
2777- `value` - api value
2778- return value - number of bytes in the buffer needed to represent the utf8-encoded string.
2779
2780*New in version 2.0*.
2781
2782**Example**
2783
2784```c
2785{
2786  const jerry_char_t char_array[] = "a string";
2787  jerry_value_t string = jerry_create_string (char_array);
2788
2789  jerry_size_t string_size = jerry_get_utf8_string_size (string);
2790
2791  ... // usage of string_size
2792
2793  jerry_release_value (string);
2794}
2795```
2796
2797**See also**
2798
2799- [jerry_create_string_from_utf8](#jerry_create_string_from_utf8)
2800- [jerry_get_utf8_string_length](#jerry_get_utf8_string_length)
2801- [jerry_is_valid_utf8_string](#jerry_is_valid_utf8_string)
2802
2803
2804## jerry_get_string_length
2805
2806**Summary**
2807
2808Get the length of a string. Returns zero, if the value parameter is not a string.
2809
2810*Notes:*
2811- The difference from [jerry_get_string_size](#jerry_get_string_size) is that it
2812  returns the number of bytes used for the string.
2813- This is **not** the number of bytes required to store the string.
2814
2815**Prototype**
2816
2817```c
2818jerry_length_t
2819jerry_get_string_length (const jerry_value_t value);
2820```
2821
2822- `value` - api value
2823- return value - number of characters in the string
2824
2825**Example**
2826
2827```c
2828{
2829  const jerry_char_t char_array[] = "a string";
2830  jerry_value_t string = jerry_create_string (char_array);
2831
2832  jerry_length_t string_length = jerry_get_string_length (string);
2833
2834  ... // usage of string_length
2835
2836  jerry_release_value (string);
2837}
2838```
2839
2840**See also**
2841
2842- [jerry_create_string](#jerry_create_string)
2843- [jerry_get_string_size](#jerry_get_string_size)
2844- [jerry_is_valid_cesu8_string](#jerry_is_valid_cesu8_string)
2845
2846
2847## jerry_get_utf8_string_length
2848
2849**Summary**
2850
2851Get the length of an UTF-8 encoded string. Returns zero, if the value parameter is not a string.
2852
2853*Notes*:
2854- The difference from [jerry_get_string_length](#jerry_get_string_length) is that it
2855  returns with utf-8 string length instead of the cesu-8 string length.
2856- This is **not** the number of bytes required to store the string.
2857
2858**Prototype**
2859
2860```c
2861jerry_length_t
2862jerry_get_utf8_string_length (const jerry_value_t value);
2863```
2864
2865- `value` - input string value
2866- return value - number of characters in the string
2867
2868*New in version 2.0*.
2869
2870**Example**
2871
2872```c
2873{
2874  const jerry_char_t char_array[] = "a string";
2875  jerry_value_t string = jerry_create_string_from_utf8 (char_array);
2876
2877  jerry_length_t string_length = jerry_get_utf8_string_length (string);
2878
2879  ... // usage of string_length
2880
2881  jerry_release_value (string);
2882}
2883```
2884
2885**See also**
2886
2887- [jerry_create_string_from_utf8](#jerry_create_string_from_utf8)
2888- [jerry_get_utf8_string_size](#jerry_get_utf8_string_size)
2889- [jerry_is_valid_utf8_string](#jerry_is_valid_utf8_string)
2890
2891
2892## jerry_string_to_char_buffer
2893
2894**Summary**
2895
2896Copy the characters of a string into a specified cesu-8 buffer.
2897The '\0' character could occur in the character buffer. Returns 0,
2898if the value parameter is not a string or the buffer is not large
2899enough for the whole string.
2900
2901*Note*: Does not put '\0' to the end of string, the return value identifies
2902the number of valid bytes in the output buffer.
2903
2904*Note*: If the size of the string in jerry value is larger than the size of the
2905target buffer, the copy will fail. To copy a substring the
2906[jerry_substring_to_char_buffer](#jerry_substring_to_char_buffer) API function
2907is recommended instead.
2908
2909
2910**Prototype**
2911
2912```c
2913jerry_size_t
2914jerry_string_to_char_buffer (const jerry_value_t value,
2915                             jerry_char_t *buffer_p,
2916                             jerry_size_t buffer_size);
2917```
2918
2919- `value` - input string value
2920- `buffer_p` - pointer to output buffer
2921- `buffer_size` - size of the buffer
2922- return value - number of bytes, actually copied to the buffer
2923
2924**Example**
2925
2926[doctest]: # ()
2927
2928```c
2929#include <stdio.h>
2930#include <stdlib.h>
2931#include "jerryscript.h"
2932
2933int
2934main (void)
2935{
2936  jerry_init (JERRY_INIT_EMPTY);
2937
2938  jerry_value_t value;
2939  // create or acquire value
2940  value = jerry_create_string ((const jerry_char_t *) "Demo string");
2941
2942  // Read the string into a byte buffer.
2943  jerry_size_t string_size = jerry_get_string_size (value);
2944  jerry_char_t *string_buffer_p = (jerry_char_t *) malloc (sizeof (jerry_char_t) * (string_size + 1));
2945
2946  jerry_size_t copied_bytes = jerry_string_to_char_buffer (value, string_buffer_p, string_size);
2947  string_buffer_p[copied_bytes] = '\0';
2948
2949  jerry_release_value (value);
2950
2951  jerry_cleanup ();
2952
2953  printf ("Test string: %s\n", string_buffer_p);
2954  free (string_buffer_p);
2955
2956  return 0;
2957}
2958```
2959
2960**See also**
2961
2962- [jerry_create_string](#jerry_create_string)
2963- [jerry_get_string_size](#jerry_get_string_size)
2964- [jerry_is_valid_cesu8_string](#jerry_is_valid_cesu8_string)
2965- [jerry_substring_to_char_buffer](#jerry_substring_to_char_buffer)
2966
2967
2968## jerry_string_to_utf8_char_buffer
2969
2970**Summary**
2971
2972Copy the characters of a string into a specified utf-8 buffer.
2973The '\0' character could occur in character buffer. Returns 0,
2974if the value parameter is not a string or the buffer is not
2975large enough for the whole string.
2976
2977*Note*: Does not put '\0' to the end of string, the return value identifies
2978the number of valid bytes in the output buffer.
2979
2980*Note*: If the size of the string in jerry value is larger than the size of the
2981target buffer, the copy will fail. To copy a substring the
2982[jerry_substring_to_utf8_char_buffer](#jerry_substring_to_utf8_char_buffer)
2983API function is recommended instead.
2984
2985**Prototype**
2986
2987```c
2988jerry_size_t
2989jerry_string_to_utf8_char_buffer (const jerry_value_t value,
2990                                  jerry_char_t *buffer_p,
2991                                  jerry_size_t buffer_size);
2992```
2993
2994- `value` - input string value
2995- `buffer_p` - pointer to output buffer
2996- `buffer_size` - size of the buffer
2997- return value - number of bytes, actually copied to the buffer
2998
2999*New in version 2.0*.
3000
3001**Example**
3002
3003```c
3004{
3005  jerry_value_t value;
3006  ... // create or acquire value
3007
3008  jerry_size_t req_sz = jerry_get_utf8_string_size (value);
3009  jerry_char_t str_buf_p[req_sz];
3010
3011  jerry_size_t bytes_copied = jerry_string_to_utf8_char_buffer (value, str_buf_p, req_sz);
3012
3013  jerry_release_value (value);
3014}
3015```
3016
3017**See also**
3018
3019- [jerry_create_string_from_utf8](#jerry_create_string_from_utf8)
3020- [jerry_get_utf8_string_size](#jerry_get_utf8_string_size)
3021- [jerry_is_valid_utf8_string](#jerry_is_valid_utf8_string)
3022- [jerry_substring_to_utf8_char_buffer](#jerry_substring_to_utf8_char_buffer)
3023
3024
3025## jerry_substring_to_char_buffer
3026
3027**Summary**
3028
3029Copy the characters of a cesu-8 encoded substring into a specified buffer.
3030The '\0' character could occur in character buffer. Returns 0, if the value
3031parameter is not a string. It will extract the substring between the
3032specified start position and the end position (or the end of the string,
3033whichever comes first).
3034
3035*Note*: Does not put '\0' to the end of string, the return value identifies
3036the number of valid bytes in the output buffer.
3037
3038**Prototype**
3039
3040```c
3041jerry_size_t
3042jerry_substring_to_char_buffer (const jerry_value_t value,
3043                                jerry_length_t start_pos,
3044                                jerry_length_t end_pos,
3045                                jerry_char_t *buffer_p,
3046                                jerry_size_t buffer_size);
3047```
3048
3049- `value` - input string value
3050- `start_pos` - position of the first character
3051- `end_pos` - position of the last character
3052- `buffer_p` - pointer to output buffer
3053- `buffer_size` - size of the buffer
3054- return value - number of bytes, actually copied to the buffer
3055
3056*New in version 2.0*.
3057
3058**Example**
3059
3060```c
3061{
3062  jerry_value_t value;
3063  ... // create or acquire value
3064
3065  jerry_size_t req_sz = jerry_get_string_size (value);
3066  jerry_char_t str_buf_p[req_sz];
3067  jerry_length_t start_pos = 0;
3068  jerry_length_t end_pos = jerry_get_string_length (value);
3069
3070  jerry_substring_to_char_buffer (value, start_pos, end_pos, str_buf_p, req_sz);
3071
3072  jerry_release_value (value);
3073}
3074```
3075
3076**See also**
3077
3078- [jerry_create_string](#jerry_create_string)
3079- [jerry_get_string_size](#jerry_get_string_size)
3080- [jerry_get_string_length](#jerry_get_string_length)
3081- [jerry_is_valid_cesu8_string](#jerry_is_valid_cesu8_string)
3082
3083
3084## jerry_substring_to_utf8_char_buffer
3085
3086**Summary**
3087
3088Copy the characters of an utf-8 encoded substring into a specified buffer.
3089The '\0' character could occur in character buffer. Returns 0, if the value
3090parameter is not a string. It will extract the substring between the specified
3091start position and the end position (or the end of the string, whichever
3092comes first).
3093
3094*Note*: Does not put '\0' to the end of string, the return value identifies
3095the number of valid bytes in the output buffer.
3096
3097**Prototype**
3098
3099```c
3100jerry_size_t
3101jerry_substring_to_utf8_char_buffer (const jerry_value_t value,
3102                                     jerry_length_t start_pos,
3103                                     jerry_length_t end_pos,
3104                                     jerry_char_t *buffer_p,
3105                                     jerry_size_t buffer_size);
3106```
3107
3108- `value` - input string value
3109- `start_pos` - position of the first character
3110- `end_pos` - position of the last character
3111- `buffer_p` - pointer to output buffer
3112- `buffer_size` - size of the buffer
3113- return value - number of bytes, actually copied to the buffer
3114
3115*New in version 2.0*.
3116
3117**Example**
3118
3119```c
3120{
3121  jerry_value_t value;
3122  ... // create or acquire value
3123
3124  jerry_size_t req_sz = jerry_get_utf8_string_size (value);
3125  jerry_char_t str_buf_p[req_sz];
3126  jerry_length_t start_pos = 0;
3127  jerry_length_t end_pos = jerry_get_utf8_string_length (value);
3128
3129  jerry_substring_to_utf8_char_buffer (value, start_pos, end_pos, str_buf_p, req_sz);
3130
3131  jerry_release_value (value);
3132}
3133```
3134
3135**See also**
3136
3137- [jerry_create_string_from_utf8](#jerry_create_string_from_utf8)
3138- [jerry_get_utf8_string_size](#jerry_get_utf8_string_size)
3139- [jerry_get_utf8_string_length](#jerry_get_utf8_string_length)
3140- [jerry_is_valid_utf8_string](#jerry_is_valid_utf8_string)
3141
3142
3143# Functions for array object values
3144
3145## jerry_get_array_length
3146
3147**Summary**
3148
3149Get length of an array object. Returns zero, if the given parameter is not an array object.
3150
3151**Prototype**
3152
3153```c
3154uint32_t
3155jerry_get_array_length (const jerry_value_t value);
3156```
3157
3158- `value` - input array value
3159- return value - length of the given array
3160
3161**Example**
3162
3163```c
3164{
3165  jerry_value_t value;
3166  ... // create or acquire value
3167
3168  uint32_t len = jerry_get_array_length (value);
3169
3170  jerry_release_value (value);
3171}
3172```
3173
3174**See also**
3175
3176- [jerry_create_array](#jerry_create_array)
3177
3178
3179# Converters of 'jerry_value_t'
3180
3181Functions for converting API values to another value type.
3182
3183## jerry_value_to_boolean
3184
3185**Summary**
3186
3187Call ToBoolean operation on the api value.
3188
3189**Prototype**
3190
3191```c
3192bool
3193jerry_value_to_boolean (const jerry_value_t value);
3194```
3195
3196- `value` - api value
3197- return value
3198  - true, if the logical value is true
3199  - false, otherwise
3200
3201**Example**
3202
3203```c
3204{
3205  jerry_value_t value;
3206  ... // create or acquire value
3207
3208  bool b = jerry_value_to_boolean (value);
3209
3210  jerry_release_value (value);
3211}
3212
3213```
3214
3215**See also**
3216
3217- [jerry_value_to_primitive](#jerry_value_to_primitive)
3218
3219## jerry_value_to_number
3220
3221**Summary**
3222
3223Call ToNumber operation on the api value.
3224
3225*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3226is no longer needed.
3227
3228**Prototype**
3229
3230```c
3231jerry_value_t
3232jerry_value_to_number (const jerry_value_t value);
3233```
3234
3235- `value` - api value
3236- return value
3237  - converted number value, if success
3238  - thrown error, otherwise
3239
3240**Example**
3241
3242```c
3243{
3244  jerry_value_t value;
3245  ... // create or acquire value
3246
3247  jerry_value_t number_value = jerry_value_to_number (value);
3248
3249  jerry_release_value (number_value);
3250  jerry_release_value (value);
3251}
3252
3253```
3254
3255**See also**
3256
3257- [jerry_value_to_primitive](#jerry_value_to_primitive)
3258
3259## jerry_value_to_object
3260
3261**Summary**
3262
3263Call ToObject operation on the api value.
3264
3265*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3266is no longer needed.
3267
3268**Prototype**
3269
3270```c
3271jerry_value_t
3272jerry_value_to_object (const jerry_value_t value);
3273```
3274
3275- `value` - api value
3276- return value
3277  - converted object value, if success
3278  - thrown error, otherwise
3279
3280**Example**
3281
3282```c
3283{
3284  jerry_value_t value;
3285  ... // create or acquire value
3286
3287  jerry_value_t object_value = jerry_value_to_object (value);
3288
3289  jerry_release_value (object_value);
3290  jerry_release_value (value);
3291}
3292```
3293
3294**See also**
3295
3296- [jerry_value_to_primitive](#jerry_value_to_primitive)
3297
3298## jerry_value_to_primitive
3299
3300**Summary**
3301
3302Call ToPrimitive operation on the api value.
3303
3304*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3305is no longer needed.
3306
3307**Prototype**
3308
3309```c
3310jerry_value_t
3311jerry_value_to_primitive (const jerry_value_t value);
3312```
3313
3314- `value` - api value
3315- return value
3316  - converted primitive value, if success
3317  - thrown error, otherwise
3318
3319**Example**
3320
3321```c
3322{
3323  jerry_value_t value;
3324  ... // create or acquire value
3325
3326  jerry_value_t prim_value = jerry_value_to_primitive (value);
3327
3328  jerry_release_value (prim_value);
3329  jerry_release_value (value);
3330}
3331```
3332
3333**See also**
3334
3335- [jerry_value_t](#jerry_value_t)
3336
3337## jerry_value_to_string
3338
3339**Summary**
3340
3341Call the ToString ecma builtin operation on the api value.
3342
3343*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3344is no longer needed.
3345
3346**Prototype**
3347
3348```c
3349jerry_value_t
3350jerry_value_to_string (const jerry_value_t value);
3351```
3352
3353- `value` - api value
3354- return value
3355  - converted string value, if success
3356  - thrown error, otherwise
3357
3358**Example**
3359
3360```c
3361{
3362  jerry_value_t value;
3363  ... // create or acquire value
3364
3365  jerry_value_t string_value = jerry_value_to_string (value);
3366
3367  jerry_release_value (string_value);
3368  jerry_release_value (value);
3369}
3370```
3371
3372**See also**
3373
3374- [jerry_value_to_primitive](#jerry_value_to_primitive)
3375
3376
3377# Functions for promise objects
3378
3379These APIs all depend on the ES2015-subset profile (or on some build options).
3380
3381## jerry_get_promise_result
3382
3383**Summary**
3384
3385The function returns the result of a Promise object.
3386
3387*Notes*:
3388- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3389  is no longer needed.
3390- This API depends on a build option (`JERRY_ES2015_BUILTIN_PROMISE`) and can be checked
3391  in runtime with the `JERRY_FEATURE_PROMISE` feature enum value,
3392  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
3393- The ES2015-subset profile enables this by default.
3394
3395
3396**Prototype**
3397
3398```c
3399jerry_value_t
3400jerry_get_promise_result (const jerry_value_t promise);
3401```
3402
3403- `promise` - the input Promise object.
3404- return
3405  - The result of the Promise.
3406  - If the Promise is not resolved yet the result is the 'undefined' value.
3407  - A TypeError is returned if the input argument was not a Promise object or
3408    the Promise support was not built into the library.
3409
3410*New in version 2.2*.
3411
3412**Example**
3413
3414[doctest]: # (test="compile")
3415
3416```c
3417#include <jerryscript.h>
3418
3419static void
3420example (void)
3421{
3422  // acquire/create a promise object.
3423  jerry_value_t promise = jerry_create_promise ();
3424  {
3425    // prepare the argumnent for the resolve or reject.
3426    jerry_value_t argument = jerry_create_number (33);
3427
3428    jerry_value_t is_ok = jerry_resolve_or_reject_promise (promise,
3429                                                           argument,
3430                                                           true);
3431    // 'is_ok' should be checked if it is an error or not.
3432    // skipped in this example
3433    jerry_release_value (is_ok);
3434    jerry_release_value (argument);
3435  }
3436
3437  jerry_value_t promise_result = jerry_get_promise_result (promise);
3438  // 'promise_result' is now the number 33.
3439
3440  jerry_release_value (promise_result);
3441  jerry_release_value (promise);
3442}
3443```
3444
3445**See also**
3446
3447- [jerry_create_promise](#jerry_create_promise)
3448- [jerry_promise_state_t](#jerry_promise_state_t)
3449
3450## jerry_get_promise_state
3451
3452**Summary**
3453
3454*Notes*:
3455- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3456  is no longer needed.
3457- This API depends on a build option (`JERRY_ES2015_BUILTIN_PROMISE`) and can be checked
3458  in runtime with the `JERRY_FEATURE_PROMISE` feature enum value,
3459  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
3460- The ES2015-subset profile enables this by default.
3461
3462
3463**Prototype**
3464
3465```c
3466jerry_promise_state_t
3467jerry_get_promise_state (const jerry_value_t promise);
3468```
3469
3470- `promise` - the input promise object.
3471- return
3472  - [jerry_promise_state_t](#jerry_promise_state_t)
3473  - `JERRY_PROMISE_STATE_NONE` is returned if the input argument was not a promise object or
3474    the Promise support was not built into the library.
3475
3476*New in version 2.2*.
3477
3478**Example**
3479
3480[doctest]: # (test="compile")
3481
3482```c
3483#include <jerryscript.h>
3484
3485static void
3486example (void)
3487{
3488  // acquire/create a promise object.
3489  jerry_value_t promise = jerry_create_promise ();
3490
3491  jerry_promise_state_t start_state = jerry_get_promise_state (promise);
3492  // a Promise have a default state of JERRY_PROMISE_STATE_PENDING
3493
3494  {
3495    // prepare the argumnent for the resolve or reject.
3496    jerry_value_t argument = jerry_create_number (33);
3497
3498    jerry_value_t is_ok = jerry_resolve_or_reject_promise (promise,
3499                                                           argument,
3500                                                           true);
3501    // 'is_ok' should be checked if it is an error or not.
3502    // skipped in this example
3503    jerry_release_value (is_ok);
3504    jerry_release_value (argument);
3505  }
3506
3507  jerry_promise_state_t current_state = jerry_get_promise_state (promise);
3508  // at this point the Promise should be in the JERRY_PROMISE_STATE_FULFILLED state.
3509
3510  jerry_release_value (promise);
3511}
3512```
3513
3514**See also**
3515
3516- [jerry_create_promise](#jerry_create_promise)
3517- [jerry_promise_state_t](#jerry_promise_state_t)
3518
3519## jerry_resolve_or_reject_promise
3520
3521**Summary**
3522
3523Resolve or reject the promise with an argument.
3524
3525*Note*:
3526- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3527  is no longer needed.
3528- This API depends on a build option (`JERRY_ES2015_BUILTIN_PROMISE`) and can be checked
3529  in runtime with the `JERRY_FEATURE_PROMISE` feature enum value,
3530  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
3531- The ES2015-subset profile enables this by default.
3532
3533
3534**Prototype**
3535
3536```c
3537jerry_value_t
3538jerry_resolve_or_reject_promise (jerry_value_t promise,
3539                                 jerry_value_t argument,
3540                                 bool is_resolve)
3541```
3542
3543- `promise` - the promise value
3544- `argument` - the argument for resolve or reject
3545- `is_resolve` - whether the promise should be resolved or rejected
3546- return value
3547  - undefined jerry value - resolve or reject successed
3548  - jerry value with error flag - otherwise
3549
3550*New in version 2.0*.
3551
3552**Example**
3553
3554```c
3555{
3556  jerry_value_t promise = ... // acquire/create a promise object.
3557
3558  ...
3559
3560  bool is_resolve = ... // whether the promise should be resolved or rejected
3561  jerry_value_t argument = ... // prepare the argumnent for the resolve or reject.
3562
3563  jerry_value_t is_ok = jerry_resolve_or_reject_promise (promise,
3564                                                         argument,
3565                                                         is_resolve);
3566
3567  if (jerry_value_is_error (is_ok))
3568  {
3569    // handle the error.
3570  }
3571
3572  jerry_release_value (is_ok);
3573  jerry_release_value (argument);
3574  jerry_release_value (promise);
3575}
3576```
3577
3578**See also**
3579
3580- [jerry_release_value](#jerry_release_value)
3581- [jerry_value_is_error](#jerry_value_is_error)
3582
3583# Functions for symbols
3584
3585These APIs all depend on the ES2015-subset profile (or on build options).
3586
3587## jerry_get_symbol_descriptive_string
3588
3589**Summary**
3590
3591Call the SymbolDescriptiveString ecma builtin operation on the API value.
3592Based on ECMA 262 v6 19.4.3.2.1 this is in the form of `Symbol(<description>)`.
3593
3594*Notes*:
3595- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3596  is no longer needed.
3597- This API depends on a build option (`JERRY_ES2015_BUILTIN_SYMBOL`) and can be checked
3598  in runtime with the `JERRY_FEATURE_SYMBOL` feature enum value,
3599  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
3600- The ES2015-subset profile enables this by default.
3601- If the symbol support is not enabled an error will be returned.
3602
3603**Prototype**
3604
3605```c
3606jerry_value_t
3607jerry_get_symbol_descriptive_string (const jerry_value_t value);
3608```
3609
3610- `value` - symbol value
3611- return value
3612  - string value containing the symbol's descriptive string - if success
3613  - thrown error, otherwise
3614
3615*New in version 2.0*.
3616
3617**Example**
3618
3619[doctest]: # ()
3620
3621```c
3622#include "jerryscript.h"
3623
3624int
3625main (void)
3626{
3627  jerry_init (JERRY_INIT_EMPTY);
3628
3629  jerry_value_t string_value = jerry_create_string ((const jerry_char_t *) "foo");
3630  jerry_value_t symbol_value = jerry_create_symbol (string_value);
3631
3632  jerry_release_value (string_value);
3633
3634  jerry_value_t symbol_desc_string = jerry_get_symbol_descriptive_string (symbol_value);
3635
3636  // usage of symbol_desc_string
3637
3638  jerry_release_value (symbol_desc_string);
3639  jerry_release_value (symbol_value);
3640
3641  jerry_cleanup ();
3642  return 0;
3643}
3644```
3645
3646
3647# Acquire and release API values
3648
3649## jerry_acquire_value
3650
3651**Summary**
3652
3653Acquires the specified Jerry API value.
3654
3655*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3656is no longer needed.
3657
3658**Prototype**
3659
3660```c
3661jerry_value_t
3662jerry_acquire_value (jerry_value_t value);
3663```
3664
3665- `value` - api value
3666- return value - acquired value that may be used outside of the engine
3667
3668**Example**
3669
3670```c
3671{
3672  jerry_value_t object_value = jerry_create_object ();
3673
3674  jerry_value_t acquired_object = jerry_acquire_value (object_value);
3675
3676  jerry_release_value (object_value);
3677
3678  // acquired_object refers to the created object and makes it
3679  // available after the release of 'object_value'
3680
3681  jerry_release_value (acquired_object);
3682}
3683```
3684
3685**See also**
3686
3687- [jerry_release_value](#jerry_release_value)
3688- [jerry_value_t](#jerry_value_t)
3689
3690
3691## jerry_release_value
3692
3693**Summary**
3694
3695Release specified Jerry API value.
3696
3697**Prototype**
3698
3699```c
3700void
3701jerry_release_value (jerry_value_t value);
3702```
3703
3704- `value` - api value
3705
3706**Example**
3707
3708```c
3709{
3710  jerry_value_t object_value = jerry_create_object ();
3711
3712  ...
3713
3714  jerry_release_value (object_value);
3715}
3716```
3717
3718
3719# Create API values
3720
3721Function for creating [API values](#jerry_value_t).
3722
3723*Note*: Every created API value must be freed with [jerry_release_value](#jerry_release_value) when it
3724is no longer needed.
3725
3726## jerry_create_array
3727
3728**Summary**
3729
3730Create an array object value.
3731
3732*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3733is no longer needed.
3734
3735**Prototype**
3736
3737```c
3738jerry_value_t
3739jerry_create_array (uint32_t size);
3740```
3741
3742 - `size` - size of array;
3743 - return value - value of the constructed array object
3744
3745 **Example**
3746
3747```c
3748{
3749    jerry_value_t array = jerry_create_array (10);
3750
3751    ...
3752
3753    jerry_release_value (array);
3754}
3755```
3756
3757**See also**
3758
3759- [jerry_set_property_by_index](#jerry_set_property_by_index)
3760- [jerry_get_property_by_index](#jerry_get_property_by_index)
3761
3762
3763## jerry_create_arraybuffer
3764
3765**Summary**
3766
3767Create a jerry_value_t representing an ArrayBuffer object.
3768
3769*Note*:
3770  - This API depends on the ES2015-subset profile.
3771  - Returned value must be freed with [jerry_release_value](#jerry_release_value)
3772    when it is no longer needed.
3773
3774**Prototype**
3775
3776```c
3777jerry_value_t
3778jerry_create_arraybuffer (jerry_length_t size);
3779```
3780
3781 - `size` - size of the ArrayBuffer to create **in bytes**
3782 - return value - the new ArrayBuffer as a `jerry_value_t`
3783
3784*New in version 2.0*.
3785
3786**Example**
3787
3788```c
3789{
3790  jerry_value_t buffer_value = jerry_create_arraybuffer (15);
3791
3792  ... // use the ArrayBuffer
3793
3794  jerry_release_value (buffer_value);
3795}
3796```
3797
3798**See also**
3799
3800- [jerry_arraybuffer_read](#jerry_arraybuffer_read)
3801- [jerry_arraybuffer_write](#jerry_arraybuffer_write)
3802- [jerry_value_is_arraybuffer](#jerry_value_is_arraybuffer)
3803- [jerry_release_value](#jerry_release_value)
3804
3805
3806## jerry_create_arraybuffer_external
3807
3808**Summary**
3809
3810Creates a jerry_value_t representing an ArrayBuffer object with
3811user specified back-buffer.
3812
3813User must pass a buffer pointer which is at least `size` big.
3814After the object is not needed the GC will call the `free_cb`
3815so the user can release the buffer which was provided.
3816
3817*Note*:
3818  - This API depends on the ES2015-subset profile.
3819  - Returned value must be freed with [jerry_release_value](#jerry_release_value)
3820    when it is no longer needed.
3821
3822**Prototype**
3823
3824```c
3825jerry_value_t
3826jerry_create_arraybuffer_external (const jerry_length_t size
3827                                   uint8_t *buffer_p,
3828                                   jerry_object_native_free_callback_t free_cb);
3829```
3830
3831- `size` - size of the buffer to use **in bytes** (should not be 0)
3832- `buffer_p` - the buffer used for the Array Buffer object (should not be a null pointer)
3833- `free_cb` - the callback function called when the object is released
3834- return value
3835  - the new ArrayBuffer as a `jerry_value_t`
3836  - if the `size` is zero or `buffer_p` is a null pointer this will return an empty ArrayBuffer.
3837
3838*New in version 2.0*.
3839
3840**Example**
3841
3842```c
3843{
3844  uint8_t buffer_p[15];
3845  jerry_value_t buffer_value = jerry_create_arraybuffer_external (15, buffer_p, NULL);
3846
3847  ... // use the array buffer
3848
3849  jerry_release_value (buffer_value);
3850}
3851```
3852
3853**See also**
3854
3855- [jerry_get_arraybuffer_pointer](#jerry_get_arraybuffer_pointer)
3856- [jerry_arraybuffer_read](#jerry_arraybuffer_read)
3857- [jerry_arraybuffer_write](#jerry_arraybuffer_write)
3858- [jerry_value_is_arraybuffer](#jerry_value_is_arraybuffer)
3859- [jerry_release_value](#jerry_release_value)
3860- [jerry_object_native_free_callback_t](#jerry_object_native_free_callback_t)
3861
3862
3863## jerry_create_boolean
3864
3865**Summary**
3866
3867Create a jerry_value_t representing a boolean value from the given boolean parameter.
3868
3869**Prototype**
3870
3871```c
3872jerry_value_t
3873jerry_create_boolean (bool value);
3874```
3875
3876- `value` - raw boolean value.
3877- return value - a `jerry_value_t` created from the given boolean argument.
3878
3879**Example**
3880
3881```c
3882{
3883  jerry_value_t boolean_value = jerry_create_boolean (true);
3884
3885  ... // usage of the value
3886
3887  jerry_release_value (boolean_value);
3888}
3889```
3890
3891**See also**
3892
3893- [jerry_release_value](#jerry_release_value)
3894
3895
3896## jerry_create_error
3897
3898**Summary**
3899
3900Create new JavaScript error object.
3901
3902Important! The `error_type` argument *must not be* `JERRY_ERROR_NONE`.
3903Creating an error with no error type is not valid.
3904
3905*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3906is no longer needed.
3907
3908**Prototype**
3909
3910```c
3911jerry_value_t
3912jerry_create_error (jerry_error_t error_type,
3913                    const jerry_char_t *message_p);
3914```
3915
3916- `error_type` - type of error
3917- `message_p` - value of 'message' property of constructed error object
3918- return value - value of the constructed error object
3919
3920**Example**
3921
3922```c
3923{
3924  jerry_value_t error_obj = jerry_create_error (JERRY_ERROR_TYPE,
3925                                                (const jerry_char_t *) "error");
3926
3927  ... // usage of error_obj
3928
3929
3930  jerry_release_value (error_obj);
3931}
3932```
3933
3934**See also**
3935
3936- [jerry_value_is_error](#jerry_value_is_error)
3937- [jerry_get_value_from_error](#jerry_get_value_from_error)
3938- [jerry_create_error_from_value](#jerry_create_error_from_value)
3939
3940
3941## jerry_create_error_sz
3942
3943**Summary**
3944
3945Create new JavaScript error object.
3946
3947*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3948is no longer needed.
3949
3950**Prototype**
3951
3952```c
3953jerry_value_t
3954jerry_create_error_sz (jerry_error_t error_type,
3955                       const jerry_char_t *message_p,
3956                       jerry_size_t message_size);
3957```
3958
3959- `error_type` - type of the error
3960- `message_p` - value of 'message' property of the constructed error object
3961- `message_size` - size of the message in bytes
3962- return value - value of the constructed error object
3963
3964**Example**
3965
3966```c
3967{
3968  const jerry_char_t message[] = "error";
3969  jerry_value_t error_obj = jerry_create_error_sz (JERRY_ERROR_COMMON,
3970                                                   message,
3971                                                   sizeof (message) - 1);
3972
3973  ... // usage of error_obj
3974
3975  jerry_release_value (error_obj);
3976}
3977```
3978
3979**See also**
3980
3981- [jerry_create_error](#jerry_create_error)
3982
3983
3984## jerry_create_dataview
3985
3986**Summary**
3987
3988Create new JavaScript DataView object.
3989
3990*Note*:
3991  - This API depends on the ES2015-subset profile.
3992  - Returned value must be freed with [jerry_release_value](#jerry_release_value)
3993    when it is no longer needed.
3994
3995**Prototype**
3996
3997```c
3998jerry_value_t
3999jerry_create_dataview (const jerry_value_t array_buffer,
4000                       const jerry_length_t byte_offset,
4001                       const jerry_length_t byte_length)
4002```
4003
4004- `array_buffer` - arrayBuffer to create DataView from
4005- `byte_offset` - offset in bytes, to the first byte in the buffer
4006- `byte_length` - number of elements in the byte array
4007- return value
4008  - value of the constructed DataView object - if success
4009  - created error - otherwise
4010
4011*New in version 2.0*.
4012
4013**Example**
4014
4015[doctest]: # ()
4016
4017```c
4018#include "jerryscript.h"
4019
4020int
4021main (void)
4022{
4023  jerry_init (JERRY_INIT_EMPTY);
4024
4025  jerry_value_t arraybuffer = jerry_create_arraybuffer (16);
4026  jerry_value_t dataview = jerry_create_dataview (arraybuffer, 0, 16);
4027
4028  // usage of dataview
4029
4030  jerry_release_value (dataview);
4031  jerry_release_value (arraybuffer);
4032
4033  jerry_cleanup ();
4034  return 0;
4035}
4036```
4037
4038**See also**
4039
4040- [jerry_value_is_dataview](#jerry_value_is_dataview)
4041- [jerry_create_arraybuffer](#jerry_create_arraybuffer)
4042
4043
4044## jerry_create_external_function
4045
4046**Summary**
4047
4048Create an external function object.
4049
4050*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
4051is no longer needed.
4052
4053**Prototype**
4054
4055```c
4056jerry_value_t
4057jerry_create_external_function (jerry_external_handler_t handler_p);
4058```
4059
4060- `handler_p` - pointer to native handler of the function object
4061- return value - value of the constructed function object
4062
4063**Example**
4064
4065[doctest]: # ()
4066
4067```c
4068#include <stdio.h>
4069#include <string.h>
4070#include "jerryscript.h"
4071
4072static jerry_value_t
4073handler (const jerry_value_t function_obj,
4074         const jerry_value_t this_val,
4075         const jerry_value_t args_p[],
4076         const jerry_length_t args_cnt)
4077{
4078  printf ("native handler called!\n");
4079
4080  return jerry_create_boolean (true);
4081}
4082
4083int
4084main (void)
4085{
4086  jerry_init (JERRY_INIT_EMPTY);
4087
4088  jerry_value_t func_val = jerry_create_external_function (handler);
4089  jerry_value_t glob_obj = jerry_get_global_object ();
4090
4091  // after this, script can invoke the native handler through "handler_field (1, 2, 3);"
4092  jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "handler_field");
4093  // set property and release the return value without any check
4094  jerry_release_value (jerry_set_property (glob_obj, prop_name, func_val));
4095  jerry_release_value (prop_name);
4096
4097  jerry_release_value (func_val);
4098  jerry_release_value (glob_obj);
4099
4100  // Test the method by calling it
4101  const char *test_src = "handler_field ();";
4102  jerry_value_t ret_val = jerry_eval ((const jerry_char_t *) test_src,
4103                                      strlen (test_src),
4104                                      JERRY_PARSE_NO_OPTS);
4105  // release the eval result
4106  jerry_release_value (ret_val);
4107  jerry_cleanup ();
4108  return 0;
4109}
4110```
4111
4112**See also**
4113
4114- [jerry_external_handler_t](#jerry_external_handler_t)
4115- [jerry_set_property](#jerry_set_property)
4116- [jerry_call_function](#jerry_call_function)
4117
4118
4119## jerry_create_number
4120
4121**Summary**
4122
4123Creates a `jerry_value_t` representing a number value.
4124
4125*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
4126is no longer needed.
4127
4128**Prototype**
4129
4130```c
4131jerry_value_t
4132jerry_create_number (double value);
4133```
4134
4135- `value` - double value from which a `jerry_value_t` will be created
4136- return value - a `jerry_value_t` created from the given double argument
4137
4138**Example**
4139
4140```c
4141{
4142  jerry_value_t number_value = jerry_create_number (3.14);
4143
4144  ... // usage of the value
4145
4146  jerry_release_value (number_value);
4147}
4148```
4149
4150**See also**
4151
4152- [jerry_release_value](#jerry_release_value)
4153- [jerry_create_number_infinity](#jerry_create_number_infinity)
4154- [jerry_create_number_nan](#jerry_create_number_nan)
4155
4156
4157## jerry_create_number_infinity
4158
4159**Summary**
4160
4161Creates a `jerry_value_t` representing a positive or negative infinity value.
4162
4163*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
4164is no longer needed.
4165
4166**Prototype**
4167
4168```c
4169jerry_value_t
4170jerry_create_number_infinity (bool sign);
4171```
4172
4173- `sign` - true for negative Infinity and false for positive Infinity
4174- return value - a `jerry_value_t` representing the infinity value
4175
4176**Example**
4177
4178```c
4179{
4180  jerry_value_t positive_inf_value = jerry_create_number_infinity (false);
4181
4182  ... // usage of the positive_inf_value
4183
4184  jerry_release_value (positive_inf_value);
4185}
4186```
4187
4188**See also**
4189
4190- [jerry_release_value](#jerry_release_value)
4191- [jerry_create_number](#jerry_create_number)
4192- [jerry_create_number_nan](#jerry_create_number_nan)
4193
4194
4195## jerry_create_number_nan
4196
4197**Summary**
4198
4199Creates a `jerry_value_t` representing a not-a-number value.
4200
4201*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
4202is no longer needed.
4203
4204**Prototype**
4205
4206```c
4207jerry_value_t
4208jerry_create_number_nan (void);
4209```
4210
4211- return value - a `jerry_value_t` representing the not-a-number value
4212
4213**Example**
4214
4215```c
4216{
4217  jerry_value_t nan_value = jerry_create_number_nan ();
4218
4219  ... // usage of the nan_value
4220
4221  jerry_release_value (nan_value);
4222}
4223```
4224
4225**See also**
4226
4227- [jerry_release_value](#jerry_release_value)
4228- [jerry_create_number](#jerry_create_number)
4229- [jerry_create_number_infinity](#jerry_create_number_infinity)
4230
4231
4232## jerry_create_null
4233
4234**Summary**
4235
4236Creates and returns a `jerry_value_t` with type null object.
4237
4238**Prototype**
4239
4240```c
4241jerry_value_t
4242jerry_create_null (void);
4243```
4244
4245- return value - a `jerry_value_t` representing null.
4246
4247**Example**
4248
4249```c
4250{
4251  jerry_value_t null_value = jerry_create_null ();
4252
4253  ... // usage of the value
4254
4255  jerry_release_value (null_value);
4256}
4257```
4258
4259**See also**
4260
4261- [jerry_release_value](#jerry_release_value)
4262
4263
4264## jerry_create_object
4265
4266**Summary**
4267
4268Create new JavaScript object, like with new Object().
4269
4270*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
4271is no longer needed.
4272
4273**Prototype**
4274
4275```c
4276jerry_value_t
4277jerry_create_object (void);
4278```
4279
4280- return value - value of the created object
4281
4282**Example**
4283
4284```c
4285{
4286  jerry_value_t object_value = jerry_create_object ();
4287
4288  ... // usage of object_value
4289
4290  jerry_release_value (object_value);
4291}
4292```
4293
4294**See also**
4295
4296- [jerry_release_value](#jerry_release_value)
4297
4298
4299## jerry_create_promise
4300
4301**Summary**
4302
4303Create an empty promise object which can be resolved or rejected later
4304by calling jerry_resolve_or_reject_promise.
4305
4306*Note*:
4307  - This API depends on the ES2015-subset profile.
4308  - Returned value must be freed with [jerry_release_value](#jerry_release_value)
4309    when it is no longer needed.
4310
4311**Prototype**
4312
4313```c
4314jerry_value_t
4315jerry_create_promise (void)
4316```
4317
4318- return value - value of the newly created promise
4319
4320*New in version 2.0*.
4321
4322**Example**
4323
4324```c
4325{
4326  jerry_value_t p = jerry_create_promise ();
4327
4328  ...// usage of the promise
4329
4330  jerry_release_value (p);
4331}
4332```
4333
4334**See also**
4335
4336- [jerry_resolve_or_reject_promise](#jerry_resolve_or_reject_promise)
4337- [jerry_release_value](#jerry_release_value)
4338
4339
4340## jerry_create_proxy
4341
4342**Summary**
4343
4344Create a new Proxy object with the given target and handler.
4345
4346*Note*:
4347  - This API depends on the ES2015-subset profile.
4348  - Returned value must be freed with [jerry_release_value](#jerry_release_value)
4349    when it is no longer needed.
4350
4351**Prototype**
4352
4353```c
4354jerry_value_t
4355jerry_create_proxy (const jerry_value_t target,
4356                    const jerry_value_t handler)
4357```
4358
4359- `target` - proxy target
4360- `handler` - proxy handler
4361- return thrown error - if the Proxy construction fails
4362         value of the newly created proxy object - otherwise
4363
4364**Example**
4365
4366*New in version 2.3*.
4367
4368[doctest]: # ()
4369
4370```c
4371#include "jerryscript.h"
4372
4373int
4374main (void)
4375{
4376  jerry_init (JERRY_INIT_EMPTY);
4377
4378  jerry_value_t target = jerry_create_object ();
4379  jerry_value_t handler = jerry_create_object ();
4380  jerry_value_t proxy = jerry_create_proxy (target, handler);
4381
4382  jerry_release_value (target);
4383  jerry_release_value (handler);
4384
4385  // usage of the proxy
4386
4387  jerry_release_value (proxy);
4388
4389  jerry_cleanup ();
4390}
4391```
4392
4393**See also**
4394
4395- [jerry_value_is_proxy](#jerry_value_is_proxy)
4396- [jerry_release_value](#jerry_release_value)
4397
4398
4399## jerry_create_string
4400
4401**Summary**
4402
4403Create string from a valid CESU8 string.
4404
4405*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
4406is no longer needed.
4407
4408**Prototype**
4409
4410```c
4411jerry_value_t
4412jerry_create_string (const jerry_char_t *str_p);
4413```
4414
4415- `str_p` - non-null pointer to string
4416- return value - value of the created string
4417
4418**Example**
4419
4420```c
4421{
4422  const jerry_char_t char_array[] = "a string";
4423  jerry_value_t string_value  = jerry_create_string (char_array);
4424
4425  ... // usage of string_value
4426
4427  jerry_release_value (string_value);
4428}
4429```
4430
4431**See also**
4432
4433- [jerry_is_valid_cesu8_string](#jerry_is_valid_cesu8_string)
4434- [jerry_create_string_sz](#jerry_create_string_sz)
4435
4436
4437## jerry_create_string_sz
4438
4439**Summary**
4440
4441Create string from a valid CESU8 string.
4442
4443*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
4444is no longer needed.
4445
4446**Prototype**
4447
4448```c
4449jerry_value_t
4450jerry_create_string_sz (const jerry_char_t *str_p,
4451                        jerry_size_t str_size)
4452```
4453
4454- `str_p` - non-null pointer to string
4455- `str_size` - size of the string
4456- return value - value of the created string
4457
4458**Example**
4459
4460```c
4461{
4462  const jerry_char_t char_array[] = "a string";
4463  jerry_value_t string_value  = jerry_create_string_sz (char_array,
4464                                                        sizeof (char_array) - 1);
4465
4466  ... // usage of string_value
4467
4468  jerry_release_value (string_value);
4469}
4470
4471```
4472
4473**See also**
4474
4475- [jerry_is_valid_cesu8_string](#jerry_is_valid_cesu8_string)
4476- [jerry_create_string](#jerry_create_string)
4477
4478
4479## jerry_create_string_from_utf8
4480
4481**Summary**
4482
4483Create string from a valid UTF8 string.
4484
4485*Note*:
4486 - The difference from [jerry_create_string](#jerry_create_string) is that it accepts utf-8 string instead of cesu-8 string.
4487 - Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
4488is no longer needed.
4489
4490**Prototype**
4491
4492```c
4493jerry_value_t
4494jerry_create_string_from_utf8 (const jerry_char_t *str_p);
4495```
4496
4497- `str_p` - non-null pointer to string
4498- return value - value of the created string
4499
4500*New in version 2.0*.
4501
4502**Example**
4503
4504```c
4505{
4506  const jerry_char_t char_array[] = "a string";
4507  jerry_value_t string_value  = jerry_create_string_from_utf8 (char_array);
4508
4509  ... // usage of string_value
4510
4511  jerry_release_value (string_value);
4512}
4513```
4514
4515**See also**
4516
4517- [jerry_is_valid_utf8_string](#jerry_is_valid_utf8_string)
4518- [jerry_create_string_sz_from_utf8](#jerry_create_string_sz_from_utf8)
4519
4520
4521## jerry_create_string_sz_from_utf8
4522
4523**Summary**
4524
4525Create string from a valid UTF8 string.
4526
4527*Note*:
4528 - The difference from [jerry_create_string_sz](#jerry_create_string_sz) is that it accepts utf-8 string instead of cesu-8 string.
4529 - Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
4530is no longer needed.
4531
4532**Prototype**
4533
4534```c
4535jerry_value_t
4536jerry_create_string_sz_from_utf8 (const jerry_char_t *str_p,
4537                                  jerry_size_t str_size)
4538```
4539
4540- `str_p` - non-null pointer to string
4541- `str_size` - size of the string
4542- return value - value of the created string
4543
4544*New in version 2.0*.
4545
4546**Example**
4547
4548```c
4549{
4550  const jerry_char_t char_array[] = "a string";
4551  jerry_value_t string_value  = jerry_create_string_sz_from_utf8 (char_array,
4552                                                                  sizeof (char_array) - 1);
4553
4554  ... // usage of string_value
4555
4556  jerry_release_value (string_value);
4557}
4558
4559```
4560
4561**See also**
4562
4563- [jerry_is_valid_utf8_string](#jerry_is_valid_utf8_string)
4564- [jerry_create_string_from_utf8](#jerry_create_string_from_utf8)
4565
4566
4567## jerry_create_symbol
4568
4569**Summary**
4570
4571Create symbol from an API value.
4572
4573*Note*:
4574  - The given argument is converted to string. This operation can throw an error.
4575  - This API depends on the ES2015-subset profile.
4576  - Returned value must be freed with [jerry_release_value](#jerry_release_value)
4577    when it is no longer needed.
4578
4579**Prototype**
4580
4581```c
4582jerry_value_t
4583jerry_create_symbol (const jerry_value_t value)
4584```
4585
4586- `value` - API value
4587- return value
4588  - value of the created symbol, if success
4589  - thrown error, otherwise
4590
4591*New in version 2.0*.
4592
4593**Example**
4594
4595[doctest]: # ()
4596
4597```c
4598#include "jerryscript.h"
4599
4600int
4601main (void)
4602{
4603  jerry_init (JERRY_INIT_EMPTY);
4604
4605  jerry_value_t string_value = jerry_create_string ((const jerry_char_t *) "Symbol description string");
4606  jerry_value_t symbol_value = jerry_create_symbol (string_value);
4607
4608  // The description value is no longer needed
4609  jerry_release_value (string_value);
4610
4611  // usage of symbol_value
4612
4613  jerry_release_value (symbol_value);
4614
4615  jerry_cleanup ();
4616}
4617```
4618
4619**See also**
4620
4621- [jerry_value_is_symbol](#jerry_value_is_symbol)
4622- [jerry_release_value](#jerry_release_value)
4623
4624
4625## jerry_create_regexp
4626
4627**Summary**
4628
4629Returns a `jerry_value_t` RegExp object or an error, if the construction of the object fails.
4630Optional flags can be set using [jerry_regexp_flags_t](#jerry_regexp_flags_t).
4631These flags can be combined together with the binary OR operator or used on their own as enum values.
4632
4633*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
4634is no longer needed.
4635
4636**Prototype**
4637```c
4638jerry_value_t
4639jerry_create_regexp (const jerry_char_t *pattern_p, uint16_t flags);
4640```
4641
4642- `pattern_p` - the RegExp pattern as a zero-terminated UTF-8 string
4643- `flags` - optional flags for the RegExp object, see [jerry_regexp_flags_t](#jerry_regexp_flags_t)
4644- return value - the RegExp object as a `jerry_value_t`
4645
4646*New in version 2.0*.
4647
4648**Example**
4649
4650```c
4651{
4652  jerry_char_t pattern_p = "[cgt]gggtaaa|tttaccc[acg]";
4653  uint16_t pattern_flags = JERRY_REGEXP_FLAG_IGNORE_CASE;
4654
4655  jerry_value_t regexp = jerry_create_regexp (pattern_p, pattern_flags);
4656
4657  ...
4658
4659  jerry_release_value (regexp);
4660}
4661```
4662
4663
4664## jerry_create_regexp_sz
4665
4666**Summary**
4667
4668Returns a `jerry_value_t` RegExp object or an error, if the construction of the object fails.
4669Optional flags can be set using [jerry_regexp_flags_t](#jerry_regexp_flags_t).
4670These flags can be combined together with the binary OR operator or used on their own as enum values.
4671
4672*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
4673is no longer needed.
4674
4675**Prototype**
4676```c
4677jerry_value_t
4678jerry_create_regexp_sz (const jerry_char_t *pattern_p, jerry_size_t pattern_size, uint16_t flags);
4679```
4680
4681- `pattern_p` - the RegExp pattern as a zero-terminated UTF-8 string
4682- `pattern_size` - size of the `pattern`
4683- `flags` - optional flags for the RegExp object, see [jerry_regexp_flags_t](#jerry_regexp_flags_t)
4684- return value - the RegExp object as a `jerry_value_t`
4685
4686*New in version 2.0*.
4687
4688**Example**
4689
4690```c
4691{
4692  jerry_char_t pattern_p = "[cgt]gggtaaa|tttaccc[acg]";
4693  jerry_size_t pattern_size = sizeof (pattern_p) - 1;
4694  uint16_t pattern_flags = JERRY_REGEXP_FLAG_IGNORE_CASE;
4695
4696  jerry_value_t regexp = jerry_create_regexp_sz (pattern_p, pattern_size, pattern_flags);
4697
4698  ...
4699
4700  jerry_release_value (regexp);
4701}
4702```
4703
4704
4705## jerry_create_typedarray
4706
4707**Summary**
4708
4709Create a jerry_value_t representing an TypedArray object.
4710
4711For the new object the type of the TypedArray (see: [jerry_typedarray_type_t](#jerry_typedarray_type_t))
4712and element count can be specified.
4713
4714*Notes*:
4715- Returned value must be freed with [jerry_release_value](#jerry_release_value)
4716  when it is no longer needed.
4717- This API depends on a build option (`JERRY_ES2015_BUILTIN_TYPEDARRAY`) and can be checked
4718  in runtime with the `JERRY_FEATURE_TYPEDARRAY` feature enum value,
4719  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
4720- The ES2015-subset profile enables this by default.
4721
4722**Prototype**
4723
4724```c
4725jerry_value_t
4726jerry_create_typedarray (jerry_typedarray_type_t type_name, jerry_length_t item_count);
4727```
4728
4729- `type_name` - type of TypedArray to create
4730- `item_count` - number of items in the new TypedArray
4731- return value - the new TypedArray as a `jerry_value_t`
4732
4733*New in version 2.0*.
4734
4735**Example**
4736
4737```c
4738{
4739  jerry_value_t array = jerry_create_typedarray (JERRY_TYPEDARRAY_UINT16, 15);
4740
4741  ... // use the TypedArray
4742
4743  jerry_release_value (array);
4744}
4745```
4746
4747**See also**
4748
4749- [jerry_typedarray_type_t](#jerry_typedarray_type_t)
4750- [jerry_value_is_typedarray](#jerry_value_is_typedarray)
4751- [jerry_release_value](#jerry_release_value)
4752
4753
4754## jerry_create_typedarray_for_arraybuffer
4755
4756**Summary**
4757
4758Create a jerry_value_t representing an TypedArray object using
4759an already existing ArrayBuffer object.
4760
4761For the new object the type of the TypedArray (see: [jerry_typedarray_type_t](#jerry_typedarray_type_t))
4762and element count can be specified.
4763
4764The developer must ensure that the ArrayBuffer has the correct length for the given
4765type of TypedArray otherwise an error is generated.
4766
4767The JavaScript equivalent of this function is: `new %TypedArray%(arraybuffer)` where `%TypedArray%` is
4768one of the allowed TypedArray functions.
4769
4770*Notes*:
4771- Returned value must be freed with [jerry_release_value](#jerry_release_value)
4772  when it is no longer needed.
4773- This API depends on a build option (`JERRY_ES2015_BUILTIN_TYPEDARRAY`) and can be checked
4774  in runtime with the `JERRY_FEATURE_TYPEDARRAY` feature enum value,
4775  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
4776- The ES2015-subset profile enables this by default.
4777
4778**Prototype**
4779
4780```c
4781jerry_value_t
4782jerry_create_typedarray_for_arraybuffer (jerry_typedarray_type_t type_name,
4783                                         const jerry_value_t arraybuffer);
4784```
4785
4786- `type_name` - type of TypedArray to create
4787- `arraybuffer` - the ArrayBuffer to use for the new TypedArray
4788- return value
4789  - the new TypedArray as a `jerry_value_t`
4790  - Error if the ArrayBuffer does not have enough space for the given type of TypedArray
4791
4792*New in version 2.0*.
4793
4794**Example**
4795
4796```c
4797{
4798  jerry_value_t buffer = jerry_create_array_buffer (12 * 2);
4799  jerry_value_t array = jerry_create_typedarray_for_arraybuffer (JERRY_TYPEDARRAY_UINT16, buffer);
4800  jerry_release_value (buffer);
4801
4802  ... // use the TypedArray
4803
4804  jerry_release_value (array);
4805}
4806```
4807
4808**See also**
4809
4810- [jerry_typedarray_type_t](#jerry_typedarray_type_t)
4811- [jerry_value_is_typedarray](#jerry_value_is_typedarray)
4812- [jerry_release_value](#jerry_release_value)
4813
4814
4815## jerry_create_typedarray_for_arraybuffer_sz
4816
4817**Summary**
4818
4819Create a jerry_value_t representing an TypedArray object using
4820an already existing ArrayBuffer object and by specifying the byteOffset, and length properties.
4821
4822For the new object the type of the TypedArray (see: [jerry_typedarray_type_t](#jerry_typedarray_type_t))
4823and element count can be specified.
4824
4825The developer must ensure that the ArrayBuffer has the correct length for the given
4826type of TypedArray otherwise an error is generated.
4827
4828The JavaScript equivalent of this function is: `new %TypedArray%(arraybuffer, byteOffset, length)` where `%TypedArray%` is
4829one of the allowed TypedArray functions.
4830
4831*Notes*:
4832- Returned value must be freed with [jerry_release_value](#jerry_release_value)
4833  when it is no longer needed.
4834- This API depends on a build option (`JERRY_ES2015_BUILTIN_TYPEDARRAY`) and can be checked
4835  in runtime with the `JERRY_FEATURE_TYPEDARRAY` feature enum value,
4836  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
4837- The ES2015-subset profile enables this by default.
4838
4839**Prototype**
4840
4841```c
4842jerry_value_t
4843jerry_create_typedarray_for_arraybuffer_sz (jerry_typedarray_type_t type_name,
4844                                            const jerry_value_t arraybuffer,
4845                                            jerry_length_t byte_offset,
4846                                            jerry_length_t length);
4847```
4848
4849- `type_name` - type of TypedArray to create
4850- `arraybuffer` - the ArrayBuffer to use for the new TypedArray
4851- `byte_offset` - start offset to use for the ArrayBuffer
4852- `length` - number of elements to used from the ArrayBuffer (this is not the same as the byteLength)
4853- return value
4854  - the new TypedArray as a `jerry_value_t`
4855  - Error if the ArrayBuffer does not have enough space for the given type of TypedArray
4856
4857*New in version 2.0*.
4858
4859**Example**
4860
4861```c
4862{
4863  jerry_value_t buffer = jerry_create_array_buffer (12 * 2);
4864  jerry_value_t array = jerry_create_typedarray_for_arraybuffer_sz (JERRY_TYPEDARRAY_UINT16, buffer, 4, 10);
4865  jerry_release_value (buffer);
4866
4867  ... // use the TypedArray
4868
4869  jerry_release_value (array);
4870}
4871```
4872
4873**See also**
4874
4875- [jerry_typedarray_type_t](#jerry_typedarray_type_t)
4876- [jerry_value_is_typedarray](#jerry_value_is_typedarray)
4877- [jerry_release_value](#jerry_release_value)
4878
4879
4880## jerry_create_container
4881
4882**Summary**
4883
4884Create a jerry_value_t representing a given type container object.
4885
4886*Notes*:
4887- This method is expected to work the same way as the JavaScript Map constructor.
4888- Returned value must be freed with [jerry_release_value](#jerry_release_value)
4889  when it is no longer needed.
4890- This API depends on a build option (`JERRY_ES2015_BUILTIN_CONTAINER`) and can be checked
4891  in runtime with the `JERRY_FEATURE_MAP, JERRY_FEATURE_SET, JERRY_FEATURE_WEAKMAP, JERRY_FEATURE_WEAKSET`
4892  feature enum values.
4893  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
4894- The ES2015-subset profile enables this by default.
4895
4896*New in version 2.3*.
4897
4898**Prototype**
4899
4900```c
4901jerry_value_t
4902jerry_create_container (jerry_container_type_t container_type,
4903                        const jerry_value_t *arguments_list_p,
4904                        jerry_length_t arguments_list_len);
4905```
4906
4907- `container_type` - Type of the container to be created, see `jerry_container_type_t`.
4908- `arguments_list_p` - The arguments passed to the container constructor to be inserted to the container.
4909- `arguments_list_len` - The length of the above arguments.
4910- return value - the new container object as a `jerry_value_t`
4911
4912**Example**
4913
4914[doctest]: # ()
4915
4916```c
4917#include "jerryscript.h"
4918
4919int
4920main (void)
4921{
4922  jerry_init (JERRY_INIT_EMPTY);
4923  jerry_char_t src[] = "[1,2,3,4].entries()";
4924  jerry_value_t iterable = jerry_eval (src, sizeof (src) - 1, JERRY_PARSE_NO_OPTS);
4925
4926  jerry_value_t map = jerry_create_container (JERRY_CONTAINER_TYPE_MAP, &iterable, 1);
4927  jerry_release_value (iterable);
4928
4929  // use the Map
4930
4931  jerry_release_value (map);
4932
4933  jerry_cleanup ();
4934  return 0;
4935}
4936```
4937
4938**See also**
4939
4940- [jerry_container_type_t](#jerry_container_type_t)
4941- [jerry_get_container_type](#jerry_get_container_type)
4942
4943
4944## jerry_create_undefined
4945
4946**Summary**
4947
4948Creates a `jerry_value_t` representing an undefined value.
4949
4950**Prototype**
4951
4952```c
4953jerry_value_t
4954jerry_create_undefined (void);
4955```
4956
4957- return value - value of undefined
4958
4959**Example**
4960
4961```c
4962{
4963  jerry_value_t undefined_value = jerry_create_undefined ();
4964
4965  ... // usage of the value
4966
4967  jerry_release_value (undefined_value);
4968}
4969```
4970
4971**See also**
4972
4973- [jerry_release_value](#jerry_release_value)
4974
4975
4976# General API functions of JS objects
4977
4978## jerry_has_property
4979
4980**Summary**
4981
4982Checks whether the object or its prototype objects have the given property.
4983
4984*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
4985is no longer needed.
4986
4987**Prototype**
4988
4989```c
4990jerry_value_t
4991jerry_has_property (const jerry_value_t obj_val,
4992                    const jerry_value_t prop_name_val);
4993```
4994
4995- `obj_val` - object value
4996- `prop_name_val` - property name
4997- return value - JavaScript value that evaluates to
4998  -  raised error - if the operation fail
4999  -  true/false API value  - depend on whether the property exists
5000
5001*Changed in version 2.0*: The return value type is now a JavaScript value and not a primitive boolean value.
5002*Changed in version 2.3*: The return value can be an error value.
5003
5004**Example**
5005
5006[doctest]: # ()
5007
5008```c
5009#include "jerryscript.h"
5010
5011int
5012main (void)
5013{
5014  jerry_init (JERRY_INIT_EMPTY);
5015
5016  jerry_value_t global_object = jerry_get_global_object ();
5017  jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "handler_field");
5018
5019  jerry_value_t has_prop_js = jerry_has_property (global_object, prop_name);
5020  bool has_prop = jerry_get_boolean_value (has_prop_js);
5021
5022  jerry_release_value (has_prop_js);
5023  jerry_release_value (prop_name);
5024  jerry_release_value (global_object);
5025
5026  jerry_cleanup ();
5027
5028  return 0;
5029}
5030```
5031
5032**See also**
5033
5034- [jerry_has_own_property](#jerry_has_own_property)
5035- [jerry_delete_property](#jerry_delete_property)
5036
5037
5038## jerry_has_own_property
5039
5040**Summary**
5041
5042Checks whether the object has the given property.
5043
5044*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
5045is no longer needed.
5046
5047**Prototype**
5048
5049```c
5050jerry_value_t
5051jerry_has_own_property (const jerry_value_t obj_val,
5052                        const jerry_value_t prop_name_val);
5053```
5054
5055- `obj_val` - object value
5056- `prop_name_val` - property name
5057- return value - JavaScript value that evaluates to
5058  -  raised error - if the operation fails
5059  -  true/false API value - depend on whether the property exists
5060
5061*Changed in version 2.0*: The return value type is now a JavaScript value and not a primitive boolean value.
5062*Changed in version 2.3*: The return value can be an error value.
5063
5064**Example**
5065
5066[doctest]: # ()
5067
5068```c
5069#include "jerryscript.h"
5070
5071int
5072main (void)
5073{
5074  jerry_init (JERRY_INIT_EMPTY);
5075
5076  jerry_value_t global_object = jerry_get_global_object ();
5077  jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "handler_field");
5078
5079  jerry_value_t has_prop_js = jerry_has_own_property (global_object, prop_name);
5080  bool has_prop = jerry_get_boolean_value (has_prop_js);
5081
5082  jerry_release_value (has_prop_js);
5083  jerry_release_value (prop_name);
5084  jerry_release_value (global_object);
5085
5086  jerry_cleanup ();
5087
5088  return 0;
5089}
5090```
5091
5092**See also**
5093
5094- [jerry_has_property](#jerry_has_property)
5095- [jerry_delete_property](#jerry_delete_property)
5096
5097
5098## jerry_has_internal_property
5099
5100**Summary**
5101
5102Checks whether the object has the given internal property.
5103
5104*Note*:
5105 - Properties which were not created with [jerry_set_internal_property](#jerry_set_internal_property) are excluded
5106   during the operation.
5107 - Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
5108is no longer needed.
5109
5110**Prototype**
5111
5112```c
5113bool
5114jerry_has_internal_property (const jerry_value_t obj_val,
5115                             const jerry_value_t prop_name_val);
5116```
5117
5118- `obj_val` - object value
5119- `prop_name_val` - property name
5120- return value
5121  - true, if the property exists
5122  - false, otherwise
5123
5124*New in version 2.2*.
5125
5126**Example**
5127
5128[doctest]: # ()
5129
5130```c
5131#include "jerryscript.h"
5132
5133int
5134main (void)
5135{
5136  jerry_init (JERRY_INIT_EMPTY);
5137
5138  jerry_value_t global_object = jerry_get_global_object ();
5139  jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "hidden_property");
5140
5141  bool has_internal_js_prop = jerry_has_internal_property (global_object, prop_name);
5142
5143  jerry_release_value (prop_name);
5144  jerry_release_value (global_object);
5145
5146  return 0;
5147}
5148```
5149
5150**See also**
5151
5152- [jerry_delete_internal_property](#jerry_delete_internal_property)
5153- [jerry_get_internal_property](#jerry_get_internal_property)
5154- [jerry_set_internal_property](#jerry_set_internal_property)
5155
5156
5157## jerry_delete_property
5158
5159**Summary**
5160
5161Delete a property from an object.
5162
5163**Prototype**
5164
5165```c
5166bool
5167jerry_delete_property (const jerry_value_t obj_val,
5168                       const jerry_value_t prop_name_val);
5169```
5170
5171- `obj_val` - object value
5172- `prop_name_val` - property name
5173- return value
5174  - true, if property was deleted successfully
5175  - false, otherwise
5176
5177**Example**
5178
5179```c
5180{
5181  jerry_value_t global_object = jerry_get_global_object ();
5182  jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "my_prop");
5183
5184  bool delete_result = jerry_delete_property (global_object, prop_name);
5185  /* use "delete_result" */
5186
5187  jerry_release_value (prop_name);
5188  jerry_release_value (global_object);
5189}
5190```
5191
5192**See also**
5193
5194- [jerry_has_property](#jerry_has_property)
5195- [jerry_has_own_property](#jerry_has_own_property)
5196- [jerry_delete_property_by_index](#jerry_delete_property_by_index)
5197- [jerry_get_property](#jerry_get_property)
5198
5199
5200## jerry_delete_property_by_index
5201
5202**Summary**
5203
5204Delete indexed property from the specified object.
5205
5206**Prototype**
5207
5208```c
5209bool
5210jerry_delete_property_by_index (const jerry_value_t obj_val,
5211                                uint32_t index);
5212```
5213
5214- `obj_val` - object value
5215- `index` - index number
5216- return value
5217  - true, if property was deleted successfully
5218  - false, otherwise
5219
5220*New in version 2.0*.
5221
5222**Example**
5223
5224```c
5225{
5226  jerry_value_t object;
5227
5228  ... // create or acquire object
5229
5230  bool delete_result = jerry_delete_property_by_index (object, 5);
5231
5232  jerry_release_value (object);
5233}
5234```
5235
5236**See also**
5237
5238- [jerry_has_property](#jerry_has_property)
5239- [jerry_has_own_property](#jerry_has_own_property)
5240- [jerry_delete_property](#jerry_delete_property)
5241- [jerry_get_property](#jerry_get_property)
5242- [jerry_set_property](#jerry_set_property)
5243- [jerry_get_property_by_index](#jerry_get_property_by_index)
5244- [jerry_set_property_by_index](#jerry_set_property_by_index)
5245
5246## jerry_delete_internal_property
5247
5248**Summary**
5249
5250Delete an internal property from an object.
5251
5252*Note*: Properties which were not created with [jerry_set_internal_property](#jerry_set_internal_property) are excluded
5253        during the operation.
5254
5255**Prototype**
5256
5257```c
5258bool
5259jerry_delete_internal_property (const jerry_value_t obj_val,
5260                                const jerry_value_t prop_name_val);
5261```
5262
5263- `obj_val` - object value
5264- `prop_name_val` - property name
5265- return value
5266  - true, if property was deleted successfully
5267  - false, otherwise
5268
5269*New in version 2.2*.
5270
5271**Example**
5272
5273```c
5274{
5275  jerry_value_t global_object = jerry_get_global_object ();
5276  jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "hidden_property");
5277
5278  bool delete_result = jerry_delete_internal_property (global_object, prop_name);
5279  /* use "delete_result" */
5280
5281  jerry_release_value (prop_name);
5282  jerry_release_value (global_object);
5283}
5284```
5285
5286**See also**
5287
5288- [jerry_has_internal_property](#jerry_has_internal_property)
5289- [jerry_get_internal_property](#jerry_get_internal_property)
5290- [jerry_set_internal_property](#jerry_set_internal_property)
5291
5292
5293## jerry_get_property
5294
5295**Summary**
5296
5297Get value of a property to the specified object with the given name.
5298
5299*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
5300is no longer needed.
5301
5302**Prototype**
5303
5304```c
5305jerry_value_t
5306jerry_get_property (const jerry_value_t obj_val,
5307                    const jerry_value_t prop_name_val);
5308```
5309
5310- `obj_val` - object value
5311- `prop_name_val` - property name
5312- return value
5313  - value of property, if success
5314  - thrown error, otherwise
5315
5316**Example**
5317
5318[doctest]: # ()
5319
5320```c
5321#include "jerryscript.h"
5322
5323int
5324main (void)
5325{
5326  jerry_init (JERRY_INIT_EMPTY);
5327
5328  jerry_value_t global_object = jerry_get_global_object ();
5329  jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "Object");
5330
5331  jerry_value_t prop_value = jerry_get_property (global_object, prop_name);
5332
5333  /* use "prop_value" then release it. */
5334
5335  jerry_release_value (prop_value);
5336  jerry_release_value (prop_name);
5337  jerry_release_value (global_object);
5338
5339  return 0;
5340}
5341```
5342
5343**See also**
5344
5345- [jerry_has_property](#jerry_has_property)
5346- [jerry_has_own_property](#jerry_has_own_property)
5347- [jerry_delete_property](#jerry_delete_property)
5348- [jerry_delete_property_by_index](#jerry_delete_property_by_index)
5349- [jerry_set_property](#jerry_set_property)
5350- [jerry_get_property_by_index](#jerry_get_property_by_index)
5351- [jerry_set_property_by_index](#jerry_set_property_by_index)
5352
5353
5354## jerry_get_property_by_index
5355
5356**Summary**
5357
5358Get value by an index from the specified object.
5359
5360*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
5361is no longer needed.
5362
5363**Prototype**
5364
5365```c
5366jerry_value_t
5367jerry_get_property_by_index (const jerry_value_t obj_val,
5368                             uint32_t index);
5369```
5370
5371- `obj_val` - object value
5372- `index` - index number
5373- return value
5374  - stored value on the specified index, if success
5375  - thrown exception, otherwise.
5376
5377**Example**
5378
5379```c
5380{
5381  jerry_value_t object;
5382
5383  ... // create or acquire object
5384
5385  jerry_value_t value = jerry_get_property_by_index (object, 5);
5386
5387  ...
5388
5389  jerry_release_value (value);
5390  jerry_release_value (object);
5391}
5392```
5393
5394**See also**
5395
5396- [jerry_has_property](#jerry_has_property)
5397- [jerry_has_own_property](#jerry_has_own_property)
5398- [jerry_delete_property](#jerry_delete_property)
5399- [jerry_delete_property_by_index](#jerry_delete_property_by_index)
5400- [jerry_get_property](#jerry_get_property)
5401- [jerry_set_property](#jerry_set_property)
5402- [jerry_set_property_by_index](#jerry_set_property_by_index)
5403
5404## jerry_get_internal_property
5405
5406**Summary**
5407
5408Get value of an internal property to the specified object with the given name.
5409
5410*Note*:
5411 - Properties which were not created with [jerry_set_internal_property](#jerry_set_internal_property) are excluded
5412   during the operation.
5413 - Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
5414   is no longer needed.
5415
5416**Prototype**
5417
5418```c
5419jerry_value_t
5420jerry_get_internal_property (const jerry_value_t obj_val,
5421                             const jerry_value_t prop_name_val);
5422```
5423
5424- `obj_val` - object value
5425- `prop_name_val` - property name
5426- return value
5427  - value of property, if the internal property exists
5428  - undefined value, if the, if the internal does not property exists
5429  - thrown error, otherwise
5430
5431*New in version 2.2*.
5432
5433**Example**
5434
5435[doctest]: # ()
5436
5437```c
5438#include "jerryscript.h"
5439
5440int
5441main (void)
5442{
5443  jerry_init (JERRY_INIT_EMPTY);
5444
5445  jerry_value_t global_object = jerry_get_global_object ();
5446  jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "hidden_property");
5447
5448  jerry_value_t prop_value = jerry_get_internal_property (global_object, prop_name);
5449
5450  /* use "prop_value" then release it. */
5451
5452  jerry_release_value (prop_value);
5453  jerry_release_value (prop_name);
5454  jerry_release_value (global_object);
5455
5456  return 0;
5457}
5458```
5459
5460**See also**
5461
5462- [jerry_has_internal_property](#jerry_has_internal_property)
5463- [jerry_delete_internal_property](#jerry_delete_internal_property)
5464- [jerry_set_internal_property](#jerry_set_internal_property)
5465
5466
5467## jerry_set_property
5468
5469**Summary**
5470
5471Set a property to the specified object with the given name.
5472
5473*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
5474is no longer needed.
5475
5476**Prototype**
5477
5478```c
5479jerry_value_t
5480jerry_set_property (const jerry_value_t obj_val,
5481                    const jerry_value_t prop_name_val,
5482                    const jerry_value_t value_to_set)
5483```
5484
5485- `obj_val` - object value
5486- `prop_name_val` - property name
5487- `value_to_set` - value to set
5488- return value
5489  - true, if success
5490  - thrown error, otherwise
5491
5492**Example**
5493
5494```c
5495{
5496  jerry_value_t value_to_set;
5497
5498  ... // create or acquire value to set
5499
5500  jerry_value_t glob_obj = jerry_get_global_object ();
5501  jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "my_prop");
5502
5503  jerry_value_t set_result = jerry_set_property (glob_obj, prop_name, value_to_set);
5504
5505  ... // check result of property set call
5506
5507  jerry_release_value (set_result);
5508  jerry_release_value (prop_name);
5509
5510  ...
5511
5512  jerry_release_value (value_to_set);
5513  jerry_release_value (glob_obj);
5514}
5515```
5516
5517**See also**
5518
5519- [jerry_has_property](#jerry_has_property)
5520- [jerry_has_own_property](#jerry_has_own_property)
5521- [jerry_delete_property](#jerry_delete_property)
5522- [jerry_delete_property_by_index](#jerry_delete_property_by_index)
5523- [jerry_get_property](#jerry_get_property)
5524- [jerry_get_property_by_index](#jerry_get_property_by_index)
5525- [jerry_set_property_by_index](#jerry_set_property_by_index)
5526
5527
5528## jerry_set_property_by_index
5529
5530**Summary**
5531
5532Set indexed value in the specified object
5533
5534*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
5535is no longer needed.
5536
5537**Prototype**
5538
5539```c
5540jerry_value_t
5541jerry_set_property_by_index (const jerry_value_t obj_val,
5542                             uint32_t index,
5543                             const jerry_value_t value_to_set);
5544```
5545
5546- `obj_val` - object value
5547- `index` - index number
5548- `value_to_set` - value to set
5549- return value
5550  - true, if field value was set successfully
5551  - thrown exception, otherwise
5552
5553**Example**
5554
5555```c
5556{
5557  jerry_value_t object;
5558  jerry_value_t value_to_set;
5559
5560  ... // create or acquire object and value to set
5561
5562  jerry_value_t ret_val = jerry_set_property_by_index (object, 5, value_to_set);
5563
5564  ...
5565
5566  jerry_release_value (value_to_set);
5567  jerry_release_value (ret_val);
5568  jerry_release_value (object);
5569}
5570```
5571
5572**See also**
5573
5574- [jerry_has_property](#jerry_has_property)
5575- [jerry_has_own_property](#jerry_has_own_property)
5576- [jerry_delete_property](#jerry_delete_property)
5577- [jerry_delete_property_by_index](#jerry_delete_property_by_index)
5578- [jerry_get_property](#jerry_get_property)
5579- [jerry_set_property](#jerry_set_property)
5580- [jerry_get_property_by_index](#jerry_get_property_by_index)
5581
5582
5583## jerry_set_internal_property
5584
5585**Summary**
5586
5587Set an internal property to the specified object with the given name.
5588
5589*Note*:
5590 - The property cannot be accessed from the JavaScript context, only from the public API.
5591 - It is different from [jerry_set_object_native_pointer](#jerry_set_object_native_pointer) in that any jerry API value
5592   can be hidden from the JavaScript context, not only native pointers.
5593
5594**Prototype**
5595
5596```c
5597bool
5598jerry_set_internal_property (const jerry_value_t obj_val,
5599                             const jerry_value_t prop_name_val,
5600                             const jerry_value_t value_to_set)
5601```
5602
5603- `obj_val` - object value
5604- `prop_name_val` - property name
5605- `value_to_set` - value to set
5606- return value
5607  - true, if success
5608  - thrown error, otherwise
5609
5610*New in version 2.2*.
5611
5612**Example**
5613
5614[doctest]: # ()
5615
5616```c
5617#include "jerryscript.h"
5618
5619int
5620main (void)
5621{
5622  jerry_init (JERRY_INIT_EMPTY);
5623
5624  jerry_value_t global_object = jerry_get_global_object ();
5625  jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "hidden_property");
5626  jerry_value_t value_to_set = jerry_create_number (5);
5627
5628  bool set_result = jerry_set_internal_property (global_object, prop_name, value_to_set);
5629
5630  /* check the result of internal property set call */
5631
5632  jerry_release_value (value_to_set);
5633  jerry_release_value (prop_name);
5634  jerry_release_value (global_object);
5635
5636  return 0;
5637}
5638```
5639
5640**See also**
5641
5642- [jerry_has_internal_property](#jerry_has_internal_property)
5643- [jerry_delete_internal_property](#jerry_delete_internal_property)
5644- [jerry_get_internal_property](#jerry_get_internal_property)
5645
5646
5647## jerry_init_property_descriptor_fields
5648
5649**Summary**
5650
5651Initialize property descriptor. This means that all fields in the `jerry_property_descriptor_t`
5652struct will be set to zero or false depending on the field's type.
5653
5654**Prototype**
5655
5656```c
5657void
5658jerry_init_property_descriptor_fields (jerry_property_descriptor_t *prop_desc_p);
5659```
5660
5661- `prop_desc_p` - pointer to property descriptor
5662
5663**Example**
5664
5665```c
5666{
5667  jerry_property_descriptor_t prop_desc;
5668  jerry_init_property_descriptor_fields (&prop_desc);
5669
5670  ... // usage of prop_desc
5671
5672  jerry_free_property_descriptor_fields (&prop_desc);
5673}
5674```
5675
5676For a more complete example see [jerry_define_own_property](#jerry_define_own_property).
5677
5678**See also**
5679
5680- [jerry_property_descriptor_t](#jerry_property_descriptor_t)
5681- [jerry_define_own_property](#jerry_define_own_property)
5682- [jerry_get_own_property_descriptor](#jerry_get_own_property_descriptor)
5683- [jerry_free_property_descriptor_fields](#jerry_free_property_descriptor_fields)
5684
5685
5686## jerry_define_own_property
5687
5688**Summary**
5689
5690Define a property to the specified object with the given name.
5691
5692*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
5693is no longer needed.
5694
5695**Prototype**
5696
5697```c
5698jerry_value_t
5699jerry_define_own_property (const jerry_value_t obj_val,
5700                           const jerry_value_t prop_name_val,
5701                           const jerry_property_descriptor_t *prop_desc_p);
5702```
5703
5704- `obj_val` - target object where the property should be registered
5705- `prop_name_val` - property name
5706- `prop_desc_p` - pointer to property descriptor
5707- return value
5708  - true, if success
5709  - thrown error, otherwise
5710
5711**Example**
5712
5713Registering a simple value property via the `jerry_define_own_property` method:
5714
5715[doctest]: # (name="02.API-REFERENCE-define-property.c")
5716
5717```c
5718#include "jerryscript.h"
5719
5720int
5721main (void)
5722{
5723  jerry_init (JERRY_INIT_EMPTY);
5724
5725  jerry_value_t global_obj_val = jerry_get_global_object ();
5726
5727  // configure the property
5728  jerry_property_descriptor_t prop_desc;
5729  jerry_init_property_descriptor_fields (&prop_desc);
5730
5731  jerry_value_t value_to_set;
5732
5733  // create or acquire value to set
5734  // For example:
5735  value_to_set = jerry_create_number (33);
5736
5737  // set the property descriptor fields:
5738  // set the "is_value_defined" field to "true" to indicate the "value"
5739  //  field should be used during the property registration.
5740  prop_desc.is_value_defined = true;
5741
5742  // set the "value" field to the number 33
5743  prop_desc.value = value_to_set;
5744
5745  // add the property as "my_prop" for the global object
5746  jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "my_prop");
5747  jerry_value_t return_value = jerry_define_own_property (global_obj_val, prop_name, &prop_desc);
5748  if (jerry_value_is_error (return_value))
5749  {
5750    // there was an error
5751  }
5752
5753  // if there was no error at this point the global object should have a "my_prop" property
5754
5755  jerry_release_value (return_value);
5756  jerry_release_value (prop_name);
5757
5758  jerry_free_property_descriptor_fields (&prop_desc);
5759  jerry_release_value (global_obj_val);
5760
5761  jerry_cleanup ();
5762  return 0;
5763}
5764```
5765
5766
5767Registering a getter/setter property via the `jerry_define_own_property` method:
5768
5769[doctest]: # (name="02.API-REFERENCE-define-property-getset.c")
5770
5771```c
5772#include <stdio.h>
5773#include <string.h>
5774#include "jerryscript.h"
5775
5776static int counter = 0;
5777
5778static jerry_value_t
5779method_getter (const jerry_value_t this_obj,
5780               const jerry_value_t func_obj,
5781               const jerry_value_t args[],
5782               const jerry_length_t argc)
5783{
5784  counter++;
5785  printf("Getter called, returning: %d\n", counter);
5786
5787  return jerry_create_number (counter);
5788}
5789
5790static jerry_value_t
5791method_setter (const jerry_value_t this_obj,
5792               const jerry_value_t func_obj,
5793               const jerry_value_t args[],
5794               const jerry_length_t argc)
5795{
5796  // Note: the arguments count and type should be checked
5797  // in this example it is ommitted!
5798
5799  double new_value = jerry_get_number_value (args[0]);
5800  counter = (int) new_value;
5801
5802  printf("Setter called, setting: %d\n", counter);
5803
5804  return jerry_create_undefined ();
5805}
5806
5807int
5808main (void)
5809{
5810  jerry_init (JERRY_INIT_EMPTY);
5811
5812  jerry_value_t global_obj_val = jerry_get_global_object ();
5813
5814  // configure the property
5815  jerry_property_descriptor_t prop_desc;
5816  jerry_init_property_descriptor_fields (&prop_desc);
5817
5818  // set the property descriptor fields:
5819
5820  prop_desc.is_get_defined = true;
5821  prop_desc.getter = jerry_create_external_function (method_getter);
5822  prop_desc.is_set_defined = true;
5823  prop_desc.setter = jerry_create_external_function (method_setter);
5824
5825  // add the property as "my_prop" for the global object
5826  jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "my_prop");
5827  jerry_value_t return_value = jerry_define_own_property (global_obj_val, prop_name, &prop_desc);
5828  if (jerry_value_is_error (return_value))
5829  {
5830    // there was an error
5831  }
5832
5833  // if there was no error at this point the global object should have a "my_prop" property
5834
5835  jerry_release_value (return_value);
5836  jerry_release_value (prop_name);
5837
5838  jerry_free_property_descriptor_fields (&prop_desc);
5839  jerry_release_value (global_obj_val);
5840
5841  // run an example js code to use the getter/setters
5842
5843  const char *src_p = "this.my_prop; this.my_prop; this.my_prop = 4; this.my_prop";
5844  jerry_value_t eval_result = jerry_eval ((const jerry_char_t *) src_p, strlen (src_p), JERRY_PARSE_NO_OPTS);
5845
5846  // "eval_result" is the last result of "this.my_prop" that is "5" currently.
5847  double result_number = jerry_get_number_value (eval_result);
5848  printf("output: %lf\n", result_number);
5849
5850  jerry_cleanup ();
5851
5852  return result_number != 5.0;
5853}
5854```
5855
5856**See also**
5857
5858- [jerry_property_descriptor_t](#jerry_property_descriptor_t)
5859- [jerry_init_property_descriptor_fields](#jerry_init_property_descriptor_fields)
5860- [jerry_get_own_property_descriptor](#jerry_get_own_property_descriptor)
5861- [jerry_free_property_descriptor_fields](#jerry_free_property_descriptor_fields)
5862
5863
5864## jerry_get_own_property_descriptor
5865
5866**Summary**
5867
5868Construct property descriptor from specified property.
5869
5870**Prototype**
5871
5872```c
5873bool
5874jerry_get_own_property_descriptor (const jerry_value_t  obj_val,
5875                                   const jerry_value_t prop_name_val,
5876                                   jerry_property_descriptor_t *prop_desc_p);
5877```
5878
5879- `obj_val` - object value
5880- `prop_name_val` - property name
5881- `prop_desc_p` - pointer to property descriptor
5882- return value
5883
5884**Example**
5885
5886```c
5887{
5888  jerry_value_t global_obj_val = jerry_get_global_object ();
5889
5890  jerry_property_descriptor_t prop_desc;
5891  jerry_init_property_descriptor_fields (&prop_desc);
5892
5893  jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "my_prop");
5894  jerry_get_own_property_descriptor (global_obj_val, prop_name, &prop_desc);
5895  jerry_release_value (prop_name);
5896
5897  ... // usage of property descriptor
5898
5899  jerry_free_property_descriptor_fields (&prop_desc);
5900  jerry_release_value (global_obj_val);
5901}
5902```
5903
5904**See also**
5905
5906- [jerry_property_descriptor_t](#jerry_property_descriptor_t)
5907- [jerry_init_property_descriptor_fields](#jerry_init_property_descriptor_fields)
5908- [jerry_define_own_property](#jerry_define_own_property)
5909- [jerry_free_property_descriptor_fields](#jerry_free_property_descriptor_fields)
5910
5911
5912## jerry_free_property_descriptor_fields
5913
5914**Summary**
5915
5916Free fields of property descriptor (setter, getter and value).
5917
5918**Prototype**
5919
5920```c
5921void
5922jerry_free_property_descriptor_fields (const jerry_property_descriptor_t *prop_desc_p);
5923```
5924
5925- `prop_desc_p` - pointer to property descriptor
5926
5927**Example**
5928
5929```c
5930{
5931  jerry_property_descriptor_t prop_desc;
5932  jerry_init_property_descriptor_fields (&prop_desc);
5933
5934  ... // usage of property descriptor
5935
5936  jerry_free_property_descriptor_fields (&prop_desc);
5937}
5938```
5939
5940**See also**
5941
5942- [jerry_init_property_descriptor_fields](#jerry_init_property_descriptor_fields)
5943- [jerry_define_own_property](#jerry_define_own_property)
5944- [jerry_get_own_property_descriptor](#jerry_get_own_property_descriptor)
5945
5946
5947## jerry_call_function
5948
5949**Summary**
5950
5951Call function specified by a function value. Error flag must
5952not be set for any arguments of this function. Value of `this`
5953parameter should be set to `undefined` for non-method calls.
5954
5955*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
5956is no longer needed.
5957
5958**Prototype**
5959
5960```c
5961jerry_value_t
5962jerry_call_function (const jerry_value_t func_obj_val,
5963                     const jerry_value_t this_val,
5964                     const jerry_value_t args_p[],
5965                     jerry_size_t args_count);
5966```
5967
5968- `func_obj_val` - the function object to call
5969- `this_val` - object for 'this' binding
5970- `args_p` - function's call arguments
5971- `args_count` - number of arguments
5972- return value - returned jerry value of the called function
5973
5974**Example**
5975
5976```c
5977{
5978  jerry_value_t target_function;
5979
5980  ... // create or get "target_function"
5981
5982  if (jerry_value_is_function (target_function))
5983  {
5984    jerry_value_t this_val = jerry_create_undefined ();
5985    jerry_value_t ret_val = jerry_call_function (target_function, this_val, NULL, 0);
5986
5987    if (!jerry_value_is_error (ret_val))
5988    {
5989      ... // handle return value
5990    }
5991
5992    jerry_release_value (ret_val);
5993    jerry_release_value (this_val);
5994  }
5995
5996  jerry_release_value (target_function);
5997}
5998```
5999
6000**See also**
6001
6002- [jerry_is_function](#jerry_is_function)
6003- [jerry_create_external_function](#jerry_create_external_function)
6004
6005
6006## jerry_construct_object
6007
6008**Summary**
6009
6010Construct object, invoking specified function object as constructor.
6011Error flag must not be set for any arguments of this function.
6012
6013*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
6014is no longer needed.
6015
6016**Prototype**
6017
6018```c
6019jerry_value_t
6020jerry_construct_object (const jerry_value_t func_obj_val,
6021                        const jerry_value_t args_p[],
6022                        jerry_size_t args_count);
6023```
6024
6025- `func_obj_val` - function object to call
6026- `args_p` - function's call arguments
6027- `args_count` - number of arguments
6028- return value - returned value of the invoked constructor
6029
6030**Example**
6031
6032```c
6033{
6034  jerry_value_t val;
6035
6036  ... // receiving val
6037
6038  if (jerry_is_constructor (val))
6039  {
6040    jerry_value_t ret_val = jerry_construct_object (val, NULL, 0);
6041
6042    if (!jerry_value_is_error (ret_val))
6043    {
6044      ... // handle return value
6045    }
6046
6047    jerry_release_value (ret_val);
6048  }
6049}
6050```
6051
6052**See also**
6053
6054 - [jerry_is_constructor](#jerry_is_constructor)
6055
6056
6057## jerry_get_object_keys
6058
6059**Summary**
6060
6061Get keys of the specified object value.
6062
6063*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
6064is no longer needed.
6065
6066**Prototype**
6067
6068```c
6069jerry_value_t
6070jerry_get_object_keys (const jerry_value_t obj_val);
6071```
6072
6073- `obj_val` - object value
6074- return value
6075  - array object value, if success
6076  - thrown error, otherwise
6077
6078**Example**
6079
6080```c
6081{
6082  jerry_value_t object;
6083  ... // create or acquire object
6084
6085  jerry_value_t keys_array = jerry_get_object_keys (object);
6086
6087  ... // usage of keys_array
6088
6089  jerry_release_value (keys_array);
6090}
6091```
6092
6093**See also**
6094
6095- [jerry_get_property](#jerry_get_property)
6096- [jerry_set_property](#jerry_set_property)
6097
6098
6099## jerry_get_prototype
6100
6101**Summary**
6102
6103Get the prototype of the specified object.
6104
6105*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
6106is no longer needed.
6107
6108**Prototype**
6109
6110```c
6111jerry_value_t
6112jerry_get_prototype (const jerry_value_t obj_val);
6113```
6114
6115- `obj_val` - object value
6116- return value
6117  - object value, if success
6118  - null or thrown error, otherwise
6119
6120**Example**
6121
6122```c
6123{
6124  jerry_value_t object;
6125  ... // create or acquire object
6126
6127  jerry_value_t prototype = jerry_get_prototype (object);
6128
6129  ... // usage of prototype object
6130
6131  jerry_release_value (prototype);
6132  jerry_release_value (object);
6133}
6134```
6135
6136**See also**
6137
6138- [jerry_set_prototype](#jerry_set_prototype)
6139
6140
6141## jerry_set_prototype
6142
6143**Summary**
6144
6145Set the prototype of the specified object.
6146
6147*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
6148is no longer needed.
6149
6150**Prototype**
6151
6152```c
6153jerry_value_t
6154jerry_set_prototype (const jerry_value_t obj_val,
6155                     const jerry_value_t proto_obj_val);
6156```
6157
6158- `obj_val` - object value
6159- `proto_obj_val` - prototype object value
6160- return value
6161  - true, if success
6162  - thrown error, otherwise
6163
6164**Example**
6165
6166```c
6167{
6168  jerry_value_t object;
6169  jerry_value_t prototype;
6170
6171  ... // create or acquire object and prototype
6172
6173  jerry_value_t ret_val = jerry_set_prototype (object, prototype);
6174
6175  jerry_release_value (ret_val);
6176  jerry_release_value (prototype);
6177  jerry_release_value (object);
6178}
6179```
6180
6181**See also**
6182
6183- [jerry_get_prototype](#jerry_get_prototype)
6184
6185
6186## jerry_get_object_native_pointer
6187
6188**Summary**
6189
6190Get native pointer by the given type information.
6191The pointer and the type information are previously associated with the object by
6192[jerry_set_object_native_pointer](#jerry_set_object_native_pointer).
6193
6194*Note*: `out_native_pointer_p` can be NULL, and it means the
6195        caller doesn't want to get the native_pointer.
6196
6197**Prototype**
6198
6199```c
6200bool
6201jerry_get_object_native_pointer (const jerry_value_t obj_val,
6202                                 void **out_native_pointer_p,
6203                                 const jerry_object_native_info_t *native_info_p)
6204```
6205
6206- `obj_val` - object value to get native pointer from.
6207- `out_native_pointer_p` - native pointer (output parameter).
6208- `native_info_p` - native pointer's type information.
6209- return value
6210  - true, if there is native pointer associated of the specified object with the given native type info
6211  - false, otherwise
6212
6213*New in version 2.0*: Changed from `jerry_get_object_native_handle`.
6214
6215**Example**
6216
6217[doctest]: # ()
6218
6219```c
6220#include <stdio.h>
6221#include <stdlib.h>
6222#include <string.h>
6223#include "jerryscript.h"
6224
6225typedef struct
6226{
6227  char *data_p;
6228  unsigned int length;
6229} buffer_native_object_t;
6230
6231typedef struct
6232{
6233  int area;
6234  int perimeter;
6235} shape_native_object_t;
6236
6237#define SECRET_INFO ((void *) 42)
6238
6239static void
6240buffer_native_freecb (void *native_p)
6241{
6242  char *data_p = ((buffer_native_object_t*)native_p)->data_p;
6243
6244  if (data_p != NULL)
6245  {
6246    free (data_p);
6247  }
6248
6249  free (native_p);
6250}
6251
6252static void
6253shape_native_freecb (void *native_p)
6254{
6255  free (native_p);
6256}
6257
6258static void
6259destructor_freecb (void *native_p)
6260{
6261   printf("Note: the object has been freed\n");
6262}
6263
6264// NOTE: The address (!) of type_info acts as a way to uniquely "identify" the
6265// C type `buffer_native_object_t *`.
6266static const jerry_object_native_info_t buffer_obj_type_info =
6267{
6268  .free_cb = buffer_native_freecb
6269};
6270
6271// NOTE: The address (!) of type_info acts as a way to uniquely "identify" the
6272// C type `shape_native_object_t *`.
6273static const jerry_object_native_info_t shape_obj_type_info =
6274{
6275  .free_cb = shape_native_freecb
6276};
6277
6278// NOTE: The address (!) of type_info is the unique "identifier"
6279static const jerry_object_native_info_t destructor_obj_type_info =
6280{
6281  .free_cb = destructor_freecb
6282};
6283
6284static void
6285print_buffer (char *data_p,
6286              unsigned int length)
6287{
6288  for (unsigned int i = 0; i < length; ++i)
6289  {
6290    printf("%c", data_p[i]);
6291  }
6292
6293  printf("\n");
6294}
6295
6296static void
6297do_stuff (jerry_value_t object)
6298{
6299  void *native_p;
6300  bool has_p = jerry_get_object_native_pointer (object, &native_p, &buffer_obj_type_info);
6301
6302  if (!has_p)
6303  {
6304    // Process the error
6305    return;
6306  }
6307
6308  // It is safe to cast to buffer_native_object_t * and dereference the pointer:
6309  buffer_native_object_t *buffer_p = (buffer_native_object_t *) native_p;
6310  print_buffer (buffer_p->data_p, buffer_p->length); // Usage of buffer_p
6311
6312  bool need_shape_info = true; // implementation dependent
6313
6314  if (need_shape_info)
6315  {
6316    has_p = jerry_get_object_native_pointer (object, &native_p, &shape_obj_type_info);
6317
6318    if (!has_p)
6319    {
6320      // Process the error
6321      return;
6322    }
6323
6324    // It is safe to cast to shape_native_object_t * and dereference the pointer:
6325    shape_native_object_t *shape_p = (shape_native_object_t *) native_p;
6326
6327    printf("Area: %d\tPerimeter: %d\n", shape_p->area, shape_p->perimeter); // Usage of shape_p
6328  }
6329
6330  bool need_secret_info = true; // implementation dependent
6331
6332  if (need_secret_info)
6333  {
6334    has_p = jerry_get_object_native_pointer (object, &native_p, NULL);
6335
6336    if (!has_p)
6337    {
6338      // Process the error
6339      return;
6340    }
6341
6342    printf("Secret: %d\n", (int)((uintptr_t) native_p)); // Usage of native_p
6343
6344    bool deleted = jerry_delete_object_native_pointer (object, NULL);
6345
6346    if (deleted)
6347    {
6348      printf("The secret is no longer available\n");
6349    }
6350  }
6351}
6352
6353int
6354main (void)
6355{
6356  jerry_init (JERRY_INIT_EMPTY);
6357
6358  jerry_value_t object = jerry_create_object ();
6359  buffer_native_object_t *buffer_p = (buffer_native_object_t *) malloc (sizeof (buffer_native_object_t));
6360  buffer_p->length = 14;
6361  buffer_p->data_p = (char *) malloc (buffer_p->length * sizeof (char));
6362  memcpy (buffer_p->data_p, "My buffer data", buffer_p->length);
6363  jerry_set_object_native_pointer (object, buffer_p, &buffer_obj_type_info);
6364
6365  shape_native_object_t *shape_p = (shape_native_object_t *) malloc (sizeof (shape_native_object_t));
6366  shape_p->area = 6;
6367  shape_p->perimeter = 12;
6368  jerry_set_object_native_pointer (object, shape_p, &shape_obj_type_info);
6369
6370  // The native pointer can be NULL. This gives possibily to get notified via the native type info's
6371  // free callback when the object has been freed by the GC.
6372  jerry_set_object_native_pointer (object, NULL, &destructor_obj_type_info);
6373
6374  // The native type info can be NULL as well. In this case the registered property is simply freed
6375  // when the object is freed by te GC.
6376  jerry_set_object_native_pointer (object, SECRET_INFO, NULL);
6377
6378  do_stuff (object);
6379
6380  jerry_release_value (object);
6381  jerry_cleanup ();
6382
6383  return 0;
6384}
6385```
6386
6387**See also**
6388
6389- [jerry_create_object](#jerry_create_object)
6390- [jerry_set_object_native_pointer](#jerry_set_object_native_pointer)
6391- [jerry_object_native_info_t](#jerry_object_native_info_t)
6392
6393
6394## jerry_set_object_native_pointer
6395
6396**Summary**
6397
6398Set native pointer and an optional type information for the specified object.
6399You can get them by calling [jerry_get_object_native_pointer](#jerry_get_object_native_pointer) later.
6400
6401*Notes*:
6402 - If a native pointer was already set for the object with the same type information, its value is updated.
6403 - If a non-NULL free callback is specified in the native type information,
6404   it will be called by the garbage collector when the object is freed.
6405 - If the object is only referenced via the "global" object (or one of it's "child"),
6406   the free callback will be invoked during the execution of `jerry_cleanup`.
6407 - The free callback can invoke API functions.
6408
6409*Note*: If possible do not store API values in native pointers, rather check
6410        [jerry_set_internal_property](#jerry_set_internal_property).
6411
6412**Prototype**
6413
6414```c
6415void
6416jerry_set_object_native_pointer (const jerry_value_t obj_val,
6417                                 void *native_p,
6418                                 const jerry_object_native_info_t *info_p)
6419```
6420
6421- `obj_val` - object to set native pointer in.
6422- `native_p` - native pointer.
6423- `info_p` - native pointer's type information or NULL. When used, this should
6424             be a long-lived pointer, usually a pointer to a
6425             `static const jerry_object_native_info_t` makes most sense.
6426
6427*New in version 2.0*: Changed from `jerry_set_object_native_handle`.
6428
6429**Example**
6430
6431See [jerry_get_object_native_pointer](#jerry_get_object_native_pointer) for a
6432best-practice example.
6433
6434**See also**
6435
6436- [jerry_create_object](#jerry_create_object)
6437- [jerry_get_object_native_pointer](#jerry_get_object_native_pointer)
6438- [jerry_object_native_info_t](#jerry_object_native_info_t)
6439
6440## jerry_delete_object_native_pointer
6441
6442**Summary**
6443
6444Delete the native pointer of the specified object associated with the given native type info.
6445
6446*Notes*:
6447 - If the specified object has no matching native pointer for the given native type info the operation has no effect.
6448 - The method does not invoke the free callback specified in the type info.
6449   If the native pointer should be freed then one must get the native pointer first and invoke the free callback manually
6450   before calling this method.
6451 - This operation cannot throw an exception.
6452
6453**Prototype**
6454
6455```c
6456bool
6457jerry_delete_object_native_pointer (const jerry_value_t obj_val,
6458                                    const jerry_object_native_info_t *info_p)
6459```
6460
6461- `obj_val` - object to delete native pointer from.
6462- `info_p` - native pointer's type information.
6463
6464*New in version 2.0*.
6465
6466**Example**
6467
6468See [jerry_get_object_native_pointer](#jerry_get_object_native_pointer) for a
6469best-practice example.
6470
6471**See also**
6472
6473- [jerry_create_object](#jerry_create_object)
6474- [jerry_get_object_native_pointer](#jerry_get_object_native_pointer)
6475- [jerry_get_object_native_pointer](#jerry_set_object_native_pointer)
6476- [jerry_object_native_info_t](#jerry_object_native_info_t)
6477
6478
6479## jerry_foreach_object_property
6480
6481**Summary**
6482
6483Applies the given function to every enumerable(!) property in the given object.
6484
6485The "iterator" `foreach_p` method should return `true` value to continue the iteration.
6486If the method returns `false` the iteration will end.
6487
6488**Prototype**
6489
6490```c
6491bool
6492jerry_foreach_object_property (jerry_value_t obj_val,
6493                               jerry_object_property_foreach_t foreach_p,
6494                               void *user_data_p);
6495```
6496
6497- `obj_val` - object value
6498- `foreach_p` - foreach function, that will be applied for each property
6499- `user_data_p` - user data for foreach function
6500- return value
6501  - true, if object fields traversal was performed successfully, i.e.:
6502    - no unhandled exceptions were thrown in object fields traversal
6503    - object fields traversal was stopped on callback that returned false
6504  - false, otherwise
6505
6506**Example**
6507
6508
6509[doctest]: # (name="02.API-REFERENCE-foreach-property.c")
6510
6511```c
6512#include <stdio.h>
6513#include "jerryscript.h"
6514
6515/* Example structure used as user data for the property iteration. */
6516struct iteration_data {
6517  int string_property_count;
6518};
6519
6520/*
6521 * Example foreach function to print out property names.
6522 */
6523static bool
6524foreach_function (const jerry_value_t prop_name,
6525                  const jerry_value_t prop_value,
6526                  void *user_data_p)
6527{
6528  if (jerry_value_is_string (prop_name)) {
6529    jerry_char_t string_buffer[128];
6530    jerry_size_t copied_bytes = jerry_substring_to_char_buffer (prop_name,
6531                                                                0,
6532                                                                127,
6533                                                                string_buffer,
6534                                                                127);
6535    string_buffer[copied_bytes] = '\0';
6536
6537    printf ("Property: %s\n", string_buffer);
6538
6539    struct iteration_data *data = (struct iteration_data *) user_data_p;
6540    data->string_property_count++;
6541  }
6542
6543  /* return true to continue iteration */
6544  return true;
6545}
6546
6547int
6548main (void)
6549{
6550  jerry_init (JERRY_INIT_EMPTY);
6551
6552  /* Construct an example object with a single property. */
6553  jerry_value_t object = jerry_create_object ();
6554  {
6555    jerry_value_t test_property = jerry_create_string ((const jerry_char_t *) "DemoProp");
6556    jerry_value_t test_value = jerry_create_number (3);
6557    /* By default all properties added to an object are enumerable. */
6558    jerry_value_t set_result = jerry_set_property (object, test_property, test_value);
6559    /* The `set_result` should be checked if it is an error or not. */
6560    jerry_release_value (set_result);
6561    jerry_release_value (test_value);
6562    jerry_release_value (test_property);
6563  }
6564
6565  /* Iterate on the object's properties with the given user data. */
6566  struct iteration_data user_data = { 0 };
6567
6568  bool iteration_result = jerry_foreach_object_property (object, foreach_function, &user_data);
6569  /* Check and process the `iteration_result` if required. */
6570
6571  jerry_release_value (object);
6572
6573  jerry_cleanup ();
6574
6575  return user_data.string_property_count == 0;
6576}
6577```
6578
6579**See also**
6580
6581- [jerry_object_property_foreach_t](#jerry_object_property_foreach_t)
6582
6583## jerry_objects_foreach
6584
6585**Summary**
6586
6587Iterate over all objects available in the engine.
6588
6589The "iterator" `foreach_p` method should return `true` value to continue the search.
6590If the method returns `false` the search for the object is finished.
6591
6592*Note*: Values obtained in `foreach_p` must be retained using [jerry_acquire_value](#jerry_acquire_value).
6593
6594**Prototype**
6595
6596```c
6597bool
6598jerry_objects_foreach (jerry_objects_foreach_t foreach_p,
6599                       void *user_data_p);
6600```
6601
6602- `foreach_p` - function that will be invoked for each object.
6603- `user_data_p` - User data to pass to the function.
6604- return value
6605  - `true`, if the search function terminated the traversal by returning `false`
6606  - `false`, if the end of the list of objects was reached
6607
6608*New in version 2.0*.
6609
6610**Example**
6611
6612[doctest]: # (name="02.API-REFERENCE-objects-foreach.c")
6613
6614```c
6615#include <stdio.h>
6616#include "jerryscript.h"
6617
6618/* Create a custom structure to guide the search and store the result. */
6619typedef struct
6620{
6621  jerry_value_t property_name;
6622  jerry_value_t result;
6623} find_my_object_info_t;
6624
6625/*
6626 * Find the first object with the given property.
6627 */
6628static bool
6629find_my_object (const jerry_value_t candidate,
6630                void *user_data_p)
6631{
6632  find_my_object_info_t *info_p = (find_my_object_info_t *) user_data_p;
6633
6634  /* Check if the given object has the required property. */
6635  jerry_value_t has_property = jerry_has_property (candidate, info_p->property_name);
6636  bool object_found = jerry_get_boolean_value (has_property);
6637
6638  if (object_found)
6639  {
6640    /* We found it, so we acquire the value and record it. */
6641    info_p->result = jerry_acquire_value (candidate);
6642  }
6643
6644  jerry_release_value (has_property);
6645
6646  /* If the object was not found continue the search. */
6647  return !object_found;
6648} /* find_my_object */
6649
6650int
6651main (void)
6652{
6653  int return_value = 0;
6654
6655  /* Initialize JerryScript engine. */
6656  jerry_init (JERRY_INIT_EMPTY);
6657
6658  /* Create the test object. */
6659  {
6660    jerry_value_t test_object = jerry_create_object ();
6661
6662    {
6663      jerry_value_t test_property = jerry_create_string ((const jerry_char_t *) "DemoProp");
6664      jerry_value_t test_value = jerry_create_number (3);
6665      jerry_value_t set_result = jerry_set_property (test_object, test_property, test_value);
6666      /* The `set_result` should be checked if it is an error or not. */
6667      jerry_release_value (set_result);
6668      jerry_release_value (test_value);
6669      jerry_release_value (test_property);
6670    }
6671
6672    {
6673      /* Register the test object into the global object. */
6674      jerry_value_t global_object = jerry_get_global_object ();
6675      jerry_value_t demo_property = jerry_create_string ((const jerry_char_t *) "DemoObject");
6676      jerry_value_t set_result = jerry_set_property (global_object, demo_property, test_object);
6677      /* The `set_result` should be checked if it is an error or not. */
6678      jerry_release_value (set_result);
6679      jerry_release_value (demo_property);
6680      jerry_release_value (global_object);
6681    }
6682
6683    jerry_release_value (test_object);
6684  }
6685
6686  /* Look up the test object base on a property name. */
6687  find_my_object_info_t search_info =
6688  {
6689    .property_name = jerry_create_string ((const jerry_char_t *) "DemoProp")
6690  };
6691
6692  if (jerry_objects_foreach (find_my_object, &search_info))
6693  {
6694    /* The search was successful. Do something useful with search_info.result. */
6695    // ...
6696    printf ("Object found\n");
6697
6698    /* Release the found object after we're done using it. */
6699    jerry_release_value (search_info.result);
6700  }
6701  else
6702  {
6703    /* The search has failed. */
6704    printf ("Object not found\n");
6705
6706    return_value = 1;
6707  }
6708
6709  jerry_release_value (search_info.property_name);
6710
6711  /* Engine cleanup */
6712  jerry_cleanup ();
6713  return return_value;
6714}
6715```
6716
6717**See also**
6718
6719- [jerry_objects_foreach_t](#jerry_objects_foreach_t)
6720
6721## jerry_objects_foreach_by_native_info
6722
6723**Summary**
6724
6725Iterate over all objects in the engine matching a certain native data type.
6726
6727The "iterator" `foreach_p` method should return `true` value to continue the search.
6728If the method returns `false` the search for the object is finished.
6729
6730*Note*: Values obtained in `foreach_p` must be retained using [jerry_acquire_value](#jerry_acquire_value).
6731
6732**Prototype**
6733
6734```c
6735bool
6736jerry_objects_foreach_by_native_info (const jerry_object_native_info_t *native_info_p,
6737                                      jerry_objects_foreach_by_native_info_t foreach_p,
6738                                      void *user_data_p);
6739```
6740
6741- `native_info_p` - native pointer's type information.
6742- `foreach_p` - function that will be invoked for each object.
6743- return value
6744  - `true`, if the search function terminated the traversal by returning `false`
6745  - `false`, if the end of the list of objects was reached
6746
6747*New in version 2.0*.
6748
6749**Example**
6750
6751[doctest]: # (name="02.API-REFERENCE-objects-foreach-nativeptr.c")
6752
6753```c
6754#include <stdio.h>
6755#include <stdlib.h>
6756#include "jerryscript.h"
6757
6758typedef struct
6759{
6760  int foo;
6761  bool bar;
6762} native_obj_t;
6763
6764typedef struct
6765{
6766  jerry_value_t found_object;
6767  native_obj_t *found_native_data_p;
6768
6769  int match_foo_value;
6770} find_object_data_t;
6771
6772static void native_freecb (void *native_p)
6773{
6774  /* `native_p` was allocated via malloc. */
6775  free (native_p);
6776} /* native_freecb */
6777
6778/*
6779 * NOTE: The address (!) of type_info acts as a way to uniquely "identify" the
6780 * C type `native_obj_t *`.
6781 */
6782static const jerry_object_native_info_t native_obj_type_info =
6783{
6784  .free_cb = native_freecb
6785};
6786
6787/*
6788 * Function creating JS object that is "backed" by a `native_obj_t`.
6789 */
6790static void
6791add_object_with_nativeptr (int foo_value)
6792{
6793  // construct object and native_set value:
6794  jerry_value_t test_object = jerry_create_object ();
6795  native_obj_t *native_obj_p = malloc (sizeof (*native_obj_p));
6796  native_obj_p->foo = foo_value;
6797  native_obj_p->bar = true;
6798
6799  jerry_set_object_native_pointer (test_object, native_obj_p, &native_obj_type_info);
6800
6801  /* Register the test object into the global object. */
6802  jerry_value_t global_object = jerry_get_global_object ();
6803  jerry_value_t demo_property = jerry_create_string ((const jerry_char_t *) "DemoObject");
6804  jerry_value_t set_result = jerry_set_property (global_object, demo_property, test_object);
6805  /* The `set_result` should be checked if it is an error or not. */
6806  jerry_release_value (set_result);
6807  jerry_release_value (demo_property);
6808  jerry_release_value (global_object);
6809
6810  jerry_release_value (test_object);
6811} /* create_object_with_nativeptr */
6812
6813/*
6814 * Example native method that searches for a JavaScript object
6815 * with a `native_obj_type_info` has the correct value.
6816 */
6817static bool
6818find_object (const jerry_value_t candidate, void *data_p, void *user_data_p)
6819{
6820  find_object_data_t *find_data_p = (find_object_data_t *) user_data_p;
6821  native_obj_t *native_obj_p = (native_obj_t *) data_p;
6822
6823  if (find_data_p->match_foo_value == native_obj_p->foo)
6824  {
6825    /* If the object was found, acquire it and store it in the user data. */
6826    find_data_p->found_object = jerry_acquire_value (candidate);
6827    find_data_p->found_native_data_p = native_obj_p;
6828
6829    /* Stop traversing over the objects. */
6830    return false;
6831  }
6832
6833  /* Indicate that the object was not found, so traversal must continue. */
6834  return true;
6835} /* find_object */
6836
6837int
6838main (void)
6839{
6840  jerry_init (JERRY_INIT_EMPTY);
6841
6842  add_object_with_nativeptr (4);
6843  add_object_with_nativeptr (3);
6844  add_object_with_nativeptr (2);
6845
6846  find_object_data_t find_data =
6847  {
6848    .match_foo_value = 3,
6849  };
6850
6851  if (jerry_objects_foreach_by_native_info (&native_obj_type_info, find_object, &find_data))
6852  {
6853    /* The object was found and is now stored in `find_data.found_object`. After using it, it must be released. */
6854    printf ("Object found, native foo value: %d\n", find_data.found_native_data_p->foo);
6855
6856    jerry_release_value (find_data.found_object);
6857  }
6858  else
6859  {
6860    printf ("Object not found\n");
6861  }
6862
6863  jerry_cleanup ();
6864
6865  return 0;
6866}
6867```
6868
6869**See also**
6870
6871- [jerry_create_object](#jerry_create_object)
6872- [jerry_set_object_native_pointer](#jerry_set_object_native_pointer)
6873- [jerry_get_object_native_pointer](#jerry_get_object_native_pointer)
6874- [jerry_object_native_info_t](#jerry_object_native_info_t)
6875- [jerry_objects_foreach](#jerry_objects_foreach)
6876
6877
6878# Input validator functions
6879
6880## jerry_is_valid_utf8_string
6881
6882**Summary**
6883
6884Check if a given character buffer is a valid UTF-8 string.
6885
6886**Notes**: Calling this method is safe in any time. It can be called
6887even before engine initialization.
6888
6889**Prototype**
6890
6891```c
6892bool
6893jerry_is_valid_utf8_string (const jerry_char_t *utf8_buf_p, /**< UTF-8 string */
6894                            jerry_size_t buf_size) /**< string size */
6895```
6896
6897- `utf8_buf_p` - UTF-8 input string buffer.
6898- `buf_size` - input string buffer size in bytes.
6899- return value
6900  - true, if the provided string was a valid UTF-8 string.
6901  - false, if the string is not valid as an UTF-8 string.
6902
6903*New in version 2.0*.
6904
6905**Example**
6906
6907[doctest]: # ()
6908
6909```c
6910#include "jerryscript.h"
6911
6912int
6913main (void)
6914{
6915  const jerry_char_t script[] = "print ('Hello, World!');";
6916  const jerry_size_t script_size = sizeof (script) - 1;
6917
6918  if (jerry_is_valid_utf8_string (script, script_size))
6919  {
6920    jerry_run_simple (script, script_size, JERRY_INIT_EMPTY);
6921  }
6922
6923  return 0;
6924}
6925```
6926
6927**See also**
6928
6929- [jerry_run_simple](#jerry_run_simple)
6930- [jerry_create_string_from_utf8](#jerry_create_string_from_utf8)
6931- [jerry_create_string_sz_from_utf8](#jerry_create_string_sz_from_utf8)
6932- [jerry_get_utf8_string_size](#jerry_get_utf8_string_size)
6933- [jerry_get_utf8_string_length](#jerry_get_utf8_string_length)
6934- [jerry_string_to_utf8_char_buffer](#jerry_string_to_utf8_char_buffer)
6935- [jerry_substring_to_utf8_char_buffer](#jerry_substring_to_utf8_char_buffer)
6936
6937## jerry_is_valid_cesu8_string
6938
6939**Summary**
6940
6941Check if a given character buffer is a valid CESU-8 string.
6942
6943**Notes**: Calling this method is safe in any time. It can be called
6944even before engine initialization.
6945
6946**Prototype**
6947
6948```c
6949bool
6950jerry_is_valid_cesu8_string (const jerry_char_t *cesu8_buf_p, /**< CESU-8 string */
6951                             jerry_size_t buf_size) /**< string size */
6952```
6953
6954- `cesu8_buf_p` - CESU-8 input string buffer.
6955- `buf_size` - input string buffer size in bytes.
6956- return value
6957  - true, if the provided string was a valid CESU-8 string.
6958  - false, if the string is not valid as a CESU-8 string.
6959
6960*New in version 2.0*.
6961
6962**Example**
6963
6964[doctest]: # ()
6965
6966```c
6967#include "jerryscript.h"
6968
6969int
6970main (void)
6971{
6972  jerry_init (JERRY_INIT_EMPTY);
6973
6974  const jerry_char_t script[] = "Hello, World!";
6975  const jerry_size_t script_size = sizeof (script) - 1;
6976
6977  if (jerry_is_valid_cesu8_string (script, script_size))
6978  {
6979    jerry_value_t string_value = jerry_create_string_sz (script,
6980                                                         script_size);
6981
6982    // usage of string_value
6983
6984    jerry_release_value (string_value);
6985  }
6986
6987  jerry_cleanup ();
6988  return 0;
6989}
6990```
6991
6992**See also**
6993
6994- [jerry_create_string](#jerry_create_string)
6995- [jerry_create_string_sz](#jerry_create_string_sz)
6996- [jerry_get_string_size](#jerry_get_string_size)
6997- [jerry_get_string_length](#jerry_get_string_length)
6998- [jerry_string_to_char_buffer](#jerry_string_to_char_buffer)
6999- [jerry_substring_to_char_buffer](#jerry_substring_to_char_buffer)
7000
7001
7002# Dynamic memory management functions
7003
7004## jerry_heap_alloc
7005
7006**Summary**
7007
7008Allocate memory on the engine's heap.
7009
7010*Note*: This function may take away memory from the executed JavaScript code.
7011If any other dynamic memory allocation API is available (e.g., libc malloc), it
7012should be used instead.
7013
7014**Prototype**
7015
7016```c
7017void *jerry_heap_alloc (size_t size);
7018```
7019
7020- `size`: size of the memory block.
7021- return value: non-NULL pointer, if the memory is successfully allocated,
7022                NULL otherwise.
7023
7024*New in version 2.0*.
7025
7026**See also**
7027
7028- [jerry_heap_free](#jerry_heap_free)
7029
7030## jerry_heap_free
7031
7032**Summary**
7033
7034Free memory allocated on the engine's heap.
7035
7036**Prototype**
7037
7038```c
7039void jerry_heap_free (void *mem_p, size_t size);
7040```
7041
7042- `mem_p`: value returned by `jerry_heap_alloc`.
7043- `size`: same size as passed to `jerry_heap_alloc`.
7044
7045*New in version 2.0*.
7046
7047**See also**
7048
7049- [jerry_heap_alloc](#jerry_heap_alloc)
7050
7051
7052# External context functions
7053
7054## jerry_create_context
7055
7056**Summary**
7057
7058Create an external JerryScript engine context.
7059
7060**Prototype**
7061
7062```c
7063jerry_context_t *
7064jerry_create_context (uint32_t heap_size,
7065                      jerry_context_alloc_t alloc,
7066                      void *cb_data_p);
7067```
7068
7069- `heap_size` - requested heap size of the JerryScript context
7070- `alloc` - function for allocation
7071- `cb_data_p` - user data
7072- return value
7073  - pointer to the newly created JerryScript context if success
7074  - NULL otherwise.
7075
7076*New in version 2.0*.
7077
7078**Example**
7079
7080[doctest]: # (test="compile", name="02.API-REFERENCE-create-context.c")
7081
7082```c
7083#include <stdlib.h>
7084#include <pthread.h>
7085
7086#include "jerryscript.h"
7087#include "jerryscript-port.h"
7088
7089/* A different Thread Local Storage variable for each jerry context. */
7090__thread jerry_context_t *tls_context;
7091
7092jerry_context_t *
7093jerry_port_get_current_context (void)
7094{
7095  /* Returns the context assigned to the thread. */
7096  return tls_context;
7097}
7098
7099/* Allocate JerryScript heap for each thread. */
7100static void *
7101context_alloc_fn (size_t size, void *cb_data)
7102{
7103  (void) cb_data;
7104  return malloc (size);
7105}
7106
7107static void *
7108thread_function (void *param)
7109{
7110  tls_context = jerry_create_context (512 * 1024,
7111                                      context_alloc_fn,
7112                                      NULL);
7113  jerry_init (JERRY_INIT_EMPTY);
7114  /* Run JerryScript in the context (e.g.: jerry_parse & jerry_run) */
7115  jerry_cleanup ();
7116
7117  /* Deallocate JerryScript context */
7118  free (tls_context);
7119
7120  return NULL;
7121}
7122
7123#define NUM_OF_THREADS 8
7124
7125int
7126main (void)
7127{
7128  pthread_t threads[NUM_OF_THREADS];
7129
7130  /* Create the threads. */
7131  for (int i = 0; i < NUM_OF_THREADS; i++)
7132  {
7133    pthread_create (&threads[i], NULL, thread_function, (void *) (intptr_t) i);
7134  }
7135
7136  /* Wait for the threads to complete, and release their resources. */
7137  for (int i = 0; i < NUM_OF_THREADS; i++)
7138  {
7139    pthread_join (threads[i], NULL);
7140  }
7141
7142  return 0;
7143}
7144```
7145
7146**See also**
7147
7148- [jerry_context_t](#jerry_context_t)
7149- [jerry_context_alloc_t](#jerry_context_alloc_t)
7150- [jerry_port_get_current_context](05.PORT-API.md#jerry_port_get_current_context)
7151
7152
7153# Snapshot functions
7154
7155## jerry_generate_snapshot
7156
7157**Summary**
7158
7159Generate snapshot from the specified source code.
7160
7161*Notes*:
7162- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
7163  is no longer needed.
7164- This API depends on a build option (`JERRY_SNAPSHOT_SAVE`) and can be checked in runtime with
7165  the `JERRY_FEATURE_SNAPSHOT_SAVE` feature enum value, see [jerry_is_feature_enabled](#jerry_is_feature_enabled).
7166  If the feature is not enabled the function will return an error.
7167
7168**Prototype**
7169
7170```c
7171jerry_value_t
7172jerry_generate_snapshot (const jerry_char_t *resource_name_p,
7173                         size_t resource_name_length,
7174                         const jerry_char_t *source_p,
7175                         size_t source_size,
7176                         uint32_t generate_snapshot_opts,
7177                         uint32_t *buffer_p,
7178                         size_t buffer_size);
7179```
7180
7181- `resource_name_p` - resource (file) name of the source code. Currently unused, the debugger may use it in the future.
7182- `resource_name_length` - length of resource name.
7183- `source_p` - script source, it must be a valid utf8 string.
7184- `source_size` - script source size, in bytes.
7185- `generate_snapshot_opts` - any combination of [jerry_generate_snapshot_opts_t](#jerry_generate_snapshot_opts_t) flags.
7186- `buffer_p` - output buffer (aligned to 4 bytes) to save snapshot to.
7187- `buffer_size` - the output buffer's size in bytes.
7188- return value
7189  - the size of the generated snapshot in bytes as number value, if it was generated succesfully (i.e. there
7190    are no syntax errors in source code, buffer size is sufficient, and snapshot support is enabled in
7191    current configuration through JERRY_SNAPSHOT_SAVE)
7192  - thrown error, otherwise.
7193
7194*New in version 2.0*.
7195
7196**Example**
7197
7198[doctest]: # ()
7199
7200```c
7201#include "jerryscript.h"
7202
7203int
7204main (void)
7205{
7206  jerry_init (JERRY_INIT_EMPTY);
7207
7208  static uint32_t global_mode_snapshot_buffer[256];
7209  const jerry_char_t script_to_snapshot[] = "(function () { return 'string from snapshot'; }) ();";
7210
7211  jerry_value_t generate_result;
7212  generate_result = jerry_generate_snapshot (NULL,
7213                                             0,
7214                                             script_to_snapshot,
7215                                             sizeof (script_to_snapshot) - 1,
7216                                             0,
7217                                             global_mode_snapshot_buffer,
7218                                             sizeof (global_mode_snapshot_buffer) / sizeof (uint32_t));
7219
7220  if (!jerry_value_is_error (generate_result))
7221  {
7222    size_t snapshot_size = (size_t) jerry_get_number_value (generate_result);
7223  }
7224
7225  jerry_release_value (generate_result);
7226
7227  jerry_cleanup ();
7228  return 0;
7229}
7230```
7231
7232**See also**
7233
7234- [jerry_init](#jerry_init)
7235- [jerry_cleanup](#jerry_cleanup)
7236- [jerry_generate_function_snapshot](#jerry_generate_function_snapshot)
7237- [jerry_exec_snapshot](#jerry_exec_snapshot)
7238
7239
7240## jerry_generate_function_snapshot
7241
7242**Summary**
7243
7244Generate function snapshot from the specified source code
7245with the given arguments.
7246
7247The function arguments and function body are
7248passed as separated arguments.
7249
7250*Notes*:
7251- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
7252  is no longer needed.
7253- This API depends on a build option (`JERRY_SNAPSHOT_SAVE`) and can be checked in runtime with
7254  the `JERRY_FEATURE_SNAPSHOT_SAVE` feature enum value, see [jerry_is_feature_enabled](#jerry_is_feature_enabled).
7255  If the feature is not enabled the function will return an error.
7256
7257**Prototype**
7258
7259```c
7260jerry_value_t
7261jerry_generate_function_snapshot (const jerry_char_t *resource_name_p,
7262                                  size_t resource_name_length,
7263                                  const jerry_char_t *source_p,
7264                                  size_t source_size,
7265                                  const jerry_char_t *args_p,
7266                                  size_t args_size,
7267                                  uint32_t generate_snapshot_opts,
7268                                  uint32_t *buffer_p,
7269                                  size_t buffer_size)
7270```
7271
7272- `resource_name_p` - resource (file) name of the source code. Currently unused, the debugger may use it in the future.
7273- `resource_name_length` - length of resource name.
7274- `source_p` - script source, it must be a valid utf8 string.
7275- `source_size` - script source size, in bytes.
7276- `args_p` - function arguments, it must be a valid utf8 string.
7277- `args_size` - function argument size, in bytes.
7278- `generate_snapshot_opts` - any combination of [jerry_generate_snapshot_opts_t](#jerry_generate_snapshot_opts_t) flags.
7279- `buffer_p` - buffer (aligned to 4 bytes) to save snapshot to.
7280- `buffer_size` - the buffer's size in bytes.
7281- return value
7282  - the size of the generated snapshot in bytes as number value, if it was generated succesfully (i.e. there
7283    are no syntax errors in source code, buffer size is sufficient, and snapshot support is enabled in
7284    current configuration through JERRY_SNAPSHOT_SAVE)
7285  - thrown error, otherwise.
7286
7287*New in version 2.0*.
7288
7289**Example**
7290
7291[doctest]: # ()
7292
7293```c
7294#include "jerryscript.h"
7295
7296int
7297main (void)
7298{
7299  jerry_init (JERRY_INIT_EMPTY);
7300
7301  static uint32_t func_snapshot_buffer[256];
7302  const jerry_char_t args[] = "a, b";
7303  const jerry_char_t src[] = "return a + b;";
7304
7305  jerry_value_t generate_result;
7306  generate_result = jerry_generate_function_snapshot (NULL,
7307                                                      0,
7308                                                      src,
7309                                                      sizeof (src) - 1,
7310                                                      args,
7311                                                      sizeof (args) - 1,
7312                                                      0,
7313                                                      func_snapshot_buffer,
7314                                                      sizeof (func_snapshot_buffer) / sizeof (uint32_t));
7315
7316  if (!jerry_value_is_error (generate_result))
7317  {
7318    size_t snapshot_size = (size_t) jerry_get_number_value (generate_result);
7319  }
7320
7321  jerry_release_value (generate_result);
7322
7323  jerry_cleanup ();
7324  return 0;
7325}
7326```
7327
7328**See also**
7329
7330- [jerry_init](#jerry_init)
7331- [jerry_cleanup](#jerry_cleanup)
7332- [jerry_generate_snapshot](#jerry_generate_snapshot)
7333- [jerry_load_function_snapshot_at](#jerry_load_function_snapshot_at)
7334
7335
7336## jerry_exec_snapshot
7337
7338**Summary**
7339
7340Execute snapshot from the specified buffer.
7341
7342*Notes*:
7343- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
7344  is no longer needed.
7345- This API depends on a build option (`JERRY_SNAPSHOT_EXEC`) and can be checked in runtime with
7346  the `JERRY_FEATURE_SNAPSHOT_EXEC` feature enum value, see [jerry_is_feature_enabled](#jerry_is_feature_enabled).
7347  If the feature is not enabled the function will return an error.
7348
7349**Prototype**
7350
7351```c
7352jerry_value_t
7353jerry_exec_snapshot (const uint32_t *snapshot_p,
7354                     size_t snapshot_size,
7355                     size_t func_index,
7356                     uint32_t exec_snapshot_opts);
7357```
7358
7359- `snapshot_p` - pointer to snapshot.
7360- `snapshot_size` - size of snapshot in bytes.
7361- `func_index` - index of executed function.
7362- `exec_snapshot_opts` - any combination of [jerry_exec_snapshot_opts_t](#jerry_exec_snapshot_opts_t) flags.
7363- return value
7364  - result of bytecode, if run was successful.
7365  - thrown error, otherwise (an error is reported if the snapshot execution feature is not enabled).
7366
7367*Changed in version 2.0*: Added `func_index` and `exec_snapshot_opts` arguments. Removed the `copy_bytecode` last argument.
7368
7369**Example**
7370
7371[doctest]: # ()
7372
7373```c
7374#include "jerryscript.h"
7375
7376int
7377main (void)
7378{
7379  static uint32_t global_mode_snapshot_buffer[256];
7380  const jerry_char_t script_to_snapshot[] = "(function () { return 'string from snapshot'; }) ();";
7381
7382  jerry_init (JERRY_INIT_EMPTY);
7383
7384  jerry_value_t generate_result;
7385  generate_result = jerry_generate_snapshot (NULL,
7386                                             0,
7387                                             script_to_snapshot,
7388                                             sizeof (script_to_snapshot) - 1,
7389                                             0,
7390                                             global_mode_snapshot_buffer,
7391                                             sizeof (global_mode_snapshot_buffer) / sizeof (uint32_t));
7392  // generate_result should be checked if it is an error or not
7393
7394  size_t global_mode_snapshot_size = (size_t) jerry_get_number_value (generate_result);
7395  jerry_release_value (generate_result);
7396
7397  jerry_cleanup ();
7398
7399  jerry_init (JERRY_INIT_EMPTY);
7400
7401  jerry_value_t res = jerry_exec_snapshot (global_mode_snapshot_buffer,
7402                                           global_mode_snapshot_size,
7403                                           0,
7404                                           0);
7405
7406  // check the `res` value for error and process the result.
7407
7408  jerry_release_value (res);
7409
7410  jerry_cleanup ();
7411  return 0;
7412}
7413```
7414
7415**See also**
7416
7417- [jerry_init](#jerry_init)
7418- [jerry_cleanup](#jerry_cleanup)
7419- [jerry_parse_and_save_snapshot](#jerry_parse_and_save_snapshot)
7420
7421
7422## jerry_load_function_snapshot
7423
7424**Summary**
7425
7426Load the selected snapshot function from the specified buffer as a function object.
7427
7428The lexical environment of the loaded function is always the global lexical environment.
7429
7430*Notes*:
7431- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
7432  is no longer needed.
7433- This API depends on a build option (`JERRY_SNAPSHOT_EXEC`) and can be checked in runtime with
7434  the `JERRY_FEATURE_SNAPSHOT_EXEC` feature enum value, see [jerry_is_feature_enabled](#jerry_is_feature_enabled).
7435  If the feature is not enabled the function will return an error.
7436
7437**Prototype**
7438
7439```c
7440jerry_value_t
7441jerry_load_function_snapshot (const uint32_t *snapshot_p,
7442                              size_t snapshot_size,
7443                              size_t func_index,
7444                              uint32_t exec_snapshot_opts);
7445```
7446
7447- `snapshot_p` - pointer to snapshot.
7448- `snapshot_size` - size of snapshot in bytes.
7449- `func_index` - index of function to load from the snapshot.
7450- `exec_snapshot_opts` - any combination of [jerry_exec_snapshot_opts_t](#jerry_exec_snapshot_opts_t) flags.
7451- return value
7452  - function object built from the snapshot.
7453  - thrown error, otherwise.
7454
7455*New in version 2.0*.
7456
7457**Example**
7458
7459[doctest]: # ()
7460
7461```c
7462#include "jerryscript.h"
7463
7464int
7465main (void)
7466{
7467  static uint32_t snapshot_buffer[256];
7468  const jerry_char_t func_args[] = "a, b";
7469  const jerry_char_t func_src[] = "return a + b;";
7470
7471  jerry_init (JERRY_INIT_EMPTY);
7472
7473  jerry_value_t generate_result;
7474  generate_result = jerry_generate_function_snapshot (NULL,
7475                                                      0,
7476                                                      func_src,
7477                                                      sizeof (func_src) - 1,
7478                                                      func_args,
7479                                                      sizeof (func_args) - 1,
7480                                                      false,
7481                                                      snapshot_buffer,
7482                                                      sizeof (snapshot_buffer) / sizeof (uint32_t));
7483
7484  size_t snapshot_size = (size_t) jerry_get_number_value (generate_result);
7485  jerry_release_value (generate_result);
7486
7487  jerry_cleanup ();
7488
7489  jerry_init (JERRY_INIT_EMPTY);
7490
7491  jerry_value_t func = jerry_load_function_snapshot (snapshot_buffer,
7492                                                     snapshot_size,
7493                                                     0,
7494                                                     0);
7495  /* 'func' can be used now as a function object */
7496
7497  jerry_value_t this_value = jerry_create_undefined ();
7498  jerry_value_t args[2];
7499  args[0] = jerry_create_number (1.0);
7500  args[1] = jerry_create_number (2.0);
7501
7502  jerry_value_t res = jerry_call_function (func, this_value, args, 2);
7503
7504  /* 'res' now contains the value 3 as a jerry_value_t */
7505
7506  jerry_release_value (args[0]);
7507  jerry_release_value (args[1]);
7508  jerry_release_value (this_value);
7509  jerry_release_value (func);
7510
7511  jerry_cleanup ();
7512  return 0;
7513}
7514```
7515
7516**See also**
7517
7518- [jerry_init](#jerry_init)
7519- [jerry_cleanup](#jerry_cleanup)
7520- [jerry_parse_and_save_function_snapshot](#jerry_parse_and_save_function_snapshot)
7521
7522
7523## jerry_get_literals_from_snapshot
7524
7525**Summary**
7526
7527Collect the used literals from the given snapshot and save them into a buffer in list or C format.
7528None of these literals are magic strings. In C format only valid identifiers are collected.
7529
7530*Note*:
7531- This API depends on a build option (`JERRY_SNAPSHOT_SAVE`) and can be checked in runtime with
7532  the `JERRY_FEATURE_SNAPSHOT_SAVE` feature enum value, see [jerry_is_feature_enabled](#jerry_is_feature_enabled).
7533  If the feature is not enabled the function will return zero.
7534
7535**Prototype**
7536
7537```c
7538size_t
7539jerry_get_literals_from_snapshot (const uint32_t *snapshot_p,
7540                                  size_t snapshot_size,
7541                                  jerry_char_t *lit_buf_p,
7542                                  size_t lit_buf_size,
7543                                  bool is_c_format);
7544```
7545
7546- `snapshot_p` - input snapshot buffer.
7547- `snapshot_size` - size of snapshot in bytes.
7548- `lit_buf_p` - buffer to save literals to.
7549- `lit_buf_size` - the buffer's size.
7550- `is_c_format` - the output format would be C-style (true) or a simple list (false).
7551- return value
7552  - the size of the literal-list, if it was generated succesfully (i.e. the list of literals isn't empty,
7553    and literal-save support is enabled in current configuration through JERRY_SNAPSHOT_SAVE)
7554  - 0 otherwise.
7555
7556*New in version 2.0*.
7557
7558**Example**
7559
7560[doctest]: # (test="link")
7561
7562```c
7563#include <stdio.h>
7564#include "jerryscript.h"
7565
7566int
7567main (void)
7568{
7569  jerry_init (JERRY_INIT_EMPTY);
7570
7571  static jerry_char_t literal_buffer[256];
7572  static uint32_t snapshot_buffer[256];
7573  const jerry_char_t script_for_literal_save[] = "var obj = { a:'aa', bb:'Bb' }";
7574
7575  jerry_value_t generate_result = jerry_generate_snapshot (NULL,
7576                                                           0,
7577                                                           script_for_literal_save,
7578                                                           sizeof (script_for_literal_save) - 1,
7579                                                           0,
7580                                                           snapshot_buffer,
7581                                                           256);
7582  size_t snapshot_size = (size_t) jerry_get_number_value (generate_result);
7583  jerry_release_value (generate_result);
7584
7585  const size_t literal_size = jerry_get_literals_from_snapshot (snapshot_buffer,
7586                                                                snapshot_size,
7587                                                                literal_buffer,
7588                                                                256,
7589                                                                true);
7590
7591  if (literal_size != 0)
7592  {
7593    FILE *literal_file_p = fopen ("literals.h", "wb");
7594    fwrite (literal_buffer, sizeof (uint8_t), literal_size, literal_file_p);
7595    fclose (literal_file_p);
7596  }
7597
7598  jerry_cleanup ();
7599  return 0;
7600}
7601```
7602
7603**See also**
7604
7605- [jerry_init](#jerry_init)
7606- [jerry_cleanup](#jerry_cleanup)
7607- [jerry_register_magic_strings](#jerry_register_magic_strings)
7608
7609
7610# Miscellaneous functions
7611
7612## jerry_set_vm_exec_stop_callback
7613
7614**Summary**
7615
7616When JERRY_FEATURE_VM_EXEC_STOP is enabled a callback function can be
7617specified by this function. This callback is periodically called when
7618JerryScript executes an ECMAScript program.
7619
7620If the callback returns with undefined value the ECMAScript execution
7621continues. Otherwise the result is thrown by the engine (if the error
7622flag is not set for the returned value the engine automatically sets
7623it). The callback function might be called again even if it threw
7624an error. In this case the function must throw the same error again.
7625
7626To reduce the CPU overhead of constantly checking the termination
7627condition the callback is called when a backward jump is executed
7628or an exception is caught. Setting the `frequency` to a greater
7629than `1` value reduces this overhead further. If its value is N
7630only every Nth event (backward jump, etc.) trigger the next check.
7631
7632
7633**Prototype**
7634
7635```c
7636void
7637jerry_set_vm_exec_stop_callback (jerry_vm_exec_stop_callback_t stop_cb,
7638                                 void *user_p,
7639                                 uint32_t frequency);
7640```
7641
7642- `stop_cb` - periodically called callback (passing NULL disables this feature)
7643- `user_p` - user pointer passed to the `stop_cb` function
7644- `frequency` - frequency of calling the `stop_cb` function
7645
7646*New in version 2.0*.
7647
7648**Example**
7649
7650[doctest]: # (test="link")
7651
7652```c
7653#include "jerryscript.h"
7654
7655static int countdown = 10;
7656
7657static jerry_value_t
7658vm_exec_stop_callback (void *user_p)
7659{
7660  while (countdown > 0)
7661  {
7662    countdown--;
7663    return jerry_create_undefined ();
7664  }
7665
7666  // The error flag is added automatically.
7667  return jerry_create_string ((const jerry_char_t *) "Abort script");
7668}
7669
7670int
7671main (void)
7672{
7673  jerry_init (JERRY_INIT_EMPTY);
7674
7675  jerry_set_vm_exec_stop_callback (vm_exec_stop_callback, &countdown, 16);
7676
7677  // Inifinte loop.
7678  const jerry_char_t script[] = "while(true) {}";
7679
7680  jerry_value_t parsed_code = jerry_parse (NULL, 0, script, sizeof (script) - 1, JERRY_PARSE_NO_OPTS);
7681  jerry_release_value (jerry_run (parsed_code));
7682  jerry_release_value (parsed_code);
7683  jerry_cleanup ();
7684}
7685```
7686
7687**See also**
7688
7689- [jerry_init](#jerry_init)
7690- [jerry_cleanup](#jerry_cleanup)
7691- [jerry_parse](#jerry_parse)
7692- [jerry_run](#jerry_run)
7693- [jerry_vm_exec_stop_callback_t](#jerry_vm_exec_stop_callback_t)
7694
7695## jerry_get_backtrace
7696
7697**Summary**
7698
7699Get backtrace. The backtrace is an array of strings where
7700each string contains the position of the corresponding frame.
7701The array length is zero if the backtrace is not available.
7702
7703This function is typically called from native callbacks.
7704
7705*Notes*:
7706- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
7707is no longer needed.
7708- This feature depends on build option (`JERRY_LINE_INFO`) and can be checked
7709  in runtime with the `JERRY_FEATURE_LINE_INFO` feature enum value,
7710  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
7711
7712**Prototype**
7713
7714```c
7715jerry_value_t
7716jerry_get_backtrace (uint32_t max_depth);
7717```
7718
7719- `max_depth` - backtrace collection stops after reaching this value, 0 = unlimited
7720- return value
7721  - a newly constructed JS array
7722
7723*New in version 2.0*.
7724
7725**Example**
7726
7727[doctest]: # (name="02.API-REFERENCE-jsbacktrace.c")
7728
7729```c
7730#include <stdio.h>
7731#include <string.h>
7732#include "jerryscript.h"
7733
7734static jerry_value_t
7735backtrace_handler (const jerry_value_t function_obj,
7736                   const jerry_value_t this_val,
7737                   const jerry_value_t args_p[],
7738                   const jerry_length_t args_count)
7739{
7740  if (!jerry_is_feature_enabled (JERRY_FEATURE_LINE_INFO))
7741  {
7742    printf ("Line info disabled, no backtrace will be printed\n");
7743  }
7744
7745  /* If the line info feature is disabled an empty array will be returned. */
7746  jerry_value_t backtrace_array = jerry_get_backtrace (5);
7747  uint32_t array_length = jerry_get_array_length (backtrace_array);
7748
7749  for (uint32_t idx = 0; idx < array_length; idx++)
7750  {
7751    jerry_value_t property = jerry_get_property_by_index (backtrace_array, idx);
7752
7753    jerry_char_t string_buffer[64];
7754    jerry_size_t copied_bytes = jerry_substring_to_char_buffer (property,
7755                                                                0,
7756                                                                63,
7757                                                                string_buffer,
7758                                                                63);
7759    string_buffer[copied_bytes] = '\0';
7760    printf(" %d: %s\n", idx, string_buffer);
7761
7762    jerry_release_value (property);
7763  }
7764
7765  jerry_release_value (backtrace_array);
7766
7767  return jerry_create_undefined ();
7768} /* backtrace_handler */
7769
7770int
7771main (void)
7772{
7773  jerry_init (JERRY_INIT_EMPTY);
7774
7775  jerry_value_t global = jerry_get_global_object ();
7776
7777  /* Register the "dump_backtrace" method. */
7778  {
7779    jerry_value_t func = jerry_create_external_function (backtrace_handler);
7780    jerry_value_t name = jerry_create_string ((const jerry_char_t *) "backtrace");
7781    jerry_value_t result = jerry_set_property (global, name, func);
7782    jerry_release_value (result);
7783    jerry_release_value (name);
7784    jerry_release_value (func);
7785  }
7786
7787  jerry_release_value (global);
7788
7789  const char *source = ("function f() { g (); }\n"
7790                        "function g() { h (); }\n"
7791                        "function h() { backtrace (); }\n"
7792                        "f ();\n");
7793  const char *resource = "demo_memoryjs";
7794
7795  jerry_value_t program = jerry_parse ((const jerry_char_t *) resource,
7796                                       strlen (resource),
7797                                       (const jerry_char_t *) source,
7798                                       strlen (source),
7799                                       JERRY_PARSE_NO_OPTS);
7800  if (!jerry_value_is_error (program))
7801  {
7802    jerry_value_t run_result = jerry_run (program);
7803    jerry_release_value (run_result);
7804  }
7805
7806  jerry_release_value (program);
7807  jerry_cleanup ();
7808
7809  return 0;
7810}
7811```
7812
7813**See also**
7814
7815- [jerry_create_external_function](#jerry_create_external_function)
7816
7817
7818## jerry_get_resource_name
7819
7820**Summary**
7821
7822Get the resource name (usually a file name) of the currently executed script or the given function object.
7823
7824This function is typically called from native callbacks.
7825
7826*Notes*:
7827- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
7828is no longer needed.
7829- This feature depends on build option (`JERRY_LINE_INFO`) and can be checked
7830  in runtime with the `JERRY_FEATURE_LINE_INFO` feature enum value,
7831  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
7832
7833**Prototype**
7834
7835```c
7836jerry_value_t
7837jerry_get_resource_name (jerry_value_t value);
7838```
7839- `value` - api value to obtain the resource name from
7840- return string value constructed from
7841  - the currently executed function object's resource name, if the given value is undefined
7842  - resource name of the function object, if the given value is a function object
7843  - "<anonymous>", otherwise
7844
7845*New in version 2.2*.
7846
7847**Example**
7848
7849[doctest]: # (name="02.API-REFERENCE-jsresourcename.c")
7850
7851```c
7852#include <stdio.h>
7853#include <string.h>
7854#include "jerryscript.h"
7855
7856static jerry_value_t
7857resource_name_handler (const jerry_value_t function_obj,
7858                       const jerry_value_t this_val,
7859                       const jerry_value_t args_p[],
7860                       const jerry_length_t args_count)
7861{
7862  jerry_value_t undefined_value = jerry_create_undefined ();
7863  jerry_value_t resource_name = jerry_get_resource_name (args_count > 0 ? args_p[0] : undefined_value);
7864  jerry_release_value (undefined_value);
7865
7866  return resource_name;
7867} /* resource_name_handler */
7868
7869int
7870main (void)
7871{
7872  jerry_init (JERRY_INIT_EMPTY);
7873
7874  jerry_value_t global = jerry_get_global_object ();
7875
7876  /* Register the "resourceName" method. */
7877  {
7878    jerry_value_t func = jerry_create_external_function (resource_name_handler);
7879    jerry_value_t name = jerry_create_string ((const jerry_char_t *) "resourceName");
7880    jerry_value_t result = jerry_set_property (global, name, func);
7881    jerry_release_value (result);
7882    jerry_release_value (name);
7883    jerry_release_value (func);
7884  }
7885
7886  jerry_release_value (global);
7887
7888  const jerry_char_t source[] = "function myFunction() { return resourceName() }; myFunction()";
7889  const jerry_char_t resource[] = "demo.js";
7890
7891  jerry_value_t program = jerry_parse (resource,
7892                                       sizeof (resource) - 1,
7893                                       source,
7894                                       sizeof (source) - 1,
7895                                       JERRY_PARSE_NO_OPTS);
7896
7897  if (!jerry_value_is_error (program))
7898  {
7899    /* `run_result` contains "demo.js" */
7900    jerry_value_t run_result = jerry_run (program);
7901
7902    /* usage of `run_result` */
7903
7904    jerry_release_value (run_result);
7905  }
7906
7907  jerry_release_value (program);
7908  jerry_cleanup ();
7909
7910  return 0;
7911}
7912```
7913
7914**See also**
7915
7916- [jerry_create_external_function](#jerry_create_external_function)
7917
7918## jerry_get_new_target
7919
7920**Summary**
7921
7922Returns the current "new.target" JavaScript function at the call site.
7923
7924If used outside of a native C function it will return "undefined" value.
7925
7926*Notes*:
7927- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
7928is no longer needed.
7929- This feature depends on build option (`JERRY_ES2015`) and can be checked
7930  in runtime with the `JERRY_FEATURE_SYMBOL` feature enum value (as symbols are enabled in case of ES2015),
7931  see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
7932- If the ES2015 mode is not enabled this method will always return the "undefined" value.
7933
7934**Prototype**
7935
7936```c
7937jerry_value_t
7938jerry_get_new_target (void);
7939```
7940- return
7941  - "undefined" - if at the call site it was not a constructor call.
7942  - function object - if the current call site is in a constructor call.
7943
7944*New in version 2.2*.
7945
7946**Example 1**
7947
7948[doctest]: # (name="02.API-REFERENCE-jsnewtarget-01.c")
7949
7950```c
7951#include <stdio.h>
7952#include <string.h>
7953#include <jerryscript.h>
7954
7955static jerry_value_t
7956demo_handler (const jerry_value_t func_obj_val,
7957              const jerry_value_t this_val,
7958              const jerry_value_t args_p[],
7959              const jerry_length_t args_cnt)
7960{
7961  jerry_value_t new_target = jerry_get_new_target ();
7962
7963  /* new_target is the "demo" JS function object */
7964  if (jerry_value_get_type (new_target) == JERRY_TYPE_FUNCTION)
7965  {
7966    printf ("This is a construct call\r\n");
7967  }
7968
7969  jerry_release_value (new_target);
7970
7971  return jerry_create_undefined ();
7972}
7973
7974int
7975main (int argc, char** argv)
7976{
7977  jerry_init (JERRY_INIT_EMPTY);
7978
7979  jerry_value_t function_val = jerry_create_external_function (demo_handler);
7980
7981  jerry_value_t ret_val = jerry_construct_object (function_val, NULL, 0);
7982
7983  jerry_release_value (ret_val);
7984  jerry_release_value (function_val);
7985
7986  jerry_cleanup ();
7987  return 0;
7988}
7989```
7990
7991**Example 2**
7992
7993[doctest]: # (name="02.API-REFERENCE-jsnewtarget-02.c")
7994
7995```c
7996#include <stdio.h>
7997#include <string.h>
7998#include <jerryscript.h>
7999
8000static jerry_value_t
8001demo_handler (const jerry_value_t func_obj_val,
8002              const jerry_value_t this_val,
8003              const jerry_value_t args_p[],
8004              const jerry_length_t args_cnt)
8005{
8006  jerry_value_t new_target = jerry_get_new_target ();
8007
8008  /* new_target is a JS function object */
8009  if (jerry_value_get_type (new_target) == JERRY_TYPE_FUNCTION)
8010  {
8011    printf ("This is a construct call\r\n");
8012  }
8013
8014  jerry_release_value (new_target);
8015
8016  return jerry_create_undefined ();
8017}
8018
8019int
8020main (int argc, char** argv)
8021{
8022  jerry_init (JERRY_INIT_EMPTY);
8023
8024  /* register C method */
8025  jerry_value_t global_obj_val = jerry_get_global_object ();
8026  jerry_value_t function_val = jerry_create_external_function (demo_handler);
8027  jerry_value_t function_name_val = jerry_create_string ((const jerry_char_t *) "demo");
8028  jerry_value_t result_val = jerry_set_property (global_obj_val, function_name_val, function_val);
8029  jerry_release_value (result_val);
8030  jerry_release_value (function_name_val);
8031  jerry_release_value (function_val);
8032  jerry_release_value (global_obj_val);
8033
8034  /* Invoke C method via JS */
8035  const char *src = "new demo ()";
8036  jerry_value_t ret_val = jerry_eval ((const jerry_char_t *) src,
8037                                      strlen (src),
8038                                      JERRY_PARSE_NO_OPTS);
8039
8040  jerry_release_value (ret_val);
8041
8042  jerry_cleanup ();
8043  return 0;
8044}
8045```
8046
8047**See also**
8048
8049- [jerry_construct_object](#jerry_construct_object)
8050
8051# ArrayBuffer and TypedArray functions
8052
8053These APIs all depend on the ES2015-subset profile.
8054
8055## jerry_get_arraybuffer_byte_length
8056
8057**Summary**
8058
8059Get the byte length property of the ArrayBuffer. This is the
8060same value which was passed to the ArrayBuffer constructor call.
8061
8062**Prototype**
8063
8064```c
8065jerry_length_t
8066jerry_get_arraybuffer_byte_length (const jerry_value_t value);
8067```
8068
8069- `value` - ArrayBuffer object
8070- return value
8071  - size of the ArrayBuffer in bytes
8072  - 0 if the `value` parameter is not an ArrayBuffer
8073
8074*New in version 2.0*.
8075
8076**Example**
8077
8078```c
8079{
8080  jerry_value_t buffer = jerry_create_arraybuffer (15);
8081  jerry_length_t length = jerry_get_arraybuffer_byte_length (buffer);
8082  // length should be 15
8083
8084  jerry_release_value (buffer);
8085}
8086```
8087
8088**See also**
8089- [jerry_create_arraybuffer](#jerry_create_arraybuffer)
8090
8091
8092## jerry_arraybuffer_read
8093
8094**Summary**
8095
8096Copy the portion of the ArrayBuffer into a user provided buffer.
8097The start offset of the read operation can be specified.
8098
8099The number bytes to be read can be specified via the `buf_size`
8100parameter. It is not possible to read more than the length of
8101the ArrayBuffer.
8102
8103Function returns the number of bytes read from the ArrayBuffer
8104(and written to the buffer parameter). This value is
8105calculated in the following way: `min(array buffer length - offset, buf_size)`.
8106
8107**Prototype**
8108
8109```c
8110jerry_length_t
8111jerry_arraybuffer_read (const jerry_value_t value,
8112                        jerry_length_t offset,
8113                        uint8_t *buf_p,
8114                        jerry_length_t buf_size);
8115```
8116
8117- `value` - ArrayBuffer to read from
8118- `offset` - start offset of the read operation
8119- `buf_p` - buffer to read the data to
8120- `buf_size` - maximum number of bytes to read into the buffer
8121- return value
8122  - number of bytes written into the buffer (read from the ArrayBuffer)
8123  - 0 if the `value` is not an ArrayBuffer object
8124  - 0 if the `buf_size` is zero or there is nothing to read
8125
8126*New in version 2.0*.
8127
8128**Example**
8129
8130```c
8131{
8132  uint8_t data[20];
8133  jerry_value_t buffer;
8134  // ... create the ArrayBuffer or acuiqre it from somewhere.
8135
8136  jerry_value_t bytes_read;
8137
8138  // read 10 bytes from the start of the ArrayBuffer.
8139  bytes_read = jerry_arraybuffer_read (buffer, 0, data, 10);
8140  // read the next 10 bytes
8141  bytes_read += jerry_arraybuffer_read (buffer, bytes_read, data + bytes_read, 10);
8142
8143  // process the data variable
8144
8145  jerry_release_value (buffer);
8146}
8147```
8148
8149**See also**
8150
8151- [jerry_create_arraybuffer](#jerry_create_arraybuffer)
8152- [jerry_arraybuffer_write](#jerry_arraybuffer_write)
8153- [jerry_get_arraybuffer_byte_length](#jerry_get_arraybuffer_byte_length)
8154
8155
8156## jerry_arraybuffer_write
8157
8158**Summary**
8159
8160Copy the contents of a buffer into the ArrayBuffer.
8161The start offset of the write operation can be specified.
8162
8163The number bytes to be written can be specified via the `buf_size`
8164parameter. It is not possible to write more than the length of
8165the ArrayBuffer.
8166
8167Function returns the number of bytes written into the ArrayBuffer
8168(and read from the buffer parameter). This value is
8169calculated in the following way: `min(array buffer length - offset, buf_size)`.
8170
8171**Prototype**
8172
8173```c
8174jerry_length_t
8175jerry_arraybuffer_write (const jerry_value_t value,
8176                         jerry_length_t offset,
8177                         const uint8_t *buf_p,
8178                         jerry_length_t buf_size);
8179```
8180
8181- `value` - ArrayBuffer to write to
8182- `offset` - start offset of the write operation
8183- `buf_p` - buffer to read the data from
8184- `buf_size` - maximum number of bytes to write into the ArrayBuffer
8185- return value
8186  - number of bytes written into the ArrayBuffer (read from the buffer parameter)
8187  - 0 if the `value` is not an ArrayBuffer object
8188  - 0 if the `buf_size` is zero or there is nothing to write
8189
8190*New in version 2.0*.
8191
8192**Example**
8193
8194```c
8195{
8196  uint8_t data[20];
8197
8198  // fill the data with values
8199  for (int i = 0; i < 20; i++)
8200  {
8201    data[i] = (uint8_t) (i * 2);
8202  }
8203
8204  jerry_value_t buffer;
8205  // ... create the ArrayBuffer or acquire it from somewhere.
8206
8207  jerry_value_t bytes_written;
8208
8209  // write 10 bytes from to the start of the ArrayBuffer.
8210  bytes_written = jerry_arraybuffer_write (buffer, 0, data, 10);
8211  // read the next 10 bytes
8212  bytes_written += jerry_arraybuffer_write (buffer, bytes_written, data + bytes_written, 10);
8213
8214  // use the ArrayBuffer
8215
8216  jerry_release_value (buffer);
8217}
8218```
8219
8220**See also**
8221
8222- [jerry_create_arraybuffer](#jerry_create_arraybuffer)
8223- [jerry_arraybuffer_write](#jerry_arraybuffer_write)
8224- [jerry_get_arraybuffer_byte_length](#jerry_get_arraybuffer_byte_length)
8225
8226
8227## jerry_get_arraybuffer_pointer
8228
8229**Summary**
8230
8231The function allows access to the contents of the Array Buffer directly.
8232
8233**WARNING!** This operation is for expert use only! The programmer must
8234ensure that the returned memory area is used correctly. That is
8235there is no out of bounds reads or writes. The lifetime of the underlying
8236data buffer is managed by the ArrayBuffer value. Make sure to acquire the
8237value with [`jerry_acquire_value`](#jerry_acquire_value) if the data
8238buffer is needed later.
8239
8240**Prototype**
8241
8242```c
8243uint8_t *
8244jerry_get_arraybuffer_pointer (const jerry_value_t value);
8245```
8246
8247- `value` - Array Buffer object.
8248- return value
8249  - pointer to the Array Buffer's data area.
8250  - NULL if the `value` is not an Array Buffer object.
8251
8252*New in version 2.0*.
8253
8254**Example**
8255
8256```c
8257{
8258  // create the ArrayBuffer
8259  jerry_value_t buffer = jerry_create_arraybuffer (16);
8260
8261  uint8_t *const data = jerry_get_arraybuffer_pointer (buffer);
8262
8263  for (int i = 0; i < 16; i++)
8264  {
8265    data[i] = (uint8_t) (i + 4);
8266  }
8267
8268  // use the Array Buffer
8269
8270  // release buffer as it is not needed after this point
8271  jerry_release_value (buffer);
8272}
8273```
8274
8275**See also**
8276
8277- [jerry_create_arraybuffer_external](#jerry_create_arraybuffer_external)
8278
8279## jerry_is_arraybuffer_detachable
8280
8281**Summary**
8282
8283Get if the ArrayBuffer is detachable.
8284
8285**Prototype**
8286
8287```c
8288jerry_value_t
8289jerry_is_arraybuffer_detachable (const jerry_value_t value);
8290```
8291
8292- `value` - ArrayBuffer to be detached
8293- return
8294  - boolean value if success
8295  - Error otherwise
8296
8297*New in version 2.2*.
8298
8299**Example**
8300
8301```c
8302{
8303  // create the ArrayBuffer
8304  jerry_value_t buffer = jerry_create_arraybuffer (16);
8305
8306  jerry_value_t res = jerry_is_arraybuffer_detachable (buffer);
8307  bool is_detachable = jerry_get_boolean_value (res);
8308
8309  // release buffer as it is not needed after this point
8310  jerry_release_value (res);
8311  jerry_release_value (buffer);
8312}
8313```
8314
8315**See also**
8316
8317- [jerry_detach_arraybuffer](#jerry_detach_arraybuffer)
8318
8319## jerry_detach_arraybuffer
8320
8321**Summary**
8322
8323Detach the underlying data block from ArrayBuffer and set its bytelength to 0.
8324
8325This operation requires the ArrayBuffer to be external that created by
8326`jerry_create_arraybuffer_external`.
8327
8328**Prototype**
8329
8330```c
8331jerry_value_t
8332jerry_detach_arraybuffer (const jerry_value_t value);
8333```
8334
8335- `value` - ArrayBuffer to be detached
8336- return
8337  - null value if success
8338  - Error otherwise
8339
8340*New in version 2.2*.
8341
8342**Example**
8343
8344```c
8345{
8346  uint8_t buf[1];
8347  jerry_size_t length = 1;
8348  // create the ArrayBuffer
8349  jerry_value_t buffer = jerry_create_arraybuffer (length, buf, NULL);
8350
8351  jerry_value_t res = jerry_detach_arraybuffer (buffer);
8352
8353  // release buffer as it is not needed after this point
8354  jerry_release_value (res);
8355  jerry_release_value (buffer);
8356}
8357```
8358
8359**See also**
8360
8361- [jerry_is_arraybuffer_detachable](#jerry_is_arraybuffer_detachable)
8362
8363## jerry_get_dataview_buffer
8364
8365**Summary**
8366
8367Get the ArrayBuffer object used by a DataView object.
8368Additionally returns the byteLength and byteOffset properties
8369of the DataView object.
8370
8371For the returned ArrayBuffer the [jerry_release_value](#jerry_release_value)
8372must be called when it is no longer needed.
8373
8374**Prototype**
8375
8376```c
8377jerry_value_t
8378jerry_get_dataview_buffer (const jerry_value_t value,
8379                           jerry_length_t *byteOffset,
8380                           jerry_length_t *byteLength);
8381```
8382
8383- `value` - DataView to get the ArrayBuffer from
8384- `byteOffset` - (Optional) returns the start offset of the ArrayBuffer for the DataView
8385- `byteLength` - (Optional) returns the number of bytes used from the ArrayBuffer for the DataView
8386- return
8387  - DataView object's underlying ArrayBuffer object
8388  - TypeError if the `value` is not a DataView object
8389
8390*New in version 2.0*.
8391
8392**Example**
8393
8394[doctest]: # ()
8395
8396```c
8397#include "jerryscript.h"
8398
8399int
8400main (void)
8401{
8402  jerry_init (JERRY_INIT_EMPTY);
8403
8404  jerry_value_t arraybuffer = jerry_create_arraybuffer (16);
8405  jerry_value_t dataview = jerry_create_dataview (arraybuffer, 0, 16);
8406  jerry_length_t byteOffset = 0;
8407  jerry_length_t byteLength = 0;
8408  jerry_value_t buffer = jerry_get_dataview_buffer (dataview, &byteOffset, &byteLength);
8409
8410  // buffer is an ArrayBuffer object and ArrayBuffer operations can be performed on it
8411  // byteOffset is 0
8412  // byteLength is 16
8413
8414  // usage of buffer
8415
8416  jerry_release_value (buffer);
8417  jerry_release_value (dataview);
8418  jerry_release_value (arraybuffer);
8419
8420  jerry_cleanup ();
8421}
8422```
8423
8424**See also**
8425
8426- [jerry_create_dataview](#jerry_create_dataview)
8427
8428
8429## jerry_get_typedarray_type
8430
8431**Summary**
8432
8433Get the type of the TypedArray.
8434
8435The returned type is one of the [jerry_typedarray_type_t](#jerry_typedarray_type_t)
8436enum value.
8437
8438**Prototype**
8439
8440```c
8441jerry_typedarray_type_t
8442jerry_get_typedarray_type (jerry_value_t value);
8443```
8444
8445- `value` - TypedArray object to query for type.
8446- return
8447  - the type of the TypedArray
8448  - JERRY_TYPEDARRAY_INVALID if the object was not a TypedArray
8449
8450*New in version 2.0*.
8451
8452**Example**
8453
8454```c
8455{
8456  jerry_typedarray_type_t expected_type = JERRY_TYPEDARRAY_UINT32;
8457  jerry_value_t typedarray = jerry_create_typedarray (expected_klass, 25);
8458
8459  jerry_typedarray_type_t type = jerry_get_typedarray_type (typedarray);
8460
8461  // 'type' is now JERRY_TYPEDARRAY_UINT32
8462
8463  jerry_release_value (typedarray);
8464}
8465```
8466
8467**See also**
8468
8469- [jerry_create_typedarray](#jerry_create_typedarray)
8470- [jerry_typedarray_type_t](#jerry_typedarray_type_t)
8471
8472
8473## jerry_get_typedarray_length
8474
8475**Summary**
8476
8477Get the element count of the TypedArray as specified during creation.
8478
8479This is not the same as the byteLength property of a TypedArray object.
8480
8481**Prototype**
8482
8483```
8484jerry_length_t
8485jerry_get_typedarray_length (jerry_value_t value);
8486```
8487
8488- `value` - TypedArray object to query
8489- return
8490  - length (element count) of the TypedArray object
8491  - 0 if the object is not a TypedArray
8492
8493*New in version 2.0*.
8494
8495**Example**
8496
8497```c
8498{
8499  jerry_value_t array = jerry_create_typedarray (JERRY_TYPEDARRAY_INT32, 21);
8500
8501  jerry_length_t element_count = jerry_get_typedarray_length (array);
8502
8503  // element_count is now 21.
8504
8505  jerry_release_value (array);
8506}
8507```
8508
8509**See also**
8510
8511- [jerry_create_typedarray](#jerry_create_typedarray)
8512
8513
8514## jerry_get_typedarray_buffer
8515
8516**Summary**
8517
8518Get the ArrayBuffer object used by a TypedArray object.
8519Additionally returns the byteLength and byteOffset properties
8520of the TypedArray object.
8521
8522For the returned ArrayBuffer the [jerry_release_value](#jerry_release_value)
8523must be called.
8524
8525*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
8526is no longer needed.
8527
8528**Prototype**
8529
8530```c
8531jerry_value_t
8532jerry_get_typedarray_buffer (jerry_value_t value,
8533                             jerry_length_t *byteOffset,
8534                             jerry_length_t *byteLength);
8535```
8536
8537- `value` - TypedArray to get the ArrayBuffer from
8538- `byteOffset` - (Optional) returns the start offset of the ArrayBuffer for the TypedArray
8539- `byteLength` - (Optional) returns the number of bytes used from the ArrayBuffer for the TypedArray
8540- return
8541  - TypedArray object's underlying ArrayBuffer object
8542  - TypeError if the `value` is not a TypedArray object
8543
8544*New in version 2.0*.
8545
8546**Example**
8547
8548```c
8549{
8550  jerry_value_t array = jerry_create_typedarray (JERRY_TYPEDARRAY_INT16, 11);
8551
8552  jerry_length_t byteLength = 0;
8553  jerry_length_t byteOffset = 0;
8554  jerry_value_t buffer = jerry_get_typedarray_buffer (array, &byteOffset, &byteLength);
8555
8556  // buffer is an ArrayBuffer object and ArrayBuffer operations can be performed on it
8557  // byteLength is 11 * 2  (2 as the TypedArray stores Int16 that is 2 byte elements)
8558  // byteOffset is 0
8559
8560  jerry_release_value (buffer);
8561  jerry_release_value (array);
8562}
8563```
8564
8565**See also**
8566
8567- [jerry_create_typedarray](#jerry_create_typedarray)
8568
8569# JSON functions
8570
8571## jerry_json_parse
8572
8573**Summary**
8574
8575Returns the same result as `JSON.parse` ecmascript function.
8576
8577**Prototype**
8578
8579```c
8580jerry_value_t
8581jerry_json_parse (const jerry_char_t *string_p,
8582                  jerry_size_t string_size);
8583```
8584
8585- `string_p` - a JSON string
8586- `string_size` - size of the string
8587- return
8588  - jerry_value_t containing the same as json.parse()
8589  - jerry_value_t containing error massage
8590
8591*New in version 2.0*.
8592
8593**Example**
8594
8595```c
8596{
8597  const jerry_char_t data[] = "{\"name\": \"John\", \"age\": 5}";
8598  jerry_value_t parsed_json = jerry_json_parse (data, sizeof (data) - 1);
8599
8600  // parsed_json now conatins all data stored in data_in_json
8601
8602  jerry_release_value (parsed_json);
8603}
8604```
8605
8606## jerry_json_stringify
8607
8608**Summary**
8609
8610Returns the same value as `JSON.stringify` ecmascript function.
8611
8612**Prototype**
8613
8614```c
8615jerry_value_t
8616jerry_json_stringify (const jerry_value_t object_to_stringify);
8617```
8618
8619- `object_to_stringify` - a jerry_value_t object to stringify
8620- return
8621  - jerry_value_t containing the same as json.stringify()
8622  - jerry_value_t containing error massage
8623
8624*New in version 2.0*.
8625
8626**Example**
8627
8628```c
8629{
8630  jerry_value_t obj = jerry_create_object ();
8631  jerry_value_t key = jerry_create_string ((const jerry_char_t *) "name");
8632  jerry_value_t value = jerry_create_string ((const jerry_char_t *) "John");
8633  jerry_release_value (jerry_set_property (obj, key, value));
8634  jerry_value_t stringified = jerry_json_stringify (obj);
8635
8636  //stringified now contains a json formated string
8637
8638  jerry_release_value (obj);
8639  jerry_release_value (key);
8640  jerry_release_value (value);
8641  jerry_release_value (stringified);
8642}
8643```
8644