diff --git a/jerry-core/parser/js/bytecode-data.h b/jerry-core/parser/js/bytecode-data.h index e741d463d7..9696af4344 100644 --- a/jerry-core/parser/js/bytecode-data.h +++ b/jerry-core/parser/js/bytecode-data.h @@ -43,6 +43,7 @@ typedef struct __attribute__ ((aligned (MEM_ALIGNMENT))) mem_cpointer_t lit_id_hash_cp; /**< pointer to literal identifiers hash table * See also: lit_id_hash_table_init */ mem_cpointer_t next_opcodes_cp; /**< pointer to next byte-code memory region */ + opcode_counter_t instructions_number; /**< number of instructions in the byte-code array */ } opcodes_header_t; typedef struct diff --git a/jerry-core/parser/js/serializer.cpp b/jerry-core/parser/js/serializer.cpp index 03073a4eea..a40a30aa3c 100644 --- a/jerry-core/parser/js/serializer.cpp +++ b/jerry-core/parser/js/serializer.cpp @@ -33,16 +33,27 @@ serializer_get_op_meta (opcode_counter_t oc) return scopes_tree_op_meta (current_scope, oc); } +/** + * Get byte-code instruction from current scope, or specified byte-code array + * + * @return byte-code instruction + */ opcode_t -serializer_get_opcode (opcode_counter_t oc) +serializer_get_opcode (const opcode_t *opcodes_p, /**< pointer to byte-code array (or NULL, + * if instruction should be taken from + * instruction list of current scope) */ + opcode_counter_t oc) /**< opcode counter of the intruction */ { - if (bytecode_data.opcodes == NULL) + if (opcodes_p == NULL) { return serializer_get_op_meta (oc).op; } - JERRY_ASSERT (oc < bytecode_data.opcodes_count); - return bytecode_data.opcodes[oc]; -} + else + { + JERRY_ASSERT (oc < GET_BYTECODE_HEADER (opcodes_p)->instructions_number); + return opcodes_p[oc]; + } +} /* serializer_get_opcode */ /** * Convert literal id (operand value of instruction) to compressed pointer to literal @@ -85,7 +96,7 @@ serializer_merge_scopes_into_bytecode (void) const size_t buckets_count = scopes_tree_count_literals_in_blocks (current_scope); const size_t blocks_count = (size_t) bytecode_data.opcodes_count / BLOCK_SIZE + 1; - const size_t opcodes_count = scopes_tree_count_opcodes (current_scope); + const opcode_counter_t opcodes_count = scopes_tree_count_opcodes (current_scope); const size_t opcodes_array_size = JERRY_ALIGNUP (sizeof (opcodes_header_t) + opcodes_count * sizeof (opcode_t), MEM_ALIGNMENT); @@ -104,6 +115,7 @@ serializer_merge_scopes_into_bytecode (void) opcodes_header_t *header_p = (opcodes_header_t*) buffer_p; MEM_CP_SET_POINTER (header_p->next_opcodes_cp, bytecode_data.opcodes); + header_p->instructions_number = opcodes_count; bytecode_data.opcodes = opcodes_p; if (print_opcodes) @@ -125,7 +137,7 @@ serializer_dump_op_meta (op_meta op) #ifdef JERRY_ENABLE_PRETTY_PRINTER if (print_opcodes) { - pp_op_meta ((opcode_counter_t) (scopes_tree_opcodes_num (current_scope) - 1), op, false); + pp_op_meta (NULL, (opcode_counter_t) (scopes_tree_opcodes_num (current_scope) - 1), op, false); } #endif } @@ -156,7 +168,7 @@ serializer_rewrite_op_meta (const opcode_counter_t loc, op_meta op) #ifdef JERRY_ENABLE_PRETTY_PRINTER if (print_opcodes) { - pp_op_meta (loc, op, true); + pp_op_meta (NULL, loc, op, true); } #endif } @@ -176,7 +188,7 @@ serializer_print_opcodes (const opcode_t *opcodes_p, opm.lit_id[i] = NOT_A_LITERAL; } - pp_op_meta (loc, opm, false); + pp_op_meta (opcodes_p, loc, opm, false); } #else (void) opcodes_p; diff --git a/jerry-core/parser/js/serializer.h b/jerry-core/parser/js/serializer.h index 87331e3db1..cc7f346946 100644 --- a/jerry-core/parser/js/serializer.h +++ b/jerry-core/parser/js/serializer.h @@ -25,7 +25,7 @@ void serializer_init (); void serializer_set_show_opcodes (bool show_opcodes); op_meta serializer_get_op_meta (opcode_counter_t); -opcode_t serializer_get_opcode (opcode_counter_t); +opcode_t serializer_get_opcode (const opcode_t*, opcode_counter_t); lit_cpointer_t serializer_get_literal_cp_by_uid (uint8_t, const opcode_t*, opcode_counter_t); void serializer_set_strings_buffer (const ecma_char_t *); void serializer_set_scope (scopes_tree); diff --git a/jerry-core/vm/pretty-printer.cpp b/jerry-core/vm/pretty-printer.cpp index e39c27e14e..f510bfc496 100644 --- a/jerry-core/vm/pretty-printer.cpp +++ b/jerry-core/vm/pretty-printer.cpp @@ -179,7 +179,10 @@ dump_asm (opcode_counter_t oc, opcode_t opcode) } void -pp_op_meta (opcode_counter_t oc, op_meta opm, bool rewrite) +pp_op_meta (const opcode_t *opcodes_p, + opcode_counter_t oc, + op_meta opm, + bool rewrite) { dump_asm (oc, opm.op); printf (" // "); @@ -393,7 +396,7 @@ pp_op_meta (opcode_counter_t oc, op_meta opm, bool rewrite) while ((int16_t) start >= 0 && !found) { start--; - switch (serializer_get_opcode (start).op_idx) + switch (serializer_get_opcode (opcodes_p, start).op_idx) { case NAME_TO_ID (call_n): case NAME_TO_ID (native_call): @@ -408,7 +411,7 @@ pp_op_meta (opcode_counter_t oc, op_meta opm, bool rewrite) } } } - opcode_t start_op = serializer_get_opcode (start); + opcode_t start_op = serializer_get_opcode (opcodes_p, start); switch (start_op.op_idx) { case NAME_TO_ID (call_n): @@ -470,7 +473,7 @@ pp_op_meta (opcode_counter_t oc, op_meta opm, bool rewrite) } for (opcode_counter_t counter = start; counter <= oc; counter++) { - opcode_t meta_op = serializer_get_opcode (counter); + opcode_t meta_op = serializer_get_opcode (opcodes_p, counter); switch (meta_op.op_idx) { diff --git a/jerry-core/vm/pretty-printer.h b/jerry-core/vm/pretty-printer.h index 8dcfb3d9aa..596fc76e17 100644 --- a/jerry-core/vm/pretty-printer.h +++ b/jerry-core/vm/pretty-printer.h @@ -22,7 +22,7 @@ #include "scopes-tree.h" void pp_opcode (opcode_counter_t, opcode_t, bool); -void pp_op_meta (opcode_counter_t, op_meta, bool); +void pp_op_meta (const opcode_t*, opcode_counter_t, op_meta, bool); #endif // JERRY_ENABLE_PRETTY_PRINTER #endif // PRETTY_PRINTER