Remove pseudo array object type from the project (#4643)
A new class type enum is introduced to describe the class of objects. This enum is organized to improve property resolve and GC performance. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
+160
-201
@@ -197,14 +197,14 @@ ecma_gc_mark_global_object (ecma_global_object_t *global_object_p) /**< global o
|
||||
static void
|
||||
ecma_gc_mark_arguments_object (ecma_extended_object_t *ext_object_p) /**< arguments object */
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_object_type ((ecma_object_t *) ext_object_p) == ECMA_OBJECT_TYPE_PSEUDO_ARRAY);
|
||||
JERRY_ASSERT (ecma_get_object_type ((ecma_object_t *) ext_object_p) == ECMA_OBJECT_TYPE_CLASS);
|
||||
|
||||
ecma_unmapped_arguments_t *arguments_p = (ecma_unmapped_arguments_t *) ext_object_p;
|
||||
ecma_gc_set_object_visited (ecma_get_object_from_value (arguments_p->callee));
|
||||
|
||||
ecma_value_t *argv_p = (ecma_value_t *) (arguments_p + 1);
|
||||
|
||||
if (ext_object_p->u.pseudo_array.extra_info & ECMA_ARGUMENTS_OBJECT_MAPPED)
|
||||
if (ext_object_p->u.cls.u1.arguments_flags & ECMA_ARGUMENTS_OBJECT_MAPPED)
|
||||
{
|
||||
ecma_mapped_arguments_t *mapped_arguments_p = (ecma_mapped_arguments_t *) ext_object_p;
|
||||
argv_p = (ecma_value_t *) (mapped_arguments_p + 1);
|
||||
@@ -212,7 +212,7 @@ ecma_gc_mark_arguments_object (ecma_extended_object_t *ext_object_p) /**< argume
|
||||
ecma_gc_set_object_visited (ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t, mapped_arguments_p->lex_env));
|
||||
}
|
||||
|
||||
uint32_t arguments_number = arguments_p->header.u.pseudo_array.u2.arguments_number;
|
||||
uint32_t arguments_number = arguments_p->header.u.cls.u3.arguments_number;
|
||||
|
||||
for (uint32_t i = 0; i < arguments_number; i++)
|
||||
{
|
||||
@@ -343,7 +343,7 @@ static void
|
||||
ecma_gc_mark_promise_object (ecma_extended_object_t *ext_object_p) /**< extended object */
|
||||
{
|
||||
/* Mark promise result. */
|
||||
ecma_value_t result = ext_object_p->u.class_prop.u.value;
|
||||
ecma_value_t result = ext_object_p->u.cls.u3.value;
|
||||
|
||||
if (ecma_is_value_object (result))
|
||||
{
|
||||
@@ -392,7 +392,7 @@ ecma_gc_mark_map_object (ecma_object_t *object_p) /**< object */
|
||||
|
||||
ecma_extended_object_t *map_object_p = (ecma_extended_object_t *) object_p;
|
||||
ecma_collection_t *container_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_collection_t,
|
||||
map_object_p->u.class_prop.u.value);
|
||||
map_object_p->u.cls.u3.value);
|
||||
ecma_value_t *start_p = ECMA_CONTAINER_START (container_p);
|
||||
uint32_t entry_count = ECMA_CONTAINER_ENTRY_COUNT (container_p);
|
||||
|
||||
@@ -429,7 +429,7 @@ ecma_gc_mark_weakmap_object (ecma_object_t *object_p) /**< object */
|
||||
|
||||
ecma_extended_object_t *map_object_p = (ecma_extended_object_t *) object_p;
|
||||
ecma_collection_t *container_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_collection_t,
|
||||
map_object_p->u.class_prop.u.value);
|
||||
map_object_p->u.cls.u3.value);
|
||||
ecma_value_t *start_p = ECMA_CONTAINER_START (container_p);
|
||||
uint32_t entry_count = ECMA_CONTAINER_ENTRY_COUNT (container_p);
|
||||
|
||||
@@ -461,7 +461,7 @@ ecma_gc_mark_set_object (ecma_object_t *object_p) /**< object */
|
||||
|
||||
ecma_extended_object_t *map_object_p = (ecma_extended_object_t *) object_p;
|
||||
ecma_collection_t *container_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_collection_t,
|
||||
map_object_p->u.class_prop.u.value);
|
||||
map_object_p->u.cls.u3.value);
|
||||
ecma_value_t *start_p = ECMA_CONTAINER_START (container_p);
|
||||
uint32_t entry_count = ECMA_CONTAINER_ENTRY_COUNT (container_p);
|
||||
|
||||
@@ -491,9 +491,9 @@ ecma_gc_mark_executable_object (ecma_object_t *object_p) /**< object */
|
||||
{
|
||||
vm_executable_object_t *executable_object_p = (vm_executable_object_t *) object_p;
|
||||
|
||||
if (executable_object_p->extended_object.u.class_prop.extra_info & ECMA_ASYNC_GENERATOR_CALLED)
|
||||
if (executable_object_p->extended_object.u.cls.u2.executable_obj_flags & ECMA_ASYNC_GENERATOR_CALLED)
|
||||
{
|
||||
ecma_value_t task = executable_object_p->extended_object.u.class_prop.u.head;
|
||||
ecma_value_t task = executable_object_p->extended_object.u.cls.u3.head;
|
||||
|
||||
while (!ECMA_IS_INTERNAL_VALUE_NULL (task))
|
||||
{
|
||||
@@ -514,7 +514,7 @@ ecma_gc_mark_executable_object (ecma_object_t *object_p) /**< object */
|
||||
|
||||
ecma_gc_set_object_visited (executable_object_p->frame_ctx.lex_env_p);
|
||||
|
||||
if (!ECMA_EXECUTABLE_OBJECT_IS_SUSPENDED (executable_object_p->extended_object.u.class_prop.extra_info))
|
||||
if (!ECMA_EXECUTABLE_OBJECT_IS_SUSPENDED (executable_object_p))
|
||||
{
|
||||
/* All objects referenced by running executable objects are strong roots,
|
||||
* and a finished executable object cannot refer to other values. */
|
||||
@@ -719,10 +719,23 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
|
||||
{
|
||||
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
|
||||
|
||||
switch (ext_object_p->u.class_prop.class_id)
|
||||
switch (ext_object_p->u.cls.type)
|
||||
{
|
||||
case ECMA_OBJECT_CLASS_ARGUMENTS:
|
||||
{
|
||||
ecma_gc_mark_arguments_object (ext_object_p);
|
||||
break;
|
||||
}
|
||||
#if JERRY_BUILTIN_TYPEDARRAY
|
||||
case ECMA_OBJECT_CLASS_TYPEDARRAY:
|
||||
case ECMA_OBJECT_CLASS_TYPEDARRAY_WITH_INFO:
|
||||
{
|
||||
ecma_gc_set_object_visited (ecma_typedarray_get_arraybuffer (object_p));
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_TYPEDARRAY */
|
||||
#if JERRY_MODULE_SYSTEM
|
||||
case LIT_MAGIC_STRING_MODULE_UL:
|
||||
case ECMA_OBJECT_CLASS_MODULE:
|
||||
{
|
||||
ecma_module_node_t *node_p = ((ecma_module_t *) ext_object_p)->imports_p;
|
||||
|
||||
@@ -738,16 +751,15 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_MODULE_SYSTEM */
|
||||
|
||||
#if JERRY_BUILTIN_PROMISE
|
||||
case LIT_MAGIC_STRING_PROMISE_UL:
|
||||
case ECMA_OBJECT_CLASS_PROMISE:
|
||||
{
|
||||
ecma_gc_mark_promise_object (ext_object_p);
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_PROMISE */
|
||||
#if JERRY_BUILTIN_DATAVIEW
|
||||
case LIT_MAGIC_STRING_DATAVIEW_UL:
|
||||
case ECMA_OBJECT_CLASS_DATAVIEW:
|
||||
{
|
||||
ecma_dataview_object_t *dataview_p = (ecma_dataview_object_t *) object_p;
|
||||
ecma_gc_set_object_visited (dataview_p->buffer_p);
|
||||
@@ -755,48 +767,49 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_DATAVIEW */
|
||||
#if JERRY_BUILTIN_CONTAINER
|
||||
#if JERRY_BUILTIN_WEAKSET
|
||||
case LIT_MAGIC_STRING_WEAKSET_UL:
|
||||
case ECMA_OBJECT_CLASS_CONTAINER:
|
||||
{
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_WEAKSET */
|
||||
#if JERRY_BUILTIN_SET
|
||||
case LIT_MAGIC_STRING_SET_UL:
|
||||
{
|
||||
ecma_gc_mark_set_object (object_p);
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_SET */
|
||||
#if JERRY_BUILTIN_WEAKMAP
|
||||
case LIT_MAGIC_STRING_WEAKMAP_UL:
|
||||
{
|
||||
ecma_gc_mark_weakmap_object (object_p);
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_WEAKMAP */
|
||||
#if JERRY_BUILTIN_MAP
|
||||
case LIT_MAGIC_STRING_MAP_UL:
|
||||
{
|
||||
ecma_gc_mark_map_object (object_p);
|
||||
if (ext_object_p->u.cls.u2.id == LIT_MAGIC_STRING_MAP_UL)
|
||||
{
|
||||
ecma_gc_mark_map_object (object_p);
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_MAP */
|
||||
#if JERRY_BUILTIN_WEAKMAP
|
||||
if (ext_object_p->u.cls.u2.id == LIT_MAGIC_STRING_WEAKMAP_UL)
|
||||
{
|
||||
ecma_gc_mark_weakmap_object (object_p);
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_WEAKMAP */
|
||||
#if JERRY_BUILTIN_SET
|
||||
if (ext_object_p->u.cls.u2.id == LIT_MAGIC_STRING_SET_UL)
|
||||
{
|
||||
ecma_gc_mark_set_object (object_p);
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_SET */
|
||||
#if JERRY_BUILTIN_WEAKSET
|
||||
JERRY_ASSERT (ext_object_p->u.cls.u2.id == LIT_MAGIC_STRING_WEAKSET_UL);
|
||||
#endif /* JERRY_BUILTIN_WEAKSET */
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_MAP */
|
||||
#endif /* JERRY_BUILTIN_CONTAINER */
|
||||
#if JERRY_ESNEXT
|
||||
case LIT_MAGIC_STRING_GENERATOR_UL:
|
||||
case LIT_MAGIC_STRING_ASYNC_GENERATOR_UL:
|
||||
case ECMA_OBJECT_CLASS_GENERATOR:
|
||||
case ECMA_OBJECT_CLASS_ASYNC_GENERATOR:
|
||||
{
|
||||
ecma_gc_mark_executable_object (object_p);
|
||||
break;
|
||||
}
|
||||
case LIT_INTERNAL_MAGIC_PROMISE_CAPABILITY:
|
||||
case ECMA_OBJECT_CLASS_PROMISE_CAPABILITY:
|
||||
{
|
||||
ecma_promise_capabality_t *capability_p = (ecma_promise_capabality_t *) object_p;
|
||||
|
||||
if (ecma_is_value_object (capability_p->header.u.class_prop.u.promise))
|
||||
if (ecma_is_value_object (capability_p->header.u.cls.u3.promise))
|
||||
{
|
||||
ecma_gc_set_object_visited (ecma_get_object_from_value (capability_p->header.u.class_prop.u.promise));
|
||||
ecma_gc_set_object_visited (ecma_get_object_from_value (capability_p->header.u.cls.u3.promise));
|
||||
}
|
||||
if (ecma_is_value_object (capability_p->resolve))
|
||||
{
|
||||
@@ -808,58 +821,31 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_ESNEXT */
|
||||
default:
|
||||
case ECMA_OBJECT_CLASS_ARRAY_ITERATOR:
|
||||
case ECMA_OBJECT_CLASS_SET_ITERATOR:
|
||||
case ECMA_OBJECT_CLASS_MAP_ITERATOR:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case ECMA_OBJECT_TYPE_PSEUDO_ARRAY:
|
||||
{
|
||||
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
|
||||
|
||||
switch (ext_object_p->u.pseudo_array.type)
|
||||
{
|
||||
#if JERRY_BUILTIN_TYPEDARRAY
|
||||
case ECMA_PSEUDO_ARRAY_TYPEDARRAY:
|
||||
case ECMA_PSEUDO_ARRAY_TYPEDARRAY_WITH_INFO:
|
||||
{
|
||||
ecma_gc_set_object_visited (ecma_typedarray_get_arraybuffer (object_p));
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_TYPEDARRAY */
|
||||
#if JERRY_ESNEXT
|
||||
case ECMA_PSEUDO_ARRAY_ITERATOR:
|
||||
case ECMA_PSEUDO_SET_ITERATOR:
|
||||
case ECMA_PSEUDO_MAP_ITERATOR:
|
||||
{
|
||||
ecma_value_t iterated_value = ext_object_p->u.pseudo_array.u2.iterated_value;
|
||||
ecma_value_t iterated_value = ext_object_p->u.cls.u3.iterated_value;
|
||||
if (!ecma_is_value_empty (iterated_value))
|
||||
{
|
||||
ecma_gc_set_object_visited (ecma_get_object_from_value (iterated_value));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ECMA_PSEUDO_STRING_ITERATOR:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case ECMA_PSEUDO_REGEXP_STRING_ITERATOR:
|
||||
#if JERRY_BUILTIN_REGEXP
|
||||
case ECMA_OBJECT_CLASS_REGEXP_STRING_ITERATOR:
|
||||
{
|
||||
ecma_regexp_string_iterator_t *regexp_string_iterator_obj = (ecma_regexp_string_iterator_t *) object_p;
|
||||
ecma_value_t regexp = regexp_string_iterator_obj->iterating_regexp;
|
||||
ecma_gc_set_object_visited (ecma_get_object_from_value (regexp));
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_REGEXP */
|
||||
#endif /* JERRY_ESNEXT */
|
||||
default:
|
||||
{
|
||||
JERRY_ASSERT (ext_object_p->u.pseudo_array.type == ECMA_PSEUDO_ARRAY_ARGUMENTS);
|
||||
|
||||
ecma_gc_mark_arguments_object (ext_object_p);
|
||||
/* The ECMA_OBJECT_CLASS__MAX type represents an uninitialized class. */
|
||||
JERRY_ASSERT (ext_object_p->u.cls.type <= ECMA_OBJECT_CLASS__MAX);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1144,17 +1130,17 @@ ecma_gc_free_native_pointer (ecma_property_t *property_p) /**< property */
|
||||
static size_t
|
||||
ecma_free_arguments_object (ecma_extended_object_t *ext_object_p) /**< arguments object */
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_object_type ((ecma_object_t *) ext_object_p) == ECMA_OBJECT_TYPE_PSEUDO_ARRAY);
|
||||
JERRY_ASSERT (ecma_get_object_type ((ecma_object_t *) ext_object_p) == ECMA_OBJECT_TYPE_CLASS);
|
||||
|
||||
size_t object_size = sizeof (ecma_unmapped_arguments_t);
|
||||
|
||||
if (ext_object_p->u.pseudo_array.extra_info & ECMA_ARGUMENTS_OBJECT_MAPPED)
|
||||
if (ext_object_p->u.cls.u1.arguments_flags & ECMA_ARGUMENTS_OBJECT_MAPPED)
|
||||
{
|
||||
ecma_mapped_arguments_t *mapped_arguments_p = (ecma_mapped_arguments_t *) ext_object_p;
|
||||
object_size = sizeof (ecma_mapped_arguments_t);
|
||||
|
||||
#if JERRY_SNAPSHOT_EXEC
|
||||
if (!(mapped_arguments_p->unmapped.header.u.pseudo_array.extra_info & ECMA_ARGUMENTS_OBJECT_STATIC_BYTECODE))
|
||||
if (!(mapped_arguments_p->unmapped.header.u.cls.u1.arguments_flags & ECMA_ARGUMENTS_OBJECT_STATIC_BYTECODE))
|
||||
#endif /* JERRY_SNAPSHOT_EXEC */
|
||||
{
|
||||
ecma_compiled_code_t *byte_code_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_compiled_code_t,
|
||||
@@ -1166,7 +1152,7 @@ ecma_free_arguments_object (ecma_extended_object_t *ext_object_p) /**< arguments
|
||||
|
||||
ecma_value_t *argv_p = (ecma_value_t *) (((uint8_t *) ext_object_p) + object_size);
|
||||
ecma_unmapped_arguments_t *arguments_p = (ecma_unmapped_arguments_t *) ext_object_p;
|
||||
uint32_t arguments_number = arguments_p->header.u.pseudo_array.u2.arguments_number;
|
||||
uint32_t arguments_number = arguments_p->header.u.cls.u3.arguments_number;
|
||||
|
||||
for (uint32_t i = 0; i < arguments_number; i++)
|
||||
{
|
||||
@@ -1174,7 +1160,7 @@ ecma_free_arguments_object (ecma_extended_object_t *ext_object_p) /**< arguments
|
||||
}
|
||||
|
||||
uint32_t saved_argument_count = JERRY_MAX (arguments_number,
|
||||
arguments_p->header.u.pseudo_array.u1.formal_params_number);
|
||||
arguments_p->header.u.cls.u2.formal_params_number);
|
||||
|
||||
return object_size + (saved_argument_count * sizeof (ecma_value_t));
|
||||
} /* ecma_free_arguments_object */
|
||||
@@ -1236,14 +1222,15 @@ ecma_gc_free_executable_object (ecma_object_t *object_p) /**< object */
|
||||
}
|
||||
|
||||
size = JERRY_ALIGNUP (sizeof (vm_executable_object_t) + size, sizeof (uintptr_t));
|
||||
|
||||
JERRY_ASSERT (!(executable_object_p->extended_object.u.class_prop.extra_info & ECMA_EXECUTABLE_OBJECT_RUNNING));
|
||||
|
||||
ecma_bytecode_deref ((ecma_compiled_code_t *) bytecode_header_p);
|
||||
|
||||
if (executable_object_p->extended_object.u.class_prop.extra_info & ECMA_ASYNC_GENERATOR_CALLED)
|
||||
uint16_t executable_obj_flags = executable_object_p->extended_object.u.cls.u2.executable_obj_flags;
|
||||
|
||||
JERRY_ASSERT (!(executable_obj_flags & ECMA_EXECUTABLE_OBJECT_RUNNING));
|
||||
|
||||
if (executable_obj_flags & ECMA_ASYNC_GENERATOR_CALLED)
|
||||
{
|
||||
ecma_value_t task = executable_object_p->extended_object.u.class_prop.u.head;
|
||||
ecma_value_t task = executable_object_p->extended_object.u.cls.u3.head;
|
||||
|
||||
while (!ECMA_IS_INTERNAL_VALUE_NULL (task))
|
||||
{
|
||||
@@ -1258,7 +1245,7 @@ ecma_gc_free_executable_object (ecma_object_t *object_p) /**< object */
|
||||
}
|
||||
}
|
||||
|
||||
if (executable_object_p->extended_object.u.class_prop.extra_info & ECMA_EXECUTABLE_OBJECT_COMPLETED)
|
||||
if (executable_obj_flags & ECMA_EXECUTABLE_OBJECT_COMPLETED)
|
||||
{
|
||||
return size;
|
||||
}
|
||||
@@ -1412,11 +1399,10 @@ ecma_gc_free_properties (ecma_object_t *object_p) /**< object */
|
||||
{
|
||||
ecma_object_t *obj_p = ecma_get_object_from_value (value);
|
||||
|
||||
if (ecma_object_class_is (obj_p, LIT_MAGIC_STRING_WEAKREF_UL))
|
||||
if (ecma_object_class_is (obj_p, ECMA_OBJECT_CLASS_WEAKREF))
|
||||
{
|
||||
JERRY_ASSERT (ecma_object_class_is (obj_p, LIT_MAGIC_STRING_WEAKREF_UL));
|
||||
ecma_extended_object_t *ext_obj_p = (ecma_extended_object_t *) obj_p;
|
||||
ext_obj_p->u.class_prop.u.target = ECMA_VALUE_UNDEFINED;
|
||||
ext_obj_p->u.cls.u3.target = ECMA_VALUE_UNDEFINED;
|
||||
continue;
|
||||
}
|
||||
ecma_op_container_remove_weak_entry (obj_p, ecma_make_object_value (object_p));
|
||||
@@ -1585,53 +1571,98 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
|
||||
{
|
||||
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
|
||||
|
||||
switch (ext_object_p->u.class_prop.class_id)
|
||||
switch (ext_object_p->u.cls.type)
|
||||
{
|
||||
case LIT_MAGIC_STRING_SCRIPT_UL:
|
||||
case ECMA_OBJECT_CLASS_STRING:
|
||||
case ECMA_OBJECT_CLASS_NUMBER:
|
||||
#if JERRY_ESNEXT
|
||||
case ECMA_OBJECT_CLASS_SYMBOL:
|
||||
#endif /* JERRY_ESNEXT */
|
||||
#if JERRY_BUILTIN_BIGINT
|
||||
case ECMA_OBJECT_CLASS_BIGINT:
|
||||
#endif /* JERRY_BUILTIN_BIGINT */
|
||||
{
|
||||
ecma_free_value (ext_object_p->u.cls.u3.value);
|
||||
break;
|
||||
}
|
||||
case ECMA_OBJECT_CLASS_ARGUMENTS:
|
||||
{
|
||||
ext_object_size = ecma_free_arguments_object (ext_object_p);
|
||||
break;
|
||||
}
|
||||
#if JERRY_BUILTIN_TYPEDARRAY
|
||||
case ECMA_OBJECT_CLASS_TYPEDARRAY_WITH_INFO:
|
||||
{
|
||||
ext_object_size = sizeof (ecma_extended_typedarray_object_t);
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_TYPEDARRAY */
|
||||
#if JERRY_PARSER
|
||||
case ECMA_OBJECT_CLASS_SCRIPT:
|
||||
{
|
||||
ecma_compiled_code_t *compiled_code_p;
|
||||
compiled_code_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_compiled_code_t,
|
||||
ext_object_p->u.class_prop.u.value);
|
||||
ext_object_p->u.cls.u3.value);
|
||||
|
||||
ecma_bytecode_deref (compiled_code_p);
|
||||
break;
|
||||
}
|
||||
case LIT_MAGIC_STRING_STRING_UL:
|
||||
case LIT_MAGIC_STRING_NUMBER_UL:
|
||||
#if JERRY_ESNEXT
|
||||
case LIT_MAGIC_STRING_SYMBOL_UL:
|
||||
#endif /* JERRY_ESNEXT */
|
||||
#if JERRY_BUILTIN_BIGINT
|
||||
case LIT_MAGIC_STRING_BIGINT_UL:
|
||||
#endif /* JERRY_BUILTIN_BIGINT */
|
||||
{
|
||||
ecma_free_value (ext_object_p->u.class_prop.u.value);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIT_MAGIC_STRING_DATE_UL:
|
||||
#endif /* JERRY_PARSER */
|
||||
#if JERRY_BUILTIN_DATE
|
||||
case ECMA_OBJECT_CLASS_DATE:
|
||||
{
|
||||
#if JERRY_ESNEXT
|
||||
ext_object_size = sizeof (ecma_date_object_t);
|
||||
#else /* !JERRY_ESNEXT */
|
||||
ecma_number_t *num_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_number_t, ext_object_p->u.class_prop.u.date);
|
||||
ecma_number_t *num_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_number_t, ext_object_p->u.cls.u3.date);
|
||||
ecma_dealloc_number (num_p);
|
||||
#endif /* JERRY_ESNEXT */
|
||||
break;
|
||||
}
|
||||
case LIT_MAGIC_STRING_REGEXP_UL:
|
||||
#endif /* JERRY_BUILTIN_DATE */
|
||||
#if JERRY_BUILTIN_REGEXP
|
||||
case ECMA_OBJECT_CLASS_REGEXP:
|
||||
{
|
||||
ecma_compiled_code_t *bytecode_p = ECMA_GET_INTERNAL_VALUE_ANY_POINTER (ecma_compiled_code_t,
|
||||
ext_object_p->u.class_prop.u.value);
|
||||
ext_object_p->u.cls.u3.value);
|
||||
|
||||
ecma_bytecode_deref (bytecode_p);
|
||||
|
||||
break;
|
||||
}
|
||||
#if JERRY_BUILTIN_TYPEDARRAY
|
||||
case LIT_MAGIC_STRING_ARRAY_BUFFER_UL:
|
||||
#endif /* JERRY_BUILTIN_REGEXP */
|
||||
#if JERRY_ESNEXT
|
||||
case ECMA_OBJECT_CLASS_STRING_ITERATOR:
|
||||
{
|
||||
uint32_t arraybuffer_length = ext_object_p->u.class_prop.u.length;
|
||||
ecma_value_t iterated_value = ext_object_p->u.cls.u3.iterated_value;
|
||||
|
||||
if (!ecma_is_value_empty (iterated_value))
|
||||
{
|
||||
ecma_deref_ecma_string (ecma_get_string_from_value (iterated_value));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
#if JERRY_BUILTIN_REGEXP
|
||||
case ECMA_OBJECT_CLASS_REGEXP_STRING_ITERATOR:
|
||||
{
|
||||
ecma_regexp_string_iterator_t *regexp_string_iterator_obj = (ecma_regexp_string_iterator_t *) object_p;
|
||||
ecma_value_t iterated_string = regexp_string_iterator_obj->iterated_string;
|
||||
|
||||
if (!ecma_is_value_empty (iterated_string))
|
||||
{
|
||||
ecma_deref_ecma_string (ecma_get_string_from_value (iterated_string));
|
||||
}
|
||||
|
||||
ext_object_size = sizeof (ecma_regexp_string_iterator_t);
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_REGEXP */
|
||||
#endif /* JERRY_ESNEXT */
|
||||
#if JERRY_BUILTIN_TYPEDARRAY
|
||||
case ECMA_OBJECT_CLASS_ARRAY_BUFFER:
|
||||
{
|
||||
uint32_t arraybuffer_length = ext_object_p->u.cls.u3.length;
|
||||
|
||||
if (ECMA_ARRAYBUFFER_HAS_EXTERNAL_MEMORY (ext_object_p))
|
||||
{
|
||||
@@ -1654,9 +1685,9 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_TYPEDARRAY */
|
||||
#if JERRY_BUILTIN_PROMISE
|
||||
case LIT_MAGIC_STRING_PROMISE_UL:
|
||||
case ECMA_OBJECT_CLASS_PROMISE:
|
||||
{
|
||||
ecma_free_value_if_not_object (ext_object_p->u.class_prop.u.value);
|
||||
ecma_free_value_if_not_object (ext_object_p->u.cls.u3.value);
|
||||
|
||||
/* Reactions only contains objects. */
|
||||
ecma_collection_destroy (((ecma_promise_object_t *) object_p)->reactions);
|
||||
@@ -1666,9 +1697,9 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_PROMISE */
|
||||
#if JERRY_BUILTIN_WEAKREF
|
||||
case LIT_MAGIC_STRING_WEAKREF_UL:
|
||||
case ECMA_OBJECT_CLASS_WEAKREF:
|
||||
{
|
||||
ecma_value_t target = ext_object_p->u.class_prop.u.target;
|
||||
ecma_value_t target = ext_object_p->u.cls.u3.target;
|
||||
|
||||
if (!ecma_is_value_undefined (target))
|
||||
{
|
||||
@@ -1678,50 +1709,38 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_WEAKREF */
|
||||
#if JERRY_BUILTIN_CONTAINER
|
||||
#if JERRY_BUILTIN_MAP
|
||||
case LIT_MAGIC_STRING_MAP_UL:
|
||||
#endif /* JERRY_BUILTIN_MAP */
|
||||
#if JERRY_BUILTIN_SET
|
||||
case LIT_MAGIC_STRING_SET_UL:
|
||||
#endif /* JERRY_BUILTIN_SET */
|
||||
#if JERRY_BUILTIN_WEAKMAP
|
||||
case LIT_MAGIC_STRING_WEAKMAP_UL:
|
||||
#endif /* JERRY_BUILTIN_WEAKMAP */
|
||||
#if JERRY_BUILTIN_WEAKSET
|
||||
case LIT_MAGIC_STRING_WEAKSET_UL:
|
||||
#endif /* JERRY_BUILTIN_WEAKSET */
|
||||
case ECMA_OBJECT_CLASS_CONTAINER:
|
||||
{
|
||||
ecma_extended_object_t *map_object_p = (ecma_extended_object_t *) object_p;
|
||||
ecma_collection_t *container_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_collection_t,
|
||||
map_object_p->u.class_prop.u.value);
|
||||
map_object_p->u.cls.u3.value);
|
||||
ecma_op_container_free_entries (object_p);
|
||||
ecma_collection_destroy (container_p);
|
||||
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_CONTAINER */
|
||||
#if JERRY_BUILTIN_DATAVIEW
|
||||
case LIT_MAGIC_STRING_DATAVIEW_UL:
|
||||
case ECMA_OBJECT_CLASS_DATAVIEW:
|
||||
{
|
||||
ext_object_size = sizeof (ecma_dataview_object_t);
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_DATAVIEW */
|
||||
#if JERRY_ESNEXT
|
||||
case LIT_MAGIC_STRING_GENERATOR_UL:
|
||||
case LIT_MAGIC_STRING_ASYNC_GENERATOR_UL:
|
||||
case ECMA_OBJECT_CLASS_GENERATOR:
|
||||
case ECMA_OBJECT_CLASS_ASYNC_GENERATOR:
|
||||
{
|
||||
ext_object_size = ecma_gc_free_executable_object (object_p);
|
||||
break;
|
||||
}
|
||||
case LIT_INTERNAL_MAGIC_PROMISE_CAPABILITY:
|
||||
case ECMA_OBJECT_CLASS_PROMISE_CAPABILITY:
|
||||
{
|
||||
ext_object_size = sizeof (ecma_promise_capabality_t);
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_ESNEXT */
|
||||
#if JERRY_MODULE_SYSTEM
|
||||
case LIT_MAGIC_STRING_MODULE_UL:
|
||||
case ECMA_OBJECT_CLASS_MODULE:
|
||||
{
|
||||
ecma_module_release_module ((ecma_module_t *) ext_object_p);
|
||||
ext_object_size = sizeof (ecma_module_t);
|
||||
@@ -1730,12 +1749,8 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
|
||||
#endif /* JERRY_MODULE_SYSTEM */
|
||||
default:
|
||||
{
|
||||
/* The undefined id represents an uninitialized class. */
|
||||
JERRY_ASSERT (ext_object_p->u.class_prop.class_id == LIT_MAGIC_STRING_UNDEFINED
|
||||
|| ext_object_p->u.class_prop.class_id == LIT_MAGIC_STRING_ARGUMENTS_UL
|
||||
|| ext_object_p->u.class_prop.class_id == LIT_MAGIC_STRING_BOOLEAN_UL
|
||||
|| ext_object_p->u.class_prop.class_id == LIT_MAGIC_STRING_ERROR_UL
|
||||
|| ext_object_p->u.class_prop.class_id == LIT_INTERNAL_MAGIC_STRING_INTERNAL_OBJECT);
|
||||
/* The ECMA_OBJECT_CLASS__MAX type represents an uninitialized class. */
|
||||
JERRY_ASSERT (ext_object_p->u.cls.type <= ECMA_OBJECT_CLASS__MAX);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1780,62 +1795,6 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
|
||||
#endif /* JERRY_SNAPSHOT_EXEC */
|
||||
break;
|
||||
}
|
||||
case ECMA_OBJECT_TYPE_PSEUDO_ARRAY:
|
||||
{
|
||||
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
|
||||
|
||||
switch (ext_object_p->u.pseudo_array.type)
|
||||
{
|
||||
case ECMA_PSEUDO_ARRAY_ARGUMENTS:
|
||||
{
|
||||
ext_object_size = ecma_free_arguments_object (ext_object_p);
|
||||
break;
|
||||
}
|
||||
#if JERRY_BUILTIN_TYPEDARRAY
|
||||
case ECMA_PSEUDO_ARRAY_TYPEDARRAY_WITH_INFO:
|
||||
{
|
||||
ext_object_size = sizeof (ecma_extended_typedarray_object_t);
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_BUILTIN_TYPEDARRAY */
|
||||
#if JERRY_ESNEXT
|
||||
case ECMA_PSEUDO_STRING_ITERATOR:
|
||||
{
|
||||
ecma_value_t iterated_value = ext_object_p->u.pseudo_array.u2.iterated_value;
|
||||
|
||||
if (!ecma_is_value_empty (iterated_value))
|
||||
{
|
||||
ecma_deref_ecma_string (ecma_get_string_from_value (iterated_value));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case ECMA_PSEUDO_REGEXP_STRING_ITERATOR:
|
||||
{
|
||||
ecma_regexp_string_iterator_t *regexp_string_iterator_obj = (ecma_regexp_string_iterator_t *) object_p;
|
||||
ecma_value_t iterated_string = regexp_string_iterator_obj->iterated_string;
|
||||
|
||||
if (!ecma_is_value_empty (iterated_string))
|
||||
{
|
||||
ecma_deref_ecma_string (ecma_get_string_from_value (iterated_string));
|
||||
}
|
||||
|
||||
ext_object_size = sizeof (ecma_regexp_string_iterator_t);
|
||||
break;
|
||||
}
|
||||
#endif /* JERRY_ESNEXT */
|
||||
default:
|
||||
{
|
||||
JERRY_ASSERT (ext_object_p->u.pseudo_array.type == ECMA_PSEUDO_ARRAY_TYPEDARRAY
|
||||
|| ext_object_p->u.pseudo_array.type == ECMA_PSEUDO_ARRAY_ITERATOR
|
||||
|| ext_object_p->u.pseudo_array.type == ECMA_PSEUDO_SET_ITERATOR
|
||||
|| ext_object_p->u.pseudo_array.type == ECMA_PSEUDO_MAP_ITERATOR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
||||
{
|
||||
ext_object_size = sizeof (ecma_bound_function_t);
|
||||
|
||||
@@ -685,7 +685,6 @@ typedef enum
|
||||
ECMA_OBJECT_TYPE_GENERAL = 0, /**< all objects that are not belongs to the sub-types below. */
|
||||
ECMA_OBJECT_TYPE_CLASS = 1, /**< Objects with class property */
|
||||
ECMA_OBJECT_TYPE_ARRAY = 2, /**< Array object (15.4) */
|
||||
ECMA_OBJECT_TYPE_PSEUDO_ARRAY = 3, /**< Array-like object, such as Arguments object (10.6) */
|
||||
ECMA_OBJECT_TYPE_PROXY = 4, /**< Proxy object ECMAScript v6 26.2 */
|
||||
/* Note: these 4 types must be in this order. See IsCallable operation. */
|
||||
ECMA_OBJECT_TYPE_FUNCTION = 5, /**< Function objects (15.3), created through 13.2 routine */
|
||||
@@ -701,16 +700,69 @@ typedef enum
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
ECMA_PSEUDO_ARRAY_ARGUMENTS = 0, /**< Arguments object (10.6) */
|
||||
ECMA_PSEUDO_ARRAY_TYPEDARRAY = 1, /**< TypedArray which does NOT need extra space to store length and offset */
|
||||
ECMA_PSEUDO_ARRAY_TYPEDARRAY_WITH_INFO = 2, /**< TypedArray which NEEDS extra space to store length and offset */
|
||||
ECMA_PSEUDO_ARRAY_ITERATOR = 3, /**< Array iterator object (ECMAScript v6, 22.1.5.1) */
|
||||
ECMA_PSEUDO_SET_ITERATOR = 4, /**< Set iterator object (ECMAScript v6, 23.2.5.1) */
|
||||
ECMA_PSEUDO_MAP_ITERATOR = 5, /**< Map iterator object (ECMAScript v6, 23.1.5.1) */
|
||||
ECMA_PSEUDO_STRING_ITERATOR = 6, /**< String iterator object (ECMAScript v6, 22.1.5.1) */
|
||||
ECMA_PSEUDO_REGEXP_STRING_ITERATOR = 7, /** RegExp string iterator object (ECMAScript v11, 21.2.7) */
|
||||
ECMA_PSEUDO_ARRAY__MAX = ECMA_PSEUDO_STRING_ITERATOR /**< maximum value */
|
||||
} ecma_pseudo_array_type_t;
|
||||
/* These objects require custom property resolving. */
|
||||
ECMA_OBJECT_CLASS_STRING, /**< String Object (ECMAScript v5.1, 4.3.18) */
|
||||
ECMA_OBJECT_CLASS_ARGUMENTS, /**< Arguments object (10.6) */
|
||||
#if JERRY_BUILTIN_TYPEDARRAY
|
||||
ECMA_OBJECT_CLASS_TYPEDARRAY, /**< TypedArray which does NOT need extra space to store length and offset */
|
||||
ECMA_OBJECT_CLASS_TYPEDARRAY_WITH_INFO, /**< TypedArray which NEEDS extra space to store length and offset */
|
||||
#endif /* JERRY_BUILTIN_TYPEDARRAY */
|
||||
|
||||
/* These objects are marked by Garbage Collector. */
|
||||
#if JERRY_ESNEXT
|
||||
ECMA_OBJECT_CLASS_GENERATOR, /**< Generator object (ECMAScript v6, 25.2) */
|
||||
ECMA_OBJECT_CLASS_ASYNC_GENERATOR, /**< Async generator object (ECMAScript v11, 25.3) */
|
||||
ECMA_OBJECT_CLASS_ARRAY_ITERATOR, /**< Array iterator object (ECMAScript v6, 22.1.5.1) */
|
||||
ECMA_OBJECT_CLASS_SET_ITERATOR, /**< Set iterator object (ECMAScript v6, 23.2.5.1) */
|
||||
ECMA_OBJECT_CLASS_MAP_ITERATOR, /**< Map iterator object (ECMAScript v6, 23.1.5.1) */
|
||||
#if JERRY_BUILTIN_REGEXP
|
||||
ECMA_OBJECT_CLASS_REGEXP_STRING_ITERATOR, /** RegExp string iterator object (ECMAScript v11, 21.2.7) */
|
||||
#endif /* JERRY_BUILTIN_REGEXP */
|
||||
#endif /* JERRY_ESNEXT */
|
||||
#if JERRY_MODULE_SYSTEM
|
||||
ECMA_OBJECT_CLASS_MODULE, /**< Module (ECMAScript v6, 15.2) */
|
||||
#endif
|
||||
#if JERRY_BUILTIN_PROMISE
|
||||
ECMA_OBJECT_CLASS_PROMISE, /**< Promise (ECMAScript v6, 25.4) */
|
||||
ECMA_OBJECT_CLASS_PROMISE_CAPABILITY, /**< Promise capability (ECMAScript v6, 25.4.1.1) */
|
||||
#endif /* JERRY_BUILTIN_PROMISE */
|
||||
#if JERRY_BUILTIN_DATAVIEW
|
||||
ECMA_OBJECT_CLASS_DATAVIEW, /**< DataView (ECMAScript v6, 24.2) */
|
||||
#endif /* JERRY_BUILTIN_DATAVIEW */
|
||||
#if JERRY_BUILTIN_CONTAINER
|
||||
ECMA_OBJECT_CLASS_CONTAINER, /**< Container (Map, WeakMap, Set, WeakSet) */
|
||||
#endif /* JERRY_BUILTIN_CONTAINER */
|
||||
|
||||
/* Normal objects. */
|
||||
ECMA_OBJECT_CLASS_BOOLEAN, /**< Boolean Object (ECMAScript v5.1, 4.3.15) */
|
||||
ECMA_OBJECT_CLASS_NUMBER, /**< Number Object (ECMAScript v5.1, 4.3.21) */
|
||||
ECMA_OBJECT_CLASS_ERROR, /**< Error Object (ECMAScript v5.1, 15.11) */
|
||||
ECMA_OBJECT_CLASS_INTERNAL_OBJECT, /**< object for internal properties */
|
||||
#if JERRY_PARSER
|
||||
ECMA_OBJECT_CLASS_SCRIPT, /**< Compiled ECMAScript byte code */
|
||||
#endif /* JERRY_PARSER */
|
||||
#if JERRY_BUILTIN_DATE
|
||||
ECMA_OBJECT_CLASS_DATE, /**< Date Object (ECMAScript v5.1, 15.9) */
|
||||
#endif /* JERRY_BUILTIN_DATE */
|
||||
#if JERRY_BUILTIN_REGEXP
|
||||
ECMA_OBJECT_CLASS_REGEXP, /**< RegExp Object (ECMAScript v5.1, 15.10) */
|
||||
#endif /* JERRY_BUILTIN_REGEXP */
|
||||
#if JERRY_ESNEXT
|
||||
ECMA_OBJECT_CLASS_SYMBOL, /**< Symbol object (ECMAScript v6, 4.3.27) */
|
||||
ECMA_OBJECT_CLASS_STRING_ITERATOR, /**< String iterator object (ECMAScript v6, 22.1.5.1) */
|
||||
#endif /* JERRY_ESNEXT */
|
||||
#if JERRY_BUILTIN_TYPEDARRAY
|
||||
ECMA_OBJECT_CLASS_ARRAY_BUFFER, /**< Array Buffer (ECMAScript v6, 24.1) */
|
||||
#endif /* JERRY_BUILTIN_TYPEDARRAY */
|
||||
#if JERRY_BUILTIN_BIGINT
|
||||
ECMA_OBJECT_CLASS_BIGINT, /**< Bigint (ECMAScript v11, 4.3.27) */
|
||||
#endif /* JERRY_BUILTIN_BIGINT */
|
||||
#if JERRY_BUILTIN_WEAKREF
|
||||
ECMA_OBJECT_CLASS_WEAKREF, /**< WeakRef (Not standardized yet) */
|
||||
#endif /* JERRY_BUILTIN_WEAKREF */
|
||||
|
||||
ECMA_OBJECT_CLASS__MAX /**< maximum value */
|
||||
} ecma_object_class_type_t;
|
||||
|
||||
/**
|
||||
* Types of lexical environments.
|
||||
@@ -960,30 +1012,72 @@ typedef struct
|
||||
|
||||
/**
|
||||
* Description of objects with class.
|
||||
*
|
||||
* Note:
|
||||
* class is a reserved word in c++, so cls is used instead
|
||||
*/
|
||||
struct
|
||||
{
|
||||
uint16_t class_id; /**< class id of the object */
|
||||
uint16_t extra_info; /**< extra information for the object
|
||||
* e.g. array buffer type info (external/internal) */
|
||||
|
||||
uint8_t type; /**< class type of the object */
|
||||
/**
|
||||
* Description of extra fields. These extra fields depend on the class_id.
|
||||
* Description of 8 bit extra fields. These extra fields depend on the type.
|
||||
*/
|
||||
union
|
||||
{
|
||||
uint8_t arguments_flags; /**< arguments object flags */
|
||||
#if JERRY_BUILTIN_DATE
|
||||
uint8_t date_flags; /**< flags for date objects */
|
||||
#endif /* JERRY_BUILTIN_DATE */
|
||||
#if JERRY_MODULE_SYSTEM
|
||||
uint8_t module_state; /**< Module state */
|
||||
#endif /* JERRY_MODULE_SYSTEM */
|
||||
#if JERRY_ESNEXT
|
||||
uint8_t iterator_kind; /**< type of iterator */
|
||||
uint8_t regexp_string_iterator_flags; /**< flags for RegExp string iterator */
|
||||
#endif /* JERRY_ESNEXT */
|
||||
#if JERRY_BUILTIN_PROMISE
|
||||
uint8_t promise_flags; /**< flags for Promise objects */
|
||||
#endif /* JERRY_BUILTIN_PROMISE */
|
||||
#if JERRY_BUILTIN_CONTAINER
|
||||
uint8_t container_flags; /**< flags for container objects */
|
||||
#endif /* JERRY_BUILTIN_CONTAINER */
|
||||
#if JERRY_BUILTIN_TYPEDARRAY
|
||||
uint8_t array_buffer_flags; /**< ArrayBuffer flags */
|
||||
uint8_t typedarray_type; /**< type of typed array */
|
||||
#endif /* JERRY_BUILTIN_TYPEDARRAY */
|
||||
} u1;
|
||||
/**
|
||||
* Description of 16 bit extra fields. These extra fields depend on the type.
|
||||
*/
|
||||
union
|
||||
{
|
||||
/* The ecma_object_get_class_name must handle those types which does not use id. */
|
||||
uint16_t id; /**< magic string id of the class */
|
||||
uint16_t formal_params_number; /**< for arguments: formal parameters number */
|
||||
uint16_t iterator_index; /**< for %Iterator%: [[%Iterator%NextIndex]] property */
|
||||
uint16_t executable_obj_flags; /**< executable object flags */
|
||||
} u2;
|
||||
/**
|
||||
* Description of 32 bit / value. These extra fields depend on the type.
|
||||
*/
|
||||
union
|
||||
{
|
||||
ecma_value_t value; /**< value of the object (e.g. boolean, number, string, etc.) */
|
||||
ecma_value_t date; /**< Date object [[DateValue]] internal property */
|
||||
int32_t tza; /**< TimeZone adjustment for date objects */
|
||||
uint32_t length; /**< length related property (e.g. length of ArrayBuffer) */
|
||||
#if JERRY_MODULE_SYSTEM
|
||||
uint32_t dfs_ancestor_index; /**< module dfs ancestor index (ES2020 15.2.1.16) */
|
||||
#endif /* JERRY_MODULE_SYSTEM */
|
||||
ecma_value_t target; /**< [[ProxyTarget]] or [[WeakRefTarget]] internal property */
|
||||
ecma_value_t head; /**< points to the async generator task queue head item */
|
||||
ecma_value_t promise; /**< PromiseCapability[[Promise]] internal slot */
|
||||
} u;
|
||||
} class_prop;
|
||||
ecma_value_t arraybuffer; /**< for typedarray: internal arraybuffer */
|
||||
ecma_value_t iterated_value; /**< for %Iterator%: [[IteratedObject]] property */
|
||||
ecma_value_t spread_value; /**< for spread object: spreaded element */
|
||||
int32_t tza; /**< TimeZone adjustment for date objects */
|
||||
uint32_t length; /**< length related property (e.g. length of ArrayBuffer) */
|
||||
uint32_t arguments_number; /**< for arguments: arguments number */
|
||||
#if JERRY_MODULE_SYSTEM
|
||||
uint32_t dfs_ancestor_index; /**< module dfs ancestor index (ES2020 15.2.1.16) */
|
||||
#endif /* JERRY_MODULE_SYSTEM */
|
||||
} u3;
|
||||
} cls;
|
||||
|
||||
/**
|
||||
* Description of function objects.
|
||||
@@ -1004,30 +1098,6 @@ typedef struct
|
||||
* a fast access mode array multiplied ECMA_FAST_ACCESS_HOLE_ONE */
|
||||
} array;
|
||||
|
||||
/**
|
||||
* Description of pseudo array objects.
|
||||
*/
|
||||
struct
|
||||
{
|
||||
uint8_t type; /**< pseudo array type, e.g. Arguments, TypedArray, ArrayIterator */
|
||||
uint8_t extra_info; /**< extra information about the object.
|
||||
* e.g. the specific builtin id for typed arrays,
|
||||
* [[IterationKind]] property for %Iterator% */
|
||||
union
|
||||
{
|
||||
uint16_t formal_params_number; /**< for arguments: formal parameters number */
|
||||
uint16_t class_id; /**< for typedarray: the specific class name id */
|
||||
uint16_t iterator_index; /**< for %Iterator%: [[%Iterator%NextIndex]] property */
|
||||
} u1;
|
||||
union
|
||||
{
|
||||
uint32_t arguments_number; /**< for arguments: arguments number */
|
||||
ecma_value_t arraybuffer; /**< for typedarray: internal arraybuffer */
|
||||
ecma_value_t iterated_value; /**< for %Iterator%: [[IteratedObject]] property */
|
||||
ecma_value_t spread_value; /**< for spread object: spreaded element */
|
||||
} u2;
|
||||
} pseudo_array;
|
||||
|
||||
/**
|
||||
* Description of bound function object.
|
||||
*/
|
||||
@@ -1973,7 +2043,7 @@ typedef enum
|
||||
* Check whether the ArrayBuffer has external underlying buffer
|
||||
*/
|
||||
#define ECMA_ARRAYBUFFER_HAS_EXTERNAL_MEMORY(object_p) \
|
||||
((((ecma_extended_object_t *) object_p)->u.class_prop.extra_info & ECMA_ARRAYBUFFER_EXTERNAL_MEMORY) != 0)
|
||||
((((ecma_extended_object_t *) object_p)->u.cls.u1.array_buffer_flags & ECMA_ARRAYBUFFER_EXTERNAL_MEMORY) != 0)
|
||||
|
||||
/**
|
||||
* Struct to store information for ArrayBuffers with external memory.
|
||||
@@ -2065,8 +2135,9 @@ typedef enum
|
||||
/**
|
||||
* Checks whether the executable object is waiting for resuming.
|
||||
*/
|
||||
#define ECMA_EXECUTABLE_OBJECT_IS_SUSPENDED(extra_info) \
|
||||
(!((extra_info) & (ECMA_EXECUTABLE_OBJECT_COMPLETED | ECMA_EXECUTABLE_OBJECT_RUNNING)))
|
||||
#define ECMA_EXECUTABLE_OBJECT_IS_SUSPENDED(executable_object_p) \
|
||||
(!((executable_object_p)->extended_object.u.cls.u2.executable_obj_flags \
|
||||
& (ECMA_EXECUTABLE_OBJECT_COMPLETED | ECMA_EXECUTABLE_OBJECT_RUNNING)))
|
||||
|
||||
/**
|
||||
* Last item of yield* related await states.
|
||||
@@ -2082,7 +2153,7 @@ typedef enum
|
||||
* Resume execution of the byte code.
|
||||
*/
|
||||
#define ECMA_EXECUTABLE_OBJECT_RESUME_EXEC(executable_object_p) \
|
||||
((executable_object_p)->extended_object.u.class_prop.extra_info &= ECMA_EXECUTABLE_OBJECT_RESUME_EXEC_MASK)
|
||||
((executable_object_p)->extended_object.u.cls.u2.executable_obj_flags &= ECMA_EXECUTABLE_OBJECT_RESUME_EXEC_MASK)
|
||||
|
||||
/**
|
||||
* Enqueued task of an AsyncGenerator.
|
||||
@@ -2143,7 +2214,7 @@ typedef enum
|
||||
ECMA_PROMISE_ALLSETTLED_RESOLVE, /**< promise.allSettled resolve */
|
||||
ECMA_PROMISE_ALLSETTLED_REJECT, /**< promise.allSettled reject */
|
||||
ECMA_PROMISE_ANY_REJECT, /**< promise.any reject */
|
||||
} ecma_promise_all_exector_type_t;
|
||||
} ecma_promise_executor_type_t;
|
||||
|
||||
#endif /* JERRY_ESNEXT */
|
||||
|
||||
|
||||
@@ -39,8 +39,8 @@ ecma_module_initialize_context (void)
|
||||
ecma_object_t *obj_p = ecma_create_object (NULL, sizeof (ecma_module_t), ECMA_OBJECT_TYPE_CLASS);
|
||||
|
||||
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p;
|
||||
ext_object_p->u.class_prop.class_id = LIT_MAGIC_STRING_MODULE_UL;
|
||||
ext_object_p->u.class_prop.extra_info = JERRY_MODULE_STATE_UNLINKED;
|
||||
ext_object_p->u.cls.type = ECMA_OBJECT_CLASS_MODULE;
|
||||
ext_object_p->u.cls.u1.module_state = JERRY_MODULE_STATE_UNLINKED;
|
||||
|
||||
ecma_module_t *module_p = (ecma_module_t *) obj_p;
|
||||
|
||||
@@ -80,7 +80,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.class_prop.class_id == LIT_MAGIC_STRING_MODULE_UL);
|
||||
JERRY_ASSERT (((ecma_extended_object_t *) object_p)->u.cls.type == ECMA_OBJECT_CLASS_MODULE);
|
||||
|
||||
return (ecma_module_t *) object_p;
|
||||
} /* ecma_module_get_from_object */
|
||||
@@ -219,7 +219,7 @@ ecma_module_resolve_export (ecma_module_t *const module_p, /**< base module */
|
||||
continue;
|
||||
}
|
||||
|
||||
if (current_module_p->header.u.class_prop.extra_info == JERRY_MODULE_STATE_NATIVE)
|
||||
if (current_module_p->header.u.cls.u1.module_state == JERRY_MODULE_STATE_NATIVE)
|
||||
{
|
||||
ecma_object_t *object_p = current_module_p->namespace_object_p;
|
||||
ecma_value_t prop_value = ecma_op_object_find_own (ecma_make_object_value (object_p),
|
||||
@@ -382,17 +382,17 @@ ecma_module_resolve_export (ecma_module_t *const module_p, /**< base module */
|
||||
ecma_value_t
|
||||
ecma_module_evaluate (ecma_module_t *module_p) /**< module */
|
||||
{
|
||||
if (module_p->header.u.class_prop.extra_info == JERRY_MODULE_STATE_ERROR)
|
||||
if (module_p->header.u.cls.u1.module_state == JERRY_MODULE_STATE_ERROR)
|
||||
{
|
||||
return ecma_raise_range_error (ECMA_ERR_MSG ("Module is in error state"));
|
||||
}
|
||||
|
||||
if (module_p->header.u.class_prop.extra_info >= JERRY_MODULE_STATE_EVALUATING)
|
||||
if (module_p->header.u.cls.u1.module_state >= JERRY_MODULE_STATE_EVALUATING)
|
||||
{
|
||||
return ECMA_VALUE_EMPTY;
|
||||
}
|
||||
|
||||
JERRY_ASSERT (module_p->header.u.class_prop.extra_info == JERRY_MODULE_STATE_LINKED);
|
||||
JERRY_ASSERT (module_p->header.u.cls.u1.module_state == JERRY_MODULE_STATE_LINKED);
|
||||
|
||||
#if JERRY_BUILTIN_REALMS
|
||||
ecma_object_t *global_object_p = (ecma_object_t *) ecma_op_function_get_realm (module_p->compiled_code_p);
|
||||
@@ -400,18 +400,18 @@ ecma_module_evaluate (ecma_module_t *module_p) /**< module */
|
||||
ecma_object_t *global_object_p = ecma_builtin_get_global ();
|
||||
#endif /* JERRY_BUILTIN_REALMS */
|
||||
|
||||
module_p->header.u.class_prop.extra_info = JERRY_MODULE_STATE_EVALUATING;
|
||||
module_p->header.u.cls.u1.module_state = JERRY_MODULE_STATE_EVALUATING;
|
||||
module_p->scope_p = ecma_create_decl_lex_env (ecma_get_global_environment (global_object_p));
|
||||
|
||||
ecma_value_t ret_value;
|
||||
ret_value = vm_run_module (module_p);
|
||||
|
||||
module_p->header.u.class_prop.extra_info = JERRY_MODULE_STATE_ERROR;
|
||||
module_p->header.u.cls.u1.module_state = JERRY_MODULE_STATE_ERROR;
|
||||
|
||||
if (!ECMA_IS_VALUE_ERROR (ret_value))
|
||||
{
|
||||
ecma_free_value (ret_value);
|
||||
module_p->header.u.class_prop.extra_info = JERRY_MODULE_STATE_EVALUATED;
|
||||
module_p->header.u.cls.u1.module_state = JERRY_MODULE_STATE_EVALUATED;
|
||||
ret_value = ECMA_VALUE_EMPTY;
|
||||
}
|
||||
|
||||
@@ -491,7 +491,7 @@ ecma_module_create_namespace_object (ecma_module_t *module_p) /**< module */
|
||||
return result;
|
||||
}
|
||||
|
||||
JERRY_ASSERT (module_p->header.u.class_prop.extra_info == JERRY_MODULE_STATE_EVALUATED);
|
||||
JERRY_ASSERT (module_p->header.u.cls.u1.module_state == JERRY_MODULE_STATE_EVALUATED);
|
||||
ecma_module_resolve_set_t *resolve_set_p = NULL;
|
||||
ecma_module_resolve_stack_t *stack_p = NULL;
|
||||
|
||||
@@ -688,7 +688,7 @@ ecma_module_connect_imports (ecma_module_t *module_p)
|
||||
return ecma_raise_syntax_error (ECMA_ERR_MSG ("Ambiguous import request"));
|
||||
}
|
||||
|
||||
if (record.module_p->header.u.class_prop.extra_info == JERRY_MODULE_STATE_NATIVE)
|
||||
if (record.module_p->header.u.cls.u1.module_state == JERRY_MODULE_STATE_NATIVE)
|
||||
{
|
||||
ecma_object_t *object_p = record.module_p->namespace_object_p;
|
||||
prop_value = ecma_op_object_find_own (ecma_make_object_value (object_p), object_p, record.name_p);
|
||||
@@ -827,7 +827,7 @@ ecma_module_get_resolved_module (ecma_value_t module_val) /**< module */
|
||||
|
||||
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
|
||||
|
||||
if (ext_object_p->u.class_prop.class_id != LIT_MAGIC_STRING_MODULE_UL)
|
||||
if (ext_object_p->u.cls.type != ECMA_OBJECT_CLASS_MODULE)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@@ -858,12 +858,12 @@ ecma_module_link (ecma_module_t *module_p, /**< root module */
|
||||
jerry_module_resolve_callback_t callback, /**< resolve module callback */
|
||||
void *user_p) /**< pointer passed to the resolve callback */
|
||||
{
|
||||
if (module_p->header.u.class_prop.extra_info != JERRY_MODULE_STATE_UNLINKED)
|
||||
if (module_p->header.u.cls.u1.module_state != JERRY_MODULE_STATE_UNLINKED)
|
||||
{
|
||||
return ecma_raise_type_error (ECMA_ERR_MSG ("Module must be in unlinked state"));
|
||||
}
|
||||
|
||||
module_p->header.u.class_prop.extra_info = JERRY_MODULE_STATE_LINKING;
|
||||
module_p->header.u.cls.u1.module_state = JERRY_MODULE_STATE_LINKING;
|
||||
|
||||
uint32_t dfs_index = 0;
|
||||
ecma_module_stack_item_t *last_p;
|
||||
@@ -876,7 +876,7 @@ ecma_module_link (ecma_module_t *module_p, /**< root module */
|
||||
last_p->node_p = module_p->imports_p;
|
||||
last_p->dfs_index = dfs_index;
|
||||
|
||||
module_p->header.u.class_prop.u.dfs_ancestor_index = dfs_index;
|
||||
module_p->header.u.cls.u3.dfs_ancestor_index = dfs_index;
|
||||
|
||||
ecma_value_t module_val = ecma_make_object_value (&module_p->header.object);
|
||||
ecma_module_stack_item_t *current_p = last_p;
|
||||
@@ -919,7 +919,7 @@ restart:
|
||||
node_p->u.path_or_module = resolve_result;
|
||||
ecma_deref_object (ecma_get_object_from_value (resolve_result));
|
||||
|
||||
if (resolved_module_p->header.u.class_prop.extra_info == JERRY_MODULE_STATE_ERROR)
|
||||
if (resolved_module_p->header.u.cls.u1.module_state == JERRY_MODULE_STATE_ERROR)
|
||||
{
|
||||
ecma_raise_type_error (ECMA_ERR_MSG ("Cannot link to a module which is in error state"));
|
||||
goto error;
|
||||
@@ -938,10 +938,10 @@ restart:
|
||||
{
|
||||
module_p = ecma_module_get_from_object (node_p->u.path_or_module);
|
||||
|
||||
if (module_p->header.u.class_prop.extra_info == JERRY_MODULE_STATE_UNLINKED)
|
||||
if (module_p->header.u.cls.u1.module_state == JERRY_MODULE_STATE_UNLINKED)
|
||||
{
|
||||
current_p->node_p = node_p->next_p;
|
||||
module_p->header.u.class_prop.extra_info = JERRY_MODULE_STATE_LINKING;
|
||||
module_p->header.u.cls.u1.module_state = JERRY_MODULE_STATE_LINKING;
|
||||
|
||||
ecma_module_stack_item_t *item_p;
|
||||
item_p = (ecma_module_stack_item_t *) jmem_heap_alloc_block (sizeof (ecma_module_stack_item_t));
|
||||
@@ -954,7 +954,7 @@ restart:
|
||||
item_p->node_p = module_p->imports_p;
|
||||
item_p->dfs_index = dfs_index;
|
||||
|
||||
module_p->header.u.class_prop.u.dfs_ancestor_index = dfs_index;
|
||||
module_p->header.u.cls.u3.dfs_ancestor_index = dfs_index;
|
||||
|
||||
last_p = item_p;
|
||||
current_p = item_p;
|
||||
@@ -962,29 +962,29 @@ restart:
|
||||
goto restart;
|
||||
}
|
||||
|
||||
if (module_p->header.u.class_prop.extra_info == JERRY_MODULE_STATE_LINKING)
|
||||
if (module_p->header.u.cls.u1.module_state == JERRY_MODULE_STATE_LINKING)
|
||||
{
|
||||
uint32_t dfs_ancestor_index = module_p->header.u.class_prop.u.dfs_ancestor_index;
|
||||
uint32_t dfs_ancestor_index = module_p->header.u.cls.u3.dfs_ancestor_index;
|
||||
|
||||
if (dfs_ancestor_index < current_module_p->header.u.class_prop.u.dfs_ancestor_index)
|
||||
if (dfs_ancestor_index < current_module_p->header.u.cls.u3.dfs_ancestor_index)
|
||||
{
|
||||
current_module_p->header.u.class_prop.u.dfs_ancestor_index = dfs_ancestor_index;
|
||||
current_module_p->header.u.cls.u3.dfs_ancestor_index = dfs_ancestor_index;
|
||||
}
|
||||
}
|
||||
|
||||
node_p = node_p->next_p;
|
||||
}
|
||||
|
||||
if (current_module_p->header.u.class_prop.u.dfs_ancestor_index != current_p->dfs_index)
|
||||
if (current_module_p->header.u.cls.u3.dfs_ancestor_index != current_p->dfs_index)
|
||||
{
|
||||
current_p = current_p->parent_p;
|
||||
JERRY_ASSERT (current_p != NULL);
|
||||
|
||||
uint32_t dfs_ancestor_index = current_module_p->header.u.class_prop.u.dfs_ancestor_index;
|
||||
uint32_t dfs_ancestor_index = current_module_p->header.u.cls.u3.dfs_ancestor_index;
|
||||
|
||||
if (dfs_ancestor_index < current_p->module_p->header.u.class_prop.u.dfs_ancestor_index)
|
||||
if (dfs_ancestor_index < current_p->module_p->header.u.cls.u3.dfs_ancestor_index)
|
||||
{
|
||||
current_p->module_p->header.u.class_prop.u.dfs_ancestor_index = dfs_ancestor_index;
|
||||
current_p->module_p->header.u.cls.u3.dfs_ancestor_index = dfs_ancestor_index;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
@@ -996,8 +996,8 @@ restart:
|
||||
{
|
||||
ecma_module_stack_item_t *prev_p = last_p->prev_p;
|
||||
|
||||
JERRY_ASSERT (last_p->module_p->header.u.class_prop.extra_info == JERRY_MODULE_STATE_LINKING);
|
||||
last_p->module_p->header.u.class_prop.extra_info = JERRY_MODULE_STATE_LINKED;
|
||||
JERRY_ASSERT (last_p->module_p->header.u.cls.u1.module_state == JERRY_MODULE_STATE_LINKING);
|
||||
last_p->module_p->header.u.cls.u1.module_state = JERRY_MODULE_STATE_LINKED;
|
||||
|
||||
jmem_heap_free_block (last_p, sizeof (ecma_module_stack_item_t));
|
||||
last_p = prev_p;
|
||||
@@ -1017,8 +1017,8 @@ error:
|
||||
{
|
||||
ecma_module_stack_item_t *prev_p = last_p->prev_p;
|
||||
|
||||
JERRY_ASSERT (last_p->module_p->header.u.class_prop.extra_info == JERRY_MODULE_STATE_LINKING);
|
||||
last_p->module_p->header.u.class_prop.extra_info = JERRY_MODULE_STATE_UNLINKED;
|
||||
JERRY_ASSERT (last_p->module_p->header.u.cls.u1.module_state == JERRY_MODULE_STATE_LINKING);
|
||||
last_p->module_p->header.u.cls.u1.module_state = JERRY_MODULE_STATE_UNLINKED;
|
||||
|
||||
jmem_heap_free_block (last_p, sizeof (ecma_module_stack_item_t));
|
||||
last_p = prev_p;
|
||||
@@ -1075,7 +1075,7 @@ ecma_module_release_module_nodes (ecma_module_node_t *module_node_p, /**< first
|
||||
void
|
||||
ecma_module_release_module (ecma_module_t *module_p) /**< module */
|
||||
{
|
||||
jerry_module_state_t state = (jerry_module_state_t) module_p->header.u.class_prop.extra_info;
|
||||
jerry_module_state_t state = (jerry_module_state_t) module_p->header.u.cls.u1.module_state;
|
||||
|
||||
JERRY_ASSERT (state != JERRY_MODULE_STATE_INVALID);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user