aboutsummaryrefslogtreecommitdiff
path: root/jerry-core/ecma/base/ecma-globals.h
diff options
context:
space:
mode:
authorZoltan Herczeg <zherczeg.u-szeged@partner.samsung.com>2021-04-06 18:46:48 +0200
committerGitHub <noreply@github.com>2021-04-06 18:46:48 +0200
commitd85020f709b5ea0c6ecf06920746953441c3dfed (patch)
tree1ced54c2cb573e7601a192d5a6e8e92d9fc94f5a /jerry-core/ecma/base/ecma-globals.h
parent4377ef684deba37eede8278869f9b5000606249a (diff)
Remove pseudo array object type from the project (#4643)
A new class type enum is introduced to describe the class of objects. This enum is organized to improve property resolve and GC performance. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
Diffstat (limited to 'jerry-core/ecma/base/ecma-globals.h')
-rw-r--r--jerry-core/ecma/base/ecma-globals.h171
1 files changed, 121 insertions, 50 deletions
diff --git a/jerry-core/ecma/base/ecma-globals.h b/jerry-core/ecma/base/ecma-globals.h
index 836dad04..4bc63b2a 100644
--- a/jerry-core/ecma/base/ecma-globals.h
+++ b/jerry-core/ecma/base/ecma-globals.h
@@ -685,7 +685,6 @@ typedef enum
ECMA_OBJECT_TYPE_GENERAL = 0, /**< all objects that are not belongs to the sub-types below. */
ECMA_OBJECT_TYPE_CLASS = 1, /**< Objects with class property */
ECMA_OBJECT_TYPE_ARRAY = 2, /**< Array object (15.4) */
- ECMA_OBJECT_TYPE_PSEUDO_ARRAY = 3, /**< Array-like object, such as Arguments object (10.6) */
ECMA_OBJECT_TYPE_PROXY = 4, /**< Proxy object ECMAScript v6 26.2 */
/* Note: these 4 types must be in this order. See IsCallable operation. */
ECMA_OBJECT_TYPE_FUNCTION = 5, /**< Function objects (15.3), created through 13.2 routine */
@@ -701,16 +700,69 @@ typedef enum
*/
typedef enum
{
- ECMA_PSEUDO_ARRAY_ARGUMENTS = 0, /**< Arguments object (10.6) */
- ECMA_PSEUDO_ARRAY_TYPEDARRAY = 1, /**< TypedArray which does NOT need extra space to store length and offset */
- ECMA_PSEUDO_ARRAY_TYPEDARRAY_WITH_INFO = 2, /**< TypedArray which NEEDS extra space to store length and offset */
- ECMA_PSEUDO_ARRAY_ITERATOR = 3, /**< Array iterator object (ECMAScript v6, 22.1.5.1) */
- ECMA_PSEUDO_SET_ITERATOR = 4, /**< Set iterator object (ECMAScript v6, 23.2.5.1) */
- ECMA_PSEUDO_MAP_ITERATOR = 5, /**< Map iterator object (ECMAScript v6, 23.1.5.1) */
- ECMA_PSEUDO_STRING_ITERATOR = 6, /**< String iterator object (ECMAScript v6, 22.1.5.1) */
- ECMA_PSEUDO_REGEXP_STRING_ITERATOR = 7, /** RegExp string iterator object (ECMAScript v11, 21.2.7) */
- ECMA_PSEUDO_ARRAY__MAX = ECMA_PSEUDO_STRING_ITERATOR /**< maximum value */
-} ecma_pseudo_array_type_t;
+ /* These objects require custom property resolving. */
+ ECMA_OBJECT_CLASS_STRING, /**< String Object (ECMAScript v5.1, 4.3.18) */
+ ECMA_OBJECT_CLASS_ARGUMENTS, /**< Arguments object (10.6) */
+#if JERRY_BUILTIN_TYPEDARRAY
+ ECMA_OBJECT_CLASS_TYPEDARRAY, /**< TypedArray which does NOT need extra space to store length and offset */
+ ECMA_OBJECT_CLASS_TYPEDARRAY_WITH_INFO, /**< TypedArray which NEEDS extra space to store length and offset */
+#endif /* JERRY_BUILTIN_TYPEDARRAY */
+
+ /* These objects are marked by Garbage Collector. */
+#if JERRY_ESNEXT
+ ECMA_OBJECT_CLASS_GENERATOR, /**< Generator object (ECMAScript v6, 25.2) */
+ ECMA_OBJECT_CLASS_ASYNC_GENERATOR, /**< Async generator object (ECMAScript v11, 25.3) */
+ ECMA_OBJECT_CLASS_ARRAY_ITERATOR, /**< Array iterator object (ECMAScript v6, 22.1.5.1) */
+ ECMA_OBJECT_CLASS_SET_ITERATOR, /**< Set iterator object (ECMAScript v6, 23.2.5.1) */
+ ECMA_OBJECT_CLASS_MAP_ITERATOR, /**< Map iterator object (ECMAScript v6, 23.1.5.1) */
+#if JERRY_BUILTIN_REGEXP
+ ECMA_OBJECT_CLASS_REGEXP_STRING_ITERATOR, /** RegExp string iterator object (ECMAScript v11, 21.2.7) */
+#endif /* JERRY_BUILTIN_REGEXP */
+#endif /* JERRY_ESNEXT */
+#if JERRY_MODULE_SYSTEM
+ ECMA_OBJECT_CLASS_MODULE, /**< Module (ECMAScript v6, 15.2) */
+#endif
+#if JERRY_BUILTIN_PROMISE
+ ECMA_OBJECT_CLASS_PROMISE, /**< Promise (ECMAScript v6, 25.4) */
+ ECMA_OBJECT_CLASS_PROMISE_CAPABILITY, /**< Promise capability (ECMAScript v6, 25.4.1.1) */
+#endif /* JERRY_BUILTIN_PROMISE */
+#if JERRY_BUILTIN_DATAVIEW
+ ECMA_OBJECT_CLASS_DATAVIEW, /**< DataView (ECMAScript v6, 24.2) */
+#endif /* JERRY_BUILTIN_DATAVIEW */
+#if JERRY_BUILTIN_CONTAINER
+ ECMA_OBJECT_CLASS_CONTAINER, /**< Container (Map, WeakMap, Set, WeakSet) */
+#endif /* JERRY_BUILTIN_CONTAINER */
+
+ /* Normal objects. */
+ ECMA_OBJECT_CLASS_BOOLEAN, /**< Boolean Object (ECMAScript v5.1, 4.3.15) */
+ ECMA_OBJECT_CLASS_NUMBER, /**< Number Object (ECMAScript v5.1, 4.3.21) */
+ ECMA_OBJECT_CLASS_ERROR, /**< Error Object (ECMAScript v5.1, 15.11) */
+ ECMA_OBJECT_CLASS_INTERNAL_OBJECT, /**< object for internal properties */
+#if JERRY_PARSER
+ ECMA_OBJECT_CLASS_SCRIPT, /**< Compiled ECMAScript byte code */
+#endif /* JERRY_PARSER */
+#if JERRY_BUILTIN_DATE
+ ECMA_OBJECT_CLASS_DATE, /**< Date Object (ECMAScript v5.1, 15.9) */
+#endif /* JERRY_BUILTIN_DATE */
+#if JERRY_BUILTIN_REGEXP
+ ECMA_OBJECT_CLASS_REGEXP, /**< RegExp Object (ECMAScript v5.1, 15.10) */
+#endif /* JERRY_BUILTIN_REGEXP */
+#if JERRY_ESNEXT
+ ECMA_OBJECT_CLASS_SYMBOL, /**< Symbol object (ECMAScript v6, 4.3.27) */
+ ECMA_OBJECT_CLASS_STRING_ITERATOR, /**< String iterator object (ECMAScript v6, 22.1.5.1) */
+#endif /* JERRY_ESNEXT */
+#if JERRY_BUILTIN_TYPEDARRAY
+ ECMA_OBJECT_CLASS_ARRAY_BUFFER, /**< Array Buffer (ECMAScript v6, 24.1) */
+#endif /* JERRY_BUILTIN_TYPEDARRAY */
+#if JERRY_BUILTIN_BIGINT
+ ECMA_OBJECT_CLASS_BIGINT, /**< Bigint (ECMAScript v11, 4.3.27) */
+#endif /* JERRY_BUILTIN_BIGINT */
+#if JERRY_BUILTIN_WEAKREF
+ ECMA_OBJECT_CLASS_WEAKREF, /**< WeakRef (Not standardized yet) */
+#endif /* JERRY_BUILTIN_WEAKREF */
+
+ ECMA_OBJECT_CLASS__MAX /**< maximum value */
+} ecma_object_class_type_t;
/**
* Types of lexical environments.
@@ -960,30 +1012,72 @@ typedef struct
/**
* Description of objects with class.
+ *
+ * Note:
+ * class is a reserved word in c++, so cls is used instead
*/
struct
{
- uint16_t class_id; /**< class id of the object */
- uint16_t extra_info; /**< extra information for the object
- * e.g. array buffer type info (external/internal) */
-
+ uint8_t type; /**< class type of the object */
/**
- * Description of extra fields. These extra fields depend on the class_id.
+ * Description of 8 bit extra fields. These extra fields depend on the type.
+ */
+ union
+ {
+ uint8_t arguments_flags; /**< arguments object flags */
+#if JERRY_BUILTIN_DATE
+ uint8_t date_flags; /**< flags for date objects */
+#endif /* JERRY_BUILTIN_DATE */
+#if JERRY_MODULE_SYSTEM
+ uint8_t module_state; /**< Module state */
+#endif /* JERRY_MODULE_SYSTEM */
+#if JERRY_ESNEXT
+ uint8_t iterator_kind; /**< type of iterator */
+ uint8_t regexp_string_iterator_flags; /**< flags for RegExp string iterator */
+#endif /* JERRY_ESNEXT */
+#if JERRY_BUILTIN_PROMISE
+ uint8_t promise_flags; /**< flags for Promise objects */
+#endif /* JERRY_BUILTIN_PROMISE */
+#if JERRY_BUILTIN_CONTAINER
+ uint8_t container_flags; /**< flags for container objects */
+#endif /* JERRY_BUILTIN_CONTAINER */
+#if JERRY_BUILTIN_TYPEDARRAY
+ uint8_t array_buffer_flags; /**< ArrayBuffer flags */
+ uint8_t typedarray_type; /**< type of typed array */
+#endif /* JERRY_BUILTIN_TYPEDARRAY */
+ } u1;
+ /**
+ * Description of 16 bit extra fields. These extra fields depend on the type.
+ */
+ union
+ {
+ /* The ecma_object_get_class_name must handle those types which does not use id. */
+ uint16_t id; /**< magic string id of the class */
+ uint16_t formal_params_number; /**< for arguments: formal parameters number */
+ uint16_t iterator_index; /**< for %Iterator%: [[%Iterator%NextIndex]] property */
+ uint16_t executable_obj_flags; /**< executable object flags */
+ } u2;
+ /**
+ * Description of 32 bit / value. These extra fields depend on the type.
*/
union
{
ecma_value_t value; /**< value of the object (e.g. boolean, number, string, etc.) */
ecma_value_t date; /**< Date object [[DateValue]] internal property */
+ ecma_value_t target; /**< [[ProxyTarget]] or [[WeakRefTarget]] internal property */
+ ecma_value_t head; /**< points to the async generator task queue head item */
+ ecma_value_t promise; /**< PromiseCapability[[Promise]] internal slot */
+ ecma_value_t arraybuffer; /**< for typedarray: internal arraybuffer */
+ ecma_value_t iterated_value; /**< for %Iterator%: [[IteratedObject]] property */
+ ecma_value_t spread_value; /**< for spread object: spreaded element */
int32_t tza; /**< TimeZone adjustment for date objects */
uint32_t length; /**< length related property (e.g. length of ArrayBuffer) */
+ uint32_t arguments_number; /**< for arguments: arguments number */
#if JERRY_MODULE_SYSTEM
uint32_t dfs_ancestor_index; /**< module dfs ancestor index (ES2020 15.2.1.16) */
#endif /* JERRY_MODULE_SYSTEM */
- ecma_value_t target; /**< [[ProxyTarget]] or [[WeakRefTarget]] internal property */
- ecma_value_t head; /**< points to the async generator task queue head item */
- ecma_value_t promise; /**< PromiseCapability[[Promise]] internal slot */
- } u;
- } class_prop;
+ } u3;
+ } cls;
/**
* Description of function objects.
@@ -1005,30 +1099,6 @@ typedef struct
} array;
/**
- * Description of pseudo array objects.
- */
- struct
- {
- uint8_t type; /**< pseudo array type, e.g. Arguments, TypedArray, ArrayIterator */
- uint8_t extra_info; /**< extra information about the object.
- * e.g. the specific builtin id for typed arrays,
- * [[IterationKind]] property for %Iterator% */
- union
- {
- uint16_t formal_params_number; /**< for arguments: formal parameters number */
- uint16_t class_id; /**< for typedarray: the specific class name id */
- uint16_t iterator_index; /**< for %Iterator%: [[%Iterator%NextIndex]] property */
- } u1;
- union
- {
- uint32_t arguments_number; /**< for arguments: arguments number */
- ecma_value_t arraybuffer; /**< for typedarray: internal arraybuffer */
- ecma_value_t iterated_value; /**< for %Iterator%: [[IteratedObject]] property */
- ecma_value_t spread_value; /**< for spread object: spreaded element */
- } u2;
- } pseudo_array;
-
- /**
* Description of bound function object.
*/
struct
@@ -1973,7 +2043,7 @@ typedef enum
* Check whether the ArrayBuffer has external underlying buffer
*/
#define ECMA_ARRAYBUFFER_HAS_EXTERNAL_MEMORY(object_p) \
- ((((ecma_extended_object_t *) object_p)->u.class_prop.extra_info & ECMA_ARRAYBUFFER_EXTERNAL_MEMORY) != 0)
+ ((((ecma_extended_object_t *) object_p)->u.cls.u1.array_buffer_flags & ECMA_ARRAYBUFFER_EXTERNAL_MEMORY) != 0)
/**
* Struct to store information for ArrayBuffers with external memory.
@@ -2065,8 +2135,9 @@ typedef enum
/**
* Checks whether the executable object is waiting for resuming.
*/
-#define ECMA_EXECUTABLE_OBJECT_IS_SUSPENDED(extra_info) \
- (!((extra_info) & (ECMA_EXECUTABLE_OBJECT_COMPLETED | ECMA_EXECUTABLE_OBJECT_RUNNING)))
+#define ECMA_EXECUTABLE_OBJECT_IS_SUSPENDED(executable_object_p) \
+ (!((executable_object_p)->extended_object.u.cls.u2.executable_obj_flags \
+ & (ECMA_EXECUTABLE_OBJECT_COMPLETED | ECMA_EXECUTABLE_OBJECT_RUNNING)))
/**
* Last item of yield* related await states.
@@ -2082,7 +2153,7 @@ typedef enum
* Resume execution of the byte code.
*/
#define ECMA_EXECUTABLE_OBJECT_RESUME_EXEC(executable_object_p) \
- ((executable_object_p)->extended_object.u.class_prop.extra_info &= ECMA_EXECUTABLE_OBJECT_RESUME_EXEC_MASK)
+ ((executable_object_p)->extended_object.u.cls.u2.executable_obj_flags &= ECMA_EXECUTABLE_OBJECT_RESUME_EXEC_MASK)
/**
* Enqueued task of an AsyncGenerator.
@@ -2143,7 +2214,7 @@ typedef enum
ECMA_PROMISE_ALLSETTLED_RESOLVE, /**< promise.allSettled resolve */
ECMA_PROMISE_ALLSETTLED_REJECT, /**< promise.allSettled reject */
ECMA_PROMISE_ANY_REJECT, /**< promise.any reject */
-} ecma_promise_all_exector_type_t;
+} ecma_promise_executor_type_t;
#endif /* JERRY_ESNEXT */