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
This commit is contained in:
Zoltan Herczeg
2021-04-06 18:46:48 +02:00
committed by GitHub
parent 4377ef684d
commit d85020f709
60 changed files with 1274 additions and 1212 deletions
@@ -78,7 +78,7 @@ static inline ecma_value_t
ecma_builtin_promise_reject_abrupt (ecma_value_t value, /**< value */
ecma_object_t *capability_obj_p) /**< capability */
{
JERRY_ASSERT (ecma_object_class_is (capability_obj_p, LIT_INTERNAL_MAGIC_PROMISE_CAPABILITY));
JERRY_ASSERT (ecma_object_class_is (capability_obj_p, ECMA_OBJECT_CLASS_PROMISE_CAPABILITY));
if (!ECMA_IS_VALUE_ERROR (value))
{
@@ -101,7 +101,7 @@ ecma_builtin_promise_reject_abrupt (ecma_value_t value, /**< value */
ecma_free_value (call_ret);
return ecma_copy_value (capability_p->header.u.class_prop.u.promise);
return ecma_copy_value (capability_p->header.u.cls.u3.promise);
} /* ecma_builtin_promise_reject_abrupt */
/**
@@ -122,7 +122,7 @@ ecma_builtin_promise_perform_race (ecma_value_t iterator, /**< the iterator for
bool *done_p) /**< [out] iteratorRecord[[done]] */
{
JERRY_ASSERT (ecma_is_value_object (iterator));
JERRY_ASSERT (ecma_object_class_is (capability_obj_p, LIT_INTERNAL_MAGIC_PROMISE_CAPABILITY));
JERRY_ASSERT (ecma_object_class_is (capability_obj_p, ECMA_OBJECT_CLASS_PROMISE_CAPABILITY));
JERRY_ASSERT (ecma_is_constructor (ctor));
ecma_promise_capabality_t *capability_p = (ecma_promise_capabality_t *) capability_obj_p;
@@ -145,7 +145,7 @@ ecma_builtin_promise_perform_race (ecma_value_t iterator, /**< the iterator for
if (ecma_is_value_false (next))
{
/* ii. */
ret_value = ecma_copy_value (capability_p->header.u.class_prop.u.promise);
ret_value = ecma_copy_value (capability_p->header.u.cls.u3.promise);
goto done;
}
@@ -206,7 +206,7 @@ ecma_builtin_promise_perform (ecma_value_t iterator, /**< iteratorRecord */
bool *done_p) /**< [out] iteratorRecord[[done]] */
{
/* 1. - 2. */
JERRY_ASSERT (ecma_object_class_is (capability_obj_p, LIT_INTERNAL_MAGIC_PROMISE_CAPABILITY));
JERRY_ASSERT (ecma_object_class_is (capability_obj_p, ECMA_OBJECT_CLASS_PROMISE_CAPABILITY));
JERRY_ASSERT (ecma_is_constructor (ctor));
ecma_promise_capabality_t *capability_p = (ecma_promise_capabality_t *) capability_obj_p;
@@ -261,7 +261,7 @@ ecma_builtin_promise_perform (ecma_value_t iterator, /**< iteratorRecord */
}
/* iv. */
ret_value = ecma_copy_value (capability_p->header.u.class_prop.u.promise);
ret_value = ecma_copy_value (capability_p->header.u.cls.u3.promise);
goto done;
}
@@ -320,13 +320,16 @@ ecma_builtin_promise_perform (ecma_value_t iterator, /**< iteratorRecord */
/* p. */
executor_p->remaining_elements = remaining;
executor_p->header.u.class_prop.extra_info = ECMA_PROMISE_ALL_RESOLVE;
uint8_t executor_type = ECMA_PROMISE_ALL_RESOLVE << ECMA_NATIVE_HANDLER_FLAGS_PROMISE_HELPER_SHIFT;
if (builtin_routine_id == ECMA_PROMISE_ROUTINE_ALLSETTLED)
{
executor_p->header.u.class_prop.extra_info = ECMA_PROMISE_ALLSETTLED_RESOLVE;
executor_type = ECMA_PROMISE_ALLSETTLED_RESOLVE << ECMA_NATIVE_HANDLER_FLAGS_PROMISE_HELPER_SHIFT;
}
executor_p->header.u.built_in.u2.routine_flags |= executor_type;
args[0] = ecma_make_object_value (executor_func_p);
}
else
@@ -340,22 +343,22 @@ ecma_builtin_promise_perform (ecma_value_t iterator, /**< iteratorRecord */
if (builtin_routine_id != ECMA_PROMISE_ROUTINE_ALL)
{
ecma_promise_all_exector_type_t type = ECMA_PROMISE_ALLSETTLED_REJECT;
uint8_t executor_type = ECMA_PROMISE_ALLSETTLED_REJECT << ECMA_NATIVE_HANDLER_FLAGS_PROMISE_HELPER_SHIFT;
if (builtin_routine_id == ECMA_PROMISE_ROUTINE_ANY)
{
type = ECMA_PROMISE_ANY_REJECT;
executor_type = ECMA_PROMISE_ANY_REJECT << ECMA_NATIVE_HANDLER_FLAGS_PROMISE_HELPER_SHIFT;
}
ecma_object_t *reject_func_p = ecma_op_create_native_handler (ECMA_NATIVE_HANDLER_PROMISE_ALL_HELPER,
sizeof (ecma_promise_all_executor_t));
sizeof (ecma_promise_all_executor_t));
ecma_promise_all_executor_t *reject_p = (ecma_promise_all_executor_t *) reject_func_p;
reject_p->index = idx;
reject_p->values = values_array;
reject_p->capability = ecma_make_object_value (capability_obj_p);
reject_p->remaining_elements = remaining;
reject_p->header.u.class_prop.extra_info = (uint16_t) type;
reject_p->header.u.built_in.u2.routine_flags |= executor_type;
args[1] = ecma_make_object_value (reject_func_p);
result = ecma_op_invoke_by_magic_id (next_promise, LIT_MAGIC_STRING_THEN, args, 2);
ecma_deref_object (reject_func_p);