2323#include " ecma-lex-env.h"
2424#include " ecma-objects.h"
2525#include " ecma-objects-general.h"
26+ #include " ecma-objects-arguments.h"
2627#include " ecma-try-catch-macro.h"
2728#include " jrt.h"
2829
@@ -379,60 +380,58 @@ ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Functio
379380 formal_parameters_p = ECMA_GET_POINTER (ecma_collection_header_t ,
380381 formal_parameters_prop_p->u .internal_property .value );
381382
382- if (formal_parameters_p = = NULL )
383+ if (formal_parameters_p ! = NULL )
383384 {
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 ;
388386
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);
391389
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++)
398393 {
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+ }
405403
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);
408406
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);
411409
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)
419412 {
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+ }
422420
423- JERRY_ASSERT (ecma_is_completion_value_empty (completion));
421+ JERRY_ASSERT (ecma_is_completion_value_empty (completion));
424422
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);
429427
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+ }
434432
435- JERRY_ASSERT (ecma_is_completion_value_empty (completion));
433+ JERRY_ASSERT (ecma_is_completion_value_empty (completion));
434+ }
436435 }
437436 }
438437
@@ -451,7 +450,43 @@ ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Functio
451450 * so instantiation of Arguments object here, in general, is supposed to not affect resource consumption
452451 * significantly.
453452 */
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);
455490 }
456491
457492 return ecma_make_empty_completion_value ();
0 commit comments