Skip to content

Commit 74ac051

Browse files
Instantiation of Arguments object.
JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan [email protected]
1 parent a0e06cc commit 74ac051

File tree

6 files changed

+315
-156
lines changed

6 files changed

+315
-156
lines changed

jerry-core/ecma/operations/ecma-function-object.cpp

Lines changed: 78 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
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

Comments
 (0)