diff --git a/jerry-core/parser/js/opcodes-dumper.cpp b/jerry-core/parser/js/opcodes-dumper.cpp index 0ef1a03cf..c9e1b95bb 100644 --- a/jerry-core/parser/js/opcodes-dumper.cpp +++ b/jerry-core/parser/js/opcodes-dumper.cpp @@ -755,6 +755,41 @@ dumper_finish_scope (void) STACK_DROP (temp_names, 1); } +/** + * Handle start of argument preparation instruction sequence generation + * + * Note: + * Values of registers, allocated for the code sequence, are not used outside of the sequence, + * so they can be reused, reducing register pressure. + * + * To reuse the registers, counter of register allocator is saved, and restored then, + * after finishing generation of the code sequence, using dumper_finish_varg_code_sequence. + * + * FIXME: + * Implement general register allocation mechanism + * + * See also: + * dumper_finish_varg_code_sequence + */ +void +dumper_start_varg_code_sequence (void) +{ + STACK_PUSH (temp_names, temp_name); +} /* dumper_start_varg_code_sequence */ + +/** + * Handle finish of argument preparation instruction sequence generation + * + * See also: + * dumper_start_varg_code_sequence + */ +void +dumper_finish_varg_code_sequence (void) +{ + temp_name = STACK_TOP (temp_names); + STACK_DROP (temp_names, 1); +} /* dumper_finish_varg_code_sequence */ + /** * Check that byte-code operand refers to 'eval' string * diff --git a/jerry-core/parser/js/opcodes-dumper.h b/jerry-core/parser/js/opcodes-dumper.h index 548d5ea14..12058fc80 100644 --- a/jerry-core/parser/js/opcodes-dumper.h +++ b/jerry-core/parser/js/opcodes-dumper.h @@ -58,6 +58,8 @@ void dumper_free (void); void dumper_new_statement (void); void dumper_new_scope (void); void dumper_finish_scope (void); +void dumper_start_varg_code_sequence (void); +void dumper_finish_varg_code_sequence (void); extern bool dumper_is_eval_literal (operand); diff --git a/jerry-core/parser/js/parser.cpp b/jerry-core/parser/js/parser.cpp index d4527b37e..f09b4b5ed 100644 --- a/jerry-core/parser/js/parser.cpp +++ b/jerry-core/parser/js/parser.cpp @@ -521,6 +521,8 @@ parse_argument_list (varg_list_type vlt, operand obj, uint8_t *args_count, opera skip_newlines (); while (!token_is (close_tt)) { + dumper_start_varg_code_sequence (); + operand op; if (vlt == VARG_FUNC_DECL @@ -572,6 +574,8 @@ parse_argument_list (varg_list_type vlt, operand obj, uint8_t *args_count, opera } args_num++; + + dumper_finish_varg_code_sequence (); } if (args_count != NULL)