From 7daabb1974baeaee3eb578dcf046077c5e2dd000 Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Tue, 4 Aug 2015 15:56:24 +0300 Subject: [PATCH] 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 --- .../base/ecma-helpers-values-collection.cpp | 15 ++-- .../builtin-objects/ecma-builtin-function.cpp | 7 +- .../ecma/operations/ecma-function-object.cpp | 74 ++++++++----------- .../ecma/operations/ecma-function-object.h | 6 +- .../operations/ecma-objects-arguments.cpp | 6 +- jerry-core/vm/opcodes-ecma-support.h | 6 +- jerry-core/vm/opcodes-varg.cpp | 17 +++-- jerry-core/vm/opcodes.cpp | 38 ++-------- 8 files changed, 68 insertions(+), 101 deletions(-) diff --git a/jerry-core/ecma/base/ecma-helpers-values-collection.cpp b/jerry-core/ecma/base/ecma-helpers-values-collection.cpp index 227e29fa3..c1a56a851 100644 --- a/jerry-core/ecma/base/ecma-helpers-values-collection.cpp +++ b/jerry-core/ecma/base/ecma-helpers-values-collection.cpp @@ -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 */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-function.cpp b/jerry-core/ecma/builtin-objects/ecma-builtin-function.cpp index fdc093de5..6a4d9698d 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-function.cpp +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-function.cpp @@ -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, diff --git a/jerry-core/ecma/operations/ecma-function-object.cpp b/jerry-core/ecma/operations/ecma-function-object.cpp index fea564eb7..6dbc2ad93 100644 --- a/jerry-core/ecma/operations/ecma-function-object.cpp +++ b/jerry-core/ecma/operations/ecma-function-object.cpp @@ -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, diff --git a/jerry-core/ecma/operations/ecma-function-object.h b/jerry-core/ecma/operations/ecma-function-object.h index 533f97f75..a2a7779b5 100644 --- a/jerry-core/ecma/operations/ecma-function-object.h +++ b/jerry-core/ecma/operations/ecma-function-object.h @@ -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); diff --git a/jerry-core/ecma/operations/ecma-objects-arguments.cpp b/jerry-core/ecma/operations/ecma-objects-arguments.cpp index f7a8a5a53..915bb3457 100644 --- a/jerry-core/ecma/operations/ecma-objects-arguments.cpp +++ b/jerry-core/ecma/operations/ecma-objects-arguments.cpp @@ -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); diff --git a/jerry-core/vm/opcodes-ecma-support.h b/jerry-core/vm/opcodes-ecma-support.h index 148376db4..cc988cca5 100644 --- a/jerry-core/vm/opcodes-ecma-support.h +++ b/jerry-core/vm/opcodes-ecma-support.h @@ -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 */ diff --git a/jerry-core/vm/opcodes-varg.cpp b/jerry-core/vm/opcodes-varg.cpp index 1b31ee2d9..05df61835 100644 --- a/jerry-core/vm/opcodes-varg.cpp +++ b/jerry-core/vm/opcodes-varg.cpp @@ -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 */ diff --git a/jerry-core/vm/opcodes.cpp b/jerry-core/vm/opcodes.cpp index 2a8cdebd7..ac982b8f0 100644 --- a/jerry-core/vm/opcodes.cpp +++ b/jerry-core/vm/opcodes.cpp @@ -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;