diff --git a/src/libcoreint/interpreter.c b/src/libcoreint/interpreter.c index d3bc21132..a9a4d5e74 100644 --- a/src/libcoreint/interpreter.c +++ b/src/libcoreint/interpreter.c @@ -46,7 +46,7 @@ run_int (void) { JERRY_ASSERT( __program != NULL ); - const int start_pos = 0; + const interp_bytecode_idx start_pos = 0; ecma_object_t *this_binding_p = NULL; ecma_object_t *lex_env_p = ecma_create_lexical_environment (NULL, ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE); @@ -88,7 +88,7 @@ run_int (void) } ecma_completion_value_t -run_int_from_pos (int start_pos, +run_int_from_pos (interp_bytecode_idx start_pos, ecma_object_t *this_binding_p, ecma_object_t *lex_env_p, bool is_strict) @@ -111,7 +111,7 @@ run_int_from_pos (int start_pos, JERRY_ASSERT( ecma_is_value_empty( regs[0]) ); struct __int_data int_data; - int_data.pos = start_pos + 1; + int_data.pos = (interp_bytecode_idx) (start_pos + 1); int_data.this_binding_p = this_binding_p; int_data.lex_env_p = lex_env_p; int_data.is_strict = is_strict; diff --git a/src/libcoreint/interpreter.h b/src/libcoreint/interpreter.h index 253b77565..d82473b10 100644 --- a/src/libcoreint/interpreter.h +++ b/src/libcoreint/interpreter.h @@ -20,9 +20,11 @@ #include "globals.h" #include "opcodes.h" +typedef uint16_t interp_bytecode_idx; + struct __int_data { - int pos; /**< current opcode to execute */ + interp_bytecode_idx pos; /**< current opcode to execute */ ecma_object_t *this_binding_p; /**< this binding for current context */ ecma_object_t *lex_env_p; /**< current lexical environment */ bool is_strict; /**< is current code execution mode strict? */ @@ -33,7 +35,7 @@ struct __int_data void init_int (const OPCODE* program_p); bool run_int (void); -ecma_completion_value_t run_int_from_pos (int start_pos, +ecma_completion_value_t run_int_from_pos (interp_bytecode_idx start_pos, ecma_object_t *this_binding_p, ecma_object_t *lex_env_p, bool is_strict); diff --git a/src/libcoreint/opcodes.c b/src/libcoreint/opcodes.c index e9161574f..2f67101c8 100644 --- a/src/libcoreint/opcodes.c +++ b/src/libcoreint/opcodes.c @@ -564,7 +564,9 @@ ecma_completion_value_t opfunc_jmp_down (OPCODE opdata, /**< operation data */ struct __int_data *int_data) /**< interpreter context */ { - int_data->pos += opdata.data.jmp_down.opcode_count; + JERRY_ASSERT( int_data->pos <= int_data->pos + opdata.data.jmp_up.opcode_count ); + + int_data->pos = (interp_bytecode_idx) ( int_data->pos + opdata.data.jmp_down.opcode_count ); return ecma_make_empty_completion_value(); } /* opfunc_jmp_down */ @@ -579,9 +581,9 @@ ecma_completion_value_t opfunc_jmp_up (OPCODE opdata, /**< operation data */ struct __int_data *int_data) /**< interpreter context */ { - int_data->pos -= opdata.data.jmp_up.opcode_count; + JERRY_ASSERT( int_data->pos >= opdata.data.jmp_up.opcode_count ); - JERRY_ASSERT( int_data->pos >= 0 ); + int_data->pos = (interp_bytecode_idx) ( int_data->pos - opdata.data.jmp_down.opcode_count ); return ecma_make_empty_completion_value(); } /* opfunc_jmp_up */