41
41
* @return pointer to newly created Arguments object
42
42
*/
43
43
ecma_object_t *
44
- ecma_create_arguments_object (ecma_object_t *func_obj_p, /* *< callee function */
45
- ecma_object_t *lex_env_p, /* *< lexical environment the Arguments
46
- object is created for */
47
- ecma_collection_iterator_t *formal_params_iter_p, /* *< formal parameters
48
- collection iterator */
49
- const ecma_value_t *arguments_list_p, /* *< list of arguments */
50
- ecma_length_t arguments_list_length, /* *< length of arguments' list */
51
- bool is_strict) /* *< flag indicating whether strict mode is enabled */
44
+ ecma_op_create_arguments_object (ecma_object_t *func_obj_p, /* *< callee function */
45
+ ecma_object_t *lex_env_p, /* *< lexical environment the Arguments
46
+ object is created for */
47
+ ecma_collection_header_t *formal_params_p, /* *< formal parameters collection */
48
+ const ecma_value_t *arguments_list_p, /* *< list of arguments */
49
+ ecma_length_t arguments_list_length, /* *< length of arguments' list */
50
+ bool is_strict) /* *< flag indicating whether strict mode is enabled */
52
51
{
53
52
// 1.
54
53
ecma_number_t *len_p = ecma_alloc_number ();
@@ -110,7 +109,7 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
110
109
prop_desc.is_configurable = true ;
111
110
}
112
111
113
- ecma_string_t *indx_string_p = ecma_new_ecma_string_from_number ( ecma_uint32_to_number ( indx) );
112
+ ecma_string_t *indx_string_p = ecma_new_ecma_string_from_uint32 ( indx);
114
113
115
114
completion = ecma_op_object_define_own_property (obj_p,
116
115
indx_string_p,
@@ -121,7 +120,11 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
121
120
ecma_deref_ecma_string (indx_string_p);
122
121
}
123
122
124
- const ecma_length_t formal_params_number = formal_params_iter_p->header_p ->unit_number ;
123
+ const ecma_length_t formal_params_number = formal_params_p->unit_number ;
124
+
125
+ ecma_collection_iterator_t formal_params_iterator;
126
+ ecma_collection_iterator_init (&formal_params_iterator, formal_params_p);
127
+
125
128
if (!is_strict
126
129
&& arguments_list_length > 0
127
130
&& formal_params_number > 0 )
@@ -132,17 +135,17 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
132
135
// 11.c
133
136
MEM_DEFINE_LOCAL_ARRAY (formal_params, formal_params_number, ecma_string_t *);
134
137
135
- JERRY_ASSERT (formal_params_iter_p-> current_value_p == NULL );
138
+ JERRY_ASSERT (formal_params_iterator. current_value_p == NULL );
136
139
uint32_t param_index;
137
140
for (param_index = 0 ;
138
- ecma_collection_iterator_next (formal_params_iter_p );
141
+ ecma_collection_iterator_next (&formal_params_iterator );
139
142
param_index++)
140
143
{
141
- JERRY_ASSERT (formal_params_iter_p-> current_value_p != NULL );
144
+ JERRY_ASSERT (formal_params_iterator. current_value_p != NULL );
142
145
JERRY_ASSERT (param_index < formal_params_number);
143
146
144
- JERRY_ASSERT (ecma_is_value_string (*formal_params_iter_p-> current_value_p ));
145
- formal_params[param_index] = ecma_get_string_from_value (*formal_params_iter_p-> current_value_p );
147
+ JERRY_ASSERT (ecma_is_value_string (*formal_params_iterator. current_value_p ));
148
+ formal_params[param_index] = ecma_get_string_from_value (*formal_params_iterator. current_value_p );
146
149
}
147
150
JERRY_ASSERT (param_index == formal_params_number);
148
151
@@ -162,17 +165,22 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
162
165
if (ecma_compare_ecma_strings (name_p, formal_params[indx2]))
163
166
{
164
167
is_first_occurence = false ;
168
+
169
+ break ;
165
170
}
166
171
}
167
172
168
173
if (is_first_occurence)
169
174
{
170
- ecma_string_t *indx_string_p = ecma_new_ecma_string_from_number ( ecma_uint32_to_number (( uint32_t ) indx) );
175
+ ecma_string_t *indx_string_p = ecma_new_ecma_string_from_uint32 (( uint32_t ) indx);
171
176
172
177
prop_desc = ecma_make_empty_property_descriptor ();
173
178
{
174
179
prop_desc.is_value_defined = true ;
175
180
prop_desc.value = ecma_make_string_value (name_p);
181
+
182
+ prop_desc.is_configurable_defined = true ;
183
+ prop_desc.is_configurable = true ;
176
184
}
177
185
178
186
completion = ecma_op_object_define_own_property (map_p,
@@ -264,11 +272,14 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
264
272
}
265
273
266
274
return obj_p;
267
- } /* ecma_create_arguments_object */
275
+ } /* ecma_op_create_arguments_object */
268
276
269
277
/* *
270
278
* Get value of function's argument mapped to index of Arguments object.
271
279
*
280
+ * Note:
281
+ * The procedure emulates execution of function described by MakeArgGetter
282
+ *
272
283
* @return completion value
273
284
* Returned value must be freed with ecma_free_completion_value
274
285
*/
@@ -437,32 +448,36 @@ ecma_op_arguments_object_define_own_property (ecma_object_t *obj_p, /**< the obj
437
448
// i.
438
449
if (property_desc_p->is_value_defined )
439
450
{
440
- completion = ecma_op_object_put (map_p,
441
- property_name_p,
442
- property_desc_p->value ,
443
- is_throw);
444
- }
451
+ /* emulating execution of function described by MakeArgSetter */
452
+ ecma_property_t *scope_prop_p = ecma_get_internal_property (map_p, ECMA_INTERNAL_PROPERTY_SCOPE);
453
+ ecma_object_t *lex_env_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t ,
454
+ scope_prop_p->u .internal_property .value );
445
455
446
- if (unlikely (ecma_is_completion_value_throw (completion)))
447
- {
448
- ret_value = completion;
456
+ ecma_property_t *mapped_prop_p = ecma_op_object_get_own_property (map_p, property_name_p);
457
+ ecma_value_t arg_name_prop_value = ecma_get_named_data_property_value (mapped_prop_p);
458
+
459
+ ecma_string_t *arg_name_p = ecma_get_string_from_value (arg_name_prop_value);
460
+
461
+ completion = ecma_op_set_mutable_binding (lex_env_p,
462
+ arg_name_p,
463
+ property_desc_p->value ,
464
+ true );
465
+ JERRY_ASSERT (ecma_is_completion_value_empty (completion));
449
466
}
450
- else
451
- {
452
- // ii.
453
- if (property_desc_p->is_writable_defined
454
- && !property_desc_p->is_writable )
455
- {
456
- completion = ecma_op_object_delete (map_p,
457
- property_name_p,
458
- false );
459
467
460
- JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
461
- }
468
+ // ii.
469
+ if (property_desc_p->is_writable_defined
470
+ && !property_desc_p->is_writable )
471
+ {
472
+ completion = ecma_op_object_delete (map_p,
473
+ property_name_p,
474
+ false );
462
475
463
- // 6.
464
- ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
476
+ JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
465
477
}
478
+
479
+ // 6.
480
+ ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
466
481
}
467
482
}
468
483
else
0 commit comments