1/* Copyright JS Foundation and other contributors, http://js.foundation
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef JERRYSCRIPT_CORE_H
17#define JERRYSCRIPT_CORE_H
18
19#include <stdbool.h>
20#include <stddef.h>
21#include <stdint.h>
22
23#include "jerryscript-compiler.h"
24
25#ifdef __cplusplus
26extern "C"
27{
28#endif /* __cplusplus */
29
30/** \addtogroup jerry Jerry engine interface
31 * @{
32 */
33
34/**
35 * Major version of JerryScript API.
36 */
37#define JERRY_API_MAJOR_VERSION 2
38
39/**
40 * Minor version of JerryScript API.
41 */
42#define JERRY_API_MINOR_VERSION 3
43
44/**
45 * Patch version of JerryScript API.
46 */
47#define JERRY_API_PATCH_VERSION 0
48
49/**
50 * JerryScript init flags.
51 */
52typedef enum
53{
54  JERRY_INIT_EMPTY               = (0u),      /**< empty flag set */
55  JERRY_INIT_SHOW_OPCODES        = (1u << 0), /**< dump byte-code to log after parse */
56  JERRY_INIT_SHOW_REGEXP_OPCODES = (1u << 1), /**< dump regexp byte-code to log after compilation */
57  JERRY_INIT_MEM_STATS           = (1u << 2), /**< dump memory statistics */
58  JERRY_INIT_MEM_STATS_SEPARATE  = (1u << 3), /**< deprecated, an unused placeholder now */
59  JERRY_INIT_DEBUGGER            = (1u << 4), /**< deprecated, an unused placeholder now */
60} jerry_init_flag_t;
61
62/**
63 * JerryScript API Error object types.
64 */
65typedef enum
66{
67  JERRY_ERROR_NONE = 0,  /**< No Error */
68
69  JERRY_ERROR_COMMON,    /**< Error */
70  JERRY_ERROR_EVAL,      /**< EvalError */
71  JERRY_ERROR_RANGE,     /**< RangeError */
72  JERRY_ERROR_REFERENCE, /**< ReferenceError */
73  JERRY_ERROR_SYNTAX,    /**< SyntaxError */
74  JERRY_ERROR_TYPE,      /**< TypeError */
75  JERRY_ERROR_URI        /**< URIError */
76} jerry_error_t;
77
78/**
79 * JerryScript feature types.
80 */
81typedef enum
82{
83  JERRY_FEATURE_CPOINTER_32_BIT, /**< 32 bit compressed pointers */
84  JERRY_FEATURE_ERROR_MESSAGES, /**< error messages */
85  JERRY_FEATURE_JS_PARSER, /**< js-parser */
86  JERRY_FEATURE_MEM_STATS, /**< memory statistics */
87  JERRY_FEATURE_PARSER_DUMP, /**< parser byte-code dumps */
88  JERRY_FEATURE_REGEXP_DUMP, /**< regexp byte-code dumps */
89  JERRY_FEATURE_SNAPSHOT_SAVE, /**< saving snapshot files */
90  JERRY_FEATURE_SNAPSHOT_EXEC, /**< executing snapshot files */
91  JERRY_FEATURE_DEBUGGER, /**< debugging */
92  JERRY_FEATURE_VM_EXEC_STOP, /**< stopping ECMAScript execution */
93  JERRY_FEATURE_JSON, /**< JSON support */
94  JERRY_FEATURE_PROMISE, /**< promise support */
95  JERRY_FEATURE_TYPEDARRAY, /**< Typedarray support */
96  JERRY_FEATURE_DATE, /**< Date support */
97  JERRY_FEATURE_REGEXP, /**< Regexp support */
98  JERRY_FEATURE_LINE_INFO, /**< line info available */
99  JERRY_FEATURE_LOGGING, /**< logging */
100  JERRY_FEATURE_SYMBOL, /**< symbol support */
101  JERRY_FEATURE_DATAVIEW, /**< DataView support */
102  JERRY_FEATURE_PROXY, /**< Proxy support */
103  JERRY_FEATURE_MAP, /**< Map support */
104  JERRY_FEATURE_SET, /**< Set support */
105  JERRY_FEATURE_WEAKMAP, /**< WeakMap support */
106  JERRY_FEATURE_WEAKSET, /**< WeakSet support */
107  JERRY_FEATURE__COUNT /**< number of features. NOTE: must be at the end of the list */
108} jerry_feature_t;
109
110/**
111 * Option flags for jerry_parse and jerry_parse_function functions.
112 */
113typedef enum
114{
115  JERRY_PARSE_NO_OPTS = 0, /**< no options passed */
116  JERRY_PARSE_STRICT_MODE = (1 << 0) /**< enable strict mode */
117} jerry_parse_opts_t;
118
119/**
120 * GC operational modes.
121 */
122typedef enum
123{
124  JERRY_GC_PRESSURE_LOW, /**< free unused objects, but keep memory
125                          *   allocated for performance improvements
126                          *   such as property hash tables for large objects */
127  JERRY_GC_PRESSURE_HIGH /**< free as much memory as possible */
128} jerry_gc_mode_t;
129
130/**
131 * Jerry regexp flags.
132 */
133typedef enum
134{
135  JERRY_REGEXP_FLAG_GLOBAL = (1u << 1),      /**< Globally scan string */
136  JERRY_REGEXP_FLAG_IGNORE_CASE = (1u << 2), /**< Ignore case */
137  JERRY_REGEXP_FLAG_MULTILINE = (1u << 3)    /**< Multiline string scan */
138} jerry_regexp_flags_t;
139
140/**
141 * Character type of JerryScript.
142 */
143typedef uint8_t jerry_char_t;
144
145/**
146 * Size type of JerryScript.
147 */
148typedef uint32_t jerry_size_t;
149
150/**
151 * Length type of JerryScript.
152 */
153typedef uint32_t jerry_length_t;
154
155/**
156 * Description of a JerryScript value.
157 */
158typedef uint32_t jerry_value_t;
159
160/**
161 * Description of ECMA property descriptor.
162 */
163typedef struct
164{
165  /** Is [[Value]] defined? */
166  bool is_value_defined;
167
168  /** Is [[Get]] defined? */
169  bool is_get_defined;
170
171  /** Is [[Set]] defined? */
172  bool is_set_defined;
173
174  /** Is [[Writable]] defined? */
175  bool is_writable_defined;
176
177  /** [[Writable]] */
178  bool is_writable;
179
180  /** Is [[Enumerable]] defined? */
181  bool is_enumerable_defined;
182
183  /** [[Enumerable]] */
184  bool is_enumerable;
185
186  /** Is [[Configurable]] defined? */
187  bool is_configurable_defined;
188
189  /** [[Configurable]] */
190  bool is_configurable;
191
192  /** [[Value]] */
193  jerry_value_t value;
194
195  /** [[Get]] */
196  jerry_value_t getter;
197
198  /** [[Set]] */
199  jerry_value_t setter;
200} jerry_property_descriptor_t;
201
202/**
203 * Description of JerryScript heap memory stats.
204 * It is for memory profiling.
205 */
206typedef struct
207{
208  size_t version; /**< the version of the stats struct */
209  size_t size; /**< heap total size */
210  size_t allocated_bytes; /**< currently allocated bytes */
211  size_t peak_allocated_bytes; /**< peak allocated bytes */
212  size_t reserved[4]; /**< padding for future extensions */
213} jerry_heap_stats_t;
214
215/**
216 * Type of an external function handler.
217 */
218typedef jerry_value_t (*jerry_external_handler_t) (const jerry_value_t function_obj,
219                                                   const jerry_value_t this_val,
220                                                   const jerry_value_t args_p[],
221                                                   const jerry_length_t args_count);
222
223/**
224 * Native free callback of an object.
225 */
226typedef void (*jerry_object_native_free_callback_t) (void *native_p);
227
228/**
229 * Callback which tells whether the ECMAScript execution should be stopped.
230 *
231 * As long as the function returns with undefined the execution continues.
232 * When a non-undefined value is returned the execution stops and the value
233 * is thrown by the engine (if the error flag is not set for the returned
234 * value the engine automatically sets it).
235 *
236 * Note: if the function returns with a non-undefined value it
237 *       must return with the same value for future calls.
238 */
239typedef jerry_value_t (*jerry_vm_exec_stop_callback_t) (void *user_p);
240
241/**
242 * Function type applied for each data property of an object.
243 */
244typedef bool (*jerry_object_property_foreach_t) (const jerry_value_t property_name,
245                                                 const jerry_value_t property_value,
246                                                 void *user_data_p);
247/**
248 * Function type applied for each object in the engine.
249 */
250typedef bool (*jerry_objects_foreach_t) (const jerry_value_t object,
251                                         void *user_data_p);
252
253/**
254 * Function type applied for each matching object in the engine.
255 */
256typedef bool (*jerry_objects_foreach_by_native_info_t) (const jerry_value_t object,
257                                                        void *object_data_p,
258                                                        void *user_data_p);
259
260/**
261 * User context item manager
262 */
263typedef struct
264{
265  /**
266   * Callback responsible for initializing a context item, or NULL to zero out the memory. This is called lazily, the
267   * first time jerry_get_context_data () is called with this manager.
268   *
269   * @param [in] data The buffer that JerryScript allocated for the manager. The buffer is zeroed out. The size is
270   * determined by the bytes_needed field. The buffer is kept alive until jerry_cleanup () is called.
271   */
272  void (*init_cb) (void *data);
273
274  /**
275   * Callback responsible for deinitializing a context item, or NULL. This is called as part of jerry_cleanup (),
276   * right *before* the VM has been cleaned up. This is a good place to release strong references to jerry_value_t's
277   * that the manager may be holding.
278   * Note: because the VM has not been fully cleaned up yet, jerry_object_native_info_t free_cb's can still get called
279   * *after* all deinit_cb's have been run. See finalize_cb for a callback that is guaranteed to run *after* all
280   * free_cb's have been run.
281   *
282   * @param [in] data The buffer that JerryScript allocated for the manager.
283   */
284  void (*deinit_cb) (void *data);
285
286  /**
287   * Callback responsible for finalizing a context item, or NULL. This is called as part of jerry_cleanup (),
288   * right *after* the VM has been cleaned up and destroyed and jerry_... APIs cannot be called any more. At this point,
289   * all values in the VM have been cleaned up. This is a good place to clean up native state that can only be cleaned
290   * up at the very end when there are no more VM values around that may need to access that state.
291   *
292   * @param [in] data The buffer that JerryScript allocated for the manager. After returning from this callback,
293   * the data pointer may no longer be used.
294   */
295  void (*finalize_cb) (void *data);
296
297  /**
298   * Number of bytes to allocate for this manager. This is the size of the buffer that JerryScript will allocate on
299   * behalf of the manager. The pointer to this buffer is passed into init_cb, deinit_cb and finalize_cb. It is also
300   * returned from the jerry_get_context_data () API.
301   */
302  size_t bytes_needed;
303} jerry_context_data_manager_t;
304
305/**
306 * Function type for allocating buffer for JerryScript context.
307 */
308typedef void *(*jerry_context_alloc_t) (size_t size, void *cb_data_p);
309
310/**
311 * Type information of a native pointer.
312 */
313typedef struct
314{
315  jerry_object_native_free_callback_t free_cb; /**< the free callback of the native pointer */
316} jerry_object_native_info_t;
317
318/**
319 * An opaque declaration of the JerryScript context structure.
320 */
321typedef struct jerry_context_t jerry_context_t;
322
323/**
324 * Enum that contains the supported binary operation types
325 */
326typedef enum
327{
328  JERRY_BIN_OP_EQUAL = 0u,    /**< equal comparison (==) */
329  JERRY_BIN_OP_STRICT_EQUAL,  /**< strict equal comparison (===) */
330  JERRY_BIN_OP_LESS,          /**< less relation (<) */
331  JERRY_BIN_OP_LESS_EQUAL,    /**< less or equal relation (<=) */
332  JERRY_BIN_OP_GREATER,       /**< greater relation (>) */
333  JERRY_BIN_OP_GREATER_EQUAL, /**< greater or equal relation (>=)*/
334  JERRY_BIN_OP_INSTANCEOF,    /**< instanceof operation */
335  JERRY_BIN_OP_ADD,           /**< addition operator (+) */
336  JERRY_BIN_OP_SUB,           /**< subtraction operator (-) */
337  JERRY_BIN_OP_MUL,           /**< multiplication operator (*) */
338  JERRY_BIN_OP_DIV,           /**< division operator (/) */
339  JERRY_BIN_OP_REM,           /**< remainder operator (%) */
340} jerry_binary_operation_t;
341
342/**
343 * General engine functions.
344 */
345
346#ifdef JERRY_FOR_IAR_CONFIG
347char* jerry_vla_malloc (uint32_t size);
348void jerry_vla_free (char* p);
349#endif
350
351void jerry_init (jerry_init_flag_t flags);
352void jerry_cleanup (void);
353void jerry_register_magic_strings (const jerry_char_t * const *ex_str_items_p,
354                                   uint32_t count,
355                                   const jerry_length_t *str_lengths_p);
356void jerry_gc (jerry_gc_mode_t mode);
357void *jerry_get_context_data (const jerry_context_data_manager_t *manager_p);
358
359bool jerry_get_memory_stats (jerry_heap_stats_t *out_stats_p);
360
361/**
362 * Parser and executor functions.
363 */
364bool jerry_run_simple (const jerry_char_t *script_source_p, size_t script_source_size, jerry_init_flag_t flags);
365jerry_value_t jerry_parse (const jerry_char_t *resource_name_p, size_t resource_name_length,
366                           const jerry_char_t *source_p, size_t source_size, uint32_t parse_opts);
367jerry_value_t jerry_parse_function (const jerry_char_t *resource_name_p, size_t resource_name_length,
368                                    const jerry_char_t *arg_list_p, size_t arg_list_size,
369                                    const jerry_char_t *source_p, size_t source_size, uint32_t parse_opts);
370jerry_value_t jerry_run (const jerry_value_t func_val);
371jerry_value_t jerry_eval (const jerry_char_t *source_p, size_t source_size, uint32_t parse_opts);
372
373jerry_value_t jerry_run_all_enqueued_jobs (void);
374
375/**
376 * Get the global context.
377 */
378jerry_value_t jerry_get_global_object (void);
379
380/**
381 * Checker functions of 'jerry_value_t'.
382 */
383bool jerry_value_is_abort (const jerry_value_t value);
384bool jerry_value_is_array (const jerry_value_t value);
385bool jerry_value_is_boolean (const jerry_value_t value);
386bool jerry_value_is_constructor (const jerry_value_t value);
387bool jerry_value_is_error (const jerry_value_t value);
388bool jerry_value_is_function (const jerry_value_t value);
389bool jerry_value_is_number (const jerry_value_t value);
390bool jerry_value_is_null (const jerry_value_t value);
391bool jerry_value_is_object (const jerry_value_t value);
392bool jerry_value_is_promise (const jerry_value_t value);
393bool jerry_value_is_proxy (const jerry_value_t value);
394bool jerry_value_is_string (const jerry_value_t value);
395bool jerry_value_is_symbol (const jerry_value_t value);
396bool jerry_value_is_undefined (const jerry_value_t value);
397
398/**
399 * JerryScript API value type information.
400 */
401typedef enum
402{
403  JERRY_TYPE_NONE = 0u, /**< no type information */
404  JERRY_TYPE_UNDEFINED, /**< undefined type */
405  JERRY_TYPE_NULL,      /**< null type */
406  JERRY_TYPE_BOOLEAN,   /**< boolean type */
407  JERRY_TYPE_NUMBER,    /**< number type */
408  JERRY_TYPE_STRING,    /**< string type */
409  JERRY_TYPE_OBJECT,    /**< object type */
410  JERRY_TYPE_FUNCTION,  /**< function type */
411  JERRY_TYPE_ERROR,     /**< error/abort type */
412  JERRY_TYPE_SYMBOL,    /**< symbol type */
413} jerry_type_t;
414
415jerry_type_t jerry_value_get_type (const jerry_value_t value);
416
417/**
418 * Checker function of whether the specified compile feature is enabled.
419 */
420bool jerry_is_feature_enabled (const jerry_feature_t feature);
421
422/**
423 * Binary operations
424 */
425jerry_value_t jerry_binary_operation (jerry_binary_operation_t op,
426                                      const jerry_value_t lhs,
427                                      const jerry_value_t rhs);
428
429/**
430 * Error manipulation functions.
431 */
432jerry_value_t jerry_create_abort_from_value (jerry_value_t value, bool release);
433jerry_value_t jerry_create_error_from_value (jerry_value_t value, bool release);
434jerry_value_t jerry_get_value_from_error (jerry_value_t value, bool release);
435
436/**
437 * Error object function(s).
438 */
439jerry_error_t jerry_get_error_type (jerry_value_t value);
440
441/**
442 * Getter functions of 'jerry_value_t'.
443 */
444bool jerry_get_boolean_value (const jerry_value_t value);
445double jerry_get_number_value (const jerry_value_t value);
446
447/**
448 * Functions for string values.
449 */
450jerry_size_t jerry_get_string_size (const jerry_value_t value);
451jerry_size_t jerry_get_utf8_string_size (const jerry_value_t value);
452jerry_length_t jerry_get_string_length (const jerry_value_t value);
453jerry_length_t jerry_get_utf8_string_length (const jerry_value_t value);
454jerry_size_t jerry_string_to_char_buffer (const jerry_value_t value, jerry_char_t *buffer_p, jerry_size_t buffer_size);
455jerry_size_t jerry_string_to_utf8_char_buffer (const jerry_value_t value,
456                                               jerry_char_t *buffer_p,
457                                               jerry_size_t buffer_size);
458jerry_size_t jerry_substring_to_char_buffer (const jerry_value_t value,
459                                             jerry_length_t start_pos,
460                                             jerry_length_t end_pos,
461                                             jerry_char_t *buffer_p,
462                                             jerry_size_t buffer_size);
463jerry_size_t jerry_substring_to_utf8_char_buffer (const jerry_value_t value,
464                                                  jerry_length_t start_pos,
465                                                  jerry_length_t end_pos,
466                                                  jerry_char_t *buffer_p,
467                                                  jerry_size_t buffer_size);
468
469/**
470 * Functions for array object values.
471 */
472uint32_t jerry_get_array_length (const jerry_value_t value);
473
474/**
475 * Converters of 'jerry_value_t'.
476 */
477bool jerry_value_to_boolean (const jerry_value_t value);
478jerry_value_t jerry_value_to_number (const jerry_value_t value);
479jerry_value_t jerry_value_to_object (const jerry_value_t value);
480jerry_value_t jerry_value_to_primitive (const jerry_value_t value);
481jerry_value_t jerry_value_to_string (const jerry_value_t value);
482
483/**
484 * Acquire types with reference counter (increase the references).
485 */
486jerry_value_t jerry_acquire_value (jerry_value_t value);
487
488/**
489 * Release the referenced values.
490 */
491void jerry_release_value (jerry_value_t value);
492
493/**
494 * Create functions of API values.
495 */
496jerry_value_t jerry_create_array (uint32_t size);
497jerry_value_t jerry_create_boolean (bool value);
498jerry_value_t jerry_create_error (jerry_error_t error_type, const jerry_char_t *message_p);
499jerry_value_t jerry_create_error_sz (jerry_error_t error_type, const jerry_char_t *message_p,
500                                     jerry_size_t message_size);
501jerry_value_t jerry_create_external_function (jerry_external_handler_t handler_p);
502jerry_value_t jerry_create_number (double value);
503jerry_value_t jerry_create_number_infinity (bool sign);
504jerry_value_t jerry_create_number_nan (void);
505jerry_value_t jerry_create_null (void);
506jerry_value_t jerry_create_object (void);
507jerry_value_t jerry_create_promise (void);
508jerry_value_t jerry_create_proxy (const jerry_value_t target, const jerry_value_t handler);
509jerry_value_t jerry_create_regexp (const jerry_char_t *pattern, uint16_t flags);
510jerry_value_t jerry_create_regexp_sz (const jerry_char_t *pattern, jerry_size_t pattern_size, uint16_t flags);
511jerry_value_t jerry_create_string_from_utf8 (const jerry_char_t *str_p);
512jerry_value_t jerry_create_string_sz_from_utf8 (const jerry_char_t *str_p, jerry_size_t str_size);
513jerry_value_t jerry_create_string (const jerry_char_t *str_p);
514jerry_value_t jerry_create_string_sz (const jerry_char_t *str_p, jerry_size_t str_size);
515jerry_value_t jerry_create_symbol (const jerry_value_t value);
516jerry_value_t jerry_create_undefined (void);
517
518/**
519 * General API functions of JS objects.
520 */
521jerry_value_t jerry_has_property (const jerry_value_t obj_val, const jerry_value_t prop_name_val);
522jerry_value_t jerry_has_own_property (const jerry_value_t obj_val, const jerry_value_t prop_name_val);
523bool jerry_has_internal_property (const jerry_value_t obj_val, const jerry_value_t prop_name_val);
524bool jerry_delete_property (const jerry_value_t obj_val, const jerry_value_t prop_name_val);
525bool jerry_delete_property_by_index (const jerry_value_t obj_val, uint32_t index);
526bool jerry_delete_internal_property (const jerry_value_t obj_val, const jerry_value_t prop_name_val);
527
528jerry_value_t jerry_get_property (const jerry_value_t obj_val, const jerry_value_t prop_name_val);
529jerry_value_t jerry_get_property_by_index (const jerry_value_t obj_val, uint32_t index);
530jerry_value_t jerry_get_internal_property (const jerry_value_t obj_val, const jerry_value_t prop_name_val);
531jerry_value_t jerry_set_property (const jerry_value_t obj_val, const jerry_value_t prop_name_val,
532                                  const jerry_value_t value_to_set);
533jerry_value_t jerry_set_property_by_index (const jerry_value_t obj_val, uint32_t index,
534                                           const jerry_value_t value_to_set);
535bool jerry_set_internal_property (const jerry_value_t obj_val, const jerry_value_t prop_name_val,
536                                  const jerry_value_t value_to_set);
537
538void jerry_init_property_descriptor_fields (jerry_property_descriptor_t *prop_desc_p);
539jerry_value_t jerry_define_own_property (const jerry_value_t obj_val,
540                                         const jerry_value_t prop_name_val,
541                                         const jerry_property_descriptor_t *prop_desc_p);
542
543bool jerry_get_own_property_descriptor (const jerry_value_t obj_val,
544                                        const jerry_value_t prop_name_val,
545                                        jerry_property_descriptor_t *prop_desc_p);
546void jerry_free_property_descriptor_fields (const jerry_property_descriptor_t *prop_desc_p);
547
548jerry_value_t jerry_call_function (const jerry_value_t func_obj_val, const jerry_value_t this_val,
549                                   const jerry_value_t args_p[], jerry_size_t args_count);
550jerry_value_t jerry_construct_object (const jerry_value_t func_obj_val, const jerry_value_t args_p[],
551                                      jerry_size_t args_count);
552
553jerry_value_t jerry_get_object_keys (const jerry_value_t obj_val);
554jerry_value_t jerry_get_prototype (const jerry_value_t obj_val);
555jerry_value_t jerry_set_prototype (const jerry_value_t obj_val, const jerry_value_t proto_obj_val);
556
557bool jerry_get_object_native_pointer (const jerry_value_t obj_val,
558                                      void **out_native_pointer_p,
559                                      const jerry_object_native_info_t *native_pointer_info_p);
560void jerry_set_object_native_pointer (const jerry_value_t obj_val,
561                                      void *native_pointer_p,
562                                      const jerry_object_native_info_t *native_info_p);
563bool jerry_delete_object_native_pointer (const jerry_value_t obj_val,
564                                         const jerry_object_native_info_t *native_info_p);
565
566bool jerry_objects_foreach (jerry_objects_foreach_t foreach_p,
567                            void *user_data);
568bool jerry_objects_foreach_by_native_info (const jerry_object_native_info_t *native_info_p,
569                                           jerry_objects_foreach_by_native_info_t foreach_p,
570                                           void *user_data_p);
571
572bool jerry_foreach_object_property (const jerry_value_t obj_val, jerry_object_property_foreach_t foreach_p,
573                                    void *user_data_p);
574
575/**
576 * Promise functions.
577 */
578jerry_value_t jerry_resolve_or_reject_promise (jerry_value_t promise, jerry_value_t argument, bool is_resolve);
579
580/**
581 * Enum values representing various Promise states.
582 */
583typedef enum
584{
585  JERRY_PROMISE_STATE_NONE = 0u, /**< Invalid/Unknown state (possibly called on a non-promise object). */
586  JERRY_PROMISE_STATE_PENDING,   /**< Promise is in "Pending" state. */
587  JERRY_PROMISE_STATE_FULFILLED, /**< Promise is in "Fulfilled" state. */
588  JERRY_PROMISE_STATE_REJECTED,  /**< Promise is in "Rejected" state. */
589} jerry_promise_state_t;
590
591jerry_value_t jerry_get_promise_result (const jerry_value_t promise);
592jerry_promise_state_t jerry_get_promise_state (const jerry_value_t promise);
593
594/**
595 * Symbol functions.
596 */
597jerry_value_t jerry_get_symbol_descriptive_string (const jerry_value_t symbol);
598
599/**
600 * Input validator functions.
601 */
602bool jerry_is_valid_utf8_string (const jerry_char_t *utf8_buf_p, jerry_size_t buf_size);
603bool jerry_is_valid_cesu8_string (const jerry_char_t *cesu8_buf_p, jerry_size_t buf_size);
604
605/*
606 * Dynamic memory management functions.
607 */
608void *jerry_heap_alloc (size_t size);
609void jerry_heap_free (void *mem_p, size_t size);
610
611/*
612 * External context functions.
613 */
614jerry_context_t *jerry_create_context (uint32_t heap_size, jerry_context_alloc_t alloc, void *cb_data_p);
615
616/**
617 * Miscellaneous functions.
618 */
619void jerry_set_vm_exec_stop_callback (jerry_vm_exec_stop_callback_t stop_cb, void *user_p, uint32_t frequency);
620jerry_value_t jerry_get_backtrace (uint32_t max_depth);
621jerry_value_t jerry_get_resource_name (const jerry_value_t value);
622jerry_value_t jerry_get_new_target (void);
623
624/**
625 * Array buffer components.
626 */
627bool jerry_value_is_arraybuffer (const jerry_value_t value);
628jerry_value_t jerry_create_arraybuffer (const jerry_length_t size);
629jerry_value_t jerry_create_arraybuffer_external (const jerry_length_t size,
630                                                 uint8_t *buffer_p,
631                                                 jerry_object_native_free_callback_t free_cb);
632jerry_length_t jerry_arraybuffer_write (const jerry_value_t value,
633                                        jerry_length_t offset,
634                                        const uint8_t *buf_p,
635                                        jerry_length_t buf_size);
636jerry_length_t jerry_arraybuffer_read (const jerry_value_t value,
637                                       jerry_length_t offset,
638                                       uint8_t *buf_p,
639                                       jerry_length_t buf_size);
640jerry_length_t jerry_get_arraybuffer_byte_length (const jerry_value_t value);
641uint8_t *jerry_get_arraybuffer_pointer (const jerry_value_t value);
642jerry_value_t jerry_is_arraybuffer_detachable (const jerry_value_t value);
643jerry_value_t jerry_detach_arraybuffer (const jerry_value_t value);
644
645/**
646 * DataView functions.
647 */
648jerry_value_t
649jerry_create_dataview (const jerry_value_t value,
650                       const jerry_length_t byte_offset,
651                       const jerry_length_t byte_length);
652
653bool
654jerry_value_is_dataview (const jerry_value_t value);
655
656jerry_value_t
657jerry_get_dataview_buffer (const jerry_value_t dataview,
658                           jerry_length_t *byte_offset,
659                           jerry_length_t *byte_length);
660
661/**
662 * TypedArray functions.
663 */
664
665/**
666 * TypedArray types.
667 */
668typedef enum
669{
670  JERRY_TYPEDARRAY_INVALID = 0,
671  JERRY_TYPEDARRAY_UINT8,
672  JERRY_TYPEDARRAY_UINT8CLAMPED,
673  JERRY_TYPEDARRAY_INT8,
674  JERRY_TYPEDARRAY_UINT16,
675  JERRY_TYPEDARRAY_INT16,
676  JERRY_TYPEDARRAY_UINT32,
677  JERRY_TYPEDARRAY_INT32,
678  JERRY_TYPEDARRAY_FLOAT32,
679  JERRY_TYPEDARRAY_FLOAT64,
680} jerry_typedarray_type_t;
681
682/**
683 * Container types.
684 */
685typedef enum
686{
687  JERRY_CONTAINER_TYPE_INVALID = 0, /**< Invalid container */
688  JERRY_CONTAINER_TYPE_MAP, /**< Map type */
689  JERRY_CONTAINER_TYPE_SET, /**< Set type */
690  JERRY_CONTAINER_TYPE_WEAKMAP, /**< WeakMap type */
691  JERRY_CONTAINER_TYPE_WEAKSET, /**< WeakSet type */
692} jerry_container_type_t;
693
694bool jerry_value_is_typedarray (jerry_value_t value);
695jerry_value_t jerry_create_typedarray (jerry_typedarray_type_t type_name, jerry_length_t length);
696jerry_value_t jerry_create_typedarray_for_arraybuffer_sz (jerry_typedarray_type_t type_name,
697                                                          const jerry_value_t arraybuffer,
698                                                          jerry_length_t byte_offset,
699                                                          jerry_length_t length);
700jerry_value_t jerry_create_typedarray_for_arraybuffer (jerry_typedarray_type_t type_name,
701                                                       const jerry_value_t arraybuffer);
702jerry_typedarray_type_t jerry_get_typedarray_type (jerry_value_t value);
703jerry_length_t jerry_get_typedarray_length (jerry_value_t value);
704jerry_value_t jerry_get_typedarray_buffer (jerry_value_t value,
705                                           jerry_length_t *byte_offset,
706                                           jerry_length_t *byte_length);
707jerry_value_t jerry_json_parse (const jerry_char_t *string_p, jerry_size_t string_size);
708jerry_value_t jerry_json_stringify (const jerry_value_t object_to_stringify);
709jerry_value_t jerry_create_container (jerry_container_type_t container_type,
710                                      const jerry_value_t *arguments_list_p,
711                                      jerry_length_t arguments_list_len);
712jerry_container_type_t jerry_get_container_type (const jerry_value_t value);
713
714#if defined(JERRY_HEAPDUMP)
715void JerryHeapdumpRun(const char* filepath);
716#endif
717
718#if defined(JERRY_REF_TRACKER)
719void JerryRefTrackerStart(const char* filepath);
720void JerryRefTrackerStop(void);
721#endif
722
723/**
724 * @}
725 */
726
727#ifdef __cplusplus
728}
729#endif /* __cplusplus */
730#endif /* !JERRYSCRIPT_CORE_H */
731