Change fill_params_list to append formal parameter names to ecma-values collection, instead of array; rename it to vm_fill_params_list.

JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com
This commit is contained in:
Ruben Ayrapetyan 2015-08-04 15:56:24 +03:00
parent 72ce13a63a
commit 7daabb1974
8 changed files with 68 additions and 101 deletions

View File

@ -258,26 +258,21 @@ ecma_collection_header_t *
ecma_new_strings_collection (ecma_string_t *string_ptrs_buffer[], /**< pointers to ecma-strings */
ecma_length_t strings_number) /**< number of ecma-strings */
{
JERRY_ASSERT (string_ptrs_buffer != NULL);
JERRY_ASSERT (strings_number > 0);
JERRY_ASSERT (string_ptrs_buffer != NULL || strings_number == 0);
ecma_collection_header_t *new_collection_p;
MEM_DEFINE_LOCAL_ARRAY (values_buffer, strings_number, ecma_value_t);
new_collection_p = ecma_new_values_collection (NULL, 0, false);
for (ecma_length_t string_index = 0;
string_index < strings_number;
string_index++)
{
values_buffer[string_index] = ecma_make_string_value (string_ptrs_buffer[string_index]);
ecma_append_to_values_collection (new_collection_p,
ecma_make_string_value (string_ptrs_buffer[string_index]),
false);
}
new_collection_p = ecma_new_values_collection (values_buffer,
strings_number,
false);
MEM_FINALIZE_LOCAL_ARRAY (values_buffer);
return new_collection_p;
} /* ecma_new_strings_collection */

View File

@ -306,8 +306,11 @@ ecma_builtin_function_dispatch_construct (const ecma_value_t *arguments_list_p,
/* 11. */
ecma_object_t *glob_lex_env_p = ecma_get_global_environment ();
ecma_object_t *func_obj_p = ecma_op_create_function_object (params_count > 1u ? string_params_p : NULL,
(ecma_length_t) (params_count - 1u),
ecma_collection_header_t *formal_params_collection_p;
formal_params_collection_p = ecma_new_strings_collection (params_count > 1u ? string_params_p : NULL,
(ecma_length_t) (params_count - 1u));
ecma_object_t *func_obj_p = ecma_op_create_function_object (formal_params_collection_p,
glob_lex_env_p,
is_strict,
do_instantiate_arguments_object,

View File

@ -215,8 +215,12 @@ ecma_function_bind_merge_arg_lists (ecma_object_t *func_obj_p, /**< Function obj
* @return pointer to newly created Function object
*/
ecma_object_t*
ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< formal parameters list */
ecma_length_t formal_parameters_number, /**< formal parameters list's length */
ecma_op_create_function_object (ecma_collection_header_t *formal_params_collection_p, /**< formal parameters collection
* Warning:
* the collection should not
* be changed / used / freed
* by caller after passing it
* to the routine */
ecma_object_t *scope_p, /**< function's scope */
bool is_strict, /**< 'strict' flag */
bool do_instantiate_arguments_object, /**< should an Arguments object be instantiated
@ -253,26 +257,7 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
// 10., 11.
ecma_property_t *formal_parameters_prop_p = ecma_create_internal_property (f,
ECMA_INTERNAL_PROPERTY_FORMAL_PARAMETERS);
if (formal_parameters_number != 0)
{
/*
* Reverse formal parameter list
*/
for (ecma_length_t i = 0; i < formal_parameters_number / 2; i++)
{
ecma_string_t *tmp_p = formal_parameter_list_p[i];
formal_parameter_list_p[i] = formal_parameter_list_p[formal_parameters_number - 1u - i];
formal_parameter_list_p[formal_parameters_number - 1u - i] = tmp_p;
}
ecma_collection_header_t *formal_parameters_collection_p = ecma_new_strings_collection (formal_parameter_list_p,
formal_parameters_number);
ECMA_SET_POINTER (formal_parameters_prop_p->u.internal_property.value, formal_parameters_collection_p);
}
else
{
JERRY_ASSERT (formal_parameters_prop_p->u.internal_property.value == ECMA_NULL_POINTER);
}
ECMA_SET_POINTER (formal_parameters_prop_p->u.internal_property.value, formal_params_collection_p);
// 12.
ecma_property_t *bytecode_prop_p = ecma_create_internal_property (f, ECMA_INTERNAL_PROPERTY_CODE_BYTECODE);
@ -285,7 +270,7 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
// 14.
ecma_number_t* len_p = ecma_alloc_number ();
*len_p = ecma_uint32_to_number (formal_parameters_number);
*len_p = ecma_uint32_to_number (formal_params_collection_p != NULL ? formal_params_collection_p->unit_number : 0);
// 15.
ecma_property_descriptor_t length_prop_desc = ecma_make_empty_property_descriptor ();
@ -478,12 +463,12 @@ ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Functio
*
* In the case, redundant SetMutableBinding invocation could be avoided.
*/
for (ssize_t n = (ssize_t) formal_parameters_count - 1;
n >= 0;
n--)
for (ecma_length_t n = 0;
n < formal_parameters_count;
n++)
{
ecma_value_t v;
if (n >= (ssize_t) arguments_list_len)
if (n >= arguments_list_len)
{
v = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
}
@ -510,19 +495,19 @@ ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Functio
}
JERRY_ASSERT (ecma_is_completion_value_empty (completion));
completion = ecma_op_set_mutable_binding (env_p,
formal_parameter_name_string_p,
v,
is_strict);
if (ecma_is_completion_value_throw (completion))
{
return completion;
}
JERRY_ASSERT (ecma_is_completion_value_empty (completion));
}
ecma_completion_value_t completion = ecma_op_set_mutable_binding (env_p,
formal_parameter_name_string_p,
v,
is_strict);
if (ecma_is_completion_value_throw (completion))
{
return completion;
}
JERRY_ASSERT (ecma_is_completion_value_empty (completion));
}
}
@ -1023,8 +1008,12 @@ ecma_op_function_declaration (ecma_object_t *lex_env_p, /**< lexical environment
const vm_instr_t *instrs_p, /**< byte-code array */
vm_instr_counter_t function_first_instr_pos, /**< position of first instruction
* of function code */
ecma_string_t* formal_parameter_list_p[], /**< formal parameters list */
ecma_length_t formal_parameter_list_length, /**< length of formal parameters list */
ecma_collection_header_t *formal_params_collection_p, /**< formal parameters collection
* Warning:
* the collection should not
* be changed / used / freed
* by caller after passing it
* to the routine */
bool is_strict, /**< flag indicating if function is declared in strict mode code */
bool do_instantiate_arguments_object, /**< flag, indicating whether an Arguments object
* should be instantiated for the function object
@ -1033,8 +1022,7 @@ ecma_op_function_declaration (ecma_object_t *lex_env_p, /**< lexical environment
* is declared in eval code */
{
// b.
ecma_object_t *func_obj_p = ecma_op_create_function_object (formal_parameter_list_p,
formal_parameter_list_length,
ecma_object_t *func_obj_p = ecma_op_create_function_object (formal_params_collection_p,
lex_env_p,
is_strict,
do_instantiate_arguments_object,

View File

@ -30,8 +30,7 @@ extern bool ecma_op_is_callable (ecma_value_t value);
extern bool ecma_is_constructor (ecma_value_t value);
extern ecma_object_t*
ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[],
ecma_length_t formal_parameters_number,
ecma_op_create_function_object (ecma_collection_header_t *formal_params_collection_p,
ecma_object_t *scope_p,
bool is_strict,
bool do_instantiate_arguments_object,
@ -60,8 +59,7 @@ ecma_op_function_declaration (ecma_object_t *lex_env_p,
ecma_string_t *function_name_p,
const vm_instr_t *instrs_p,
vm_instr_counter_t function_code_opcode_idx,
ecma_string_t* formal_parameter_list_p[],
ecma_length_t formal_parameter_list_length,
ecma_collection_header_t *formal_params_collection_p,
bool is_strict,
bool do_instantiate_arguments_object,
bool is_configurable_bindings);

View File

@ -138,6 +138,7 @@ ecma_op_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function
MEM_DEFINE_LOCAL_ARRAY (formal_params, formal_params_number, ecma_string_t *);
JERRY_ASSERT (formal_params_iterator.current_value_p == NULL);
uint32_t param_index;
for (param_index = 0;
ecma_collection_iterator_next (&formal_params_iterator);
@ -149,10 +150,7 @@ ecma_op_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function
JERRY_ASSERT (ecma_is_value_string (*formal_params_iterator.current_value_p));
ecma_string_t *param_name_p = ecma_get_string_from_value (*formal_params_iterator.current_value_p);
/*
* Formal parameter list is stored in reversed order
*/
formal_params[formal_params_number - 1u - param_index] = param_name_p;
formal_params[param_index] = param_name_p;
}
JERRY_ASSERT (param_index == formal_params_number);

View File

@ -40,7 +40,7 @@ ecma_completion_value_t set_variable_value (vm_frame_ctx_t *, vm_instr_counter_t
ecma_completion_value_t vm_fill_varg_list (vm_frame_ctx_t *frame_ctx_p,
ecma_length_t args_number,
ecma_collection_header_t *args_values_p);
void fill_params_list (vm_frame_ctx_t *frame_ctx_p,
ecma_length_t params_number,
ecma_string_t* params_names[]);
extern void vm_fill_params_list (vm_frame_ctx_t *frame_ctx_p,
ecma_length_t params_number,
ecma_collection_header_t *formal_params_collection_p);
#endif /* OPCODES_ECMA_SUPPORT_H */

View File

@ -70,9 +70,10 @@ vm_fill_varg_list (vm_frame_ctx_t *frame_ctx_p, /**< interpreter context */
* Fill parameters' list
*/
void
fill_params_list (vm_frame_ctx_t *frame_ctx_p, /**< interpreter context */
ecma_length_t params_number, /**< number of parameters */
ecma_string_t* params_names[]) /**< out: parameters' names */
vm_fill_params_list (vm_frame_ctx_t *frame_ctx_p, /**< interpreter context */
ecma_length_t params_number, /**< number of parameters */
ecma_collection_header_t *formal_params_collection_p) /**< collection to fill with
* parameters' names */
{
uint32_t param_index;
for (param_index = 0;
@ -87,10 +88,16 @@ fill_params_list (vm_frame_ctx_t *frame_ctx_p, /**< interpreter context */
frame_ctx_p->instrs_p,
frame_ctx_p->pos);
params_names[param_index] = ecma_new_ecma_string_from_lit_cp (param_name_lit_idx);
ecma_string_t *param_name_str_p = ecma_new_ecma_string_from_lit_cp (param_name_lit_idx);
ecma_value_t param_name_value = ecma_make_string_value (param_name_str_p);
ecma_append_to_values_collection (formal_params_collection_p, param_name_value, false);
ecma_deref_ecma_string (param_name_str_p);
frame_ctx_p->pos++;
}
JERRY_ASSERT (param_index == params_number);
} /* fill_params_list */
} /* vm_fill_params_list */

View File

@ -478,8 +478,7 @@ opfunc_var_decl (vm_instr_t instr, /**< instruction */
static ecma_completion_value_t
function_declaration (vm_frame_ctx_t *frame_ctx_p, /**< interpreter context */
lit_cpointer_t function_name_lit_cp, /**< compressed pointer to literal with function name */
ecma_string_t* args_names[], /**< names of arguments */
ecma_length_t args_number) /**< number of arguments */
ecma_collection_header_t *formal_params_collection_p) /** formal parameters collection */
{
bool is_strict = frame_ctx_p->is_strict;
bool do_instantiate_arguments_object = true;
@ -510,8 +509,7 @@ function_declaration (vm_frame_ctx_t *frame_ctx_p, /**< interpreter context */
function_name_string_p,
frame_ctx_p->instrs_p,
frame_ctx_p->pos,
args_names,
args_number,
formal_params_collection_p,
is_strict,
do_instantiate_arguments_object,
is_configurable_bindings);
@ -543,23 +541,13 @@ opfunc_func_decl_n (vm_instr_t instr, /**< instruction */
ecma_completion_value_t ret_value;
MEM_DEFINE_LOCAL_ARRAY (params_names, params_number, ecma_string_t*);
ecma_collection_header_t *formal_params_collection_p = ecma_new_values_collection (NULL, 0, false);
fill_params_list (frame_ctx_p, params_number, params_names);
vm_fill_params_list (frame_ctx_p, params_number, formal_params_collection_p);
ret_value = function_declaration (frame_ctx_p,
function_name_lit_cp,
params_names,
params_number);
for (uint32_t param_index = 0;
param_index < params_number;
param_index++)
{
ecma_deref_ecma_string (params_names[param_index]);
}
MEM_FINALIZE_LOCAL_ARRAY (params_names);
formal_params_collection_p);
return ret_value;
} /* opfunc_func_decl_n */
@ -587,9 +575,9 @@ opfunc_func_expr_n (vm_instr_t instr, /**< instruction */
vm_instr_counter_t function_code_end_oc;
MEM_DEFINE_LOCAL_ARRAY (params_names, params_number, ecma_string_t*);
ecma_collection_header_t *formal_params_collection_p = ecma_new_values_collection (NULL, 0, false);
fill_params_list (frame_ctx_p, params_number, params_names);
vm_fill_params_list (frame_ctx_p, params_number, formal_params_collection_p);
bool is_strict = frame_ctx_p->is_strict;
bool do_instantiate_arguments_object = true;
@ -634,8 +622,7 @@ opfunc_func_expr_n (vm_instr_t instr, /**< instruction */
ecma_ref_object (scope_p);
}
ecma_object_t *func_obj_p = ecma_op_create_function_object (params_names,
params_number,
ecma_object_t *func_obj_p = ecma_op_create_function_object (formal_params_collection_p,
scope_p,
is_strict,
do_instantiate_arguments_object,
@ -657,15 +644,6 @@ opfunc_func_expr_n (vm_instr_t instr, /**< instruction */
ecma_deref_object (func_obj_p);
ecma_deref_object (scope_p);
for (uint32_t param_index = 0;
param_index < params_number;
param_index++)
{
ecma_deref_ecma_string (params_names[param_index]);
}
MEM_FINALIZE_LOCAL_ARRAY (params_names);
frame_ctx_p->pos = function_code_end_oc;
return ret_value;