Skip to content

Commit d85020f

Browse files
authored
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 [email protected]
1 parent 4377ef6 commit d85020f

File tree

60 files changed

+1225
-1163
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+1225
-1163
lines changed

jerry-core/api/jerry.c

Lines changed: 74 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -560,8 +560,9 @@ jerry_parse (const jerry_char_t *source_p, /**< script source */
560560
ecma_object_t *object_p = ecma_create_object (NULL, sizeof (ecma_extended_object_t), ECMA_OBJECT_TYPE_CLASS);
561561

562562
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
563-
ext_object_p->u.class_prop.class_id = LIT_MAGIC_STRING_SCRIPT_UL;
564-
ECMA_SET_INTERNAL_VALUE_POINTER (ext_object_p->u.class_prop.u.value, bytecode_data_p);
563+
ext_object_p->u.cls.type = ECMA_OBJECT_CLASS_SCRIPT;
564+
ext_object_p->u.cls.u2.id = LIT_MAGIC_STRING_SCRIPT_UL;
565+
ECMA_SET_INTERNAL_VALUE_POINTER (ext_object_p->u.cls.u3.value, bytecode_data_p);
565566

566567
return ecma_make_object_value (object_p);
567568
#else /* !JERRY_PARSER */
@@ -689,13 +690,13 @@ jerry_run (const jerry_value_t func_val) /**< function to run */
689690

690691
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
691692

692-
if (ext_object_p->u.class_prop.class_id != LIT_MAGIC_STRING_SCRIPT_UL)
693+
if (ext_object_p->u.cls.type != ECMA_OBJECT_CLASS_SCRIPT)
693694
{
694695
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
695696
}
696697

697698
const ecma_compiled_code_t *bytecode_data_p;
698-
bytecode_data_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_compiled_code_t, ext_object_p->u.class_prop.u.value);
699+
bytecode_data_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_compiled_code_t, ext_object_p->u.cls.u3.value);
699700

700701
JERRY_ASSERT (CBC_FUNCTION_GET_TYPE (bytecode_data_p->status_flags) == CBC_FUNCTION_SCRIPT);
701702

@@ -790,7 +791,7 @@ jerry_module_evaluate (const jerry_value_t module_val) /**< root module */
790791
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (error_not_module_p)));
791792
}
792793

793-
if (module_p->header.u.class_prop.extra_info != JERRY_MODULE_STATE_LINKED)
794+
if (module_p->header.u.cls.u1.module_state != JERRY_MODULE_STATE_LINKED)
794795
{
795796
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG ("Module must be in linked state")));
796797
}
@@ -822,7 +823,7 @@ jerry_module_get_state (const jerry_value_t module_val) /**< module object */
822823
return JERRY_MODULE_STATE_INVALID;
823824
}
824825

825-
return (jerry_module_state_t) module_p->header.u.class_prop.extra_info;
826+
return (jerry_module_state_t) module_p->header.u.cls.u1.module_state;
826827
#else /* !JERRY_MODULE_SYSTEM */
827828
JERRY_UNUSED (module_val);
828829

@@ -936,7 +937,7 @@ jerry_module_get_namespace (const jerry_value_t module_val) /**< module */
936937

937938
if (module_p->namespace_object_p == NULL)
938939
{
939-
if (module_p->header.u.class_prop.extra_info != JERRY_MODULE_STATE_EVALUATED)
940+
if (module_p->header.u.cls.u1.module_state != JERRY_MODULE_STATE_EVALUATED)
940941
{
941942
return jerry_throw (ecma_raise_range_error (ECMA_ERR_MSG ("Namespace object has not been created yet")));
942943
}
@@ -1365,110 +1366,93 @@ jerry_object_get_type (const jerry_value_t value) /**< input value to check */
13651366
return JERRY_OBJECT_TYPE_PROXY;
13661367
}
13671368
#endif /* JERRY_ESNEXT */
1368-
case ECMA_OBJECT_TYPE_PSEUDO_ARRAY:
1369+
case ECMA_OBJECT_TYPE_CLASS:
13691370
{
1370-
switch (ext_obj_p->u.pseudo_array.type)
1371+
switch (ext_obj_p->u.cls.type)
13711372
{
1372-
case ECMA_PSEUDO_ARRAY_ARGUMENTS:
1373+
case ECMA_OBJECT_CLASS_ARGUMENTS:
13731374
{
13741375
return JERRY_OBJECT_TYPE_ARGUMENTS;
13751376
}
13761377
#if JERRY_BUILTIN_TYPEDARRAY
1377-
case ECMA_PSEUDO_ARRAY_TYPEDARRAY:
1378-
case ECMA_PSEUDO_ARRAY_TYPEDARRAY_WITH_INFO:
1378+
case ECMA_OBJECT_CLASS_TYPEDARRAY:
1379+
case ECMA_OBJECT_CLASS_TYPEDARRAY_WITH_INFO:
13791380
{
13801381
return JERRY_OBJECT_TYPE_TYPEDARRAY;
13811382
}
13821383
#endif /* JERRY_BUILTIN_TYPEDARRAY */
1383-
#if JERRY_ESNEXT
1384-
case ECMA_PSEUDO_STRING_ITERATOR:
1385-
case ECMA_PSEUDO_ARRAY_ITERATOR:
1386-
#if JERRY_BUILTIN_MAP
1387-
case ECMA_PSEUDO_MAP_ITERATOR:
1388-
#endif /* JERRY_BUILTIN_MAP */
1389-
#if JERRY_BUILTIN_SET
1390-
case ECMA_PSEUDO_SET_ITERATOR:
1391-
#endif /* JERRY_BUILTIN_SET */
1392-
{
1393-
return JERRY_OBJECT_TYPE_ITERATOR;
1394-
}
1395-
#endif /* JERRY_ESNEXT */
1396-
}
1397-
break;
1398-
}
1399-
case ECMA_OBJECT_TYPE_CLASS:
1400-
{
1401-
switch (ext_obj_p->u.class_prop.class_id)
1402-
{
1403-
case LIT_MAGIC_STRING_SCRIPT_UL:
1384+
#if JERRY_PARSER
1385+
case ECMA_OBJECT_CLASS_SCRIPT:
14041386
{
14051387
return JERRY_OBJECT_TYPE_SCRIPT;
14061388
}
1407-
#if JERRY_MODULE_SYSTEM
1408-
case LIT_MAGIC_STRING_MODULE_UL:
1409-
{
1410-
return JERRY_OBJECT_TYPE_MODULE;
1411-
}
1412-
#endif /* JERRY_MODULE_SYSTEM */
1413-
case LIT_MAGIC_STRING_ARGUMENTS_UL:
1414-
{
1415-
return JERRY_OBJECT_TYPE_ARGUMENTS;
1416-
}
1417-
case LIT_MAGIC_STRING_BOOLEAN_UL:
1389+
#endif /* JERRY_PARSER */
1390+
case ECMA_OBJECT_CLASS_BOOLEAN:
14181391
{
14191392
return JERRY_OBJECT_TYPE_BOOLEAN;
14201393
}
1421-
case LIT_MAGIC_STRING_DATE_UL:
1394+
case ECMA_OBJECT_CLASS_STRING:
14221395
{
1423-
return JERRY_OBJECT_TYPE_DATE;
1396+
return JERRY_OBJECT_TYPE_STRING;
14241397
}
1425-
case LIT_MAGIC_STRING_NUMBER_UL:
1398+
case ECMA_OBJECT_CLASS_NUMBER:
14261399
{
14271400
return JERRY_OBJECT_TYPE_NUMBER;
14281401
}
1429-
case LIT_MAGIC_STRING_REGEXP_UL:
1402+
#if JERRY_BUILTIN_DATE
1403+
case ECMA_OBJECT_CLASS_DATE:
14301404
{
1431-
return JERRY_OBJECT_TYPE_REGEXP;
1405+
return JERRY_OBJECT_TYPE_DATE;
14321406
}
1433-
case LIT_MAGIC_STRING_STRING_UL:
1407+
#endif /* JERRY_BUILTIN_DATE */
1408+
#if JERRY_BUILTIN_REGEXP
1409+
case ECMA_OBJECT_CLASS_REGEXP:
14341410
{
1435-
return JERRY_OBJECT_TYPE_STRING;
1411+
return JERRY_OBJECT_TYPE_REGEXP;
14361412
}
1413+
#endif /* JERRY_BUILTIN_REGEXP */
14371414
#if JERRY_ESNEXT
1438-
case LIT_MAGIC_STRING_SYMBOL_UL:
1415+
case ECMA_OBJECT_CLASS_SYMBOL:
14391416
{
14401417
return JERRY_OBJECT_TYPE_SYMBOL;
14411418
}
1442-
case LIT_MAGIC_STRING_GENERATOR_UL:
1419+
case ECMA_OBJECT_CLASS_GENERATOR:
1420+
case ECMA_OBJECT_CLASS_ASYNC_GENERATOR:
14431421
{
14441422
return JERRY_OBJECT_TYPE_GENERATOR;
14451423
}
1424+
case ECMA_OBJECT_CLASS_ARRAY_ITERATOR:
1425+
#if JERRY_BUILTIN_SET
1426+
case ECMA_OBJECT_CLASS_SET_ITERATOR:
1427+
#endif /* JERRY_BUILTIN_SET */
1428+
#if JERRY_BUILTIN_MAP
1429+
case ECMA_OBJECT_CLASS_MAP_ITERATOR:
1430+
#endif /* JERRY_BUILTIN_MAP */
1431+
case ECMA_OBJECT_CLASS_STRING_ITERATOR:
1432+
{
1433+
return JERRY_OBJECT_TYPE_ITERATOR;
1434+
}
14461435
#endif /* JERRY_ESNEXT */
1447-
#if JERRY_BUILTIN_BIGINT
1448-
case LIT_MAGIC_STRING_BIGINT_UL:
1436+
#if JERRY_MODULE_SYSTEM
1437+
case ECMA_OBJECT_CLASS_MODULE:
14491438
{
1450-
return JERRY_OBJECT_TYPE_BIGINT;
1439+
return JERRY_OBJECT_TYPE_MODULE;
14511440
}
1452-
#endif /* JERRY_BUILTIN_BIGINT */
1441+
#endif /* JERRY_MODULE_SYSTEM */
14531442
#if JERRY_BUILTIN_CONTAINER
1454-
#if JERRY_BUILTIN_MAP
1455-
case LIT_MAGIC_STRING_MAP_UL:
1456-
#endif /* JERRY_BUILTIN_MAP */
1457-
#if JERRY_BUILTIN_SET
1458-
case LIT_MAGIC_STRING_SET_UL:
1459-
#endif /* JERRY_BUILTIN_SET */
1460-
#if JERRY_BUILTIN_WEAKMAP
1461-
case LIT_MAGIC_STRING_WEAKMAP_UL:
1462-
#endif /* JERRY_BUILTIN_WEAKMAP */
1463-
#if JERRY_BUILTIN_WEAKSET
1464-
case LIT_MAGIC_STRING_WEAKSET_UL:
1465-
#endif /* JERRY_BUILTIN_WEAKSET */
1443+
case ECMA_OBJECT_CLASS_CONTAINER:
14661444
{
14671445
return JERRY_OBJECT_TYPE_CONTAINER;
14681446
}
14691447
#endif /* JERRY_BUILTIN_CONTAINER */
1448+
#if JERRY_BUILTIN_BIGINT
1449+
case ECMA_OBJECT_CLASS_BIGINT:
1450+
{
1451+
return JERRY_OBJECT_TYPE_BIGINT;
1452+
}
1453+
#endif /* JERRY_BUILTIN_BIGINT */
14701454
#if JERRY_BUILTIN_WEAKREF
1471-
case LIT_MAGIC_STRING_WEAKREF_UL:
1455+
case ECMA_OBJECT_CLASS_WEAKREF:
14721456
{
14731457
return JERRY_OBJECT_TYPE_WEAKREF;
14741458
}
@@ -1574,30 +1558,30 @@ jerry_iterator_get_type (const jerry_value_t value) /**< input value to check */
15741558
ecma_object_t *obj_p = ecma_get_object_from_value (value);
15751559
ecma_extended_object_t *ext_obj_p = (ecma_extended_object_t *) obj_p;
15761560

1577-
if (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_PSEUDO_ARRAY)
1561+
if (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_CLASS)
15781562
{
1579-
switch (ext_obj_p->u.pseudo_array.type)
1563+
switch (ext_obj_p->u.cls.type)
15801564
{
1581-
case ECMA_PSEUDO_ARRAY_ITERATOR:
1565+
case ECMA_OBJECT_CLASS_ARRAY_ITERATOR:
15821566
{
15831567
return JERRY_ITERATOR_TYPE_ARRAY;
15841568
}
1585-
case ECMA_PSEUDO_STRING_ITERATOR:
1569+
#if JERRY_BUILTIN_SET
1570+
case ECMA_OBJECT_CLASS_SET_ITERATOR:
15861571
{
1587-
return JERRY_ITERATOR_TYPE_STRING;
1572+
return JERRY_ITERATOR_TYPE_SET;
15881573
}
1574+
#endif /* JERRY_BUILTIN_SET */
15891575
#if JERRY_BUILTIN_MAP
1590-
case ECMA_PSEUDO_MAP_ITERATOR:
1576+
case ECMA_OBJECT_CLASS_MAP_ITERATOR:
15911577
{
15921578
return JERRY_ITERATOR_TYPE_MAP;
15931579
}
15941580
#endif /* JERRY_BUILTIN_MAP */
1595-
#if JERRY_BUILTIN_SET
1596-
case ECMA_PSEUDO_SET_ITERATOR:
1581+
case ECMA_OBJECT_CLASS_STRING_ITERATOR:
15971582
{
1598-
return JERRY_ITERATOR_TYPE_SET;
1583+
return JERRY_ITERATOR_TYPE_STRING;
15991584
}
1600-
#endif /* JERRY_BUILTIN_SET */
16011585
default:
16021586
{
16031587
break;
@@ -3476,9 +3460,8 @@ jerry_set_internal_property (const jerry_value_t obj_val, /**< object value */
34763460
ECMA_OBJECT_TYPE_CLASS);
34773461
{
34783462
ecma_extended_object_t *container_p = (ecma_extended_object_t *) internal_object_p;
3479-
container_p->u.class_prop.class_id = LIT_INTERNAL_MAGIC_STRING_INTERNAL_OBJECT;
3480-
container_p->u.class_prop.extra_info = 0;
3481-
container_p->u.class_prop.u.length = 0;
3463+
container_p->u.cls.type = ECMA_OBJECT_CLASS_INTERNAL_OBJECT;
3464+
container_p->u.cls.u2.id = LIT_MAGIC_STRING_OBJECT_UL;
34823465
}
34833466

34843467
value_p->value = ecma_make_object_value (internal_object_p);
@@ -4061,10 +4044,13 @@ bool jerry_object_is_valid_foreach (ecma_object_t *object_p) /**< object to test
40614044
if (object_type == ECMA_OBJECT_TYPE_CLASS)
40624045
{
40634046
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
4064-
switch (ext_object_p->u.class_prop.class_id)
4047+
switch (ext_object_p->u.cls.type)
40654048
{
40664049
/* An object's internal property object should not be iterable by foreach. */
4067-
case LIT_INTERNAL_MAGIC_STRING_INTERNAL_OBJECT: return false;
4050+
case ECMA_OBJECT_CLASS_INTERNAL_OBJECT:
4051+
{
4052+
return false;
4053+
}
40684054
}
40694055
}
40704056

@@ -5667,7 +5653,7 @@ jerry_get_dataview_buffer (const jerry_value_t value, /**< DataView to get the a
56675653

56685654
if (byte_length != NULL)
56695655
{
5670-
*byte_length = dataview_p->header.u.class_prop.u.length;
5656+
*byte_length = dataview_p->header.u.cls.u3.length;
56715657
}
56725658

56735659
ecma_object_t *arraybuffer_p = dataview_p->buffer_p;
@@ -6195,11 +6181,9 @@ jerry_get_container_type (const jerry_value_t value) /**< the container object *
61956181
{
61966182
ecma_object_t *obj_p = ecma_get_object_from_value (value);
61976183

6198-
if (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_CLASS)
6184+
if (ecma_object_class_is (obj_p, ECMA_OBJECT_CLASS_CONTAINER))
61996185
{
6200-
uint16_t type = ((ecma_extended_object_t *) obj_p)->u.class_prop.class_id;
6201-
6202-
switch (type)
6186+
switch (((ecma_extended_object_t *) obj_p)->u.cls.u2.id)
62036187
{
62046188
#if JERRY_BUILTIN_MAP
62056189
case LIT_MAGIC_STRING_MAP_UL:

0 commit comments

Comments
 (0)