@@ -88,7 +88,7 @@ ecma_op_create_arguments_object (vm_frame_ctx_shared_args_t *shared_p, /**< shar
88
88
89
89
for (uint32_t i = shared_p -> arg_list_len ; i < saved_arg_count ; i ++ )
90
90
{
91
- argv_p [i ] = ECMA_VALUE_INITIALIZED ;
91
+ argv_p [i ] = ECMA_VALUE_UNDEFINED ;
92
92
}
93
93
94
94
arguments_p -> header .u .cls .u3 .arguments_number = shared_p -> arg_list_len ;
@@ -137,7 +137,7 @@ ecma_op_create_arguments_object (vm_frame_ctx_shared_args_t *shared_p, /**< shar
137
137
138
138
ecma_deref_ecma_string (prop_name_p );
139
139
140
- prop_value_p -> value = argv_p [i ] == ECMA_VALUE_INITIALIZED ? ECMA_VALUE_UNDEFINED : argv_p [ i ] ;
140
+ prop_value_p -> value = argv_p [i ];
141
141
argv_p [i ] = ECMA_VALUE_EMPTY ;
142
142
}
143
143
}
@@ -183,76 +183,40 @@ ecma_op_arguments_object_define_own_property (ecma_object_t *object_p, /**< the
183
183
184
184
ecma_value_t * argv_p = (ecma_value_t * ) (mapped_arguments_p + 1 );
185
185
186
- if (! ecma_is_value_empty (argv_p [index ]))
186
+ if (ecma_is_value_empty (argv_p [index ]) || argv_p [ index ] == ECMA_VALUE_ARGUMENT_NO_TRACK )
187
187
{
188
- if (property_desc_p -> flags & (JERRY_PROP_IS_GET_DEFINED | JERRY_PROP_IS_SET_DEFINED ))
189
- {
190
- ecma_free_value_if_not_object (argv_p [index ]);
191
- argv_p [index ] = ECMA_VALUE_EMPTY ;
192
- }
193
- else
194
- {
195
- if (property_desc_p -> flags & JERRY_PROP_IS_VALUE_DEFINED )
196
- {
197
- ecma_string_t * name_p = ecma_op_arguments_object_get_formal_parameter (mapped_arguments_p , index );
198
- ecma_object_t * lex_env_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t , mapped_arguments_p -> lex_env );
199
-
200
- ecma_value_t completion = ecma_op_set_mutable_binding (lex_env_p ,
201
- name_p ,
202
- property_desc_p -> value ,
203
- true);
204
-
205
- JERRY_ASSERT (ecma_is_value_empty (completion ));
206
- }
207
-
208
- if ((property_desc_p -> flags & JERRY_PROP_IS_WRITABLE_DEFINED )
209
- && !(property_desc_p -> flags & JERRY_PROP_IS_WRITABLE ))
210
- {
211
- ecma_free_value_if_not_object (argv_p [index ]);
212
- argv_p [index ] = ECMA_VALUE_EMPTY ;
213
- }
214
- }
188
+ return ret_value ;
215
189
}
216
190
217
- return ret_value ;
218
- } /* ecma_op_arguments_object_define_own_property */
219
-
220
- /**
221
- * [[Delete]] ecma Arguments object's operation
222
- *
223
- * See also:
224
- * ECMA-262 v5, 8.6.2; ECMA-262 v5, Table 8
225
- * ECMA-262 v5, 10.6
226
- *
227
- * @return ecma value
228
- * Returned value must be freed with ecma_free_value
229
- */
230
- ecma_value_t
231
- ecma_op_arguments_object_delete (ecma_object_t * object_p , /**< the object */
232
- ecma_string_t * property_name_p , /**< property name */
233
- bool is_throw ) /**< flag that controls failure handling */
234
- {
235
- /* 3. */
236
- ecma_value_t ret_value = ecma_op_general_object_delete (object_p , property_name_p , is_throw );
237
-
238
- if (!ecma_is_value_true (ret_value )
239
- || !(((ecma_extended_object_t * ) object_p )-> u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_MAPPED ))
191
+ if (property_desc_p -> flags & (JERRY_PROP_IS_GET_DEFINED | JERRY_PROP_IS_SET_DEFINED ))
240
192
{
193
+ ecma_free_value_if_not_object (argv_p [index ]);
194
+ argv_p [index ] = ECMA_VALUE_ARGUMENT_NO_TRACK ;
241
195
return ret_value ;
242
196
}
243
197
244
- ecma_mapped_arguments_t * mapped_arguments_p = (ecma_mapped_arguments_t * ) object_p ;
245
- ecma_value_t * argv_p = (ecma_value_t * ) (mapped_arguments_p + 1 );
246
- uint32_t index = ecma_string_get_array_index (property_name_p );
198
+ if (property_desc_p -> flags & JERRY_PROP_IS_VALUE_DEFINED )
199
+ {
200
+ ecma_string_t * name_p = ecma_op_arguments_object_get_formal_parameter (mapped_arguments_p , index );
201
+ ecma_object_t * lex_env_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t , mapped_arguments_p -> lex_env );
202
+
203
+ ecma_value_t completion = ecma_op_set_mutable_binding (lex_env_p ,
204
+ name_p ,
205
+ property_desc_p -> value ,
206
+ true);
247
207
248
- if (index < mapped_arguments_p -> unmapped .header .u .cls .u2 .formal_params_number )
208
+ JERRY_ASSERT (ecma_is_value_empty (completion ));
209
+ }
210
+
211
+ if ((property_desc_p -> flags & JERRY_PROP_IS_WRITABLE_DEFINED )
212
+ && !(property_desc_p -> flags & JERRY_PROP_IS_WRITABLE ))
249
213
{
250
214
ecma_free_value_if_not_object (argv_p [index ]);
251
- argv_p [index ] = ECMA_VALUE_EMPTY ;
215
+ argv_p [index ] = ECMA_VALUE_ARGUMENT_NO_TRACK ;
252
216
}
253
217
254
218
return ret_value ;
255
- } /* ecma_op_arguments_object_delete */
219
+ } /* ecma_op_arguments_object_define_own_property */
256
220
257
221
/**
258
222
* Try to lazy instantiate the given property of a mapped/unmapped arguments object
@@ -269,7 +233,7 @@ ecma_op_arguments_object_try_to_lazy_instantiate_property (ecma_object_t *object
269
233
ecma_unmapped_arguments_t * arguments_p = (ecma_unmapped_arguments_t * ) object_p ;
270
234
ecma_value_t * argv_p = (ecma_value_t * ) (arguments_p + 1 );
271
235
ecma_property_value_t * prop_value_p ;
272
- ecma_property_t * prop_p = NULL ;
236
+ ecma_property_t * prop_p ;
273
237
uint32_t arguments_number = arguments_p -> header .u .cls .u3 .arguments_number ;
274
238
uint8_t flags = arguments_p -> header .u .cls .u1 .arguments_flags ;
275
239
@@ -283,57 +247,45 @@ ecma_op_arguments_object_try_to_lazy_instantiate_property (ecma_object_t *object
283
247
if (index != ECMA_STRING_NOT_ARRAY_INDEX )
284
248
{
285
249
if (index >= arguments_number
286
- || ecma_is_value_empty (argv_p [index ])
287
- || argv_p [index ] == ECMA_VALUE_INITIALIZED )
250
+ || ecma_is_value_empty (argv_p [index ]))
288
251
{
289
252
return NULL ;
290
253
}
291
254
255
+ JERRY_ASSERT (argv_p [index ] != ECMA_VALUE_ARGUMENT_NO_TRACK );
256
+
292
257
prop_value_p = ecma_create_named_data_property (object_p ,
293
258
property_name_p ,
294
- ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE_WRITABLE ,
259
+ ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_ENUMERABLE_WRITABLE ,
295
260
& prop_p );
296
261
297
262
/* Passing the reference */
298
263
prop_value_p -> value = argv_p [index ];
299
264
300
- /* Pevent reinitialization */
301
- if ((flags & ECMA_ARGUMENTS_OBJECT_MAPPED )
302
- && index < arguments_p -> header .u .cls .u2 .formal_params_number )
303
- {
304
- argv_p [index ] = ECMA_VALUE_INITIALIZED ;
305
- }
306
- else
307
- {
308
- argv_p [index ] = ECMA_VALUE_EMPTY ;
309
- }
310
-
265
+ argv_p [index ] = ECMA_VALUE_UNDEFINED ;
311
266
return prop_p ;
312
267
}
313
268
314
- if (property_name_p == ecma_get_magic_string ( LIT_MAGIC_STRING_LENGTH )
269
+ if (ecma_compare_ecma_string_to_magic_id ( property_name_p , LIT_MAGIC_STRING_LENGTH )
315
270
&& !(flags & ECMA_ARGUMENTS_OBJECT_LENGTH_INITIALIZED ))
316
271
{
317
- arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_LENGTH_INITIALIZED ;
318
-
319
272
prop_value_p = ecma_create_named_data_property (object_p ,
320
273
ecma_get_magic_string (LIT_MAGIC_STRING_LENGTH ),
321
- ECMA_PROPERTY_CONFIGURABLE_WRITABLE ,
274
+ ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_WRITABLE ,
322
275
& prop_p );
323
276
324
277
prop_value_p -> value = ecma_make_uint32_value (arguments_number );
278
+ return prop_p ;
325
279
}
326
280
327
- if (property_name_p == ecma_get_magic_string ( LIT_MAGIC_STRING_CALLEE )
281
+ if (ecma_compare_ecma_string_to_magic_id ( property_name_p , LIT_MAGIC_STRING_CALLEE )
328
282
&& !(flags & ECMA_ARGUMENTS_OBJECT_CALLEE_INITIALIZED ))
329
283
{
330
- arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_CALLEE_INITIALIZED ;
331
-
332
284
if (flags & ECMA_ARGUMENTS_OBJECT_MAPPED )
333
285
{
334
286
prop_value_p = ecma_create_named_data_property (object_p ,
335
287
property_name_p ,
336
- ECMA_PROPERTY_CONFIGURABLE_WRITABLE ,
288
+ ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_WRITABLE ,
337
289
& prop_p );
338
290
339
291
prop_value_p -> value = arguments_p -> callee ;
@@ -346,75 +298,120 @@ ecma_op_arguments_object_try_to_lazy_instantiate_property (ecma_object_t *object
346
298
ecma_get_magic_string (LIT_MAGIC_STRING_CALLEE ),
347
299
thrower_p ,
348
300
thrower_p ,
349
- ECMA_PROPERTY_FIXED ,
301
+ ECMA_PROPERTY_BUILT_IN_FIXED ,
350
302
& prop_p );
351
303
}
352
304
return prop_p ;
353
305
}
354
306
355
307
#if !JERRY_ESNEXT
356
- if (property_name_p == ecma_get_magic_string (LIT_MAGIC_STRING_CALLER )
357
- && !(arguments_p -> header .u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_CALLER_INITIALIZED ))
308
+ if (property_name_p == ecma_get_magic_string (LIT_MAGIC_STRING_CALLER ))
358
309
{
359
310
if (arguments_p -> header .u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_MAPPED )
360
311
{
361
312
return NULL ;
362
313
}
363
314
364
- arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_CALLER_INITIALIZED ;
365
-
366
315
ecma_object_t * thrower_p = ecma_builtin_get (ECMA_BUILTIN_ID_TYPE_ERROR_THROWER );
367
316
368
317
ecma_create_named_accessor_property (object_p ,
369
318
ecma_get_magic_string (LIT_MAGIC_STRING_CALLER ),
370
319
thrower_p ,
371
320
thrower_p ,
372
- ECMA_PROPERTY_FIXED ,
321
+ ECMA_PROPERTY_BUILT_IN_FIXED ,
373
322
& prop_p );
374
323
return prop_p ;
375
324
}
376
325
#else /* JERRY_ESNEXT */
377
- ecma_string_t * symbol_p = ecma_op_get_global_symbol (LIT_GLOBAL_SYMBOL_ITERATOR );
378
-
379
- if (property_name_p == symbol_p
326
+ if (ecma_op_compare_string_to_global_symbol (property_name_p , LIT_GLOBAL_SYMBOL_ITERATOR )
380
327
&& !(flags & ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED ))
381
328
{
382
- arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED ;
383
-
384
329
prop_value_p = ecma_create_named_data_property (object_p ,
385
- symbol_p ,
386
- ECMA_PROPERTY_CONFIGURABLE_WRITABLE ,
330
+ property_name_p ,
331
+ ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_WRITABLE ,
387
332
& prop_p );
388
333
389
334
prop_value_p -> value = ecma_op_object_get_by_magic_id (ecma_builtin_get (ECMA_BUILTIN_ID_INTRINSIC_OBJECT ),
390
335
LIT_INTERNAL_MAGIC_STRING_ARRAY_PROTOTYPE_VALUES );
391
336
392
337
JERRY_ASSERT (ecma_is_value_object (prop_value_p -> value ));
393
338
ecma_deref_object (ecma_get_object_from_value (prop_value_p -> value ));
339
+ return prop_p ;
394
340
}
395
-
396
- ecma_deref_ecma_string (symbol_p );
397
341
#endif /* !JERRY_ESNEXT */
398
342
399
- return prop_p ;
343
+ return NULL ;
400
344
} /* ecma_op_arguments_object_try_to_lazy_instantiate_property */
401
345
346
+ /**
347
+ * Delete configurable properties of arguments object
348
+ */
349
+ void
350
+ ecma_op_arguments_delete_built_in_property (ecma_object_t * object_p , /**< the object */
351
+ ecma_string_t * property_name_p ) /**< property name */
352
+ {
353
+ ecma_unmapped_arguments_t * arguments_p = (ecma_unmapped_arguments_t * ) object_p ;
354
+
355
+ if (ecma_compare_ecma_string_to_magic_id (property_name_p , LIT_MAGIC_STRING_LENGTH ))
356
+ {
357
+ JERRY_ASSERT (!(arguments_p -> header .u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_LENGTH_INITIALIZED ));
358
+
359
+ arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_LENGTH_INITIALIZED ;
360
+ return ;
361
+ }
362
+
363
+ if (ecma_compare_ecma_string_to_magic_id (property_name_p , LIT_MAGIC_STRING_CALLEE ))
364
+ {
365
+ JERRY_ASSERT (!(arguments_p -> header .u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_CALLEE_INITIALIZED ));
366
+ JERRY_ASSERT (arguments_p -> header .u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_MAPPED );
367
+
368
+ arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_CALLEE_INITIALIZED ;
369
+ return ;
370
+ }
371
+
372
+ #if JERRY_ESNEXT
373
+ if (ecma_prop_name_is_symbol (property_name_p ))
374
+ {
375
+ JERRY_ASSERT (!(arguments_p -> header .u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED ));
376
+ JERRY_ASSERT (ecma_op_compare_string_to_global_symbol (property_name_p , LIT_GLOBAL_SYMBOL_ITERATOR ));
377
+
378
+ arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED ;
379
+ return ;
380
+ }
381
+ #endif /* JERRY_ESNEXT */
382
+
383
+ uint32_t index = ecma_string_get_array_index (property_name_p );
384
+
385
+ ecma_value_t * argv_p = (ecma_value_t * ) (arguments_p + 1 );
386
+
387
+ if (arguments_p -> header .u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_MAPPED )
388
+ {
389
+ argv_p = (ecma_value_t * ) (((ecma_mapped_arguments_t * ) object_p ) + 1 );
390
+ }
391
+
392
+ JERRY_ASSERT (argv_p [index ] == ECMA_VALUE_UNDEFINED
393
+ || argv_p [index ] == ECMA_VALUE_ARGUMENT_NO_TRACK );
394
+
395
+ argv_p [index ] = ECMA_VALUE_EMPTY ;
396
+ } /* ecma_op_arguments_delete_built_in_property */
397
+
402
398
/**
403
399
* List names of an arguments object's lazy instantiated properties
404
400
*/
405
401
void
406
402
ecma_op_arguments_object_list_lazy_property_names (ecma_object_t * obj_p , /**< arguments object */
407
403
ecma_collection_t * prop_names_p , /**< prop name collection */
408
- ecma_property_counter_t * prop_counter_p ) /**< prop counter */
404
+ ecma_property_counter_t * prop_counter_p ) /**< property counters */
409
405
{
410
406
JERRY_ASSERT (ecma_object_class_is (obj_p , ECMA_OBJECT_CLASS_ARGUMENTS ));
411
407
412
408
ecma_unmapped_arguments_t * arguments_p = (ecma_unmapped_arguments_t * ) obj_p ;
413
409
414
- ecma_value_t * argv_p = (ecma_value_t * ) (arguments_p + 1 );
415
410
uint32_t arguments_number = arguments_p -> header .u .cls .u3 .arguments_number ;
416
411
uint8_t flags = arguments_p -> header .u .cls .u1 .arguments_flags ;
417
412
413
+ ecma_value_t * argv_p = (ecma_value_t * ) (arguments_p + 1 );
414
+
418
415
if (flags & ECMA_ARGUMENTS_OBJECT_MAPPED )
419
416
{
420
417
argv_p = (ecma_value_t * ) (((ecma_mapped_arguments_t * ) obj_p ) + 1 );
@@ -443,19 +440,21 @@ ecma_op_arguments_object_list_lazy_property_names (ecma_object_t *obj_p, /**< ar
443
440
}
444
441
445
442
#if !JERRY_ESNEXT
446
- if (!(flags & ( ECMA_ARGUMENTS_OBJECT_CALLER_INITIALIZED | ECMA_ARGUMENTS_OBJECT_MAPPED ) ))
443
+ if (!(flags & ECMA_ARGUMENTS_OBJECT_MAPPED ))
447
444
{
448
445
ecma_collection_push_back (prop_names_p , ecma_make_magic_string_value (LIT_MAGIC_STRING_CALLER ));
449
446
prop_counter_p -> string_named_props ++ ;
450
447
}
451
- #else /* JERRY_ESNEXT */
448
+ #endif /* !JERRY_ESNEXT */
449
+
450
+ #if JERRY_ESNEXT
452
451
if (!(flags & ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED ))
453
452
{
454
453
ecma_string_t * symbol_p = ecma_op_get_global_symbol (LIT_GLOBAL_SYMBOL_ITERATOR );
455
454
ecma_collection_push_back (prop_names_p , ecma_make_symbol_value (symbol_p ));
456
455
prop_counter_p -> symbol_named_props ++ ;
457
456
}
458
- #endif /* ! JERRY_ESNEXT */
457
+ #endif /* JERRY_ESNEXT */
459
458
} /* ecma_op_arguments_object_list_lazy_property_names */
460
459
461
460
/**
0 commit comments