Skip to content

Commit eacee27

Browse files
committed
Add property key filters for built-in functions
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg [email protected]
1 parent 3a788a2 commit eacee27

19 files changed

+255
-156
lines changed

jerry-core/api/jerry.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -4607,7 +4607,7 @@ jerry_object_get_property_names (const jerry_value_t obj_val, /**< object */
46074607
while (true)
46084608
{
46094609
/* Step 1. Get Object.[[OwnKeys]] */
4610-
ecma_collection_t *prop_names_p = ecma_op_object_own_property_keys (obj_iter_p);
4610+
ecma_collection_t *prop_names_p = ecma_op_object_own_property_keys (obj_iter_p, filter);
46114611

46124612
#if JERRY_BUILTIN_PROXY
46134613
if (prop_names_p == NULL)

jerry-core/ecma/builtin-objects/ecma-builtin-object.c

+15-7
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ ecma_builtin_object_set_integrity_level (ecma_object_t *obj_p, /**< object */
336336
}
337337

338338
/* 6. */
339-
ecma_collection_t *props_p = ecma_op_object_own_property_keys (obj_p);
339+
ecma_collection_t *props_p = ecma_op_object_own_property_keys (obj_p, JERRY_PROPERTY_FILTER_ALL);
340340

341341
#if JERRY_BUILTIN_PROXY
342342
if (props_p == NULL)
@@ -596,7 +596,7 @@ ecma_builtin_object_test_integrity_level (ecma_object_t *obj_p, /**< routine's a
596596
ecma_value_t ret_value = ECMA_VALUE_TRUE;
597597

598598
/* 2. */
599-
ecma_collection_t *props_p = ecma_op_object_own_property_keys (obj_p);
599+
ecma_collection_t *props_p = ecma_op_object_own_property_keys (obj_p, JERRY_PROPERTY_FILTER_ALL);
600600

601601
#if JERRY_BUILTIN_PROXY
602602
if (props_p == NULL)
@@ -750,7 +750,7 @@ static ecma_value_t
750750
ecma_builtin_object_object_get_own_property_descriptors (ecma_object_t *obj_p) /**< routine's first argument */
751751
{
752752
/* 2 */
753-
ecma_collection_t *prop_names_p = ecma_op_object_own_property_keys (obj_p);
753+
ecma_collection_t *prop_names_p = ecma_op_object_own_property_keys (obj_p, JERRY_PROPERTY_FILTER_ALL);
754754

755755
#if JERRY_BUILTIN_PROXY
756756
if (prop_names_p == NULL)
@@ -831,7 +831,7 @@ ecma_builtin_object_object_define_properties (ecma_object_t *obj_p, /**< routine
831831
ecma_object_t *props_p = ecma_get_object_from_value (props);
832832

833833
/* 3. */
834-
ecma_collection_t *prop_names_p = ecma_op_object_own_property_keys (props_p);
834+
ecma_collection_t *prop_names_p = ecma_op_object_own_property_keys (props_p, JERRY_PROPERTY_FILTER_ALL);
835835
ecma_value_t ret_value = ECMA_VALUE_ERROR;
836836

837837
#if JERRY_BUILTIN_PROXY
@@ -1073,7 +1073,7 @@ ecma_builtin_object_object_assign (ecma_object_t *target_p, /**< target object *
10731073
ecma_object_t *from_obj_p = ecma_get_object_from_value (from_value);
10741074

10751075
/* 5.b.iii */
1076-
ecma_collection_t *props_p = ecma_op_object_own_property_keys (from_obj_p);
1076+
ecma_collection_t *props_p = ecma_op_object_own_property_keys (from_obj_p, JERRY_PROPERTY_FILTER_ALL);
10771077

10781078
#if JERRY_BUILTIN_PROXY
10791079
if (props_p == NULL)
@@ -1327,7 +1327,15 @@ ecma_op_object_get_own_property_keys (ecma_value_t this_arg, /**< this argument
13271327
ecma_object_t *obj_p = ecma_get_object_from_value (object);
13281328

13291329
/* 2. */
1330-
ecma_collection_t *props_p = ecma_op_object_own_property_keys (obj_p);
1330+
jerry_property_filter_t filter = JERRY_PROPERTY_FILTER_EXLCUDE_SYMBOLS;
1331+
1332+
if (type == ECMA_OBJECT_ROUTINE_GET_OWN_PROPERTY_SYMBOLS)
1333+
{
1334+
filter = (JERRY_PROPERTY_FILTER_EXLCUDE_STRINGS
1335+
| JERRY_PROPERTY_FILTER_EXLCUDE_INTEGER_INDICES);
1336+
}
1337+
1338+
ecma_collection_t *props_p = ecma_op_object_own_property_keys (obj_p, filter);
13311339

13321340
if (props_p == NULL)
13331341
{
@@ -1361,7 +1369,7 @@ ecma_op_object_get_own_property_keys (ecma_value_t this_arg, /**< this argument
13611369
#else /* !JERRY_ESNEXT */
13621370
JERRY_UNUSED (type);
13631371
ecma_object_t *obj_p = ecma_get_object_from_value (this_arg);
1364-
ecma_collection_t *props_p = ecma_op_object_own_property_keys (obj_p);
1372+
ecma_collection_t *props_p = ecma_op_object_own_property_keys (obj_p, JERRY_PROPERTY_FILTER_ALL);
13651373
return ecma_op_new_array_object_from_collection (props_p, false);
13661374
#endif /* JERRY_ESNEXT */
13671375
} /* ecma_op_object_get_own_property_keys */

jerry-core/ecma/builtin-objects/ecma-builtin-reflect.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ ecma_builtin_reflect_dispatch_routine (uint8_t builtin_routine_id, /**< built-in
163163
ecma_object_t *target_p = ecma_get_object_from_value (arguments_list[0]);
164164

165165
/* 2. */
166-
ecma_collection_t *prop_names = ecma_op_object_own_property_keys (target_p);
166+
ecma_collection_t *prop_names = ecma_op_object_own_property_keys (target_p, JERRY_PROPERTY_FILTER_ALL);
167167

168168
#if JERRY_BUILTIN_PROXY
169169
if (prop_names == NULL)

jerry-core/ecma/builtin-objects/ecma-builtins.c

+83-38
Original file line numberDiff line numberDiff line change
@@ -1414,11 +1414,17 @@ ecma_builtin_native_handler_list_lazy_property_names (ecma_object_t *object_p, /
14141414
void
14151415
ecma_builtin_routine_list_lazy_property_names (ecma_object_t *object_p, /**< a built-in object */
14161416
ecma_collection_t *prop_names_p, /**< prop name collection */
1417-
ecma_property_counter_t *prop_counter_p) /**< prop counter */
1417+
ecma_property_counter_t *prop_counter_p, /**< property counters */
1418+
jerry_property_filter_t filter) /**< name filters */
14181419
{
14191420
JERRY_ASSERT (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION);
14201421
JERRY_ASSERT (ecma_builtin_function_is_routine (object_p));
14211422

1423+
if (filter & JERRY_PROPERTY_FILTER_EXLCUDE_STRINGS)
1424+
{
1425+
return;
1426+
}
1427+
14221428
#if JERRY_ESNEXT
14231429
ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) object_p;
14241430

@@ -1456,7 +1462,8 @@ ecma_builtin_routine_list_lazy_property_names (ecma_object_t *object_p, /**< a b
14561462
void
14571463
ecma_builtin_list_lazy_property_names (ecma_object_t *object_p, /**< a built-in object */
14581464
ecma_collection_t *prop_names_p, /**< prop name collection */
1459-
ecma_property_counter_t *prop_counter_p) /**< prop counter */
1465+
ecma_property_counter_t *prop_counter_p, /**< property counters */
1466+
jerry_property_filter_t filter) /**< name filters */
14601467
{
14611468
JERRY_ASSERT (ecma_get_object_type (object_p) != ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION
14621469
|| !ecma_builtin_function_is_routine (object_p));
@@ -1477,57 +1484,95 @@ ecma_builtin_list_lazy_property_names (ecma_object_t *object_p, /**< a built-in
14771484

14781485
JERRY_ASSERT (builtin_id < ECMA_BUILTIN_ID__COUNT);
14791486

1480-
const ecma_builtin_property_descriptor_t *curr_property_p = ecma_builtin_property_list_references[builtin_id];
1481-
1482-
uint32_t index = 0;
1483-
uint8_t bitset = built_in_props_p->u2.instantiated_bitset[0];
1487+
#if JERRY_ESNEXT
1488+
bool has_symbol = true;
1489+
#endif /* JERRY_BUILTIN_REALMS */
14841490

1491+
if (!(filter & JERRY_PROPERTY_FILTER_EXLCUDE_STRINGS))
1492+
{
1493+
const ecma_builtin_property_descriptor_t *curr_property_p = ecma_builtin_property_list_references[builtin_id];
1494+
uint8_t bitset = built_in_props_p->u2.instantiated_bitset[0];
14851495
#if JERRY_BUILTIN_REALMS
1486-
uint8_t *bitset_p = built_in_props_p->u2.instantiated_bitset + 1 + sizeof (ecma_value_t);
1496+
uint8_t *bitset_p = built_in_props_p->u2.instantiated_bitset + 1 + sizeof (ecma_value_t);
14871497
#else /* !JERRY_BUILTIN_REALMS */
1488-
uint8_t *bitset_p = built_in_props_p->u2.instantiated_bitset + 1;
1498+
uint8_t *bitset_p = built_in_props_p->u2.instantiated_bitset + 1;
14891499
#endif /* JERRY_BUILTIN_REALMS */
1500+
uint32_t index = 0;
14901501

1491-
while (curr_property_p->magic_string_id != LIT_MAGIC_STRING__COUNT)
1492-
{
1493-
if (index == 8)
1502+
#if JERRY_ESNEXT
1503+
has_symbol = false;
1504+
#endif /* JERRY_BUILTIN_REALMS */
1505+
1506+
while (curr_property_p->magic_string_id != LIT_MAGIC_STRING__COUNT)
14941507
{
1495-
bitset = *bitset_p++;
1496-
index = 0;
1497-
}
1508+
if (index == 8)
1509+
{
1510+
bitset = *bitset_p++;
1511+
index = 0;
1512+
}
14981513

1499-
uint32_t bit_for_index = (uint32_t) 1u << index;
1514+
uint32_t bit_for_index = (uint32_t) 1u << index;
15001515

1501-
if (curr_property_p->magic_string_id > LIT_NON_INTERNAL_MAGIC_STRING__COUNT)
1502-
{
15031516
#if JERRY_ESNEXT
1504-
if (LIT_IS_GLOBAL_SYMBOL (curr_property_p->magic_string_id))
1505-
{
1506-
ecma_string_t *name_p = ecma_op_get_global_symbol (curr_property_p->magic_string_id);
1517+
bool is_symbol = (curr_property_p->magic_string_id > LIT_NON_INTERNAL_MAGIC_STRING__COUNT);
1518+
#else /* !JERRY_ESNEXT */
1519+
bool is_symbol = false;
1520+
#endif /* JERRY_ESNEXT */
15071521

1508-
if (!(bitset & bit_for_index))
1509-
{
1510-
ecma_value_t name = ecma_make_symbol_value (name_p);
1511-
ecma_collection_push_back (prop_names_p, name);
1512-
prop_counter_p->symbol_named_props++;
1513-
}
1514-
else
1515-
{
1516-
ecma_deref_ecma_string (name_p);
1517-
}
1518-
}
1522+
if (is_symbol)
1523+
{
1524+
#if JERRY_ESNEXT
1525+
JERRY_ASSERT (LIT_IS_GLOBAL_SYMBOL (curr_property_p->magic_string_id));
1526+
has_symbol = true;
15191527
#endif /* JERRY_ESNEXT */
1528+
}
1529+
else if (!(bitset & bit_for_index))
1530+
{
1531+
ecma_value_t name = ecma_make_magic_string_value ((lit_magic_string_id_t) curr_property_p->magic_string_id);
1532+
ecma_collection_push_back (prop_names_p, name);
1533+
prop_counter_p->string_named_props++;
1534+
}
1535+
1536+
curr_property_p++;
1537+
index++;
15201538
}
1521-
else if (!(bitset & bit_for_index))
1539+
}
1540+
1541+
#if JERRY_ESNEXT
1542+
if (!(filter & JERRY_PROPERTY_FILTER_EXLCUDE_SYMBOLS) && has_symbol)
1543+
{
1544+
const ecma_builtin_property_descriptor_t *curr_property_p = ecma_builtin_property_list_references[builtin_id];
1545+
uint8_t bitset = built_in_props_p->u2.instantiated_bitset[0];
1546+
#if JERRY_BUILTIN_REALMS
1547+
uint8_t *bitset_p = built_in_props_p->u2.instantiated_bitset + 1 + sizeof (ecma_value_t);
1548+
#else /* !JERRY_BUILTIN_REALMS */
1549+
uint8_t *bitset_p = built_in_props_p->u2.instantiated_bitset + 1;
1550+
#endif /* JERRY_BUILTIN_REALMS */
1551+
uint32_t index = 0;
1552+
1553+
while (curr_property_p->magic_string_id != LIT_MAGIC_STRING__COUNT)
15221554
{
1523-
ecma_value_t name = ecma_make_magic_string_value ((lit_magic_string_id_t) curr_property_p->magic_string_id);
1524-
ecma_collection_push_back (prop_names_p, name);
1525-
prop_counter_p->string_named_props++;
1526-
}
1555+
if (index == 8)
1556+
{
1557+
bitset = *bitset_p++;
1558+
index = 0;
1559+
}
15271560

1528-
curr_property_p++;
1529-
index++;
1561+
uint32_t bit_for_index = (uint32_t) 1u << index;
1562+
1563+
if (curr_property_p->magic_string_id > LIT_NON_INTERNAL_MAGIC_STRING__COUNT
1564+
&& !(bitset & bit_for_index))
1565+
{
1566+
ecma_string_t *name_p = ecma_op_get_global_symbol (curr_property_p->magic_string_id);
1567+
ecma_collection_push_back (prop_names_p, ecma_make_symbol_value (name_p));
1568+
prop_counter_p->symbol_named_props++;
1569+
}
1570+
1571+
curr_property_p++;
1572+
index++;
1573+
}
15301574
}
1575+
#endif /* JERRY_ESNEXT */
15311576
} /* ecma_builtin_list_lazy_property_names */
15321577

15331578
/**

jerry-core/ecma/builtin-objects/ecma-builtins.h

+6-6
Original file line numberDiff line numberDiff line change
@@ -138,13 +138,13 @@ ecma_builtin_routine_delete_built_in_property (ecma_object_t *object_p, ecma_str
138138
void
139139
ecma_builtin_delete_built_in_property (ecma_object_t *object_p, ecma_string_t *property_name_p);
140140
void
141-
ecma_builtin_routine_list_lazy_property_names (ecma_object_t *object_p,
142-
ecma_collection_t *prop_names_p,
143-
ecma_property_counter_t *prop_counter_p);
141+
ecma_builtin_routine_list_lazy_property_names (ecma_object_t *object_p, ecma_collection_t *prop_names_p,
142+
ecma_property_counter_t *prop_counter_p,
143+
jerry_property_filter_t filter);
144144
void
145-
ecma_builtin_list_lazy_property_names (ecma_object_t *object_p,
146-
ecma_collection_t *prop_names_p,
147-
ecma_property_counter_t *prop_counter_p);
145+
ecma_builtin_list_lazy_property_names (ecma_object_t *object_p, ecma_collection_t *prop_names_p,
146+
ecma_property_counter_t *prop_counter_p,
147+
jerry_property_filter_t filter);
148148
bool
149149
ecma_builtin_is_global (ecma_object_t *object_p);
150150
ecma_object_t *

jerry-core/ecma/operations/ecma-arguments-object.c

+35-27
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,8 @@ ecma_op_arguments_delete_built_in_property (ecma_object_t *object_p, /**< the ob
401401
void
402402
ecma_op_arguments_object_list_lazy_property_names (ecma_object_t *obj_p, /**< arguments object */
403403
ecma_collection_t *prop_names_p, /**< prop name collection */
404-
ecma_property_counter_t *prop_counter_p) /**< property counters */
404+
ecma_property_counter_t *prop_counter_p, /**< property counters */
405+
jerry_property_filter_t filter) /**< property name filter options */
405406
{
406407
JERRY_ASSERT (ecma_object_class_is (obj_p, ECMA_OBJECT_CLASS_ARGUMENTS));
407408

@@ -410,45 +411,52 @@ ecma_op_arguments_object_list_lazy_property_names (ecma_object_t *obj_p, /**< ar
410411
uint32_t arguments_number = arguments_p->header.u.cls.u3.arguments_number;
411412
uint8_t flags = arguments_p->header.u.cls.u1.arguments_flags;
412413

413-
ecma_value_t *argv_p = (ecma_value_t *) (arguments_p + 1);
414-
415-
if (flags & ECMA_ARGUMENTS_OBJECT_MAPPED)
414+
if (!(filter & JERRY_PROPERTY_FILTER_EXLCUDE_INTEGER_INDICES))
416415
{
417-
argv_p = (ecma_value_t *) (((ecma_mapped_arguments_t *) obj_p) + 1);
418-
}
416+
ecma_value_t *argv_p = (ecma_value_t *) (arguments_p + 1);
419417

420-
for (uint32_t index = 0; index < arguments_number; index++)
421-
{
422-
if (!ecma_is_value_empty (argv_p[index]))
418+
if (flags & ECMA_ARGUMENTS_OBJECT_MAPPED)
423419
{
424-
ecma_string_t *index_string_p = ecma_new_ecma_string_from_uint32 (index);
425-
ecma_collection_push_back (prop_names_p, ecma_make_string_value (index_string_p));
426-
prop_counter_p->array_index_named_props++;
420+
argv_p = (ecma_value_t *) (((ecma_mapped_arguments_t *) obj_p) + 1);
427421
}
428-
}
429422

430-
if (!(flags & ECMA_ARGUMENTS_OBJECT_LENGTH_INITIALIZED))
431-
{
432-
ecma_collection_push_back (prop_names_p, ecma_make_magic_string_value (LIT_MAGIC_STRING_LENGTH));
433-
prop_counter_p->string_named_props++;
423+
for (uint32_t index = 0; index < arguments_number; index++)
424+
{
425+
if (!ecma_is_value_empty (argv_p[index]))
426+
{
427+
ecma_string_t *index_string_p = ecma_new_ecma_string_from_uint32 (index);
428+
ecma_collection_push_back (prop_names_p, ecma_make_string_value (index_string_p));
429+
prop_counter_p->array_index_named_props++;
430+
}
431+
}
434432
}
435433

436-
if (!(flags & ECMA_ARGUMENTS_OBJECT_CALLEE_INITIALIZED))
434+
if (!(filter & JERRY_PROPERTY_FILTER_EXLCUDE_STRINGS))
437435
{
438-
ecma_collection_push_back (prop_names_p, ecma_make_magic_string_value (LIT_MAGIC_STRING_CALLEE));
439-
prop_counter_p->string_named_props++;
440-
}
436+
if (!(flags & ECMA_ARGUMENTS_OBJECT_LENGTH_INITIALIZED))
437+
{
438+
ecma_collection_push_back (prop_names_p, ecma_make_magic_string_value (LIT_MAGIC_STRING_LENGTH));
439+
prop_counter_p->string_named_props++;
440+
}
441+
442+
if (!(flags & ECMA_ARGUMENTS_OBJECT_CALLEE_INITIALIZED))
443+
{
444+
ecma_collection_push_back (prop_names_p, ecma_make_magic_string_value (LIT_MAGIC_STRING_CALLEE));
445+
prop_counter_p->string_named_props++;
446+
}
441447

442448
#if !JERRY_ESNEXT
443-
if (!(flags & ECMA_ARGUMENTS_OBJECT_MAPPED))
444-
{
445-
ecma_collection_push_back (prop_names_p, ecma_make_magic_string_value (LIT_MAGIC_STRING_CALLER));
446-
prop_counter_p->string_named_props++;
447-
}
449+
if (!(flags & ECMA_ARGUMENTS_OBJECT_MAPPED))
450+
{
451+
ecma_collection_push_back (prop_names_p, ecma_make_magic_string_value (LIT_MAGIC_STRING_CALLER));
452+
prop_counter_p->string_named_props++;
453+
}
448454
#endif /* !JERRY_ESNEXT */
455+
}
449456

450457
#if JERRY_ESNEXT
451-
if (!(flags & ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED))
458+
if (!(filter & JERRY_PROPERTY_FILTER_EXLCUDE_SYMBOLS)
459+
&& !(flags & ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED))
452460
{
453461
ecma_string_t *symbol_p = ecma_op_get_global_symbol (LIT_GLOBAL_SYMBOL_ITERATOR);
454462
ecma_collection_push_back (prop_names_p, ecma_make_symbol_value (symbol_p));

jerry-core/ecma/operations/ecma-arguments-object.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ ecma_op_arguments_delete_built_in_property (ecma_object_t *object_p, ecma_string
3636

3737
void
3838
ecma_op_arguments_object_list_lazy_property_names (ecma_object_t *obj_p, ecma_collection_t *prop_names_p,
39-
ecma_property_counter_t *prop_counter_p);
39+
ecma_property_counter_t *prop_counter_p,
40+
jerry_property_filter_t filter);
4041

4142
ecma_string_t *
4243
ecma_op_arguments_object_get_formal_parameter (ecma_mapped_arguments_t *mapped_arguments_p,

0 commit comments

Comments
 (0)