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