diff --git a/src/libcoreint/interpreter.c b/src/libcoreint/interpreter.c index 0c96e0b81..d841fdf6f 100644 --- a/src/libcoreint/interpreter.c +++ b/src/libcoreint/interpreter.c @@ -18,8 +18,6 @@ void gen_bytecode () { - __int_data.pos = 0; - /* while (true) { LEDToggle (LED3); @@ -34,12 +32,12 @@ gen_bytecode () wait(500); } */ - save_op_data (getop_loop_inf (1)); - save_op_data (getop_call_1 (0, 12)); - save_op_data (getop_call_1 (0, 13)); - save_op_data (getop_call_1 (0, 14)); - save_op_data (getop_call_1 (0, 15)); - save_op_data (getop_jmp (0)); + save_op_data (0, getop_loop_inf (1)); + save_op_data (1, getop_call_1 (0, 12)); + save_op_data (2, getop_call_1 (0, 13)); + save_op_data (3, getop_call_1 (0, 14)); + save_op_data (4, getop_call_1 (0, 15)); + save_op_data (5, getop_jmp (0)); #ifdef __MCU // It's mandatory to restart app! @@ -50,10 +48,9 @@ gen_bytecode () void init_int () { -#define INIT_OP_FUNC(name) __int_data.func[ name ] = opfunc_##name ; +#define INIT_OP_FUNC(name) __opfuncs[ name ] = opfunc_##name ; JERRY_STATIC_ASSERT (sizeof (OPCODE) <= 4); - __int_data.pos = 0; OP_LIST (INIT_OP_FUNC) } @@ -62,9 +59,18 @@ run_int () { init_int (); + struct __int_data int_data; + int_data.pos = 0; + while (true) { - OPCODE *curr = &__program[__int_data.pos]; - __int_data.func[curr->op_idx](*curr); + run_int_from_pos(&int_data); } } + +void +run_int_from_pos (struct __int_data *int_data) +{ + OPCODE *curr = &__program[int_data->pos]; + __opfuncs[curr->op_idx](*curr, int_data); +} diff --git a/src/libcoreint/interpreter.h b/src/libcoreint/interpreter.h index 545939d76..01916337f 100644 --- a/src/libcoreint/interpreter.h +++ b/src/libcoreint/interpreter.h @@ -26,14 +26,17 @@ OPCODE __program[128]; -struct { - int pos; - opfunc func[LAST_OP]; - int *root_op_addr; -} __int_data; +opfunc __opfuncs[LAST_OP]; -void gen_bytecode(); -void run_int(); +struct __int_data +{ + int pos; + int *root_op_addr; +}; + +void gen_bytecode (); +void run_int (); +void run_int_from_pos (struct __int_data *); #endif /* INTERPRETER_H */ diff --git a/src/libcoreint/opcode-structures.h b/src/libcoreint/opcode-structures.h index 592c27377..3416e012f 100644 --- a/src/libcoreint/opcode-structures.h +++ b/src/libcoreint/opcode-structures.h @@ -17,7 +17,12 @@ #define OPCODE_STRUCTURES_H // Jerry bytecode ver:07/04/2014 -#define OP_DEF(name, list) struct __op_##name { list ; } +#define OP_DEF(name, list) struct __op_##name { list ; } ; + + +#define OP_CODE_DECL_VOID(name) \ + struct __op_##name { }; \ + OPCODE getop_##name (); #define OP_CODE_DECL(name, type, ... ) \ OP_DEF (name, type##_DECL( __VA_ARGS__ ) ); \ @@ -321,6 +326,7 @@ OP_CODE_DECL (varg_3_end, T_IDX_IDX_IDX, /** return value; */ OP_CODE_DECL (retval, T_IDX, ret_value); +OP_CODE_DECL_VOID (ret); // LOOPS // Lately, all loops should be translated into different JMPs in an optimizer. @@ -363,7 +369,6 @@ OP_CODE_DECL (loop_postcond, T_IDX_IDX, condition, body_root); -//// TODO ///** for vars...in iter, state, ctl */ //OP_CODE_DECL (loop_init, T_IDX_IDX_IDX, // start_idx, stop_idx, step_idx); @@ -374,6 +379,7 @@ OP_CODE_DECL (loop_postcond, T_IDX_IDX, //OP_CODE_DECL (loop_cond_pre_end, T_IDX, // iterator, body_root); +// Property accessors (array, objects, strings) /** Array ops for ILMIR*/ //OP_CODE_DECL (array_copy, T_IDX_IDX, /** L = R */ // var_left, var_right); @@ -382,5 +388,15 @@ OP_CODE_DECL (loop_postcond, T_IDX_IDX, //OP_CODE_DECL (array_get, T_IDX_IDX_IDX, /** dst = array[index] */ // dst, array, index); +//// TODO + +// Variable declarations +// TODO New constructor + + + + + + #endif /* OPCODE_STRUCTURES_H */ diff --git a/src/libcoreint/opcodes.c b/src/libcoreint/opcodes.c index 4eb2f9ec1..50b2e1070 100644 --- a/src/libcoreint/opcodes.c +++ b/src/libcoreint/opcodes.c @@ -18,100 +18,101 @@ #include "interpreter.h" void -save_op_data (OPCODE opdata) +save_op_data (int pos, OPCODE opdata) { - __program[__int_data.pos++] = opdata; + __program[pos] = opdata; } -void opfunc_loop_init_num (OPCODE opdata) { unreachable (); } -void opfunc_loop_precond_begin_num (OPCODE opdata) { unreachable (); } -void opfunc_loop_precond_end_num (OPCODE opdata) { unreachable (); } -void opfunc_loop_postcond (OPCODE opdata) { unreachable (); } -void opfunc_call_2 (OPCODE opdata) { unreachable (); } -void opfunc_call_n (OPCODE opdata) { unreachable (); } -void opfunc_func_decl_1 (OPCODE opdata) { unreachable (); } -void opfunc_func_decl_2 (OPCODE opdata) { unreachable (); } -void opfunc_func_decl_n (OPCODE opdata) { unreachable (); } -void opfunc_varg_1 (OPCODE opdata) { unreachable (); } -void opfunc_varg_1_end (OPCODE opdata) { unreachable (); } -void opfunc_varg_2 (OPCODE opdata) { unreachable (); } -void opfunc_varg_2_end (OPCODE opdata) { unreachable (); } -void opfunc_varg_3 (OPCODE opdata) { unreachable (); } -void opfunc_varg_3_end (OPCODE opdata) { unreachable (); } -void opfunc_retval (OPCODE opdata) { unreachable (); } -void opfunc_assignment (OPCODE opdata) { unreachable (); } -void opfunc_assignment_multiplication (OPCODE opdata) { unreachable (); } -void opfunc_assignment_devision (OPCODE opdata) { unreachable (); } -void opfunc_assignment_remainder (OPCODE opdata) { unreachable (); } -void opfunc_assignment_addition (OPCODE opdata) { unreachable (); } -void opfunc_assignment_substruction (OPCODE opdata) { unreachable (); } -void opfunc_assignment_shift_left (OPCODE opdata) { unreachable (); } -void opfunc_assignment_shift_right (OPCODE opdata) { unreachable (); } -void opfunc_assignment_shift_uright (OPCODE opdata) { unreachable (); } -void opfunc_assignment_b_and (OPCODE opdata) { unreachable (); } -void opfunc_assignment_b_xor (OPCODE opdata) { unreachable (); } -void opfunc_assignment_b_or (OPCODE opdata) { unreachable (); } -void opfunc_logical_and (OPCODE opdata) { unreachable (); } -void opfunc_logical_or (OPCODE opdata) { unreachable (); } -void opfunc_b_and (OPCODE opdata) { unreachable (); } -void opfunc_b_or (OPCODE opdata) { unreachable (); } -void opfunc_b_xor (OPCODE opdata) { unreachable (); } -void opfunc_b_shift_left (OPCODE opdata) { unreachable (); } -void opfunc_b_shift_right (OPCODE opdata) { unreachable (); } -void opfunc_b_shift_uright (OPCODE opdata) { unreachable (); } -void opfunc_addition (OPCODE opdata) { unreachable (); } -void opfunc_substraction (OPCODE opdata) { unreachable (); } -void opfunc_division (OPCODE opdata) { unreachable (); } -void opfunc_multiplication (OPCODE opdata) { unreachable (); } -void opfunc_remainder (OPCODE opdata) { unreachable (); } -void opfunc_jmp_up (OPCODE opdata) { unreachable (); } -void opfunc_jmp_down (OPCODE opdata) { unreachable (); } -void opfunc_is_true_jmp (OPCODE opdata) { unreachable (); } -void opfunc_is_false_jmp (OPCODE opdata) { unreachable (); } -void opfunc_is_less_than (OPCODE opdata) { unreachable (); } -void opfunc_is_less_or_equal (OPCODE opdata) { unreachable (); } -void opfunc_is_greater_than (OPCODE opdata) { unreachable (); } -void opfunc_is_greater_or_equal (OPCODE opdata) { unreachable (); } -void opfunc_is_equal_value (OPCODE opdata) { unreachable (); } -void opfunc_is_not_equal_value (OPCODE opdata) { unreachable (); } -void opfunc_is_equal_value_type (OPCODE opdata) { unreachable (); } -void opfunc_is_not_equal_value_type (OPCODE opdata) { unreachable (); } +void opfunc_loop_init_num (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_loop_precond_begin_num (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_loop_precond_end_num (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_loop_postcond (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_call_2 (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_call_n (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_func_decl_1 (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_func_decl_2 (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_func_decl_n (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_varg_1 (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_varg_1_end (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_varg_2 (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_varg_2_end (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_varg_3 (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_varg_3_end (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_retval (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_ret (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_assignment (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_assignment_multiplication (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_assignment_devision (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_assignment_remainder (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_assignment_addition (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_assignment_substruction (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_assignment_shift_left (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_assignment_shift_right (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_assignment_shift_uright (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_assignment_b_and (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_assignment_b_xor (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_assignment_b_or (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_logical_and (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_logical_or (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_b_and (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_b_or (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_b_xor (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_b_shift_left (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_b_shift_right (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_b_shift_uright (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_addition (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_substraction (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_division (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_multiplication (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_remainder (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_jmp_up (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_jmp_down (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_is_true_jmp (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_is_false_jmp (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_is_less_than (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_is_less_or_equal (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_is_greater_than (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_is_greater_or_equal (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_is_equal_value (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_is_not_equal_value (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_is_equal_value_type (OPCODE opdata, struct __int_data *int_data) { unreachable (); } +void opfunc_is_not_equal_value_type (OPCODE opdata, struct __int_data *int_data) { unreachable (); } void -opfunc_loop_inf (OPCODE opdata) +opfunc_loop_inf (OPCODE opdata, struct __int_data *int_data) { #ifdef __HOST printf ("%d::loop_inf:idx:%d\n", - __int_data.pos, + int_data->pos, opdata.data.loop_inf.loop_root); #endif - __int_data.pos = opdata.data.loop_inf.loop_root; + int_data->pos = opdata.data.loop_inf.loop_root; } void -opfunc_call_1 (OPCODE opdata) +opfunc_call_1 (OPCODE opdata, struct __int_data *int_data) { #ifdef __HOST printf ("%d::op_call_1:idx:%d:%d\n", - __int_data.pos, + int_data->pos, opdata.data.call_1.name_lit_idx, opdata.data.call_1.arg1_lit_idx); #endif - __int_data.pos++; + int_data->pos++; } void -opfunc_jmp (OPCODE opdata) +opfunc_jmp (OPCODE opdata, struct __int_data *int_data) { #ifdef __HOST printf ("%d::op_jmp:idx:%d\n", - __int_data.pos, + int_data->pos, opdata.data.jmp.opcode_idx); #endif - __int_data.pos = opdata.data.jmp.opcode_idx; + int_data->pos = opdata.data.jmp.opcode_idx; } OPCODE diff --git a/src/libcoreint/opcodes.h b/src/libcoreint/opcodes.h index a48ba9e26..fd027e7c8 100644 --- a/src/libcoreint/opcodes.h +++ b/src/libcoreint/opcodes.h @@ -23,10 +23,11 @@ #include "globals.h" #define OPCODE struct __opcode +struct __int_data; #define OP_STRUCT_FIELD(name) struct __op_##name name; #define OP_ENUM_FIELD(name) name , -#define OP_FUNC_DECL(name) void opfunc_##name (OPCODE); +#define OP_FUNC_DECL(name) void opfunc_##name (OPCODE, struct __int_data *); /** A single bytecode instruction is 32bit wide and has an 8bit opcode field and several operand of 8 of 16 bit.*/ @@ -35,7 +36,7 @@ #define T_IDX uint8_t /** index values */ OPCODE; -typedef void (*opfunc)(OPCODE); +typedef void (*opfunc)(OPCODE, struct __int_data *); #define OP_LOOPS(op) \ op(loop_inf) \ @@ -57,7 +58,8 @@ typedef void (*opfunc)(OPCODE); op(varg_2_end) \ op(varg_3) \ op(varg_3_end) \ - op(retval) + op(retval)\ + op(ret) #define OP_ASSIGNMENTS(op) \ op(assignment) \ @@ -147,7 +149,7 @@ OPCODE } __packed; -void save_op_data (OPCODE); +void save_op_data (int, OPCODE); #endif /* OPCODES_H */