Skip to content

Commit 723b263

Browse files
authored
Fix property enumeration order of built-in properties (#4761)
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg [email protected]
1 parent 2c2539c commit 723b263

13 files changed

+404
-155
lines changed

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

+37
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,7 @@ typedef enum
400400
ECMA_PROPERTY_FLAG_WRITABLE = (1u << 2), /**< property is writable */
401401
ECMA_PROPERTY_FLAG_SINGLE_EXTERNAL = (1u << 2), /**< only one external pointer is assigned to this object */
402402
ECMA_PROPERTY_FLAG_DELETED = (1u << 3), /**< property is deleted */
403+
ECMA_PROPERTY_FLAG_BUILT_IN = (1u << 3), /**< property is defined by the ECMAScript standard */
403404
ECMA_FAST_ARRAY_FLAG = (1u << 3), /**< array is fast array */
404405
ECMA_PROPERTY_FLAG_LCACHED = (1u << 4), /**< property is lcached */
405406
#if JERRY_ESNEXT
@@ -427,12 +428,48 @@ typedef enum
427428
#define ECMA_PROPERTY_CONFIGURABLE_WRITABLE \
428429
(ECMA_PROPERTY_FLAG_CONFIGURABLE | ECMA_PROPERTY_FLAG_WRITABLE)
429430

431+
/**
432+
* Property flag built-in.
433+
*/
434+
#define ECMA_PROPERTY_BUILT_IN_FIXED \
435+
(ECMA_PROPERTY_FLAG_BUILT_IN)
436+
430437
/**
431438
* Property flags enumerable, writable.
432439
*/
433440
#define ECMA_PROPERTY_ENUMERABLE_WRITABLE \
434441
(ECMA_PROPERTY_FLAG_ENUMERABLE | ECMA_PROPERTY_FLAG_WRITABLE)
435442

443+
/**
444+
* Property flags built-in, configurable.
445+
*/
446+
#define ECMA_PROPERTY_BUILT_IN_CONFIGURABLE \
447+
(ECMA_PROPERTY_FLAG_BUILT_IN | ECMA_PROPERTY_FLAG_CONFIGURABLE)
448+
449+
/**
450+
* Property flags built-in, configurable, enumerable.
451+
*/
452+
#define ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_ENUMERABLE \
453+
(ECMA_PROPERTY_FLAG_BUILT_IN | ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE)
454+
455+
/**
456+
* Property flags built-in, configurable, writable.
457+
*/
458+
#define ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_WRITABLE \
459+
(ECMA_PROPERTY_FLAG_BUILT_IN | ECMA_PROPERTY_CONFIGURABLE_WRITABLE)
460+
461+
/**
462+
* Property flags built-in, writable.
463+
*/
464+
#define ECMA_PROPERTY_BUILT_IN_WRITABLE \
465+
(ECMA_PROPERTY_FLAG_BUILT_IN | ECMA_PROPERTY_FLAG_WRITABLE)
466+
467+
/**
468+
* Property flags built-in, configurable, enumerable, writable.
469+
*/
470+
#define ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_ENUMERABLE_WRITABLE \
471+
(ECMA_PROPERTY_FLAG_BUILT_IN | ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE_WRITABLE)
472+
436473
/**
437474
* No attributes can be changed for this property.
438475
*/

jerry-core/ecma/base/ecma-helpers.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ ecma_create_named_data_property (ecma_object_t *object_p, /**< object */
582582
JERRY_ASSERT (ecma_is_lexical_environment (object_p)
583583
|| !ecma_op_object_is_fast_array (object_p));
584584
JERRY_ASSERT (ecma_find_named_property (object_p, name_p) == NULL);
585-
JERRY_ASSERT ((prop_attributes & ~ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE_WRITABLE) == 0);
585+
JERRY_ASSERT ((prop_attributes & ~ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_ENUMERABLE_WRITABLE) == 0);
586586

587587
uint8_t type_and_flags = ECMA_PROPERTY_FLAG_DATA | prop_attributes;
588588

@@ -610,7 +610,7 @@ ecma_create_named_accessor_property (ecma_object_t *object_p, /**< object */
610610
JERRY_ASSERT (ecma_is_lexical_environment (object_p)
611611
|| !ecma_op_object_is_fast_array (object_p));
612612
JERRY_ASSERT (ecma_find_named_property (object_p, name_p) == NULL);
613-
JERRY_ASSERT ((prop_attributes & ~ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE) == 0);
613+
JERRY_ASSERT ((prop_attributes & ~ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_ENUMERABLE) == 0);
614614

615615
uint8_t type_and_flags = prop_attributes;
616616

jerry-core/ecma/builtin-objects/ecma-builtin-internal-routines-template.inc.h

+19-19
Original file line numberDiff line numberDiff line change
@@ -92,35 +92,35 @@ const ecma_builtin_property_descriptor_t PROPERTY_DESCRIPTOR_LIST_NAME[] =
9292
{ \
9393
name, \
9494
ECMA_BUILTIN_PROPERTY_ROUTINE, \
95-
ECMA_PROPERTY_CONFIGURABLE_WRITABLE, \
95+
ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_WRITABLE, \
9696
ECMA_ROUTINE_VALUE (ECMA_ROUTINE_ ## name ## c_function_name, length_prop_value) \
9797
},
9898
#define ROUTINE_CONFIGURABLE_ONLY(name, c_function_name, args_number, length_prop_value) \
9999
{ \
100100
name, \
101101
ECMA_BUILTIN_PROPERTY_ROUTINE, \
102-
ECMA_PROPERTY_FLAG_CONFIGURABLE, \
102+
ECMA_PROPERTY_BUILT_IN_CONFIGURABLE, \
103103
ECMA_ROUTINE_VALUE (ECMA_ROUTINE_ ## name ## c_function_name, length_prop_value) \
104104
},
105-
#define ROUTINE_WITH_FLAGS(name, c_function_name, args_number, length_prop_value, flags) \
105+
#define ROUTINE_WITH_FLAGS(name, c_function_name, args_number, length_prop_value, prop_attributes) \
106106
{ \
107107
name, \
108108
ECMA_BUILTIN_PROPERTY_ROUTINE, \
109-
flags, \
109+
(prop_attributes) | ECMA_PROPERTY_FLAG_BUILT_IN, \
110110
ECMA_ROUTINE_VALUE (ECMA_ROUTINE_ ## name ## c_function_name, length_prop_value) \
111111
},
112112
#define ACCESSOR_READ_ONLY(name, c_getter_func_name, prop_attributes) \
113113
{ \
114114
name, \
115115
ECMA_BUILTIN_PROPERTY_ACCESSOR_READ_ONLY, \
116-
prop_attributes, \
116+
(prop_attributes) | ECMA_PROPERTY_FLAG_BUILT_IN, \
117117
ECMA_ACCESSOR_ ## name ## c_getter_func_name \
118118
},
119119
#define ACCESSOR_READ_WRITE(name, c_getter_func_name, c_setter_func_name, prop_attributes) \
120120
{ \
121121
name, \
122122
ECMA_BUILTIN_PROPERTY_ACCESSOR_READ_WRITE, \
123-
prop_attributes, \
123+
(prop_attributes) | ECMA_PROPERTY_FLAG_BUILT_IN, \
124124
ECMA_ACCESSOR_READ_WRITE (ECMA_ACCESSOR_ ## name ## c_getter_func_name, \
125125
ECMA_ACCESSOR_ ## name ## c_setter_func_name) \
126126
},
@@ -129,86 +129,86 @@ const ecma_builtin_property_descriptor_t PROPERTY_DESCRIPTOR_LIST_NAME[] =
129129
{ \
130130
name, \
131131
ECMA_BUILTIN_PROPERTY_ROUTINE, \
132-
ECMA_PROPERTY_CONFIGURABLE_WRITABLE, \
132+
ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_WRITABLE, \
133133
ECMA_ROUTINE_VALUE (c_function_name, length_prop_value) \
134134
},
135135
#define ROUTINE_CONFIGURABLE_ONLY(name, c_function_name, args_number, length_prop_value) \
136136
{ \
137137
name, \
138138
ECMA_BUILTIN_PROPERTY_ROUTINE, \
139-
ECMA_PROPERTY_FLAG_CONFIGURABLE, \
139+
ECMA_PROPERTY_BUILT_IN_CONFIGURABLE, \
140140
ECMA_ROUTINE_VALUE (c_function_name, length_prop_value) \
141141
},
142-
#define ROUTINE_WITH_FLAGS(name, c_function_name, args_number, length_prop_value, flags) \
142+
#define ROUTINE_WITH_FLAGS(name, c_function_name, args_number, length_prop_value, prop_attributes) \
143143
{ \
144144
name, \
145145
ECMA_BUILTIN_PROPERTY_ROUTINE, \
146-
flags, \
146+
(prop_attributes) | ECMA_PROPERTY_FLAG_BUILT_IN, \
147147
ECMA_ROUTINE_VALUE (c_function_name, length_prop_value) \
148148
},
149149
#define ACCESSOR_READ_ONLY(name, c_getter_func_name, prop_attributes) \
150150
{ \
151151
name, \
152152
ECMA_BUILTIN_PROPERTY_ACCESSOR_READ_ONLY, \
153-
prop_attributes, \
153+
(prop_attributes) | ECMA_PROPERTY_FLAG_BUILT_IN, \
154154
c_getter_func_name \
155155
},
156156
#define ACCESSOR_READ_WRITE(name, c_getter_func_name, c_setter_func_name, prop_attributes) \
157157
{ \
158158
name, \
159159
ECMA_BUILTIN_PROPERTY_ACCESSOR_READ_WRITE, \
160-
prop_attributes, \
160+
(prop_attributes) | ECMA_PROPERTY_FLAG_BUILT_IN, \
161161
ECMA_ACCESSOR_READ_WRITE (c_getter_func_name, c_setter_func_name) \
162162
},
163163
#endif /* !BUILTIN_CUSTOM_DISPATCH */
164164
#define OBJECT_VALUE(name, obj_builtin_id, prop_attributes) \
165165
{ \
166166
name, \
167167
ECMA_BUILTIN_PROPERTY_OBJECT, \
168-
prop_attributes, \
168+
(prop_attributes) | ECMA_PROPERTY_FLAG_BUILT_IN, \
169169
obj_builtin_id \
170170
},
171171
#define SIMPLE_VALUE(name, simple_value, prop_attributes) \
172172
{ \
173173
name, \
174174
ECMA_BUILTIN_PROPERTY_SIMPLE, \
175-
prop_attributes, \
175+
(prop_attributes) | ECMA_PROPERTY_FLAG_BUILT_IN, \
176176
simple_value \
177177
},
178178
#define NUMBER_VALUE(name, number_value, prop_attributes) \
179179
{ \
180180
name, \
181181
ECMA_BUILTIN_PROPERTY_NUMBER, \
182-
prop_attributes, \
182+
(prop_attributes) | ECMA_PROPERTY_FLAG_BUILT_IN, \
183183
number_value \
184184
},
185185
#define STRING_VALUE(name, magic_string_id, prop_attributes) \
186186
{ \
187187
name, \
188188
ECMA_BUILTIN_PROPERTY_STRING, \
189-
prop_attributes, \
189+
(prop_attributes) | ECMA_PROPERTY_FLAG_BUILT_IN, \
190190
magic_string_id \
191191
},
192192
#if JERRY_ESNEXT
193193
#define SYMBOL_VALUE(name, symbol) \
194194
{ \
195195
name, \
196196
ECMA_BUILTIN_PROPERTY_SYMBOL, \
197-
ECMA_PROPERTY_FIXED, \
197+
ECMA_PROPERTY_BUILT_IN_FIXED, \
198198
symbol \
199199
},
200200
#define INTRINSIC_PROPERTY(name, magic_string_id, prop_attributes) \
201201
{ \
202202
name, \
203203
ECMA_BUILTIN_PROPERTY_INTRINSIC_PROPERTY, \
204-
prop_attributes, \
204+
(prop_attributes) | ECMA_PROPERTY_FLAG_BUILT_IN, \
205205
magic_string_id \
206206
},
207207
#define ACCESSOR_BUILTIN_FUNCTION(name, getter_builtin_id, setter_builtin_id, prop_attributes) \
208208
{ \
209209
name, \
210210
ECMA_BUILTIN_PROPERTY_ACCESSOR_BUILTIN_FUNCTION, \
211-
prop_attributes, \
211+
(prop_attributes) | ECMA_PROPERTY_FLAG_BUILT_IN, \
212212
ECMA_ACCESSOR_READ_WRITE (getter_builtin_id, setter_builtin_id) \
213213
},
214214
#endif /* JERRY_ESNEXT */

0 commit comments

Comments
 (0)