23
23
#include " ecma-lex-env.h"
24
24
#include " ecma-objects.h"
25
25
#include " ecma-objects-general.h"
26
+ #include " ecma-objects-arguments.h"
26
27
#include " ecma-try-catch-macro.h"
27
28
#include " jrt.h"
28
29
@@ -379,60 +380,58 @@ ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Functio
379
380
formal_parameters_p = ECMA_GET_POINTER (ecma_collection_header_t ,
380
381
formal_parameters_prop_p->u .internal_property .value );
381
382
382
- if (formal_parameters_p = = NULL )
383
+ if (formal_parameters_p ! = NULL )
383
384
{
384
- return ecma_make_empty_completion_value ();
385
- }
386
-
387
- ecma_length_t formal_parameters_count = formal_parameters_p->unit_number ;
385
+ ecma_length_t formal_parameters_count = formal_parameters_p->unit_number ;
388
386
389
- ecma_collection_iterator_t formal_params_iterator;
390
- ecma_collection_iterator_init (&formal_params_iterator, formal_parameters_p);
387
+ ecma_collection_iterator_t formal_params_iterator;
388
+ ecma_collection_iterator_init (&formal_params_iterator, formal_parameters_p);
391
389
392
- for (size_t n = 0 ;
393
- n < formal_parameters_count;
394
- n++)
395
- {
396
- ecma_value_t v;
397
- if (n >= arguments_list_len)
390
+ for (size_t n = 0 ;
391
+ n < formal_parameters_count;
392
+ n++)
398
393
{
399
- v = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
400
- }
401
- else
402
- {
403
- v = arguments_list_p[n];
404
- }
394
+ ecma_value_t v;
395
+ if (n >= arguments_list_len)
396
+ {
397
+ v = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
398
+ }
399
+ else
400
+ {
401
+ v = arguments_list_p[n];
402
+ }
405
403
406
- bool is_moved = ecma_collection_iterator_next (&formal_params_iterator);
407
- JERRY_ASSERT (is_moved);
404
+ bool is_moved = ecma_collection_iterator_next (&formal_params_iterator);
405
+ JERRY_ASSERT (is_moved);
408
406
409
- ecma_value_t formal_parameter_name_value = *formal_params_iterator.current_value_p ;
410
- ecma_string_t *formal_parameter_name_string_p = ecma_get_string_from_value (formal_parameter_name_value);
407
+ ecma_value_t formal_parameter_name_value = *formal_params_iterator.current_value_p ;
408
+ ecma_string_t *formal_parameter_name_string_p = ecma_get_string_from_value (formal_parameter_name_value);
411
409
412
- bool arg_already_declared = ecma_op_has_binding (env_p, formal_parameter_name_string_p);
413
- if (!arg_already_declared)
414
- {
415
- ecma_completion_value_t completion = ecma_op_create_mutable_binding (env_p,
416
- formal_parameter_name_string_p,
417
- false );
418
- if (ecma_is_completion_value_throw (completion))
410
+ bool arg_already_declared = ecma_op_has_binding (env_p, formal_parameter_name_string_p);
411
+ if (!arg_already_declared)
419
412
{
420
- return completion;
421
- }
413
+ ecma_completion_value_t completion = ecma_op_create_mutable_binding (env_p,
414
+ formal_parameter_name_string_p,
415
+ false );
416
+ if (ecma_is_completion_value_throw (completion))
417
+ {
418
+ return completion;
419
+ }
422
420
423
- JERRY_ASSERT (ecma_is_completion_value_empty (completion));
421
+ JERRY_ASSERT (ecma_is_completion_value_empty (completion));
424
422
425
- completion = ecma_op_set_mutable_binding (env_p,
426
- formal_parameter_name_string_p,
427
- v,
428
- is_strict);
423
+ completion = ecma_op_set_mutable_binding (env_p,
424
+ formal_parameter_name_string_p,
425
+ v,
426
+ is_strict);
429
427
430
- if (ecma_is_completion_value_throw (completion))
431
- {
432
- return completion;
433
- }
428
+ if (ecma_is_completion_value_throw (completion))
429
+ {
430
+ return completion;
431
+ }
434
432
435
- JERRY_ASSERT (ecma_is_completion_value_empty (completion));
433
+ JERRY_ASSERT (ecma_is_completion_value_empty (completion));
434
+ }
436
435
}
437
436
}
438
437
@@ -451,7 +450,43 @@ ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Functio
451
450
* so instantiation of Arguments object here, in general, is supposed to not affect resource consumption
452
451
* significantly.
453
452
*/
454
- JERRY_UNIMPLEMENTED (" Instantiate Arguments object and setup 'arguments' implicit variable" );
453
+
454
+ ecma_string_t *arguments_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_ARGUMENTS);
455
+
456
+ bool binding_already_declared = ecma_op_has_binding (env_p, arguments_string_p);
457
+
458
+ if (!binding_already_declared)
459
+ {
460
+ ecma_object_t *args_obj_p = ecma_op_create_arguments_object (func_obj_p,
461
+ env_p,
462
+ formal_parameters_p,
463
+ arguments_list_p,
464
+ arguments_list_len,
465
+ is_strict);
466
+
467
+ if (is_strict)
468
+ {
469
+ ecma_op_create_immutable_binding (env_p, arguments_string_p);
470
+ ecma_op_initialize_immutable_binding (env_p, arguments_string_p, ecma_make_object_value (args_obj_p));
471
+ }
472
+ else
473
+ {
474
+ ecma_completion_value_t completion = ecma_op_create_mutable_binding (env_p,
475
+ arguments_string_p,
476
+ false );
477
+ JERRY_ASSERT (ecma_is_completion_value_empty (completion));
478
+
479
+ completion = ecma_op_set_mutable_binding (env_p,
480
+ arguments_string_p,
481
+ ecma_make_object_value (args_obj_p),
482
+ false );
483
+ JERRY_ASSERT (ecma_is_completion_value_empty (completion));
484
+ }
485
+
486
+ ecma_deref_object (args_obj_p);
487
+ }
488
+
489
+ ecma_deref_ecma_string (arguments_string_p);
455
490
}
456
491
457
492
return ecma_make_empty_completion_value ();
0 commit comments