@@ -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_ARGUMENT_INITIALIZED ;
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 ] == ECMA_VALUE_ARGUMENT_INITIALIZED ) ? ECMA_VALUE_UNDEFINED : 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,46 @@ 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_INITIALIZED
256
+ && argv_p [index ] != ECMA_VALUE_ARGUMENT_NO_TRACK );
257
+
292
258
prop_value_p = ecma_create_named_data_property (object_p ,
293
259
property_name_p ,
294
- ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE_WRITABLE ,
260
+ ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_ENUMERABLE_WRITABLE ,
295
261
& prop_p );
296
262
297
263
/* Passing the reference */
298
264
prop_value_p -> value = argv_p [index ];
299
265
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
-
266
+ argv_p [index ] = ECMA_VALUE_ARGUMENT_INITIALIZED ;
311
267
return prop_p ;
312
268
}
313
269
314
- if (property_name_p == ecma_get_magic_string ( LIT_MAGIC_STRING_LENGTH )
270
+ if (ecma_compare_ecma_string_to_magic_id ( property_name_p , LIT_MAGIC_STRING_LENGTH )
315
271
&& !(flags & ECMA_ARGUMENTS_OBJECT_LENGTH_INITIALIZED ))
316
272
{
317
- arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_LENGTH_INITIALIZED ;
318
-
319
273
prop_value_p = ecma_create_named_data_property (object_p ,
320
274
ecma_get_magic_string (LIT_MAGIC_STRING_LENGTH ),
321
- ECMA_PROPERTY_CONFIGURABLE_WRITABLE ,
275
+ ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_WRITABLE ,
322
276
& prop_p );
323
277
324
278
prop_value_p -> value = ecma_make_uint32_value (arguments_number );
279
+ return prop_p ;
325
280
}
326
281
327
- if (property_name_p == ecma_get_magic_string ( LIT_MAGIC_STRING_CALLEE )
282
+ if (ecma_compare_ecma_string_to_magic_id ( property_name_p , LIT_MAGIC_STRING_CALLEE )
328
283
&& !(flags & ECMA_ARGUMENTS_OBJECT_CALLEE_INITIALIZED ))
329
284
{
330
- arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_CALLEE_INITIALIZED ;
331
-
332
285
if (flags & ECMA_ARGUMENTS_OBJECT_MAPPED )
333
286
{
334
287
prop_value_p = ecma_create_named_data_property (object_p ,
335
288
property_name_p ,
336
- ECMA_PROPERTY_CONFIGURABLE_WRITABLE ,
289
+ ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_WRITABLE ,
337
290
& prop_p );
338
291
339
292
prop_value_p -> value = arguments_p -> callee ;
@@ -346,75 +299,120 @@ ecma_op_arguments_object_try_to_lazy_instantiate_property (ecma_object_t *object
346
299
ecma_get_magic_string (LIT_MAGIC_STRING_CALLEE ),
347
300
thrower_p ,
348
301
thrower_p ,
349
- ECMA_PROPERTY_FIXED ,
302
+ ECMA_PROPERTY_BUILT_IN_FIXED ,
350
303
& prop_p );
351
304
}
352
305
return prop_p ;
353
306
}
354
307
355
308
#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 ))
309
+ if (property_name_p == ecma_get_magic_string (LIT_MAGIC_STRING_CALLER ))
358
310
{
359
311
if (arguments_p -> header .u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_MAPPED )
360
312
{
361
313
return NULL ;
362
314
}
363
315
364
- arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_CALLER_INITIALIZED ;
365
-
366
316
ecma_object_t * thrower_p = ecma_builtin_get (ECMA_BUILTIN_ID_TYPE_ERROR_THROWER );
367
317
368
318
ecma_create_named_accessor_property (object_p ,
369
319
ecma_get_magic_string (LIT_MAGIC_STRING_CALLER ),
370
320
thrower_p ,
371
321
thrower_p ,
372
- ECMA_PROPERTY_FIXED ,
322
+ ECMA_PROPERTY_BUILT_IN_FIXED ,
373
323
& prop_p );
374
324
return prop_p ;
375
325
}
376
326
#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
327
+ if (ecma_op_compare_string_to_global_symbol (property_name_p , LIT_GLOBAL_SYMBOL_ITERATOR )
380
328
&& !(flags & ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED ))
381
329
{
382
- arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED ;
383
-
384
330
prop_value_p = ecma_create_named_data_property (object_p ,
385
- symbol_p ,
386
- ECMA_PROPERTY_CONFIGURABLE_WRITABLE ,
331
+ property_name_p ,
332
+ ECMA_PROPERTY_BUILT_IN_CONFIGURABLE_WRITABLE ,
387
333
& prop_p );
388
334
389
335
prop_value_p -> value = ecma_op_object_get_by_magic_id (ecma_builtin_get (ECMA_BUILTIN_ID_INTRINSIC_OBJECT ),
390
336
LIT_INTERNAL_MAGIC_STRING_ARRAY_PROTOTYPE_VALUES );
391
337
392
338
JERRY_ASSERT (ecma_is_value_object (prop_value_p -> value ));
393
339
ecma_deref_object (ecma_get_object_from_value (prop_value_p -> value ));
340
+ return prop_p ;
394
341
}
395
-
396
- ecma_deref_ecma_string (symbol_p );
397
342
#endif /* !JERRY_ESNEXT */
398
343
399
- return prop_p ;
344
+ return NULL ;
400
345
} /* ecma_op_arguments_object_try_to_lazy_instantiate_property */
401
346
347
+ /**
348
+ * Delete configurable properties of arguments object
349
+ */
350
+ void
351
+ ecma_op_arguments_delete_built_in_property (ecma_object_t * object_p , /**< the object */
352
+ ecma_string_t * property_name_p ) /**< property name */
353
+ {
354
+ ecma_unmapped_arguments_t * arguments_p = (ecma_unmapped_arguments_t * ) object_p ;
355
+
356
+ if (ecma_compare_ecma_string_to_magic_id (property_name_p , LIT_MAGIC_STRING_LENGTH ))
357
+ {
358
+ JERRY_ASSERT (!(arguments_p -> header .u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_LENGTH_INITIALIZED ));
359
+
360
+ arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_LENGTH_INITIALIZED ;
361
+ return ;
362
+ }
363
+
364
+ if (ecma_compare_ecma_string_to_magic_id (property_name_p , LIT_MAGIC_STRING_CALLEE ))
365
+ {
366
+ JERRY_ASSERT (!(arguments_p -> header .u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_CALLEE_INITIALIZED ));
367
+ JERRY_ASSERT (arguments_p -> header .u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_MAPPED );
368
+
369
+ arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_CALLEE_INITIALIZED ;
370
+ return ;
371
+ }
372
+
373
+ #if JERRY_ESNEXT
374
+ if (ecma_prop_name_is_symbol (property_name_p ))
375
+ {
376
+ JERRY_ASSERT (!(arguments_p -> header .u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED ));
377
+ JERRY_ASSERT (ecma_op_compare_string_to_global_symbol (property_name_p , LIT_GLOBAL_SYMBOL_ITERATOR ));
378
+
379
+ arguments_p -> header .u .cls .u1 .arguments_flags |= ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED ;
380
+ return ;
381
+ }
382
+ #endif /* JERRY_ESNEXT */
383
+
384
+ uint32_t index = ecma_string_get_array_index (property_name_p );
385
+
386
+ ecma_value_t * argv_p = (ecma_value_t * ) (arguments_p + 1 );
387
+
388
+ if (arguments_p -> header .u .cls .u1 .arguments_flags & ECMA_ARGUMENTS_OBJECT_MAPPED )
389
+ {
390
+ argv_p = (ecma_value_t * ) (((ecma_mapped_arguments_t * ) object_p ) + 1 );
391
+ }
392
+
393
+ JERRY_ASSERT (argv_p [index ] == ECMA_VALUE_ARGUMENT_INITIALIZED
394
+ || argv_p [index ] == ECMA_VALUE_ARGUMENT_NO_TRACK );
395
+
396
+ argv_p [index ] = ECMA_VALUE_EMPTY ;
397
+ } /* ecma_op_arguments_delete_built_in_property */
398
+
402
399
/**
403
400
* List names of an arguments object's lazy instantiated properties
404
401
*/
405
402
void
406
403
ecma_op_arguments_object_list_lazy_property_names (ecma_object_t * obj_p , /**< arguments object */
407
404
ecma_collection_t * prop_names_p , /**< prop name collection */
408
- ecma_property_counter_t * prop_counter_p ) /**< prop counter */
405
+ ecma_property_counter_t * prop_counter_p ) /**< property counters */
409
406
{
410
407
JERRY_ASSERT (ecma_object_class_is (obj_p , ECMA_OBJECT_CLASS_ARGUMENTS ));
411
408
412
409
ecma_unmapped_arguments_t * arguments_p = (ecma_unmapped_arguments_t * ) obj_p ;
413
410
414
- ecma_value_t * argv_p = (ecma_value_t * ) (arguments_p + 1 );
415
411
uint32_t arguments_number = arguments_p -> header .u .cls .u3 .arguments_number ;
416
412
uint8_t flags = arguments_p -> header .u .cls .u1 .arguments_flags ;
417
413
414
+ ecma_value_t * argv_p = (ecma_value_t * ) (arguments_p + 1 );
415
+
418
416
if (flags & ECMA_ARGUMENTS_OBJECT_MAPPED )
419
417
{
420
418
argv_p = (ecma_value_t * ) (((ecma_mapped_arguments_t * ) obj_p ) + 1 );
@@ -443,19 +441,21 @@ ecma_op_arguments_object_list_lazy_property_names (ecma_object_t *obj_p, /**< ar
443
441
}
444
442
445
443
#if !JERRY_ESNEXT
446
- if (!(flags & ( ECMA_ARGUMENTS_OBJECT_CALLER_INITIALIZED | ECMA_ARGUMENTS_OBJECT_MAPPED ) ))
444
+ if (!(flags & ECMA_ARGUMENTS_OBJECT_MAPPED ))
447
445
{
448
446
ecma_collection_push_back (prop_names_p , ecma_make_magic_string_value (LIT_MAGIC_STRING_CALLER ));
449
447
prop_counter_p -> string_named_props ++ ;
450
448
}
451
- #else /* JERRY_ESNEXT */
449
+ #endif /* !JERRY_ESNEXT */
450
+
451
+ #if JERRY_ESNEXT
452
452
if (!(flags & ECMA_ARGUMENTS_OBJECT_ITERATOR_INITIALIZED ))
453
453
{
454
454
ecma_string_t * symbol_p = ecma_op_get_global_symbol (LIT_GLOBAL_SYMBOL_ITERATOR );
455
455
ecma_collection_push_back (prop_names_p , ecma_make_symbol_value (symbol_p ));
456
456
prop_counter_p -> symbol_named_props ++ ;
457
457
}
458
- #endif /* ! JERRY_ESNEXT */
458
+ #endif /* JERRY_ESNEXT */
459
459
} /* ecma_op_arguments_object_list_lazy_property_names */
460
460
461
461
/**
0 commit comments