Remove built-in flag from object type (#4763)
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
@@ -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);
|
||||
|
||||
+37
-40
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
+135
-136
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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))
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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 */
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user