Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit fbb8496

Browse files
committedSep 21, 2021
Rework own property enumeration
Properry name filtering is done during the enumeration. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg [email protected]
1 parent 053bfa0 commit fbb8496

24 files changed

+601
-498
lines changed
 

‎jerry-core/api/jerry.c

+9-30
Original file line numberDiff line numberDiff line change
@@ -4604,10 +4604,16 @@ jerry_object_get_property_names (const jerry_value_t obj_val, /**< object */
46044604

46054605
ecma_ref_object (obj_iter_p);
46064606

4607+
if ((filter & JERRY_PROPERTY_FILTER_EXLCUDE_STRINGS)
4608+
&& !(filter & JERRY_PROPERTY_FILTER_INTEGER_INDICES_AS_NUMBER))
4609+
{
4610+
filter |= JERRY_PROPERTY_FILTER_EXLCUDE_INTEGER_INDICES;
4611+
}
4612+
46074613
while (true)
46084614
{
46094615
/* Step 1. Get Object.[[OwnKeys]] */
4610-
ecma_collection_t *prop_names_p = ecma_op_object_own_property_keys (obj_iter_p);
4616+
ecma_collection_t *prop_names_p = ecma_op_object_own_property_keys (obj_iter_p, filter);
46114617

46124618
#if JERRY_BUILTIN_PROXY
46134619
if (prop_names_p == NULL)
@@ -4623,34 +4629,7 @@ jerry_object_get_property_names (const jerry_value_t obj_val, /**< object */
46234629
ecma_string_t *key_p = ecma_get_prop_name_from_value (key);
46244630
uint32_t index = ecma_string_get_array_index (key_p);
46254631

4626-
/* Step 2. Filter by key type */
4627-
if (filter & (JERRY_PROPERTY_FILTER_EXLCUDE_STRINGS
4628-
| JERRY_PROPERTY_FILTER_EXLCUDE_SYMBOLS
4629-
| JERRY_PROPERTY_FILTER_EXLCUDE_INTEGER_INDICES))
4630-
{
4631-
if (ecma_is_value_symbol (key))
4632-
{
4633-
if (filter & JERRY_PROPERTY_FILTER_EXLCUDE_SYMBOLS)
4634-
{
4635-
continue;
4636-
}
4637-
}
4638-
else if (index != ECMA_STRING_NOT_ARRAY_INDEX)
4639-
{
4640-
if ((filter & JERRY_PROPERTY_FILTER_EXLCUDE_INTEGER_INDICES)
4641-
|| ((filter & JERRY_PROPERTY_FILTER_EXLCUDE_STRINGS)
4642-
&& !(filter & JERRY_PROPERTY_FILTER_INTEGER_INDICES_AS_NUMBER)))
4643-
{
4644-
continue;
4645-
}
4646-
}
4647-
else if (filter & JERRY_PROPERTY_FILTER_EXLCUDE_STRINGS)
4648-
{
4649-
continue;
4650-
}
4651-
}
4652-
4653-
/* Step 3. Filter property attributes */
4632+
/* Step 2. Filter property attributes */
46544633
if (filter & (JERRY_PROPERTY_FILTER_EXLCUDE_NON_CONFIGURABLE
46554634
| JERRY_PROPERTY_FILTER_EXLCUDE_NON_ENUMERABLE
46564635
| JERRY_PROPERTY_FILTER_EXLCUDE_NON_WRITABLE))
@@ -4729,7 +4708,7 @@ jerry_object_get_property_names (const jerry_value_t obj_val, /**< object */
47294708

47304709
ecma_collection_free (prop_names_p);
47314710

4732-
/* Step 4: Traverse prototype chain */
4711+
/* Step 3: Traverse prototype chain */
47334712

47344713
if ((filter & JERRY_PROPERTY_FILTER_TRAVERSE_PROTOTYPE_CHAIN) != JERRY_PROPERTY_FILTER_TRAVERSE_PROTOTYPE_CHAIN)
47354714
{

‎jerry-core/ecma/base/ecma-globals.h

+7-9
Original file line numberDiff line numberDiff line change
@@ -223,13 +223,14 @@ enum
223223
ECMA_VALUE_SPREAD_ELEMENT = ECMA_MAKE_VALUE (11), /**< a special value for spread elements in array initialization
224224
* or function call argument list */
225225
/* Other values */
226-
ECMA_VALUE_INITIALIZED = ECMA_MAKE_VALUE (12), /**< represents initialized mapped arguments formal parameter */
226+
ECMA_VALUE_ARGUMENT_INITIALIZED = ECMA_MAKE_VALUE (12), /**< represents initialized mapped arguments formal parameter */
227+
ECMA_VALUE_ARGUMENT_NO_TRACK = ECMA_MAKE_VALUE (13), /**< represents initialized mapped arguments formal parameter */
227228
#if JERRY_ESNEXT
228-
ECMA_VALUE_SYNC_ITERATOR = ECMA_MAKE_VALUE (13), /**< option for ecma_op_get_iterator: sync iterator is requested */
229-
ECMA_VALUE_ASYNC_ITERATOR = ECMA_MAKE_VALUE (14), /**< option for ecma_op_get_iterator: async iterator is requested */
229+
ECMA_VALUE_SYNC_ITERATOR = ECMA_MAKE_VALUE (14), /**< option for ecma_op_get_iterator: sync iterator is requested */
230+
ECMA_VALUE_ASYNC_ITERATOR = ECMA_MAKE_VALUE (15), /**< option for ecma_op_get_iterator: async iterator is requested */
230231
#endif /* JERRY_ESNEXT */
231232
#if JERRY_BUILTIN_GLOBAL_THIS
232-
ECMA_VALUE_GLOBAL_THIS = ECMA_MAKE_VALUE (15), /**< globalThis built-in */
233+
ECMA_VALUE_GLOBAL_THIS = ECMA_MAKE_VALUE (16), /**< globalThis built-in */
233234
#endif /* JERRY_BUILTIN_GLOBAL_THIS */
234235
};
235236

@@ -2439,8 +2440,6 @@ typedef struct
24392440
uint32_t array_index_named_props; /**< number of array index named properties */
24402441
uint32_t string_named_props; /**< number of string named properties */
24412442
uint32_t symbol_named_props; /**< number of symbol named properties */
2442-
uint32_t lazy_string_named_props; /**< number of lazy instantiated string properties */
2443-
uint32_t lazy_symbol_named_props; /**< number of lazy instantiated symbol properties */
24442443
} ecma_property_counter_t;
24452444

24462445
/**
@@ -2452,9 +2451,8 @@ typedef enum
24522451
ECMA_ARGUMENTS_OBJECT_MAPPED = (1 << 0), /* mapped arguments object */
24532452
ECMA_ARGUMENTS_OBJECT_STATIC_BYTECODE = (1 << 1), /* static mapped arguments object */
24542453
ECMA_ARGUMENTS_OBJECT_CALLEE_INITIALIZED = (1 << 2), /* 'callee' property has been lazy initialized */
2455-
ECMA_ARGUMENTS_OBJECT_CALLER_INITIALIZED = (1 << 3), /* 'caller' property has been lazy initialized */
2456-
ECMA_ARGUMENTS_OBJECT_LENGTH_INITIALIZED = (1 << 4), /* 'length' property has been lazy initialized */
2457-
ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED = (1 << 5), /* 'Symbol.iterator' property has been lazy initialized */
2454+
ECMA_ARGUMENTS_OBJECT_LENGTH_INITIALIZED = (1 << 3), /* 'length' property has been lazy initialized */
2455+
ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED = (1 << 4), /* 'Symbol.iterator' property has been lazy initialized */
24582456
} ecma_arguments_object_flags_t;
24592457

24602458
/**

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

+15-29
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,41 +1327,27 @@ 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;
13311331

1332-
if (props_p == NULL)
1332+
if (type == ECMA_OBJECT_ROUTINE_GET_OWN_PROPERTY_SYMBOLS)
13331333
{
1334-
ecma_deref_object (obj_p);
1335-
return ECMA_VALUE_ERROR;
1334+
filter = (JERRY_PROPERTY_FILTER_EXLCUDE_STRINGS
1335+
| JERRY_PROPERTY_FILTER_EXLCUDE_INTEGER_INDICES);
13361336
}
13371337

1338-
/* 3. */
1339-
ecma_collection_t *name_list_p = ecma_new_collection ();
1338+
ecma_collection_t *props_p = ecma_op_object_own_property_keys (obj_p, filter);
1339+
ecma_deref_object (obj_p);
13401340

1341-
/* 4. */
1342-
for (uint32_t i = 0; i < props_p->item_count; i++)
1341+
if (props_p == NULL)
13431342
{
1344-
ecma_value_t prop_name = props_p->buffer_p[i];
1345-
ecma_string_t *name_p = ecma_get_prop_name_from_value (prop_name);
1346-
1347-
if ((ecma_prop_name_is_symbol (name_p) && type == ECMA_OBJECT_ROUTINE_GET_OWN_PROPERTY_SYMBOLS)
1348-
|| (ecma_is_value_string (prop_name) && type == ECMA_OBJECT_ROUTINE_GET_OWN_PROPERTY_NAMES))
1349-
{
1350-
ecma_ref_ecma_string (name_p);
1351-
ecma_collection_push_back (name_list_p, prop_name);
1352-
}
1343+
return ECMA_VALUE_ERROR;
13531344
}
13541345

1355-
ecma_value_t result_array = ecma_op_new_array_object_from_collection (name_list_p, false);
1356-
1357-
ecma_deref_object (obj_p);
1358-
ecma_collection_free (props_p);
1359-
1360-
return result_array;
1346+
return ecma_op_new_array_object_from_collection (props_p, false);
13611347
#else /* !JERRY_ESNEXT */
13621348
JERRY_UNUSED (type);
13631349
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);
1350+
ecma_collection_t *props_p = ecma_op_object_own_property_keys (obj_p, JERRY_PROPERTY_FILTER_ALL);
13651351
return ecma_op_new_array_object_from_collection (props_p, false);
13661352
#endif /* JERRY_ESNEXT */
13671353
} /* ecma_op_object_get_own_property_keys */

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

+2-2
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)
@@ -206,7 +206,7 @@ ecma_builtin_reflect_dispatch_routine (uint8_t builtin_routine_id, /**< built-in
206206
return ecma_raise_type_error (ECMA_ERR_MSG ("Reflect.construct expects an object as second argument"));
207207
}
208208

209-
ecma_collection_t *coll_p = ecma_op_create_list_from_array_like (arguments_list[1], false);
209+
ecma_collection_t *coll_p = ecma_op_create_list_from_array_like (arguments_list[1], ECMA_FROM_ARRAY_LIKE_ANY);
210210

211211
if (coll_p == NULL)
212212
{

‎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 *

0 commit comments

Comments
 (0)
Please sign in to comment.