/* Copyright 2014-2015 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef OPCODES_DUMPER_H #define OPCODES_DUMPER_H #include "ecma-globals.h" #include "lexer.h" #include "opcodes.h" #include "scopes-tree.h" #include "serializer.h" /** * Operand (descriptor of value or reference in context of parser) */ class jsp_operand_t { public: enum type_t : uint8_t { EMPTY, /**< empty operand */ LITERAL, /**< operand contains literal value */ TMP, /**< operand contains byte-code register index */ UNINITIALIZED /**< uninitialized operand * * Note: * For use only in assertions to check that operands * are initialized before actual usage */ }; /** * Construct operand template */ jsp_operand_t (void) { #ifndef JERRY_NDEBUG _type = jsp_operand_t::UNINITIALIZED; #endif /* !JERRY_NDEBUG */ } /* jsp_operand_t */ /** * Construct empty operand * * @return constructed operand */ static jsp_operand_t make_empty_operand (void) { jsp_operand_t ret; ret._type = jsp_operand_t::EMPTY; return ret; } /* make_empty_operand */ /** * Construct literal operand * * @return constructed operand */ static jsp_operand_t make_lit_operand (lit_cpointer_t lit_id) /**< literal identifier */ { JERRY_ASSERT (lit_id.packed_value != NOT_A_LITERAL.packed_value); jsp_operand_t ret; ret._type = jsp_operand_t::LITERAL; ret._data.lit_id = lit_id; return ret; } /* make_lit_operand */ /** * Construct register operand * * @return constructed operand */ static jsp_operand_t make_reg_operand (vm_idx_t reg_index) /**< register index */ { /* * The following check currently leads to 'comparison is always true * due to limited range of data type' warning, so it is turned off. * * If VM_IDX_GENERAL_VALUE_FIRST is changed to value greater than 0, * the check should be restored. */ // JERRY_ASSERT (reg_index >= VM_IDX_GENERAL_VALUE_FIRST); static_assert (VM_IDX_GENERAL_VALUE_FIRST == 0, "See comment above"); JERRY_ASSERT (reg_index <= VM_IDX_GENERAL_VALUE_LAST); jsp_operand_t ret; ret._type = jsp_operand_t::TMP; ret._data.uid = reg_index; return ret; } /* make_reg_operand */ /** * Is it empty operand? * * @return true / false */ bool is_empty_operand (void) const { JERRY_ASSERT (_type != jsp_operand_t::UNINITIALIZED); return (_type == jsp_operand_t::EMPTY); } /* is_empty_operand */ /** * Is it byte-code register operand? * * @return true / false */ bool is_register_operand (void) const { JERRY_ASSERT (_type != jsp_operand_t::UNINITIALIZED); return (_type == jsp_operand_t::TMP); } /* is_register_operand */ /** * Is it literal operand? * * @return true / false */ bool is_literal_operand (void) const { JERRY_ASSERT (_type != jsp_operand_t::UNINITIALIZED); return (_type == jsp_operand_t::LITERAL); } /* is_literal_operand */ /** * Get idx for operand * * @return VM_IDX_REWRITE_LITERAL_UID (for jsp_operand_t::LITERAL), * or register index (for jsp_operand_t::TMP). */ vm_idx_t get_idx (void) const { JERRY_ASSERT (_type != jsp_operand_t::UNINITIALIZED); if (_type == jsp_operand_t::TMP) { return _data.uid; } else if (_type == jsp_operand_t::LITERAL) { return VM_IDX_REWRITE_LITERAL_UID; } else { JERRY_ASSERT (_type == jsp_operand_t::EMPTY); return VM_IDX_EMPTY; } } /* get_idx */ /** * Get literal from operand * * @return literal identifier (for jsp_operand_t::LITERAL), * or NOT_A_LITERAL (for jsp_operand_t::TMP). */ lit_cpointer_t get_literal (void) const { JERRY_ASSERT (_type != jsp_operand_t::UNINITIALIZED); if (_type == jsp_operand_t::TMP) { return NOT_A_LITERAL; } else if (_type == jsp_operand_t::LITERAL) { return _data.lit_id; } else { JERRY_ASSERT (_type == jsp_operand_t::EMPTY); return NOT_A_LITERAL; } } /* get_literal */ private: union { vm_idx_t uid; /**< byte-code register index (for jsp_operand_t::TMP) */ lit_cpointer_t lit_id; /**< literal (for jsp_operand_t::LITERAL) */ } _data; type_t _type; /**< type of operand */ }; typedef enum __attr_packed___ { VARG_FUNC_DECL, VARG_FUNC_EXPR, VARG_ARRAY_DECL, VARG_OBJ_DECL, VARG_CONSTRUCT_EXPR, VARG_CALL_EXPR } varg_list_type; jsp_operand_t empty_operand (void); jsp_operand_t literal_operand (lit_cpointer_t); jsp_operand_t eval_ret_operand (void); jsp_operand_t jsp_create_operand_for_in_special_reg (void); bool operand_is_empty (jsp_operand_t); void dumper_init (void); void dumper_free (void); bool dumper_try_replace_var_with_reg (scopes_tree, op_meta *); 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 (jsp_operand_t); jsp_operand_t dump_array_hole_assignment_res (void); void dump_boolean_assignment (jsp_operand_t, bool); jsp_operand_t dump_boolean_assignment_res (bool); void dump_string_assignment (jsp_operand_t, lit_cpointer_t); jsp_operand_t dump_string_assignment_res (lit_cpointer_t); void dump_number_assignment (jsp_operand_t, lit_cpointer_t); jsp_operand_t dump_number_assignment_res (lit_cpointer_t); void dump_regexp_assignment (jsp_operand_t, lit_cpointer_t); jsp_operand_t dump_regexp_assignment_res (lit_cpointer_t); void dump_smallint_assignment (jsp_operand_t, vm_idx_t); jsp_operand_t dump_smallint_assignment_res (vm_idx_t); void dump_undefined_assignment (jsp_operand_t); jsp_operand_t dump_undefined_assignment_res (void); void dump_null_assignment (jsp_operand_t); jsp_operand_t dump_null_assignment_res (void); void dump_variable_assignment (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_variable_assignment_res (jsp_operand_t); void dump_varg_header_for_rewrite (varg_list_type, jsp_operand_t); jsp_operand_t rewrite_varg_header_set_args_count (size_t); void dump_call_additional_info (opcode_call_flags_t, jsp_operand_t); void dump_varg (jsp_operand_t); void dump_prop_name_and_value (jsp_operand_t, jsp_operand_t); void dump_prop_getter_decl (jsp_operand_t, jsp_operand_t); void dump_prop_setter_decl (jsp_operand_t, jsp_operand_t); void dump_prop_getter (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_prop_getter_res (jsp_operand_t, jsp_operand_t); void dump_prop_setter (jsp_operand_t, jsp_operand_t, jsp_operand_t); void dump_function_end_for_rewrite (void); void rewrite_function_end (); void dump_this (jsp_operand_t); jsp_operand_t dump_this_res (void); void dump_post_increment (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_post_increment_res (jsp_operand_t); void dump_post_decrement (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_post_decrement_res (jsp_operand_t); void dump_pre_increment (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_pre_increment_res (jsp_operand_t); void dump_pre_decrement (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_pre_decrement_res (jsp_operand_t); void dump_unary_plus (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_unary_plus_res (jsp_operand_t); void dump_unary_minus (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_unary_minus_res (jsp_operand_t); void dump_bitwise_not (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_bitwise_not_res (jsp_operand_t); void dump_logical_not (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_logical_not_res (jsp_operand_t); void dump_multiplication (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_multiplication_res (jsp_operand_t, jsp_operand_t); void dump_division (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_division_res (jsp_operand_t, jsp_operand_t); void dump_remainder (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_remainder_res (jsp_operand_t, jsp_operand_t); void dump_addition (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_addition_res (jsp_operand_t, jsp_operand_t); void dump_substraction (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_substraction_res (jsp_operand_t, jsp_operand_t); void dump_left_shift (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_left_shift_res (jsp_operand_t, jsp_operand_t); void dump_right_shift (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_right_shift_res (jsp_operand_t, jsp_operand_t); void dump_right_shift_ex (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_right_shift_ex_res (jsp_operand_t, jsp_operand_t); void dump_less_than (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_less_than_res (jsp_operand_t, jsp_operand_t); void dump_greater_than (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_greater_than_res (jsp_operand_t, jsp_operand_t); void dump_less_or_equal_than (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_less_or_equal_than_res (jsp_operand_t, jsp_operand_t); void dump_greater_or_equal_than (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_greater_or_equal_than_res (jsp_operand_t, jsp_operand_t); void dump_instanceof (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_instanceof_res (jsp_operand_t, jsp_operand_t); void dump_in (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_in_res (jsp_operand_t, jsp_operand_t); void dump_equal_value (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_equal_value_res (jsp_operand_t, jsp_operand_t); void dump_not_equal_value (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_not_equal_value_res (jsp_operand_t, jsp_operand_t); void dump_equal_value_type (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_equal_value_type_res (jsp_operand_t, jsp_operand_t); void dump_not_equal_value_type (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_not_equal_value_type_res (jsp_operand_t, jsp_operand_t); void dump_bitwise_and (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_bitwise_and_res (jsp_operand_t, jsp_operand_t); void dump_bitwise_xor (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_bitwise_xor_res (jsp_operand_t, jsp_operand_t); void dump_bitwise_or (jsp_operand_t, jsp_operand_t, jsp_operand_t); jsp_operand_t dump_bitwise_or_res (jsp_operand_t, jsp_operand_t); void start_dumping_logical_and_checks (void); void dump_logical_and_check_for_rewrite (jsp_operand_t); void rewrite_logical_and_checks (void); void start_dumping_logical_or_checks (void); void dump_logical_or_check_for_rewrite (jsp_operand_t); void rewrite_logical_or_checks (void); void dump_conditional_check_for_rewrite (jsp_operand_t); void rewrite_conditional_check (void); void dump_jump_to_end_for_rewrite (void); void rewrite_jump_to_end (void); void start_dumping_assignment_expression (void); jsp_operand_t dump_prop_setter_or_variable_assignment_res (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_prop_setter_or_addition_res (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_prop_setter_or_multiplication_res (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_prop_setter_or_division_res (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_prop_setter_or_remainder_res (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_prop_setter_or_substraction_res (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_prop_setter_or_left_shift_res (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_prop_setter_or_right_shift_res (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_prop_setter_or_right_shift_ex_res (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_prop_setter_or_bitwise_and_res (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_prop_setter_or_bitwise_xor_res (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_prop_setter_or_bitwise_or_res (jsp_operand_t, jsp_operand_t); void dumper_set_break_target (void); void dumper_set_continue_target (void); void dumper_set_next_interation_target (void); vm_instr_counter_t dump_simple_or_nested_jump_for_rewrite (bool is_simple_jump, vm_instr_counter_t next_jump_for_tg_oc); vm_instr_counter_t rewrite_simple_or_nested_jump_and_get_next (vm_instr_counter_t jump_oc, vm_instr_counter_t target_oc); void dump_continue_iterations_check (jsp_operand_t); void start_dumping_case_clauses (void); void dump_case_clause_check_for_rewrite (jsp_operand_t, jsp_operand_t); void dump_default_clause_check_for_rewrite (void); void rewrite_case_clause (void); void rewrite_default_clause (void); void finish_dumping_case_clauses (void); void dump_delete (jsp_operand_t, jsp_operand_t, bool, locus); jsp_operand_t dump_delete_res (jsp_operand_t, bool, locus); void dump_typeof (jsp_operand_t, jsp_operand_t); jsp_operand_t dump_typeof_res (jsp_operand_t); vm_instr_counter_t dump_with_for_rewrite (jsp_operand_t); void rewrite_with (vm_instr_counter_t); void dump_with_end (void); vm_instr_counter_t dump_for_in_for_rewrite (jsp_operand_t); void rewrite_for_in (vm_instr_counter_t); void dump_for_in_end (void); void dump_try_for_rewrite (void); void rewrite_try (void); void dump_catch_for_rewrite (jsp_operand_t); void rewrite_catch (void); void dump_finally_for_rewrite (void); void rewrite_finally (void); void dump_end_try_catch_finally (void); void dump_throw (jsp_operand_t); bool dumper_variable_declaration_exists (lit_cpointer_t); void dump_variable_declaration (lit_cpointer_t); vm_instr_counter_t dump_scope_code_flags_for_rewrite (void); void rewrite_scope_code_flags (vm_instr_counter_t scope_code_flags_oc, opcode_scope_code_flags_t scope_flags); void dump_reg_var_decl_for_rewrite (void); void rewrite_reg_var_decl (void); void dump_ret (void); void dump_retval (jsp_operand_t op); #endif /* OPCODES_DUMPER_H */