From d08b5be57f4d87ff5dca32a20efcccfbd23be825 Mon Sep 17 00:00:00 2001 From: Zoltan Herczeg Date: Mon, 13 Sep 2021 19:25:22 +0200 Subject: [PATCH] Remove built-in flag from object type (#4763) JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com --- jerry-core/api/jerry-snapshot.c | 2 - jerry-core/api/jerry.c | 77 +-- jerry-core/debugger/debugger.c | 3 +- jerry-core/ecma/base/ecma-gc.c | 271 ++++---- jerry-core/ecma/base/ecma-globals.h | 53 +- jerry-core/ecma/base/ecma-helpers-value.c | 2 +- jerry-core/ecma/base/ecma-helpers.c | 112 +-- jerry-core/ecma/base/ecma-helpers.h | 4 +- jerry-core/ecma/base/ecma-module.c | 12 +- .../ecma-builtin-array-iterator-prototype.c | 3 +- .../ecma-builtin-async-generator-prototype.c | 9 +- .../ecma-builtin-generator-prototype.c | 9 +- .../ecma/builtin-objects/ecma-builtin-json.c | 6 +- .../ecma-builtin-regexp-prototype.c | 2 +- .../ecma/builtin-objects/ecma-builtins.c | 112 +-- .../ecma/builtin-objects/ecma-builtins.inc.h | 2 +- .../ecma/operations/ecma-array-object.c | 10 +- .../ecma/operations/ecma-function-object.c | 144 ++-- .../ecma/operations/ecma-objects-general.c | 49 +- jerry-core/ecma/operations/ecma-objects.c | 635 +++++++++--------- .../ecma/operations/ecma-string-object.c | 2 +- .../ecma/operations/ecma-symbol-object.c | 9 +- jerry-core/vm/opcodes.c | 2 - 23 files changed, 741 insertions(+), 789 deletions(-) diff --git a/jerry-core/api/jerry-snapshot.c b/jerry-core/api/jerry-snapshot.c index 5af9192f1..f1858abd0 100644 --- a/jerry-core/api/jerry-snapshot.c +++ b/jerry-core/api/jerry-snapshot.c @@ -786,8 +786,6 @@ jerry_generate_snapshot (jerry_value_t compiled_code, /**< parsed script or func } else if (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_FUNCTION) { - JERRY_ASSERT (!ecma_get_object_is_builtin (object_p)); - ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) object_p; bytecode_data_p = ecma_op_function_get_compiled_code (ext_func_p); diff --git a/jerry-core/api/jerry.c b/jerry-core/api/jerry.c index b20b0b8f5..8937abafd 100644 --- a/jerry-core/api/jerry.c +++ b/jerry-core/api/jerry.c @@ -1164,7 +1164,7 @@ jerry_value_is_array (const jerry_value_t value) /**< jerry api value */ jerry_assert_api_available (); return (ecma_is_value_object (value) - && ecma_get_object_type (ecma_get_object_from_value (value)) == ECMA_OBJECT_TYPE_ARRAY); + && ecma_get_object_base_type (ecma_get_object_from_value (value)) == ECMA_OBJECT_BASE_TYPE_ARRAY); } /* jerry_value_is_array */ /** @@ -1267,8 +1267,7 @@ jerry_value_is_async_function (const jerry_value_t value) /**< api value */ { ecma_object_t *obj_p = ecma_get_object_from_value (value); - if (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_FUNCTION - && !ecma_get_object_is_builtin (obj_p)) + if (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_FUNCTION) { const ecma_compiled_code_t *bytecode_data_p; bytecode_data_p = ecma_op_function_get_compiled_code ((ecma_extended_object_t *) obj_p); @@ -1593,13 +1592,14 @@ jerry_object_get_type (const jerry_value_t value) /**< input value to check */ switch (ecma_get_object_type (obj_p)) { - case ECMA_OBJECT_TYPE_FUNCTION: - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: + case ECMA_OBJECT_TYPE_CLASS: + case ECMA_OBJECT_TYPE_BUILT_IN_CLASS: { - return JERRY_OBJECT_TYPE_FUNCTION; + JERRY_ASSERT (ext_obj_p->u.cls.type < ECMA_OBJECT_CLASS__MAX); + return jerry_class_object_type[ext_obj_p->u.cls.type]; } case ECMA_OBJECT_TYPE_ARRAY: + case ECMA_OBJECT_TYPE_BUILT_IN_ARRAY: { return JERRY_OBJECT_TYPE_ARRAY; } @@ -1609,10 +1609,12 @@ jerry_object_get_type (const jerry_value_t value) /**< input value to check */ return JERRY_OBJECT_TYPE_PROXY; } #endif /* JERRY_ESNEXT */ - case ECMA_OBJECT_TYPE_CLASS: + case ECMA_OBJECT_TYPE_FUNCTION: + case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: { - JERRY_ASSERT (ext_obj_p->u.cls.type < ECMA_OBJECT_CLASS__MAX); - return jerry_class_object_type[ext_obj_p->u.cls.type]; + return JERRY_OBJECT_TYPE_FUNCTION; } default: { @@ -1646,37 +1648,35 @@ jerry_function_get_type (const jerry_value_t value) /**< input value to check */ return JERRY_FUNCTION_TYPE_BOUND; } case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: { return JERRY_FUNCTION_TYPE_GENERIC; } case ECMA_OBJECT_TYPE_FUNCTION: { - if (!ecma_get_object_is_builtin (obj_p)) - { - const ecma_compiled_code_t *bytecode_data_p = ecma_op_function_get_compiled_code (ext_obj_p); + const ecma_compiled_code_t *bytecode_data_p = ecma_op_function_get_compiled_code (ext_obj_p); - switch (CBC_FUNCTION_GET_TYPE (bytecode_data_p->status_flags)) - { + switch (CBC_FUNCTION_GET_TYPE (bytecode_data_p->status_flags)) + { #if JERRY_ESNEXT - case CBC_FUNCTION_ARROW: - case CBC_FUNCTION_ASYNC_ARROW: - { - return JERRY_FUNCTION_TYPE_ARROW; - } - case CBC_FUNCTION_GENERATOR: - case CBC_FUNCTION_ASYNC_GENERATOR: - { - return JERRY_FUNCTION_TYPE_GENERATOR; - } + case CBC_FUNCTION_ARROW: + case CBC_FUNCTION_ASYNC_ARROW: + { + return JERRY_FUNCTION_TYPE_ARROW; + } + case CBC_FUNCTION_GENERATOR: + case CBC_FUNCTION_ASYNC_GENERATOR: + { + return JERRY_FUNCTION_TYPE_GENERATOR; + } #endif /* JERRY_ESNEXT */ - case CBC_FUNCTION_ACCESSOR: - { - return JERRY_FUNCTION_TYPE_ACCESSOR; - } - default: - { - break; - } + case CBC_FUNCTION_ACCESSOR: + { + return JERRY_FUNCTION_TYPE_ACCESSOR; + } + default: + { + break; } } return JERRY_FUNCTION_TYPE_GENERIC; @@ -2872,7 +2872,7 @@ jerry_get_array_length (const jerry_value_t value) /**< api value */ ecma_object_t *object_p = ecma_get_object_from_value (value); - if (JERRY_LIKELY (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_ARRAY)) + if (JERRY_LIKELY (ecma_get_object_base_type (object_p) == ECMA_OBJECT_BASE_TYPE_ARRAY)) { return ecma_array_get_length (object_p); } @@ -5519,8 +5519,7 @@ jerry_set_realm (jerry_value_t realm_value) /**< jerry api value */ { ecma_object_t *object_p = ecma_get_object_from_value (realm_value); - if (ecma_get_object_is_builtin (object_p) - && ecma_builtin_is_global (object_p)) + if (ecma_builtin_is_global (object_p)) { ecma_global_object_t *previous_global_object_p = JERRY_CONTEXT (global_object_p); JERRY_CONTEXT (global_object_p) = (ecma_global_object_t *) object_p; @@ -5551,8 +5550,7 @@ jerry_realm_get_this (jerry_value_t realm_value) /**< realm value */ { ecma_object_t *object_p = ecma_get_object_from_value (realm_value); - if (ecma_get_object_is_builtin (object_p) - && ecma_builtin_is_global (object_p)) + if (ecma_builtin_is_global (object_p)) { ecma_global_object_t *global_object_p = (ecma_global_object_t *) object_p; @@ -5599,8 +5597,7 @@ jerry_realm_set_this (jerry_value_t realm_value, /**< realm value */ { ecma_object_t *object_p = ecma_get_object_from_value (realm_value); - if (ecma_get_object_is_builtin (object_p) - && ecma_builtin_is_global (object_p)) + if (ecma_builtin_is_global (object_p)) { ecma_global_object_t *global_object_p = (ecma_global_object_t *) object_p; global_object_p->this_binding = this_value; diff --git a/jerry-core/debugger/debugger.c b/jerry-core/debugger/debugger.c index 093ab24a7..13caf14ad 100644 --- a/jerry-core/debugger/debugger.c +++ b/jerry-core/debugger/debugger.c @@ -1425,8 +1425,7 @@ jerry_debugger_exception_object_to_string (ecma_value_t exception_obj_value) /** ecma_object_t *prototype_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t, prototype_cp); - if (ecma_get_object_type (prototype_p) != ECMA_OBJECT_TYPE_GENERAL - || !ecma_get_object_is_builtin (prototype_p)) + if (ecma_get_object_type (prototype_p) != ECMA_OBJECT_TYPE_BUILT_IN_GENERAL) { return NULL; } diff --git a/jerry-core/ecma/base/ecma-gc.c b/jerry-core/ecma/base/ecma-gc.c index ab6a603a9..e6745b4d4 100644 --- a/jerry-core/ecma/base/ecma-gc.c +++ b/jerry-core/ecma/base/ecma-gc.c @@ -837,53 +837,37 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */ } else { - ecma_object_type_t object_type = ecma_get_object_type (object_p); - -#if JERRY_BUILTIN_REALMS - if (JERRY_UNLIKELY (ecma_get_object_is_builtin (object_p))) - { - ecma_value_t realm_value; - - if (ECMA_BUILTIN_IS_EXTENDED_BUILT_IN (object_type)) - { - realm_value = ((ecma_extended_built_in_object_t *) object_p)->built_in.realm_value; - } - else - { - ecma_extended_object_t *extended_object_p = (ecma_extended_object_t *) object_p; - - if (object_type == ECMA_OBJECT_TYPE_GENERAL - && extended_object_p->u.built_in.id == ECMA_BUILTIN_ID_GLOBAL) - { - ecma_gc_mark_global_object ((ecma_global_object_t *) object_p); - } - - realm_value = extended_object_p->u.built_in.realm_value; - } - - ecma_gc_set_object_visited (ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t, realm_value)); - } -#endif /* JERRY_BUILTIN_REALMS */ - /** * Have the object's prototype here so the object could set it to JMEM_CP_NULL * if the prototype should be ignored (like in case of PROXY). */ jmem_cpointer_t proto_cp = object_p->u2.prototype_cp; - switch (object_type) + switch (ecma_get_object_type (object_p)) { -#if !JERRY_BUILTIN_REALMS - case ECMA_OBJECT_TYPE_GENERAL: + case ECMA_OBJECT_TYPE_BUILT_IN_GENERAL: { - if (JERRY_UNLIKELY (ecma_get_object_is_builtin (object_p)) - && ((ecma_extended_object_t *) object_p)->u.built_in.id == ECMA_BUILTIN_ID_GLOBAL) + ecma_extended_object_t *extended_object_p = (ecma_extended_object_t *) object_p; + + if (extended_object_p->u.built_in.id == ECMA_BUILTIN_ID_GLOBAL) { ecma_gc_mark_global_object ((ecma_global_object_t *) object_p); } + +#if JERRY_BUILTIN_REALMS + ecma_value_t realm_value = extended_object_p->u.built_in.realm_value; + ecma_gc_set_object_visited (ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t, realm_value)); +#endif /* JERRY_BUILTIN_REALMS */ break; } -#endif /* !JERRY_BUILTIN_REALMS */ + case ECMA_OBJECT_TYPE_BUILT_IN_CLASS: + { +#if JERRY_BUILTIN_REALMS + ecma_value_t realm_value = ((ecma_extended_built_in_object_t *) object_p)->built_in.realm_value; + ecma_gc_set_object_visited (ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t, realm_value)); +#endif /* JERRY_BUILTIN_REALMS */ + /* FALLTHRU */ + } case ECMA_OBJECT_TYPE_CLASS: { ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; @@ -1048,6 +1032,14 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */ break; } + case ECMA_OBJECT_TYPE_BUILT_IN_ARRAY: + { +#if JERRY_BUILTIN_REALMS + ecma_value_t realm_value = ((ecma_extended_built_in_object_t *) object_p)->built_in.realm_value; + ecma_gc_set_object_visited (ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t, realm_value)); +#endif /* JERRY_BUILTIN_REALMS */ + /* FALLTHRU */ + } case ECMA_OBJECT_TYPE_ARRAY: { ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; @@ -1100,8 +1092,6 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */ } case ECMA_OBJECT_TYPE_FUNCTION: { - JERRY_ASSERT (!ecma_get_object_is_builtin (object_p)); - ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) object_p; ecma_gc_set_object_visited (ECMA_GET_NON_NULL_POINTER_FROM_POINTER_TAG (ecma_object_t, ext_func_p->u.function.scope_cp)); @@ -1136,24 +1126,27 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */ ecma_gc_mark_compiled_code (byte_code_p); break; } -#if JERRY_ESNEXT || JERRY_BUILTIN_REALMS +#if JERRY_BUILTIN_REALMS case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: { + ecma_native_function_t *native_function_p = (ecma_native_function_t *) object_p; + ecma_gc_set_object_visited (ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t, + native_function_p->realm_value)); + break; + } +#endif /* JERRY_BUILTIN_REALMS */ +#if JERRY_ESNEXT || JERRY_BUILTIN_REALMS + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: + { + ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) object_p; #endif /* JERRY_ESNEXT || JERRY_BUILTIN_REALMS */ - if (!ecma_get_object_is_builtin (object_p)) - { #if JERRY_BUILTIN_REALMS - ecma_native_function_t *native_function_p = (ecma_native_function_t *) object_p; - ecma_gc_set_object_visited (ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t, - native_function_p->realm_value)); + ecma_value_t realm_value = ext_func_p->u.built_in.realm_value; + ecma_gc_set_object_visited (ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t, realm_value)); #endif /* JERRY_BUILTIN_REALMS */ - break; - } #if JERRY_ESNEXT - ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) object_p; - if (ext_func_p->u.built_in.id == ECMA_BUILTIN_ID_HANDLER) { switch (ext_func_p->u.built_in.routine_id) @@ -1688,88 +1681,6 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */ size_t ext_object_size = sizeof (ecma_extended_object_t); - if (JERRY_UNLIKELY (ecma_get_object_is_builtin (object_p))) - { - uint8_t length_and_bitset_size; - - if (ECMA_BUILTIN_IS_EXTENDED_BUILT_IN (object_type)) - { - ext_object_size = sizeof (ecma_extended_built_in_object_t); - length_and_bitset_size = ((ecma_extended_built_in_object_t *) object_p)->built_in.u.length_and_bitset_size; - ext_object_size += sizeof (uint64_t) * (length_and_bitset_size >> ECMA_BUILT_IN_BITSET_SHIFT); - } - else - { - ecma_extended_object_t *extended_object_p = (ecma_extended_object_t *) object_p; - - if (extended_object_p->u.built_in.routine_id > 0) - { - JERRY_ASSERT (object_type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION); - -#if JERRY_ESNEXT - if (extended_object_p->u.built_in.id == ECMA_BUILTIN_ID_HANDLER) - { - switch (extended_object_p->u.built_in.routine_id) - { - case ECMA_NATIVE_HANDLER_PROMISE_RESOLVE: - case ECMA_NATIVE_HANDLER_PROMISE_REJECT: - { - ext_object_size = sizeof (ecma_promise_resolver_t); - break; - } - case ECMA_NATIVE_HANDLER_PROMISE_THEN_FINALLY: - case ECMA_NATIVE_HANDLER_PROMISE_CATCH_FINALLY: - { - ext_object_size = sizeof (ecma_promise_finally_function_t); - break; - } - case ECMA_NATIVE_HANDLER_PROMISE_CAPABILITY_EXECUTOR: - { - ext_object_size = sizeof (ecma_promise_capability_executor_t); - break; - } - case ECMA_NATIVE_HANDLER_PROMISE_ALL_HELPER: - { - ext_object_size = sizeof (ecma_promise_all_executor_t); - break; - } -#if JERRY_BUILTIN_PROXY - case ECMA_NATIVE_HANDLER_PROXY_REVOKE: - { - ext_object_size = sizeof (ecma_revocable_proxy_object_t); - break; - } -#endif /* JERRY_BUILTIN_PROXY */ - case ECMA_NATIVE_HANDLER_VALUE_THUNK: - case ECMA_NATIVE_HANDLER_VALUE_THROWER: - { - ecma_free_value_if_not_object (((ecma_promise_value_thunk_t *) object_p)->value); - ext_object_size = sizeof (ecma_promise_value_thunk_t); - break; - } - default: - { - JERRY_UNREACHABLE (); - } - } - } -#endif /* JERRY_ESNEXT */ - } - else if (extended_object_p->u.built_in.id == ECMA_BUILTIN_ID_GLOBAL) - { - JERRY_ASSERT (object_type == ECMA_OBJECT_TYPE_GENERAL); - ext_object_size = sizeof (ecma_global_object_t); - } - else - { - length_and_bitset_size = ((ecma_extended_object_t *) object_p)->u.built_in.u.length_and_bitset_size; - ext_object_size += sizeof (uint64_t) * (length_and_bitset_size >> ECMA_BUILT_IN_BITSET_SHIFT); - } - - goto free_properties; - } - } - switch (object_type) { case ECMA_OBJECT_TYPE_GENERAL: @@ -1778,19 +1689,24 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */ ecma_dealloc_object (object_p); return; } - case ECMA_OBJECT_TYPE_ARRAY: + case ECMA_OBJECT_TYPE_BUILT_IN_GENERAL: { - if (ecma_op_array_is_fast_array ((ecma_extended_object_t *) object_p)) + if (((ecma_extended_object_t *) object_p)->u.built_in.id == ECMA_BUILTIN_ID_GLOBAL) { - ecma_free_fast_access_array (object_p); - return; + ext_object_size = sizeof (ecma_global_object_t); + break; } + + uint8_t bitset_size = ((ecma_extended_object_t *) object_p)->u.built_in.u.length_and_bitset_size; + ext_object_size += sizeof (uint64_t) * (bitset_size >> ECMA_BUILT_IN_BITSET_SHIFT); break; } - case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_CLASS: { - ext_object_size = sizeof (ecma_native_function_t); - break; + ext_object_size = sizeof (ecma_extended_built_in_object_t); + uint8_t bitset_size = ((ecma_extended_built_in_object_t *) object_p)->built_in.u.length_and_bitset_size; + ext_object_size += sizeof (uint64_t) * (bitset_size >> ECMA_BUILT_IN_BITSET_SHIFT); + /* FALLTHRU */ } case ECMA_OBJECT_TYPE_CLASS: { @@ -1994,6 +1910,22 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */ break; } + case ECMA_OBJECT_TYPE_BUILT_IN_ARRAY: + { + ext_object_size = sizeof (ecma_extended_built_in_object_t); + uint8_t bitset_size = ((ecma_extended_built_in_object_t *) object_p)->built_in.u.length_and_bitset_size; + ext_object_size += sizeof (uint64_t) * (bitset_size >> ECMA_BUILT_IN_BITSET_SHIFT); + /* FALLTHRU */ + } + case ECMA_OBJECT_TYPE_ARRAY: + { + if (ecma_op_array_is_fast_array ((ecma_extended_object_t *) object_p)) + { + ecma_free_fast_access_array (object_p); + return; + } + break; + } #if JERRY_BUILTIN_PROXY case ECMA_OBJECT_TYPE_PROXY: { @@ -2061,13 +1993,80 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */ ext_object_size += args_size; break; } + case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: + { + ext_object_size = sizeof (ecma_native_function_t); + break; + } + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: + { + ecma_extended_object_t *extended_func_p = (ecma_extended_object_t *) object_p; + + if (!ecma_builtin_function_is_routine (object_p)) + { + uint8_t bitset_size = extended_func_p->u.built_in.u.length_and_bitset_size; + ext_object_size += sizeof (uint64_t) * (bitset_size >> ECMA_BUILT_IN_BITSET_SHIFT); + break; + } + +#if JERRY_ESNEXT + if (extended_func_p->u.built_in.id != ECMA_BUILTIN_ID_HANDLER) + { + break; + } + + switch (extended_func_p->u.built_in.routine_id) + { + case ECMA_NATIVE_HANDLER_PROMISE_RESOLVE: + case ECMA_NATIVE_HANDLER_PROMISE_REJECT: + { + ext_object_size = sizeof (ecma_promise_resolver_t); + break; + } + case ECMA_NATIVE_HANDLER_PROMISE_THEN_FINALLY: + case ECMA_NATIVE_HANDLER_PROMISE_CATCH_FINALLY: + { + ext_object_size = sizeof (ecma_promise_finally_function_t); + break; + } + case ECMA_NATIVE_HANDLER_PROMISE_CAPABILITY_EXECUTOR: + { + ext_object_size = sizeof (ecma_promise_capability_executor_t); + break; + } + case ECMA_NATIVE_HANDLER_PROMISE_ALL_HELPER: + { + ext_object_size = sizeof (ecma_promise_all_executor_t); + break; + } +#if JERRY_BUILTIN_PROXY + case ECMA_NATIVE_HANDLER_PROXY_REVOKE: + { + ext_object_size = sizeof (ecma_revocable_proxy_object_t); + break; + } +#endif /* JERRY_BUILTIN_PROXY */ + case ECMA_NATIVE_HANDLER_VALUE_THUNK: + case ECMA_NATIVE_HANDLER_VALUE_THROWER: + { + ecma_free_value_if_not_object (((ecma_promise_value_thunk_t *) object_p)->value); + ext_object_size = sizeof (ecma_promise_value_thunk_t); + break; + } + default: + { + JERRY_UNREACHABLE (); + } + } +#endif /* JERRY_ESNEXT */ + break; + } default: { JERRY_UNREACHABLE (); } } -free_properties: ecma_gc_free_properties (object_p, ECMA_GC_FREE_NO_OPTIONS); ecma_dealloc_extended_object (object_p, ext_object_size); } /* ecma_gc_free_object */ diff --git a/jerry-core/ecma/base/ecma-globals.h b/jerry-core/ecma/base/ecma-globals.h index 22ebd3276..2e040342f 100644 --- a/jerry-core/ecma/base/ecma-globals.h +++ b/jerry-core/ecma/base/ecma-globals.h @@ -703,19 +703,35 @@ typedef enum */ 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_PROXY = 4, /**< Proxy object ECMAScript v6 26.2 */ + ECMA_OBJECT_TYPE_GENERAL = 0, /**< all objects that are not belongs to the sub-types below */ + ECMA_OBJECT_TYPE_BUILT_IN_GENERAL = 1, /**< built-in general object */ + ECMA_OBJECT_TYPE_CLASS = 2, /**< Objects with class property */ + ECMA_OBJECT_TYPE_BUILT_IN_CLASS = 3, /**< built-in object with class property */ + ECMA_OBJECT_TYPE_ARRAY = 4, /**< Array object (15.4) */ + ECMA_OBJECT_TYPE_BUILT_IN_ARRAY = 5, /**< Built-in array object */ + ECMA_OBJECT_TYPE_PROXY = 6, /**< 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 */ - ECMA_OBJECT_TYPE_BOUND_FUNCTION = 6, /**< Function objects (15.3), created through 15.3.4.5 routine */ - ECMA_OBJECT_TYPE_NATIVE_FUNCTION = 7, /**< Native function object */ - /* Types between 13-15 cannot have a built-in flag. See ecma_lexical_environment_type_t. */ + ECMA_OBJECT_TYPE_FUNCTION = 7, /**< Function objects (15.3), created through 13.2 routine */ + ECMA_OBJECT_TYPE_BOUND_FUNCTION = 8, /**< Function objects (15.3), created through 15.3.4.5 routine */ + ECMA_OBJECT_TYPE_NATIVE_FUNCTION = 9, /**< Native function object */ + ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION = 10, /**< Native built-in function object */ ECMA_OBJECT_TYPE__MAX /**< maximum value */ } ecma_object_type_t; +/** + * Base object types without built-in flag. + * + * Note: + * only these types can be checked with ecma_get_object_base_type. + */ +typedef enum +{ + ECMA_OBJECT_BASE_TYPE_GENERAL = ECMA_OBJECT_TYPE_GENERAL, /**< generic objects */ + ECMA_OBJECT_BASE_TYPE_CLASS = ECMA_OBJECT_TYPE_CLASS, /**< Objects with class property */ + ECMA_OBJECT_BASE_TYPE_ARRAY = ECMA_OBJECT_TYPE_ARRAY, /**< Array object (15.4) */ +} ecma_object_base_type_t; + /** * Types of objects with class property. * @@ -801,11 +817,11 @@ typedef enum { /* Types between 0 - 12 are ecma_object_type_t which can have a built-in flag. */ - ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE = 13, /**< declarative lexical environment */ + ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE = 29, /**< declarative lexical environment */ #if JERRY_ESNEXT - ECMA_LEXICAL_ENVIRONMENT_CLASS = 14, /**< lexical environment with class */ + ECMA_LEXICAL_ENVIRONMENT_CLASS = 30, /**< lexical environment with class */ #endif /* JERRY_ESNEXT */ - ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND = 15, /**< object-bound lexical environment */ + ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND = 31, /**< object-bound lexical environment */ ECMA_LEXICAL_ENVIRONMENT_TYPE_START = ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE, /**< first lexical * environment type */ @@ -859,14 +875,7 @@ typedef enum /** * Ecma object type mask for getting the object type. */ -#define ECMA_OBJECT_TYPE_MASK 0x0fu - -/** - * Ecma object is built-in or lexical environment. When this flag is set, the object is a - * - built-in, if object type is less than ECMA_LEXICAL_ENVIRONMENT_TYPES_START - * - lexical environment, if object type is greater or equal than ECMA_LEXICAL_ENVIRONMENT_TYPES_START - */ -#define ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV 0x10 +#define ECMA_OBJECT_TYPE_MASK 0x01fu /** * Extensible object. @@ -1167,12 +1176,6 @@ typedef struct ecma_built_in_props_t built_in; /**< built-in object part */ } ecma_extended_built_in_object_t; -/** - * Checks whether the built-in is an ecma_extended_built_in_object_t - */ -#define ECMA_BUILTIN_IS_EXTENDED_BUILT_IN(object_type) \ - ((object_type) == ECMA_OBJECT_TYPE_CLASS || (object_type) == ECMA_OBJECT_TYPE_ARRAY) - /** * Description of lexical environment with class */ diff --git a/jerry-core/ecma/base/ecma-helpers-value.c b/jerry-core/ecma/base/ecma-helpers-value.c index 59543640b..a10c9188a 100644 --- a/jerry-core/ecma/base/ecma-helpers-value.c +++ b/jerry-core/ecma/base/ecma-helpers-value.c @@ -467,7 +467,7 @@ ecma_is_value_array (ecma_value_t arg) /**< argument */ ecma_object_t *arg_obj_p = ecma_get_object_from_value (arg); - if (ecma_get_object_type (arg_obj_p) == ECMA_OBJECT_TYPE_ARRAY) + if (ecma_get_object_base_type (arg_obj_p) == ECMA_OBJECT_BASE_TYPE_ARRAY) { return ECMA_VALUE_TRUE; } diff --git a/jerry-core/ecma/base/ecma-helpers.c b/jerry-core/ecma/base/ecma-helpers.c index 151aaf4ef..578e970be 100644 --- a/jerry-core/ecma/base/ecma-helpers.c +++ b/jerry-core/ecma/base/ecma-helpers.c @@ -45,11 +45,8 @@ JERRY_STATIC_ASSERT (ECMA_OBJECT_TYPE_MASK >= ECMA_OBJECT_TYPE__MAX - 1, JERRY_STATIC_ASSERT (ECMA_OBJECT_TYPE_MASK >= ECMA_LEXICAL_ENVIRONMENT_TYPE__MAX, ecma_lexical_environment_types_must_be_lower_than_the_container_mask); -JERRY_STATIC_ASSERT (ECMA_OBJECT_TYPE_MASK + 1 == ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV, - ecma_built_in_flag_must_follow_the_object_type); - -JERRY_STATIC_ASSERT (ECMA_OBJECT_FLAG_EXTENSIBLE == (ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV << 1), - ecma_extensible_flag_must_follow_the_built_in_flag); +JERRY_STATIC_ASSERT (ECMA_OBJECT_FLAG_EXTENSIBLE == ECMA_OBJECT_TYPE_MASK + 1, + ecma_extensible_flag_must_follow_the_object_type); JERRY_STATIC_ASSERT (ECMA_OBJECT_REF_ONE == (ECMA_OBJECT_FLAG_EXTENSIBLE << 1), ecma_object_ref_one_must_follow_the_extensible_flag); @@ -60,6 +57,17 @@ JERRY_STATIC_ASSERT ((ECMA_OBJECT_MAX_REF + ECMA_OBJECT_REF_ONE) == ECMA_OBJECT_ JERRY_STATIC_ASSERT (ECMA_PROPERTY_FLAGS_MASK == ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE_WRITABLE, ecma_property_flags_mask_must_use_the_configurable_enumerable_writable_flags); +/* These checks are needed by ecma_get_object_base_type. */ +JERRY_STATIC_ASSERT ((int) ECMA_OBJECT_TYPE_BUILT_IN_GENERAL == ((int) ECMA_OBJECT_TYPE_GENERAL | 0x1) + && ((int) ECMA_OBJECT_TYPE_GENERAL & 0x1) == 0, + ecma_object_type_built_in_general_has_unexpected_value); +JERRY_STATIC_ASSERT ((int) ECMA_OBJECT_TYPE_BUILT_IN_CLASS == ((int) ECMA_OBJECT_TYPE_CLASS | 0x1) + && ((int) ECMA_OBJECT_TYPE_CLASS & 0x1) == 0, + ecma_object_type_built_in_class_has_unexpected_value); +JERRY_STATIC_ASSERT ((int) ECMA_OBJECT_TYPE_BUILT_IN_ARRAY == ((int) ECMA_OBJECT_TYPE_ARRAY | 0x1) + && ((int) ECMA_OBJECT_TYPE_ARRAY & 0x1) == 0, + ecma_object_type_built_in_array_has_unexpected_value); + /** * Create an object with specified prototype object * (or NULL prototype if there is not prototype for the object) @@ -111,8 +119,7 @@ ecma_create_decl_lex_env (ecma_object_t *outer_lexical_environment_p) /**< outer { ecma_object_t *new_lexical_environment_p = ecma_alloc_object (); - new_lexical_environment_p->type_flags_refs = (ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV - | ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE); + new_lexical_environment_p->type_flags_refs = ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE; ecma_init_gc_info (new_lexical_environment_p); @@ -142,8 +149,7 @@ ecma_create_object_lex_env (ecma_object_t *outer_lexical_environment_p, /**< out ecma_object_t *new_lexical_environment_p = ecma_alloc_object (); - new_lexical_environment_p->type_flags_refs = (ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV - | ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); + new_lexical_environment_p->type_flags_refs = ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND; ecma_init_gc_info (new_lexical_environment_p); @@ -168,8 +174,7 @@ ecma_create_lex_env_class (ecma_object_t *outer_lexical_environment_p, /**< oute { ecma_object_t *new_lexical_environment_p; - ecma_object_descriptor_t type_flags_refs = (ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV - | ECMA_LEXICAL_ENVIRONMENT_CLASS); + ecma_object_descriptor_t type_flags_refs = ECMA_LEXICAL_ENVIRONMENT_CLASS; if (lexical_env_size > 0) { @@ -205,9 +210,7 @@ ecma_is_lexical_environment (const ecma_object_t *object_p) /**< object or lexic { JERRY_ASSERT (object_p != NULL); - uint32_t full_type = object_p->type_flags_refs & (ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV | ECMA_OBJECT_TYPE_MASK); - - return full_type >= (ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV | ECMA_LEXICAL_ENVIRONMENT_TYPE_START); + return (object_p->type_flags_refs & ECMA_OBJECT_TYPE_MASK) >= ECMA_LEXICAL_ENVIRONMENT_TYPE_START; } /* ecma_is_lexical_environment */ /** @@ -223,7 +226,7 @@ ecma_op_ordinary_object_set_extensible (ecma_object_t *object_p) /**< object */ } /* ecma_op_ordinary_object_set_extensible */ /** - * Get object's internal implementation-defined type. + * Get the internal type of an object. * * @return type of the object (ecma_object_type_t) */ @@ -236,6 +239,20 @@ ecma_get_object_type (const ecma_object_t *object_p) /**< object */ return (ecma_object_type_t) (object_p->type_flags_refs & ECMA_OBJECT_TYPE_MASK); } /* ecma_get_object_type */ +/** + * Get the internal base type of an object. + * + * @return base type of the object (ecma_object_base_type_t) + */ +extern inline ecma_object_base_type_t JERRY_ATTR_PURE +ecma_get_object_base_type (const ecma_object_t *object_p) /**< object */ +{ + JERRY_ASSERT (object_p != NULL); + JERRY_ASSERT (!ecma_is_lexical_environment (object_p)); + + return (ecma_object_base_type_t) (object_p->type_flags_refs & (ECMA_OBJECT_TYPE_MASK - 0x1)); +} /* ecma_get_object_base_type */ + /** * Get value of an object if the class matches * @@ -246,7 +263,7 @@ extern inline bool JERRY_ATTR_ALWAYS_INLINE ecma_object_class_is (ecma_object_t *object_p, /**< object */ ecma_object_class_type_t class_id) /**< class id */ { - if (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_CLASS) + if (ecma_get_object_base_type (object_p) == ECMA_OBJECT_BASE_TYPE_CLASS) { ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; @@ -259,63 +276,6 @@ ecma_object_class_is (ecma_object_t *object_p, /**< object */ return false; } /* ecma_object_class_is */ -/** - * Check if the object is a built-in object - * - * @return true - if object is a built-in object - * false - otherwise - */ -extern inline bool JERRY_ATTR_PURE -ecma_get_object_is_builtin (const ecma_object_t *object_p) /**< object */ -{ - JERRY_ASSERT (object_p != NULL); - JERRY_ASSERT (!ecma_is_lexical_environment (object_p)); - - return (object_p->type_flags_refs & ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV) != 0; -} /* ecma_get_object_is_builtin */ - -/** - * Set flag indicating whether the object is a built-in object - */ -extern inline void -ecma_set_object_is_builtin (ecma_object_t *object_p) /**< object */ -{ - JERRY_ASSERT (object_p != NULL); - JERRY_ASSERT (!(object_p->type_flags_refs & ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV)); - JERRY_ASSERT ((object_p->type_flags_refs & ECMA_OBJECT_TYPE_MASK) < ECMA_LEXICAL_ENVIRONMENT_TYPE_START); - - object_p->type_flags_refs |= ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV; -} /* ecma_set_object_is_builtin */ - -/** - * Get the built-in ID of the object. - * If the object is not builtin, return ECMA_BUILTIN_ID__COUNT - * - * @return the ID of the built-in - */ -extern inline uint8_t -ecma_get_object_builtin_id (ecma_object_t *object_p) /**< object */ -{ - if (!ecma_get_object_is_builtin (object_p)) - { - return ECMA_BUILTIN_ID__COUNT; - } - - ecma_built_in_props_t *built_in_props_p; - ecma_object_type_t object_type = ecma_get_object_type (object_p); - - if (ECMA_BUILTIN_IS_EXTENDED_BUILT_IN (object_type)) - { - built_in_props_p = &((ecma_extended_built_in_object_t *) object_p)->built_in; - } - else - { - built_in_props_p = &((ecma_extended_object_t *) object_p)->u.built_in; - } - - return built_in_props_p->id; -} /* ecma_get_object_builtin_id */ - /** * Get type of lexical environment. * @@ -1669,11 +1629,7 @@ ecma_bytecode_get_from_value (ecma_value_t value) /**< compiled code */ } case ECMA_OBJECT_TYPE_FUNCTION: { - if (!ecma_get_object_is_builtin (object_p)) - { - return ecma_op_function_get_compiled_code ((ecma_extended_object_t *) object_p); - } - return NULL; + return ecma_op_function_get_compiled_code ((ecma_extended_object_t *) object_p); } case ECMA_OBJECT_TYPE_BOUND_FUNCTION: { diff --git a/jerry-core/ecma/base/ecma-helpers.h b/jerry-core/ecma/base/ecma-helpers.h index e8f64ad6b..11a41f101 100644 --- a/jerry-core/ecma/base/ecma-helpers.h +++ b/jerry-core/ecma/base/ecma-helpers.h @@ -470,10 +470,8 @@ ecma_object_t *ecma_create_lex_env_class (ecma_object_t *outer_lexical_environme bool JERRY_ATTR_PURE ecma_is_lexical_environment (const ecma_object_t *object_p); void ecma_op_ordinary_object_set_extensible (ecma_object_t *object_p); ecma_object_type_t JERRY_ATTR_PURE ecma_get_object_type (const ecma_object_t *object_p); +ecma_object_base_type_t JERRY_ATTR_PURE ecma_get_object_base_type (const ecma_object_t *object_p); bool JERRY_ATTR_PURE ecma_object_class_is (ecma_object_t *object_p, ecma_object_class_type_t class_id); -bool JERRY_ATTR_PURE ecma_get_object_is_builtin (const ecma_object_t *object_p); -void ecma_set_object_is_builtin (ecma_object_t *object_p); -uint8_t ecma_get_object_builtin_id (ecma_object_t *object_p); ecma_lexical_environment_type_t JERRY_ATTR_PURE ecma_get_lex_env_type (const ecma_object_t *object_p); ecma_object_t JERRY_ATTR_PURE *ecma_get_lex_env_binding_object (const ecma_object_t *object_p); ecma_object_t *ecma_clone_decl_lexical_environment (ecma_object_t *lex_env_p, bool copy_values); diff --git a/jerry-core/ecma/base/ecma-module.c b/jerry-core/ecma/base/ecma-module.c index 772a78791..234a1ac99 100644 --- a/jerry-core/ecma/base/ecma-module.c +++ b/jerry-core/ecma/base/ecma-module.c @@ -129,8 +129,7 @@ ecma_module_get_from_object (ecma_value_t module_val) /**< module */ ecma_object_t *object_p = ecma_get_object_from_value (module_val); - JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_CLASS); - JERRY_ASSERT (((ecma_extended_object_t *) object_p)->u.cls.type == ECMA_OBJECT_CLASS_MODULE); + JERRY_ASSERT (ecma_object_class_is (object_p, ECMA_OBJECT_CLASS_MODULE)); return (ecma_module_t *) object_p; } /* ecma_module_get_from_object */ @@ -1086,14 +1085,7 @@ ecma_module_get_resolved_module (ecma_value_t module_val) /**< module */ ecma_object_t *object_p = ecma_get_object_from_value (module_val); - if (ecma_get_object_type (object_p) != ECMA_OBJECT_TYPE_CLASS) - { - return NULL; - } - - ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; - - if (ext_object_p->u.cls.type != ECMA_OBJECT_CLASS_MODULE) + if (!ecma_object_class_is (object_p, ECMA_OBJECT_CLASS_MODULE)) { return NULL; } diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-array-iterator-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-array-iterator-prototype.c index 12ca6d354..203a826c6 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-array-iterator-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-array-iterator-prototype.c @@ -77,8 +77,7 @@ ecma_builtin_array_iterator_prototype_object_next (ecma_value_t this_val) /**< t ecma_extended_object_t *ext_obj_p = (ecma_extended_object_t *) obj_p; /* 3. */ - if (ecma_get_object_type (obj_p) != ECMA_OBJECT_TYPE_CLASS - || ext_obj_p->u.cls.type != ECMA_OBJECT_CLASS_ARRAY_ITERATOR) + if (!ecma_object_class_is (obj_p, ECMA_OBJECT_CLASS_ARRAY_ITERATOR)) { return ecma_raise_type_error (ECMA_ERR_MSG ("Argument 'this' is not an iterator")); } diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-async-generator-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-async-generator-prototype.c index bf0ebf12a..72a494913 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-async-generator-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-async-generator-prototype.c @@ -102,14 +102,9 @@ ecma_builtin_async_generator_prototype_dispatch_routine (uint8_t builtin_routine { ecma_object_t *object_p = ecma_get_object_from_value (this_arg); - if (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_CLASS) + if (ecma_object_class_is (object_p, ECMA_OBJECT_CLASS_ASYNC_GENERATOR)) { - ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; - - if (ext_object_p->u.cls.type == ECMA_OBJECT_CLASS_ASYNC_GENERATOR) - { - executable_object_p = (vm_executable_object_t *) ext_object_p; - } + executable_object_p = (vm_executable_object_t *) object_p; } } diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-generator-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-generator-prototype.c index d0f96c3cf..06098d84f 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-generator-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-generator-prototype.c @@ -216,14 +216,9 @@ ecma_builtin_generator_prototype_dispatch_routine (uint8_t builtin_routine_id, / { ecma_object_t *object_p = ecma_get_object_from_value (this_arg); - if (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_CLASS) + if (ecma_object_class_is (object_p, ECMA_OBJECT_CLASS_GENERATOR)) { - ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; - - if (ext_object_p->u.cls.type == ECMA_OBJECT_CLASS_GENERATOR) - { - executable_object_p = (vm_executable_object_t *) ext_object_p; - } + executable_object_p = (vm_executable_object_t *) object_p; } } diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-json.c b/jerry-core/ecma/builtin-objects/ecma-builtin-json.c index 87bb31499..8b4e3b072 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-json.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-json.c @@ -1327,7 +1327,7 @@ ecma_builtin_json_serialize_property (ecma_json_stringify_context_t *context_p, { ecma_object_t *obj_p = ecma_get_object_from_value (value); - if (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_CLASS) + if (ecma_get_object_base_type (obj_p) == ECMA_OBJECT_BASE_TYPE_CLASS) { switch (((ecma_extended_object_t *) obj_p)->u.cls.type) { @@ -1635,7 +1635,7 @@ ecma_builtin_json_stringify (ecma_value_t arg1, /**< value */ { ecma_object_t *value_obj_p = ecma_get_object_from_value (value); - if (ecma_get_object_type (value_obj_p) == ECMA_OBJECT_TYPE_CLASS) + if (ecma_get_object_base_type (value_obj_p) == ECMA_OBJECT_BASE_TYPE_CLASS) { uint8_t class_type = ((ecma_extended_object_t *) value_obj_p)->u.cls.type; @@ -1686,7 +1686,7 @@ ecma_builtin_json_stringify (ecma_value_t arg1, /**< value */ { ecma_object_t *obj_p = ecma_get_object_from_value (arg3); - if (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_CLASS) + if (ecma_get_object_base_type (obj_p) == ECMA_OBJECT_BASE_TYPE_CLASS) { uint8_t class_type = ((ecma_extended_object_t *) obj_p)->u.cls.type; diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-regexp-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-regexp-prototype.c index 7b0617b8e..41ad961d5 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-regexp-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-regexp-prototype.c @@ -506,7 +506,7 @@ ecma_builtin_regexp_prototype_to_string (ecma_object_t *object_p) /**< this obje extern inline bool JERRY_ATTR_ALWAYS_INLINE ecma_builtin_is_regexp_exec (ecma_extended_object_t *obj_p) { - return (ecma_get_object_is_builtin ((ecma_object_t *) obj_p) + return (ecma_get_object_type (&obj_p->object) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION && obj_p->u.built_in.routine_id == ECMA_REGEXP_PROTOTYPE_ROUTINE_EXEC); } /* ecma_builtin_is_regexp_exec */ #endif /* JERRY_ESNEXT */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtins.c b/jerry-core/ecma/builtin-objects/ecma-builtins.c index 2210dca93..0f99be297 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtins.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtins.c @@ -37,6 +37,12 @@ JERRY_STATIC_ASSERT (ECMA_BUILTIN_ID_GLOBAL == ECMA_BUILTIN_OBJECTS_COUNT, ecma_builtin_id_global_must_be_the_last_builtin_id); +/** + * Checks whether the built-in is an ecma_extended_built_in_object_t + */ +#define ECMA_BUILTIN_IS_EXTENDED_BUILT_IN(object_type) \ + ((object_type) == ECMA_OBJECT_TYPE_BUILT_IN_CLASS || (object_type) == ECMA_OBJECT_TYPE_BUILT_IN_ARRAY) + /** * Helper definition for ecma_builtin_property_list_references. */ @@ -62,14 +68,14 @@ typedef ecma_value_t (*ecma_builtin_dispatch_call_t) (const ecma_value_t argumen * Layout: * * |----------------------|---------------| - * prototype_id(13) obj_type(3) + * prototype_id(12) obj_type(4) */ typedef uint16_t ecma_builtin_descriptor_t; /** * Bitshift index for get the prototype object's id from a builtin descriptor */ -#define ECMA_BUILTIN_PROTOTYPE_ID_SHIFT 3 +#define ECMA_BUILTIN_PROTOTYPE_ID_SHIFT 4 /** * Bitmask for get the object's type from a builtin descriptor @@ -273,9 +279,7 @@ ecma_builtin_get_property_count (ecma_builtin_id_t builtin_id) /**< built-in ID bool ecma_builtin_is_global (ecma_object_t *object_p) /**< pointer to an object */ { - JERRY_ASSERT (ecma_get_object_is_builtin (object_p)); - - return (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_GENERAL + return (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_BUILT_IN_GENERAL && ((ecma_extended_object_t *) object_p)->u.built_in.id == ECMA_BUILTIN_ID_GLOBAL); } /* ecma_builtin_is_global */ @@ -304,8 +308,7 @@ ecma_builtin_get_global (void) extern inline bool JERRY_ATTR_ALWAYS_INLINE ecma_builtin_function_is_routine (ecma_object_t *func_obj_p) /**< function object */ { - JERRY_ASSERT (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_NATIVE_FUNCTION); - JERRY_ASSERT (ecma_get_object_is_builtin (func_obj_p)); + JERRY_ASSERT (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); ecma_extended_object_t *ext_func_obj_p = (ecma_extended_object_t *) func_obj_p; return (ext_func_obj_p->u.built_in.routine_id != 0); @@ -324,11 +327,14 @@ ecma_builtin_function_is_routine (ecma_object_t *func_obj_p) /**< function objec static ecma_global_object_t * ecma_builtin_get_realm (ecma_object_t *builtin_object_p) /**< built-in object */ { - JERRY_ASSERT (ecma_get_object_is_builtin (builtin_object_p)); - ecma_object_type_t object_type = ecma_get_object_type (builtin_object_p); ecma_value_t realm_value; + JERRY_ASSERT (object_type == ECMA_OBJECT_TYPE_BUILT_IN_GENERAL + || object_type == ECMA_OBJECT_TYPE_BUILT_IN_CLASS + || object_type == ECMA_OBJECT_TYPE_BUILT_IN_ARRAY + || object_type == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); + if (ECMA_BUILTIN_IS_EXTENDED_BUILT_IN (object_type)) { realm_value = ((ecma_extended_built_in_object_t *) builtin_object_p)->built_in.realm_value; @@ -378,6 +384,18 @@ ecma_instantiate_builtin (ecma_global_object_t *global_object_p, /**< global obj ecma_object_type_t obj_type = (ecma_object_type_t) (builtin_desc & ECMA_BUILTIN_OBJECT_TYPE_MASK); + JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_GENERAL + || obj_type == ECMA_OBJECT_TYPE_CLASS + || obj_type == ECMA_OBJECT_TYPE_ARRAY + || obj_type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION); + /* TODO: Remove this increase by setting the correct values in the defines. */ + obj_type = (ecma_object_type_t) ((int) obj_type + 1); + + JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_BUILT_IN_GENERAL + || obj_type == ECMA_OBJECT_TYPE_BUILT_IN_CLASS + || obj_type == ECMA_OBJECT_TYPE_BUILT_IN_ARRAY + || obj_type == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); + bool is_extended_built_in = ECMA_BUILTIN_IS_EXTENDED_BUILT_IN (obj_type); size_t ext_object_size = (is_extended_built_in ? sizeof (ecma_extended_built_in_object_t) @@ -411,7 +429,6 @@ ecma_instantiate_builtin (ecma_global_object_t *global_object_p, /**< global obj * See also: ecma_object_get_class_name */ - ecma_set_object_is_builtin (obj_p); ecma_built_in_props_t *built_in_props_p; if (is_extended_built_in) @@ -448,7 +465,7 @@ ecma_instantiate_builtin (ecma_global_object_t *global_object_p, /**< global obj #if JERRY_BUILTIN_ARRAY case ECMA_BUILTIN_ID_ARRAY_PROTOTYPE: { - JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_ARRAY); + JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_BUILT_IN_ARRAY); ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p; ext_object_p->u.array.length = 0; @@ -460,7 +477,7 @@ ecma_instantiate_builtin (ecma_global_object_t *global_object_p, /**< global obj #if JERRY_BUILTIN_STRING case ECMA_BUILTIN_ID_STRING_PROTOTYPE: { - JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_CLASS); + JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_BUILT_IN_CLASS); ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p; ext_object_p->u.cls.type = ECMA_OBJECT_CLASS_STRING; @@ -472,7 +489,7 @@ ecma_instantiate_builtin (ecma_global_object_t *global_object_p, /**< global obj #if JERRY_BUILTIN_NUMBER case ECMA_BUILTIN_ID_NUMBER_PROTOTYPE: { - JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_CLASS); + JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_BUILT_IN_CLASS); ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p; ext_object_p->u.cls.type = ECMA_OBJECT_CLASS_NUMBER; @@ -484,7 +501,7 @@ ecma_instantiate_builtin (ecma_global_object_t *global_object_p, /**< global obj #if JERRY_BUILTIN_BOOLEAN case ECMA_BUILTIN_ID_BOOLEAN_PROTOTYPE: { - JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_CLASS); + JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_BUILT_IN_CLASS); ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p; ext_object_p->u.cls.type = ECMA_OBJECT_CLASS_BOOLEAN; @@ -497,7 +514,7 @@ ecma_instantiate_builtin (ecma_global_object_t *global_object_p, /**< global obj #if JERRY_BUILTIN_DATE case ECMA_BUILTIN_ID_DATE_PROTOTYPE: { - JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_CLASS); + JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_BUILT_IN_CLASS); ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p; ext_object_p->u.cls.type = ECMA_OBJECT_CLASS_DATE; @@ -512,7 +529,7 @@ ecma_instantiate_builtin (ecma_global_object_t *global_object_p, /**< global obj #if JERRY_BUILTIN_REGEXP case ECMA_BUILTIN_ID_REGEXP_PROTOTYPE: { - JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_CLASS); + JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_BUILT_IN_CLASS); ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p; ext_object_p->u.cls.type = ECMA_OBJECT_CLASS_REGEXP; @@ -529,7 +546,7 @@ ecma_instantiate_builtin (ecma_global_object_t *global_object_p, /**< global obj #endif /* !JERRY_ESNEXT */ default: { - JERRY_ASSERT (obj_type != ECMA_OBJECT_TYPE_CLASS); + JERRY_ASSERT (obj_type != ECMA_OBJECT_TYPE_BUILT_IN_CLASS); break; } } @@ -553,7 +570,7 @@ ecma_builtin_create_global_object (void) size_t property_count = ecma_builtin_get_property_count (ECMA_BUILTIN_ID_GLOBAL); JERRY_ASSERT (prototype_builtin_id != ECMA_BUILTIN_ID__COUNT); - JERRY_ASSERT (obj_type != ECMA_OBJECT_TYPE_CLASS && obj_type != ECMA_OBJECT_TYPE_ARRAY); + JERRY_ASSERT (obj_type == ECMA_OBJECT_TYPE_BUILT_IN_GENERAL); /* Whenever this assertion fails, the size of extra_instantiated_bitset in ecma_global_object_t * must be increased and 32 must be added to these constants. Furthermore the new uint32 item @@ -567,7 +584,6 @@ ecma_builtin_create_global_object (void) ecma_object_t *object_p = ecma_create_object (NULL, sizeof (ecma_global_object_t), obj_type); ecma_op_ordinary_object_set_extensible (object_p); - ecma_set_object_is_builtin (object_p); ecma_global_object_t *global_object_p = (ecma_global_object_t *) object_p; @@ -704,9 +720,7 @@ ecma_builtin_make_function_object_for_routine (ecma_object_t *builtin_object_p, ecma_object_t *func_obj_p = ecma_create_object (prototype_obj_p, ext_object_size, - ECMA_OBJECT_TYPE_NATIVE_FUNCTION); - - ecma_set_object_is_builtin (func_obj_p); + ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); JERRY_ASSERT (routine_id > 0); JERRY_ASSERT (routine_index <= UINT8_MAX); @@ -783,8 +797,7 @@ static ecma_property_t * ecma_builtin_native_handler_try_to_instantiate_property (ecma_object_t *object_p, /**< object */ ecma_string_t *property_name_p) /**< property's name */ { - JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_NATIVE_FUNCTION - && ecma_get_object_is_builtin (object_p)); + JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); ecma_extended_object_t *ext_obj_p = (ecma_extended_object_t *) object_p; ecma_property_t *prop_p = NULL; @@ -833,8 +846,7 @@ ecma_property_t * ecma_builtin_routine_try_to_instantiate_property (ecma_object_t *object_p, /**< object */ ecma_string_t *property_name_p) /**< property name */ { - JERRY_ASSERT (ecma_get_object_is_builtin (object_p)); - JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_NATIVE_FUNCTION + JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION && ecma_builtin_function_is_routine (object_p)); ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) object_p; @@ -991,17 +1003,13 @@ ecma_property_t * ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object */ ecma_string_t *property_name_p) /**< property's name */ { - JERRY_ASSERT (ecma_get_object_is_builtin (object_p)); - lit_magic_string_id_t magic_string_id = ecma_get_string_magic (property_name_p); #if JERRY_ESNEXT - if (JERRY_UNLIKELY (ecma_prop_name_is_symbol (property_name_p))) + if (JERRY_UNLIKELY (ecma_prop_name_is_symbol (property_name_p)) + && property_name_p->u.hash & ECMA_GLOBAL_SYMBOL_FLAG) { - if (property_name_p->u.hash & ECMA_GLOBAL_SYMBOL_FLAG) - { - magic_string_id = (property_name_p->u.hash >> ECMA_GLOBAL_SYMBOL_SHIFT); - } + magic_string_id = (property_name_p->u.hash >> ECMA_GLOBAL_SYMBOL_SHIFT); } #endif /* JERRY_ESNEXT */ @@ -1012,7 +1020,12 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object * ecma_built_in_props_t *built_in_props_p; ecma_object_type_t object_type = ecma_get_object_type (object_p); - JERRY_ASSERT (object_type != ECMA_OBJECT_TYPE_FUNCTION || !ecma_builtin_function_is_routine (object_p)); + + JERRY_ASSERT (object_type == ECMA_OBJECT_TYPE_BUILT_IN_GENERAL + || object_type == ECMA_OBJECT_TYPE_BUILT_IN_CLASS + || object_type == ECMA_OBJECT_TYPE_BUILT_IN_ARRAY + || (object_type == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION + && !ecma_builtin_function_is_routine (object_p))); if (ECMA_BUILTIN_IS_EXTENDED_BUILT_IN (object_type)) { @@ -1275,8 +1288,7 @@ void ecma_builtin_routine_delete_built_in_property (ecma_object_t *object_p, /**< object */ ecma_string_t *property_name_p) /**< property name */ { - JERRY_ASSERT (ecma_get_object_is_builtin (object_p)); - JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_NATIVE_FUNCTION + JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION && ecma_builtin_function_is_routine (object_p)); ecma_extended_object_t *extended_obj_p = (ecma_extended_object_t *) object_p; @@ -1312,10 +1324,6 @@ void ecma_builtin_delete_built_in_property (ecma_object_t *object_p, /**< object */ ecma_string_t *property_name_p) /**< property name */ { - JERRY_ASSERT (ecma_get_object_is_builtin (object_p)); - JERRY_ASSERT (ecma_get_object_type (object_p) != ECMA_OBJECT_TYPE_NATIVE_FUNCTION - || !ecma_builtin_function_is_routine (object_p)); - lit_magic_string_id_t magic_string_id = ecma_get_string_magic (property_name_p); #if JERRY_ESNEXT @@ -1330,7 +1338,12 @@ ecma_builtin_delete_built_in_property (ecma_object_t *object_p, /**< object */ ecma_built_in_props_t *built_in_props_p; ecma_object_type_t object_type = ecma_get_object_type (object_p); - JERRY_ASSERT (object_type != ECMA_OBJECT_TYPE_FUNCTION || !ecma_builtin_function_is_routine (object_p)); + + JERRY_ASSERT (object_type == ECMA_OBJECT_TYPE_BUILT_IN_GENERAL + || object_type == ECMA_OBJECT_TYPE_BUILT_IN_CLASS + || object_type == ECMA_OBJECT_TYPE_BUILT_IN_ARRAY + || (object_type == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION + && !ecma_builtin_function_is_routine (object_p))); if (ECMA_BUILTIN_IS_EXTENDED_BUILT_IN (object_type)) { @@ -1381,8 +1394,7 @@ ecma_builtin_native_handler_list_lazy_property_names (ecma_object_t *object_p, / ecma_collection_t *prop_names_p, /**< prop name collection */ ecma_property_counter_t *prop_counter_p) /**< prop counter */ { - JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_NATIVE_FUNCTION - && ecma_get_object_is_builtin (object_p)); + JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); ecma_extended_object_t *ext_obj_p = (ecma_extended_object_t *) object_p; if ((ext_obj_p->u.built_in.u2.routine_flags & ECMA_NATIVE_HANDLER_FLAGS_NAME_INITIALIZED) == 0) @@ -1411,9 +1423,8 @@ ecma_builtin_routine_list_lazy_property_names (ecma_object_t *object_p, /**< a b ecma_collection_t *prop_names_p, /**< prop name collection */ ecma_property_counter_t *prop_counter_p) /**< prop counter */ { - JERRY_ASSERT (ecma_get_object_is_builtin (object_p)); - JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_NATIVE_FUNCTION - && ecma_builtin_function_is_routine (object_p)); + JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); + JERRY_ASSERT (ecma_builtin_function_is_routine (object_p)); #if JERRY_ESNEXT ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) object_p; @@ -1454,8 +1465,7 @@ ecma_builtin_list_lazy_property_names (ecma_object_t *object_p, /**< a built-in ecma_collection_t *prop_names_p, /**< prop name collection */ ecma_property_counter_t *prop_counter_p) /**< prop counter */ { - JERRY_ASSERT (ecma_get_object_is_builtin (object_p)); - JERRY_ASSERT (ecma_get_object_type (object_p) != ECMA_OBJECT_TYPE_NATIVE_FUNCTION + JERRY_ASSERT (ecma_get_object_type (object_p) != ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION || !ecma_builtin_function_is_routine (object_p)); ecma_built_in_props_t *built_in_props_p; @@ -1583,8 +1593,7 @@ ecma_builtin_dispatch_call (ecma_object_t *obj_p, /**< built-in object */ const ecma_value_t *arguments_list_p, /**< arguments list */ uint32_t arguments_list_len) /**< arguments list length */ { - JERRY_ASSERT (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_NATIVE_FUNCTION); - JERRY_ASSERT (ecma_get_object_is_builtin (obj_p)); + JERRY_ASSERT (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); ecma_extended_object_t *ext_obj_p = (ecma_extended_object_t *) obj_p; @@ -1619,8 +1628,7 @@ ecma_builtin_dispatch_construct (ecma_object_t *obj_p, /**< built-in object */ const ecma_value_t *arguments_list_p, /**< arguments list */ uint32_t arguments_list_len) /**< arguments list length */ { - JERRY_ASSERT (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_NATIVE_FUNCTION); - JERRY_ASSERT (ecma_get_object_is_builtin (obj_p)); + JERRY_ASSERT (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); if (ecma_builtin_function_is_routine (obj_p)) { diff --git a/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h index 590895039..4bac84022 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h @@ -786,7 +786,7 @@ BUILTIN_ROUTINE (ECMA_BUILTIN_ID_DATAVIEW, /* The Global object (15.1) */ BUILTIN (ECMA_BUILTIN_ID_GLOBAL, - ECMA_OBJECT_TYPE_GENERAL, + ECMA_OBJECT_TYPE_BUILT_IN_GENERAL, ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, /* Implementation-dependent */ true, global) diff --git a/jerry-core/ecma/operations/ecma-array-object.c b/jerry-core/ecma/operations/ecma-array-object.c index ca64871ab..3be8f62c0 100644 --- a/jerry-core/ecma/operations/ecma-array-object.c +++ b/jerry-core/ecma/operations/ecma-array-object.c @@ -97,7 +97,7 @@ ecma_op_alloc_array_object (uint32_t length) /**< length of the new array */ extern inline bool JERRY_ATTR_ALWAYS_INLINE ecma_op_object_is_fast_array (ecma_object_t *object_p) /**< ecma-object */ { - return (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_ARRAY && + return (ecma_get_object_base_type (object_p) == ECMA_OBJECT_BASE_TYPE_ARRAY && ecma_op_array_is_fast_array ((ecma_extended_object_t *) object_p)); } /* ecma_op_object_is_fast_array */ @@ -110,7 +110,7 @@ ecma_op_object_is_fast_array (ecma_object_t *object_p) /**< ecma-object */ extern inline bool JERRY_ATTR_ALWAYS_INLINE ecma_op_array_is_fast_array (ecma_extended_object_t *array_p) /**< ecma-array-object */ { - JERRY_ASSERT (ecma_get_object_type ((ecma_object_t *) array_p) == ECMA_OBJECT_TYPE_ARRAY); + JERRY_ASSERT (ecma_get_object_base_type ((ecma_object_t *) array_p) == ECMA_OBJECT_BASE_TYPE_ARRAY); return array_p->u.array.length_prop_and_hole_count & ECMA_FAST_ARRAY_FLAG; } /* ecma_op_array_is_fast_array */ @@ -509,7 +509,7 @@ bool ecma_array_object_delete_property (ecma_object_t *object_p, /**< object */ ecma_string_t *property_name_p) /**< property name */ { - JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_ARRAY); + JERRY_ASSERT (ecma_get_object_base_type (object_p) == ECMA_OBJECT_BASE_TYPE_ARRAY); ecma_extended_object_t *ext_obj_p = (ecma_extended_object_t *) object_p; if (!ecma_op_object_is_fast_array (object_p)) @@ -817,7 +817,7 @@ ecma_delete_array_properties (ecma_object_t *object_p, /**< object */ uint32_t old_length) /**< old length */ { JERRY_ASSERT (new_length < old_length); - JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_ARRAY); + JERRY_ASSERT (ecma_get_object_base_type (object_p) == ECMA_OBJECT_BASE_TYPE_ARRAY); if (ecma_op_object_is_fast_array (object_p)) { @@ -1195,7 +1195,7 @@ ecma_op_array_object_define_own_property (ecma_object_t *object_p, /**< the arra extern inline uint32_t JERRY_ATTR_ALWAYS_INLINE ecma_array_get_length (ecma_object_t *array_p) /**< array object */ { - JERRY_ASSERT (ecma_get_object_type (array_p) == ECMA_OBJECT_TYPE_ARRAY); + JERRY_ASSERT (ecma_get_object_base_type (array_p) == ECMA_OBJECT_BASE_TYPE_ARRAY); return ((ecma_extended_object_t *) array_p)->u.array.length; } /* ecma_array_get_length */ diff --git a/jerry-core/ecma/operations/ecma-function-object.c b/jerry-core/ecma/operations/ecma-function-object.c index 3f12dc1cf..eb8dcb07e 100644 --- a/jerry-core/ecma/operations/ecma-function-object.c +++ b/jerry-core/ecma/operations/ecma-function-object.c @@ -160,8 +160,6 @@ ecma_object_check_constructor (ecma_object_t *obj_p) /**< ecma object */ if (JERRY_LIKELY (type == ECMA_OBJECT_TYPE_FUNCTION)) { - JERRY_ASSERT (!ecma_get_object_is_builtin (obj_p)); - #if JERRY_ESNEXT const ecma_compiled_code_t *byte_code_p = ecma_op_function_get_compiled_code ((ecma_extended_object_t *) obj_p); @@ -225,9 +223,10 @@ ecma_object_check_constructor (ecma_object_t *obj_p) /**< ecma object */ } #endif /* JERRY_BUILTIN_PROXY */ - JERRY_ASSERT (type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION); + JERRY_ASSERT (type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION + || type == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); - if (ecma_get_object_is_builtin (obj_p)) + if (type == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION) { if (ecma_builtin_function_is_routine (obj_p)) { @@ -703,8 +702,7 @@ ecma_op_create_native_handler (ecma_native_handler_id_t id, /**< handler id */ ecma_object_t *function_obj_p = ecma_create_object (prototype_obj_p, object_size, - ECMA_OBJECT_TYPE_NATIVE_FUNCTION); - ecma_set_object_is_builtin (function_obj_p); + ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); ecma_extended_object_t *ext_func_obj_p = (ecma_extended_object_t *) function_obj_p; ext_func_obj_p->u.built_in.id = ECMA_BUILTIN_ID_HANDLER; @@ -782,21 +780,24 @@ ecma_op_function_get_function_realm (ecma_object_t *func_obj_p) /**< function ob { while (true) { - if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_FUNCTION) + ecma_object_type_t type = ecma_get_object_type (func_obj_p); + + if (type == ECMA_OBJECT_TYPE_FUNCTION) { ecma_extended_object_t *ext_function_obj_p = (ecma_extended_object_t *) func_obj_p; const ecma_compiled_code_t *bytecode_data_p = ecma_op_function_get_compiled_code (ext_function_obj_p); return ecma_op_function_get_realm (bytecode_data_p); } - if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_NATIVE_FUNCTION) + if (type == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION) + { + ecma_extended_object_t *ext_function_obj_p = (ecma_extended_object_t *) func_obj_p; + return ECMA_GET_INTERNAL_VALUE_POINTER (ecma_global_object_t, + ext_function_obj_p->u.built_in.realm_value); + } + + if (type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION) { - if (ecma_get_object_is_builtin (func_obj_p)) - { - ecma_extended_object_t *ext_function_obj_p = (ecma_extended_object_t *) func_obj_p; - return ECMA_GET_INTERNAL_VALUE_POINTER (ecma_global_object_t, - ext_function_obj_p->u.built_in.realm_value); - } ecma_native_function_t *native_function_p = (ecma_native_function_t *) func_obj_p; return ECMA_GET_INTERNAL_VALUE_POINTER (ecma_global_object_t, native_function_p->realm_value); @@ -816,7 +817,7 @@ ecma_op_function_get_function_realm (ecma_object_t *func_obj_p) /**< function ob } #endif /* JERRY_BUILTIN_PROXY */ - JERRY_ASSERT (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_BOUND_FUNCTION); + JERRY_ASSERT (type == ECMA_OBJECT_TYPE_BOUND_FUNCTION); ecma_bound_function_t *bound_func_p = (ecma_bound_function_t *) func_obj_p; func_obj_p = ECMA_GET_NON_NULL_POINTER_FROM_POINTER_TAG (ecma_object_t, bound_func_p->header.u.bound_function.target_function); @@ -857,6 +858,7 @@ ecma_op_function_has_instance (ecma_object_t *func_obj_p, /**< Function object * JERRY_ASSERT (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_FUNCTION || ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_NATIVE_FUNCTION + || ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION || ECMA_OBJECT_IS_PROXY (func_obj_p)); ecma_object_t *v_obj_p = ecma_get_object_from_value (value); @@ -1021,7 +1023,6 @@ ecma_op_function_call_simple (ecma_object_t *func_obj_p, /**< Function object */ uint32_t arguments_list_len) /**< length of arguments list */ { JERRY_ASSERT (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_FUNCTION); - JERRY_ASSERT (!ecma_get_object_is_builtin (func_obj_p)); vm_frame_ctx_shared_args_t shared_args; shared_args.header.status_flags = VM_FRAME_CTX_SHARED_HAS_ARG_LIST; @@ -1168,6 +1169,38 @@ exit: return ret_value; } /* ecma_op_function_call_simple */ +/** + * Perform a built-in method call. + * + * @return the result of the function call. + */ +static ecma_value_t JERRY_ATTR_NOINLINE +ecma_op_function_call_native_built_in (ecma_object_t *func_obj_p, /**< Function object */ + ecma_value_t this_arg_value, /**< 'this' argument's value */ + const ecma_value_t *arguments_list_p, /**< arguments list */ + uint32_t arguments_list_len) /**< length of arguments list */ +{ + JERRY_ASSERT (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); + +#if JERRY_BUILTIN_REALMS + ecma_global_object_t *saved_global_object_p = JERRY_CONTEXT (global_object_p); + + ecma_extended_object_t *ext_func_obj_p = (ecma_extended_object_t *) func_obj_p; + JERRY_CONTEXT (global_object_p) = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_global_object_t, + ext_func_obj_p->u.built_in.realm_value); +#endif /* JERRY_BUILTIN_REALMS */ + + ecma_value_t ret_value = ecma_builtin_dispatch_call (func_obj_p, + this_arg_value, + arguments_list_p, + arguments_list_len); + +#if JERRY_BUILTIN_REALMS + JERRY_CONTEXT (global_object_p) = saved_global_object_p; +#endif /* JERRY_BUILTIN_REALMS */ + return ret_value; +} /* ecma_op_function_call_native_built_in */ + /** * Perform a native C method call which was registered via the API. * @@ -1178,31 +1211,9 @@ ecma_op_function_call_native (ecma_object_t *func_obj_p, /**< Function object */ ecma_value_t this_arg_value, /**< 'this' argument's value */ const ecma_value_t *arguments_list_p, /**< arguments list */ uint32_t arguments_list_len) /**< length of arguments list */ - { JERRY_ASSERT (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_NATIVE_FUNCTION); - if (ecma_get_object_is_builtin (func_obj_p)) - { -#if JERRY_BUILTIN_REALMS - ecma_global_object_t *saved_global_object_p = JERRY_CONTEXT (global_object_p); - - ecma_extended_object_t *ext_func_obj_p = (ecma_extended_object_t *) func_obj_p; - JERRY_CONTEXT (global_object_p) = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_global_object_t, - ext_func_obj_p->u.built_in.realm_value); -#endif /* JERRY_BUILTIN_REALMS */ - - ecma_value_t ret_value = ecma_builtin_dispatch_call (func_obj_p, - this_arg_value, - arguments_list_p, - arguments_list_len); - -#if JERRY_BUILTIN_REALMS - JERRY_CONTEXT (global_object_p) = saved_global_object_p; -#endif /* JERRY_BUILTIN_REALMS */ - return ret_value; - } - ecma_native_function_t *native_function_p = (ecma_native_function_t *) func_obj_p; #if JERRY_BUILTIN_REALMS @@ -1370,6 +1381,10 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */ { result = ecma_op_function_call_simple (func_obj_p, this_arg_value, arguments_list_p, arguments_list_len); } + else if (type == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION) + { + result = ecma_op_function_call_native_built_in (func_obj_p, this_arg_value, arguments_list_p, arguments_list_len); + } else if (type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION) { result = ecma_op_function_call_native (func_obj_p, this_arg_value, arguments_list_p, arguments_list_len); @@ -1503,38 +1518,37 @@ ecma_op_function_construct (ecma_object_t *func_obj_p, /**< Function object */ return ecma_op_function_construct_bound (func_obj_p, new_target_p, arguments_list_p, arguments_list_len); } + if (JERRY_UNLIKELY (type == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION)) + { +#if JERRY_BUILTIN_REALMS + ecma_global_object_t *saved_global_object_p = JERRY_CONTEXT (global_object_p); + ecma_value_t realm_value = ((ecma_extended_object_t *) func_obj_p)->u.built_in.realm_value; + JERRY_CONTEXT (global_object_p) = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_global_object_t, realm_value); +#endif /* JERRY_BUILTIN_REALMS */ + +#if JERRY_ESNEXT + ecma_object_t *old_new_target = JERRY_CONTEXT (current_new_target_p); + JERRY_CONTEXT (current_new_target_p) = new_target_p; +#endif /* JERRY_ESNEXT */ + + ecma_value_t ret_value = ecma_builtin_dispatch_construct (func_obj_p, arguments_list_p, arguments_list_len); + +#if JERRY_ESNEXT + JERRY_CONTEXT (current_new_target_p) = old_new_target; +#endif /* JERRY_ESNEXT */ + +#if JERRY_BUILTIN_REALMS + JERRY_CONTEXT (global_object_p) = saved_global_object_p; +#endif /* JERRY_BUILTIN_REALMS */ + return ret_value; + } + if (JERRY_UNLIKELY (type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION)) { - if (JERRY_UNLIKELY (ecma_get_object_is_builtin (func_obj_p))) - { -#if JERRY_BUILTIN_REALMS - ecma_global_object_t *saved_global_object_p = JERRY_CONTEXT (global_object_p); - ecma_value_t realm_value = ((ecma_extended_object_t *) func_obj_p)->u.built_in.realm_value; - JERRY_CONTEXT (global_object_p) = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_global_object_t, realm_value); -#endif /* JERRY_BUILTIN_REALMS */ - -#if JERRY_ESNEXT - ecma_object_t *old_new_target = JERRY_CONTEXT (current_new_target_p); - JERRY_CONTEXT (current_new_target_p) = new_target_p; -#endif /* JERRY_ESNEXT */ - - ecma_value_t ret_value = ecma_builtin_dispatch_construct (func_obj_p, arguments_list_p, arguments_list_len); - -#if JERRY_ESNEXT - JERRY_CONTEXT (current_new_target_p) = old_new_target; -#endif /* JERRY_ESNEXT */ - -#if JERRY_BUILTIN_REALMS - JERRY_CONTEXT (global_object_p) = saved_global_object_p; -#endif /* JERRY_BUILTIN_REALMS */ - return ret_value; - } - return ecma_op_function_construct_native (func_obj_p, new_target_p, arguments_list_p, arguments_list_len); } JERRY_ASSERT (type == ECMA_OBJECT_TYPE_FUNCTION); - JERRY_ASSERT (!ecma_get_object_is_builtin (func_obj_p)); ecma_object_t *new_this_obj_p = NULL; ecma_value_t this_arg; @@ -1727,7 +1741,7 @@ ecma_property_t * ecma_op_function_try_to_lazy_instantiate_property (ecma_object_t *object_p, /**< the function object */ ecma_string_t *property_name_p) /**< property name */ { - JERRY_ASSERT (!ecma_get_object_is_builtin (object_p)); + JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_FUNCTION); #if JERRY_ESNEXT if (ecma_compare_ecma_string_to_magic_id (property_name_p, LIT_MAGIC_STRING_LENGTH)) diff --git a/jerry-core/ecma/operations/ecma-objects-general.c b/jerry-core/ecma/operations/ecma-objects-general.c index 8519960ee..e9ec143ab 100644 --- a/jerry-core/ecma/operations/ecma-objects-general.c +++ b/jerry-core/ecma/operations/ecma-objects-general.c @@ -133,40 +133,41 @@ ecma_op_general_object_delete (ecma_object_t *obj_p, /**< the object */ if (property & ECMA_PROPERTY_FLAG_BUILT_IN) { #if JERRY_ESNEXT - if (ecma_get_object_is_builtin (obj_p)) + switch (type) { - if (type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION && ecma_builtin_function_is_routine (obj_p)) + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: { - ecma_builtin_routine_delete_built_in_property (obj_p, property_name_p); + if (ecma_builtin_function_is_routine (obj_p)) + { + ecma_builtin_routine_delete_built_in_property (obj_p, property_name_p); + break; + } + /* FALLTHRU */ } - else + case ECMA_OBJECT_TYPE_BUILT_IN_GENERAL: + case ECMA_OBJECT_TYPE_BUILT_IN_CLASS: + case ECMA_OBJECT_TYPE_BUILT_IN_ARRAY: { ecma_builtin_delete_built_in_property (obj_p, property_name_p); + break; } - } - else - { - switch (type) + case ECMA_OBJECT_TYPE_FUNCTION: { - case ECMA_OBJECT_TYPE_FUNCTION: - { - ecma_op_function_delete_built_in_property (obj_p, property_name_p); - break; - } - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - { - ecma_op_bound_function_delete_built_in_property (obj_p, property_name_p); - break; - } - default: - { - break; - } + ecma_op_function_delete_built_in_property (obj_p, property_name_p); + break; + } + case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + { + ecma_op_bound_function_delete_built_in_property (obj_p, property_name_p); + break; + } + default: + { + JERRY_UNREACHABLE (); + break; } } #else /* !JERRY_ESNEXT */ - JERRY_ASSERT (ecma_get_object_is_builtin (obj_p)); - ecma_builtin_delete_built_in_property (obj_p, property_name_p); #endif /* JERRY_ESNEXT */ } diff --git a/jerry-core/ecma/operations/ecma-objects.c b/jerry-core/ecma/operations/ecma-objects.c index 4696c72c6..8562fe80a 100644 --- a/jerry-core/ecma/operations/ecma-objects.c +++ b/jerry-core/ecma/operations/ecma-objects.c @@ -84,11 +84,11 @@ ecma_op_object_get_own_property (ecma_object_t *object_p, /**< the object */ JERRY_ASSERT (options == ECMA_PROPERTY_GET_NO_OPTIONS || property_ref_p != NULL); - ecma_object_type_t type = ecma_get_object_type (object_p); + ecma_object_base_type_t base_type = ecma_get_object_base_type (object_p); - switch (type) + switch (base_type) { - case ECMA_OBJECT_TYPE_CLASS: + case ECMA_OBJECT_BASE_TYPE_CLASS: { ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; @@ -240,7 +240,7 @@ ecma_op_object_get_own_property (ecma_object_t *object_p, /**< the object */ } break; } - case ECMA_OBJECT_TYPE_ARRAY: + case ECMA_OBJECT_BASE_TYPE_ARRAY: { ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; @@ -291,80 +291,83 @@ ecma_op_object_get_own_property (ecma_object_t *object_p, /**< the object */ } ecma_property_t *property_p = ecma_find_named_property (object_p, property_name_p); + ecma_object_type_t type = ecma_get_object_type (object_p); if (property_p == NULL) { - if (ecma_get_object_is_builtin (object_p)) + switch (type) { - if (type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION && ecma_builtin_function_is_routine (object_p)) + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: { - property_p = ecma_builtin_routine_try_to_instantiate_property (object_p, property_name_p); + if (ecma_builtin_function_is_routine (object_p)) + { + property_p = ecma_builtin_routine_try_to_instantiate_property (object_p, property_name_p); + break; + } + /* FALLTHRU */ } - else + case ECMA_OBJECT_TYPE_BUILT_IN_GENERAL: + case ECMA_OBJECT_TYPE_BUILT_IN_CLASS: + case ECMA_OBJECT_TYPE_BUILT_IN_ARRAY: { property_p = ecma_builtin_try_to_instantiate_property (object_p, property_name_p); + break; } - } - else - { - switch (type) + case ECMA_OBJECT_TYPE_CLASS: { - case ECMA_OBJECT_TYPE_CLASS: + if (((ecma_extended_object_t *) object_p)->u.cls.type == ECMA_OBJECT_CLASS_ARGUMENTS) { - if (((ecma_extended_object_t *) object_p)->u.cls.type == ECMA_OBJECT_CLASS_ARGUMENTS) - { - property_p = ecma_op_arguments_object_try_to_lazy_instantiate_property (object_p, property_name_p); - } - break; + property_p = ecma_op_arguments_object_try_to_lazy_instantiate_property (object_p, property_name_p); } - case ECMA_OBJECT_TYPE_FUNCTION: - { + break; + } + case ECMA_OBJECT_TYPE_FUNCTION: + { #if !JERRY_ESNEXT - if (ecma_string_is_length (property_name_p)) + if (ecma_string_is_length (property_name_p)) + { + if (options & ECMA_PROPERTY_GET_VALUE) { - if (options & ECMA_PROPERTY_GET_VALUE) + /* Get length virtual property. */ + ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) object_p; + const ecma_compiled_code_t *bytecode_data_p = ecma_op_function_get_compiled_code (ext_func_p); + + uint32_t len; + if (bytecode_data_p->status_flags & CBC_CODE_FLAGS_UINT16_ARGUMENTS) { - /* Get length virtual property. */ - ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) object_p; - const ecma_compiled_code_t *bytecode_data_p = ecma_op_function_get_compiled_code (ext_func_p); - - uint32_t len; - if (bytecode_data_p->status_flags & CBC_CODE_FLAGS_UINT16_ARGUMENTS) - { - cbc_uint16_arguments_t *args_p = (cbc_uint16_arguments_t *) bytecode_data_p; - len = args_p->argument_end; - } - else - { - cbc_uint8_arguments_t *args_p = (cbc_uint8_arguments_t *) bytecode_data_p; - len = args_p->argument_end; - } - - property_ref_p->virtual_value = ecma_make_uint32_value (len); + cbc_uint16_arguments_t *args_p = (cbc_uint16_arguments_t *) bytecode_data_p; + len = args_p->argument_end; + } + else + { + cbc_uint8_arguments_t *args_p = (cbc_uint8_arguments_t *) bytecode_data_p; + len = args_p->argument_end; } - return ECMA_PROPERTY_VIRTUAL; + property_ref_p->virtual_value = ecma_make_uint32_value (len); } + + return ECMA_PROPERTY_VIRTUAL; + } #endif /* !JERRY_ESNEXT */ - /* Get prototype physical property. */ - property_p = ecma_op_function_try_to_lazy_instantiate_property (object_p, property_name_p); - break; - } - case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: - { - property_p = ecma_op_external_function_try_to_lazy_instantiate_property (object_p, property_name_p); - break; - } - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - { - property_p = ecma_op_bound_function_try_to_lazy_instantiate_property (object_p, property_name_p); - break; - } - default: - { - break; - } + /* Get prototype physical property. */ + property_p = ecma_op_function_try_to_lazy_instantiate_property (object_p, property_name_p); + break; + } + case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: + { + property_p = ecma_op_external_function_try_to_lazy_instantiate_property (object_p, property_name_p); + break; + } + case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + { + property_p = ecma_op_bound_function_try_to_lazy_instantiate_property (object_p, property_name_p); + break; + } + default: + { + break; } } @@ -529,11 +532,11 @@ ecma_op_object_find_own (ecma_value_t base_value, /**< base value */ JERRY_ASSERT (property_name_p != NULL); JERRY_ASSERT (!ECMA_OBJECT_IS_PROXY (object_p)); - ecma_object_type_t type = ecma_get_object_type (object_p); + ecma_object_base_type_t base_type = ecma_get_object_base_type (object_p); - switch (type) + switch (base_type) { - case ECMA_OBJECT_TYPE_CLASS: + case ECMA_OBJECT_BASE_TYPE_CLASS: { ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; @@ -664,7 +667,7 @@ ecma_op_object_find_own (ecma_value_t base_value, /**< base value */ } break; } - case ECMA_OBJECT_TYPE_ARRAY: + case ECMA_OBJECT_BASE_TYPE_ARRAY: { ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; @@ -702,72 +705,74 @@ ecma_op_object_find_own (ecma_value_t base_value, /**< base value */ if (property_p == NULL) { - if (ecma_get_object_is_builtin (object_p)) + switch (ecma_get_object_type (object_p)) { - if (type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION && ecma_builtin_function_is_routine (object_p)) + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: { - property_p = ecma_builtin_routine_try_to_instantiate_property (object_p, property_name_p); + if (ecma_builtin_function_is_routine (object_p)) + { + property_p = ecma_builtin_routine_try_to_instantiate_property (object_p, property_name_p); + break; + } + /* FALLTHRU */ } - else + case ECMA_OBJECT_TYPE_BUILT_IN_GENERAL: + case ECMA_OBJECT_TYPE_BUILT_IN_CLASS: + case ECMA_OBJECT_TYPE_BUILT_IN_ARRAY: { property_p = ecma_builtin_try_to_instantiate_property (object_p, property_name_p); + break; } - } - else - { - switch (type) + case ECMA_OBJECT_TYPE_CLASS: { - case ECMA_OBJECT_TYPE_CLASS: + if (((ecma_extended_object_t *) object_p)->u.cls.type == ECMA_OBJECT_CLASS_ARGUMENTS) { - if (((ecma_extended_object_t *) object_p)->u.cls.type == ECMA_OBJECT_CLASS_ARGUMENTS) - { - property_p = ecma_op_arguments_object_try_to_lazy_instantiate_property (object_p, property_name_p); - } - break; + property_p = ecma_op_arguments_object_try_to_lazy_instantiate_property (object_p, property_name_p); } - case ECMA_OBJECT_TYPE_FUNCTION: - { + break; + } + case ECMA_OBJECT_TYPE_FUNCTION: + { #if !JERRY_ESNEXT - if (ecma_string_is_length (property_name_p)) + if (ecma_string_is_length (property_name_p)) + { + /* Get length virtual property. */ + ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) object_p; + const ecma_compiled_code_t *bytecode_data_p = ecma_op_function_get_compiled_code (ext_func_p); + + uint32_t len; + if (bytecode_data_p->status_flags & CBC_CODE_FLAGS_UINT16_ARGUMENTS) { - /* Get length virtual property. */ - ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) object_p; - const ecma_compiled_code_t *bytecode_data_p = ecma_op_function_get_compiled_code (ext_func_p); - - uint32_t len; - if (bytecode_data_p->status_flags & CBC_CODE_FLAGS_UINT16_ARGUMENTS) - { - cbc_uint16_arguments_t *args_p = (cbc_uint16_arguments_t *) bytecode_data_p; - len = args_p->argument_end; - } - else - { - cbc_uint8_arguments_t *args_p = (cbc_uint8_arguments_t *) bytecode_data_p; - len = args_p->argument_end; - } - - return ecma_make_uint32_value (len); + cbc_uint16_arguments_t *args_p = (cbc_uint16_arguments_t *) bytecode_data_p; + len = args_p->argument_end; } + else + { + cbc_uint8_arguments_t *args_p = (cbc_uint8_arguments_t *) bytecode_data_p; + len = args_p->argument_end; + } + + return ecma_make_uint32_value (len); + } #endif /* !JERRY_ESNEXT */ - /* Get prototype physical property. */ - property_p = ecma_op_function_try_to_lazy_instantiate_property (object_p, property_name_p); - break; - } - case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: - { - property_p = ecma_op_external_function_try_to_lazy_instantiate_property (object_p, property_name_p); - break; - } - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - { - property_p = ecma_op_bound_function_try_to_lazy_instantiate_property (object_p, property_name_p); - break; - } - default: - { - break; - } + /* Get prototype physical property. */ + property_p = ecma_op_function_try_to_lazy_instantiate_property (object_p, property_name_p); + break; + } + case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: + { + property_p = ecma_op_external_function_try_to_lazy_instantiate_property (object_p, property_name_p); + break; + } + case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + { + property_p = ecma_op_bound_function_try_to_lazy_instantiate_property (object_p, property_name_p); + break; + } + default: + { + break; } } @@ -968,7 +973,7 @@ ecma_value_t ecma_op_object_get_length (ecma_object_t *object_p, /**< the object */ ecma_length_t *length_p) /**< [out] length value converted to uint32 */ { - if (JERRY_LIKELY (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_ARRAY)) + if (JERRY_LIKELY (ecma_get_object_base_type (object_p) == ECMA_OBJECT_BASE_TYPE_ARRAY)) { *length_p = (ecma_length_t) ecma_array_get_length (object_p); return ECMA_VALUE_EMPTY; @@ -1398,11 +1403,11 @@ ecma_op_object_put_with_receiver (ecma_object_t *object_p, /**< the object */ } #endif /* JERRY_BUILTIN_PROXY */ - ecma_object_type_t type = ecma_get_object_type (object_p); + ecma_object_base_type_t base_type = ecma_get_object_base_type (object_p); - switch (type) + switch (base_type) { - case ECMA_OBJECT_TYPE_CLASS: + case ECMA_OBJECT_BASE_TYPE_CLASS: { ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; @@ -1472,7 +1477,7 @@ ecma_op_object_put_with_receiver (ecma_object_t *object_p, /**< the object */ } break; } - case ECMA_OBJECT_TYPE_ARRAY: + case ECMA_OBJECT_BASE_TYPE_ARRAY: { ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; @@ -1513,82 +1518,84 @@ ecma_op_object_put_with_receiver (ecma_object_t *object_p, /**< the object */ if (property_p == NULL) { - if (ecma_get_object_is_builtin (object_p)) + switch (ecma_get_object_type (object_p)) { - if (type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION && ecma_builtin_function_is_routine (object_p)) + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: { - property_p = ecma_builtin_routine_try_to_instantiate_property (object_p, property_name_p); + if (ecma_builtin_function_is_routine (object_p)) + { + property_p = ecma_builtin_routine_try_to_instantiate_property (object_p, property_name_p); + break; + } + /* FALLTHRU */ } - else + case ECMA_OBJECT_TYPE_BUILT_IN_GENERAL: + case ECMA_OBJECT_TYPE_BUILT_IN_CLASS: + case ECMA_OBJECT_TYPE_BUILT_IN_ARRAY: { property_p = ecma_builtin_try_to_instantiate_property (object_p, property_name_p); + break; } - } - else - { - switch (type) + case ECMA_OBJECT_TYPE_CLASS: { - case ECMA_OBJECT_TYPE_CLASS: + ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; + + switch (ext_object_p->u.cls.type) { - ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; - - switch (ext_object_p->u.cls.type) + case ECMA_OBJECT_CLASS_STRING: { - case ECMA_OBJECT_CLASS_STRING: - { - uint32_t index = ecma_string_get_array_index (property_name_p); + uint32_t index = ecma_string_get_array_index (property_name_p); - if (index != ECMA_STRING_NOT_ARRAY_INDEX) + if (index != ECMA_STRING_NOT_ARRAY_INDEX) + { + ecma_value_t prim_value_p = ext_object_p->u.cls.u3.value; + ecma_string_t *prim_value_str_p = ecma_get_string_from_value (prim_value_p); + + if (index < ecma_string_get_length (prim_value_str_p)) { - ecma_value_t prim_value_p = ext_object_p->u.cls.u3.value; - ecma_string_t *prim_value_str_p = ecma_get_string_from_value (prim_value_p); - - if (index < ecma_string_get_length (prim_value_str_p)) - { - return ecma_raise_readonly_assignment (property_name_p, is_throw); - } + return ecma_raise_readonly_assignment (property_name_p, is_throw); } - break; - } - case ECMA_OBJECT_CLASS_ARGUMENTS: - { - property_p = ecma_op_arguments_object_try_to_lazy_instantiate_property (object_p, property_name_p); - break; } + break; } - break; - } - case ECMA_OBJECT_TYPE_FUNCTION: - { - if (ecma_string_is_length (property_name_p)) + case ECMA_OBJECT_CLASS_ARGUMENTS: { - /* Uninitialized 'length' property is non-writable (ECMA-262 v6, 19.2.4.1) */ - #if JERRY_ESNEXT - if (!ECMA_GET_FIRST_BIT_FROM_POINTER_TAG (((ecma_extended_object_t *) object_p)->u.function.scope_cp)) - #endif /* JERRY_ESNEXT */ - { - return ecma_raise_readonly_assignment (property_name_p, is_throw); - } + property_p = ecma_op_arguments_object_try_to_lazy_instantiate_property (object_p, property_name_p); + break; } + } + break; + } + case ECMA_OBJECT_TYPE_FUNCTION: + { + if (ecma_string_is_length (property_name_p)) + { + /* Uninitialized 'length' property is non-writable (ECMA-262 v6, 19.2.4.1) */ +#if JERRY_ESNEXT + if (!ECMA_GET_FIRST_BIT_FROM_POINTER_TAG (((ecma_extended_object_t *) object_p)->u.function.scope_cp)) +#endif /* JERRY_ESNEXT */ + { + return ecma_raise_readonly_assignment (property_name_p, is_throw); + } + } - /* Get prototype physical property. */ - property_p = ecma_op_function_try_to_lazy_instantiate_property (object_p, property_name_p); - break; - } - case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: - { - property_p = ecma_op_external_function_try_to_lazy_instantiate_property (object_p, property_name_p); - break; - } - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - { - property_p = ecma_op_bound_function_try_to_lazy_instantiate_property (object_p, property_name_p); - break; - } - default: - { - break; - } + /* Get prototype physical property. */ + property_p = ecma_op_function_try_to_lazy_instantiate_property (object_p, property_name_p); + break; + } + case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: + { + property_p = ecma_op_external_function_try_to_lazy_instantiate_property (object_p, property_name_p); + break; + } + case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + { + property_p = ecma_op_bound_function_try_to_lazy_instantiate_property (object_p, property_name_p); + break; + } + default: + { + break; } } } @@ -1690,9 +1697,9 @@ ecma_op_object_put_with_receiver (ecma_object_t *object_p, /**< the object */ if (create_new_property && ecma_op_ordinary_object_is_extensible (object_p)) { - const ecma_object_type_t obj_type = ecma_get_object_type (object_p); + const ecma_object_base_type_t obj_base_type = ecma_get_object_base_type (object_p); - if (obj_type == ECMA_OBJECT_TYPE_CLASS) + if (obj_base_type == ECMA_OBJECT_BASE_TYPE_CLASS) { ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; @@ -1706,7 +1713,7 @@ ecma_op_object_put_with_receiver (ecma_object_t *object_p, /**< the object */ uint32_t index = ecma_string_get_array_index (property_name_p); - if (obj_type == ECMA_OBJECT_TYPE_ARRAY + if (obj_base_type == ECMA_OBJECT_BASE_TYPE_ARRAY && index != ECMA_STRING_NOT_ARRAY_INDEX) { ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; @@ -1907,6 +1914,7 @@ ecma_op_object_define_own_property (ecma_object_t *obj_p, /**< the object */ break; } case ECMA_OBJECT_TYPE_ARRAY: + case ECMA_OBJECT_TYPE_BUILT_IN_ARRAY: { return ecma_op_array_object_define_own_property (obj_p, property_name_p, property_desc_p); } @@ -2300,77 +2308,76 @@ ecma_object_list_lazy_property_names (ecma_object_t *obj_p, /**< object */ ecma_collection_t *prop_names_p, /**< prop name collection */ ecma_property_counter_t *prop_counter_p) /**< prop counter */ { - const ecma_object_type_t type = ecma_get_object_type (obj_p); - const bool obj_is_builtin = ecma_get_object_is_builtin (obj_p); - - if (obj_is_builtin) + switch (ecma_get_object_type (obj_p)) { - if (type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION && ecma_builtin_function_is_routine (obj_p)) + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: { - ecma_builtin_routine_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); + if (ecma_builtin_function_is_routine (obj_p)) + { + ecma_builtin_routine_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); + break; + } + /* FALLTHRU */ } - else + case ECMA_OBJECT_TYPE_BUILT_IN_GENERAL: + case ECMA_OBJECT_TYPE_BUILT_IN_CLASS: + case ECMA_OBJECT_TYPE_BUILT_IN_ARRAY: { ecma_builtin_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); + break; } - } - else - { - switch (type) + case ECMA_OBJECT_TYPE_CLASS: { - case ECMA_OBJECT_TYPE_CLASS: - { - ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p; + ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p; - switch (ext_object_p->u.cls.type) + switch (ext_object_p->u.cls.type) + { + case ECMA_OBJECT_CLASS_STRING: { - case ECMA_OBJECT_CLASS_STRING: - { - ecma_op_string_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); - break; - } - case ECMA_OBJECT_CLASS_ARGUMENTS: - { - ecma_op_arguments_object_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); - break; - } -#if JERRY_BUILTIN_TYPEDARRAY - /* ES2015 9.4.5.1 */ - case ECMA_OBJECT_CLASS_TYPEDARRAY: - { - ecma_op_typedarray_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); - break; - } -#endif /* JERRY_BUILTIN_TYPEDARRAY */ + ecma_op_string_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); + break; } - break; - } - case ECMA_OBJECT_TYPE_FUNCTION: - { - ecma_op_function_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); - break; - } - case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: - { - ecma_op_external_function_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); - break; - } - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - { - ecma_op_bound_function_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); - break; - } - case ECMA_OBJECT_TYPE_ARRAY: - { - ecma_collection_push_back (prop_names_p, ecma_make_magic_string_value (LIT_MAGIC_STRING_LENGTH)); - prop_counter_p->string_named_props++; - break; - } - default: - { - JERRY_ASSERT (type == ECMA_OBJECT_TYPE_GENERAL); - break; + case ECMA_OBJECT_CLASS_ARGUMENTS: + { + ecma_op_arguments_object_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); + break; + } +#if JERRY_BUILTIN_TYPEDARRAY + /* ES2015 9.4.5.1 */ + case ECMA_OBJECT_CLASS_TYPEDARRAY: + { + ecma_op_typedarray_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); + break; + } +#endif /* JERRY_BUILTIN_TYPEDARRAY */ } + break; + } + case ECMA_OBJECT_TYPE_FUNCTION: + { + ecma_op_function_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); + break; + } + case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: + { + ecma_op_external_function_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); + break; + } + case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + { + ecma_op_bound_function_list_lazy_property_names (obj_p, prop_names_p, prop_counter_p); + break; + } + case ECMA_OBJECT_TYPE_ARRAY: + { + ecma_collection_push_back (prop_names_p, ecma_make_magic_string_value (LIT_MAGIC_STRING_LENGTH)); + prop_counter_p->string_named_props++; + break; + } + default: + { + JERRY_ASSERT (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_GENERAL); + break; } } } /* ecma_object_list_lazy_property_names */ @@ -2723,23 +2730,31 @@ ecma_builtin_is (ecma_object_t *object_p, /**< pointer to an object */ JERRY_ASSERT (object_p != NULL && !ecma_is_lexical_environment (object_p)); JERRY_ASSERT (builtin_id < ECMA_BUILTIN_ID__COUNT); - if (!ecma_get_object_is_builtin (object_p)) + ecma_object_type_t type = ecma_get_object_type (object_p); + + switch (type) { - return false; + case ECMA_OBJECT_TYPE_BUILT_IN_GENERAL: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: + { + ecma_extended_object_t *built_in_object_p = (ecma_extended_object_t *) object_p; + + return (built_in_object_p->u.built_in.id == builtin_id + && built_in_object_p->u.built_in.routine_id == 0); + } + case ECMA_OBJECT_TYPE_BUILT_IN_CLASS: + case ECMA_OBJECT_TYPE_BUILT_IN_ARRAY: + { + ecma_extended_built_in_object_t *extended_built_in_object_p = (ecma_extended_built_in_object_t *) object_p; + + return (extended_built_in_object_p->built_in.id == builtin_id + && extended_built_in_object_p->built_in.routine_id == 0); + } + default: + { + return false; + } } - - if (ECMA_BUILTIN_IS_EXTENDED_BUILT_IN (ecma_get_object_type (object_p))) - { - ecma_extended_built_in_object_t *extended_built_in_object_p = (ecma_extended_built_in_object_t *) object_p; - - return (extended_built_in_object_p->built_in.id == builtin_id - && extended_built_in_object_p->built_in.routine_id == 0); - } - - ecma_extended_object_t *built_in_object_p = (ecma_extended_object_t *) object_p; - - return (built_in_object_p->u.built_in.id == builtin_id - && built_in_object_p->u.built_in.routine_id == 0); } /* ecma_builtin_is */ #endif /* !JERRY_NDEBUG */ @@ -2909,10 +2924,12 @@ ecma_object_get_class_name (ecma_object_t *obj_p) /**< object */ switch (type) { case ECMA_OBJECT_TYPE_ARRAY: + case ECMA_OBJECT_TYPE_BUILT_IN_ARRAY: { return LIT_MAGIC_STRING_ARRAY_UL; } case ECMA_OBJECT_TYPE_CLASS: + case ECMA_OBJECT_TYPE_BUILT_IN_CLASS: { ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p; @@ -2944,6 +2961,7 @@ ecma_object_get_class_name (ecma_object_t *obj_p) /**< object */ case ECMA_OBJECT_TYPE_FUNCTION: case ECMA_OBJECT_TYPE_NATIVE_FUNCTION: case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: { return LIT_MAGIC_STRING_FUNCTION_UL; } @@ -2960,82 +2978,69 @@ ecma_object_get_class_name (ecma_object_t *obj_p) /**< object */ return LIT_MAGIC_STRING_OBJECT_UL; } #endif /* JERRY_BUILTIN_PROXY */ - default: + case ECMA_OBJECT_TYPE_BUILT_IN_GENERAL: { - JERRY_ASSERT (type == ECMA_OBJECT_TYPE_GENERAL || type == ECMA_OBJECT_TYPE_PROXY); + ecma_extended_object_t *ext_obj_p = (ecma_extended_object_t *) obj_p; - if (ecma_get_object_is_builtin (obj_p)) + switch (ext_obj_p->u.built_in.id) { - ecma_extended_object_t *ext_obj_p = (ecma_extended_object_t *) obj_p; - - switch (ext_obj_p->u.built_in.id) - { #if JERRY_BUILTIN_MATH - case ECMA_BUILTIN_ID_MATH: - { - return LIT_MAGIC_STRING_MATH_UL; - } + case ECMA_BUILTIN_ID_MATH: + { + return LIT_MAGIC_STRING_MATH_UL; + } #endif /* JERRY_BUILTIN_MATH */ #if JERRY_BUILTIN_REFLECT - case ECMA_BUILTIN_ID_REFLECT: - { - return LIT_MAGIC_STRING_REFLECT_UL; - } + case ECMA_BUILTIN_ID_REFLECT: + { + return LIT_MAGIC_STRING_REFLECT_UL; + } #endif /* JERRY_BUILTIN_REFLECT */ #if JERRY_ESNEXT - case ECMA_BUILTIN_ID_GENERATOR: - { - return LIT_MAGIC_STRING_GENERATOR_UL; - } - case ECMA_BUILTIN_ID_ASYNC_GENERATOR: - { - return LIT_MAGIC_STRING_ASYNC_GENERATOR_UL; - } + case ECMA_BUILTIN_ID_GENERATOR: + { + return LIT_MAGIC_STRING_GENERATOR_UL; + } + case ECMA_BUILTIN_ID_ASYNC_GENERATOR: + { + return LIT_MAGIC_STRING_ASYNC_GENERATOR_UL; + } #endif /* JERRY_ESNEXT */ #if JERRY_BUILTIN_JSON - case ECMA_BUILTIN_ID_JSON: - { - return LIT_MAGIC_STRING_JSON_U; - } + case ECMA_BUILTIN_ID_JSON: + { + return LIT_MAGIC_STRING_JSON_U; + } #endif /* JERRY_BUILTIN_JSON */ #if !JERRY_ESNEXT #if JERRY_BUILTIN_ERRORS - case ECMA_BUILTIN_ID_EVAL_ERROR_PROTOTYPE: - case ECMA_BUILTIN_ID_RANGE_ERROR_PROTOTYPE: - case ECMA_BUILTIN_ID_REFERENCE_ERROR_PROTOTYPE: - case ECMA_BUILTIN_ID_SYNTAX_ERROR_PROTOTYPE: - case ECMA_BUILTIN_ID_TYPE_ERROR_PROTOTYPE: - case ECMA_BUILTIN_ID_URI_ERROR_PROTOTYPE: + case ECMA_BUILTIN_ID_EVAL_ERROR_PROTOTYPE: + case ECMA_BUILTIN_ID_RANGE_ERROR_PROTOTYPE: + case ECMA_BUILTIN_ID_REFERENCE_ERROR_PROTOTYPE: + case ECMA_BUILTIN_ID_SYNTAX_ERROR_PROTOTYPE: + case ECMA_BUILTIN_ID_TYPE_ERROR_PROTOTYPE: + case ECMA_BUILTIN_ID_URI_ERROR_PROTOTYPE: #endif /* JERRY_BUILTIN_ERRORS */ - case ECMA_BUILTIN_ID_ERROR_PROTOTYPE: - { - return LIT_MAGIC_STRING_ERROR_UL; - } + case ECMA_BUILTIN_ID_ERROR_PROTOTYPE: + { + return LIT_MAGIC_STRING_ERROR_UL; + } #endif /* !JERRY_ESNEXT */ -#if JERRY_BUILTIN_PROXY - case ECMA_BUILTIN_ID_PROXY: - { - return LIT_MAGIC_STRING_FUNCTION_UL; - } -#endif /* JERRY_BUILTIN_PROXY */ -#if JERRY_BUILTIN_BIGINT - case ECMA_BUILTIN_ID_BIGINT: - { - return LIT_MAGIC_STRING_FUNCTION_UL; - } -#endif /* JERRY_BUILTIN_BIGINT */ - default: - { - JERRY_ASSERT (ecma_object_check_class_name_is_object (obj_p)); - - return LIT_MAGIC_STRING_OBJECT_UL; - } + default: + { + break; } } - else - { - return LIT_MAGIC_STRING_OBJECT_UL; - } + + JERRY_ASSERT (ecma_object_check_class_name_is_object (obj_p)); + return LIT_MAGIC_STRING_OBJECT_UL; + } + default: + { + JERRY_ASSERT (type == ECMA_OBJECT_TYPE_GENERAL + || type == ECMA_OBJECT_TYPE_PROXY); + + return LIT_MAGIC_STRING_OBJECT_UL; } } } /* ecma_object_get_class_name */ diff --git a/jerry-core/ecma/operations/ecma-string-object.c b/jerry-core/ecma/operations/ecma-string-object.c index 849e6051a..cf4c363dd 100644 --- a/jerry-core/ecma/operations/ecma-string-object.c +++ b/jerry-core/ecma/operations/ecma-string-object.c @@ -107,7 +107,7 @@ ecma_op_string_list_lazy_property_names (ecma_object_t *obj_p, /**< a String obj ecma_collection_t *prop_names_p, /**< prop name collection */ ecma_property_counter_t *prop_counter_p) /**< prop counter */ { - JERRY_ASSERT (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_CLASS); + JERRY_ASSERT (ecma_get_object_base_type (obj_p) == ECMA_OBJECT_BASE_TYPE_CLASS); ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p; JERRY_ASSERT (ext_object_p->u.cls.type == ECMA_OBJECT_CLASS_STRING); diff --git a/jerry-core/ecma/operations/ecma-symbol-object.c b/jerry-core/ecma/operations/ecma-symbol-object.c index 9fce8a52f..589ef7f17 100644 --- a/jerry-core/ecma/operations/ecma-symbol-object.c +++ b/jerry-core/ecma/operations/ecma-symbol-object.c @@ -162,14 +162,9 @@ ecma_symbol_this_value (ecma_value_t this_arg) /**< this argument value */ { ecma_object_t *object_p = ecma_get_object_from_value (this_arg); - if (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_CLASS) + if (ecma_object_class_is (object_p, ECMA_OBJECT_CLASS_SYMBOL)) { - ecma_extended_object_t *ext_obj_p = (ecma_extended_object_t *) object_p; - - if (ext_obj_p->u.cls.type == ECMA_OBJECT_CLASS_SYMBOL) - { - return ext_obj_p->u.cls.u3.value; - } + return ((ecma_extended_object_t *) object_p)->u.cls.u3.value; } } diff --git a/jerry-core/vm/opcodes.c b/jerry-core/vm/opcodes.c index 206358fe9..776783829 100644 --- a/jerry-core/vm/opcodes.c +++ b/jerry-core/vm/opcodes.c @@ -1175,8 +1175,6 @@ opfunc_set_home_object (ecma_object_t *func_p, /**< function object */ if (ecma_get_object_type (func_p) == ECMA_OBJECT_TYPE_FUNCTION) { - JERRY_ASSERT (!ecma_get_object_is_builtin (func_p)); - ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) func_p; ECMA_SET_NON_NULL_POINTER_TAG (ext_func_p->u.function.scope_cp, parent_env_p,