vm: Add rudimentary bytecode execution tracing capability.
This commit is contained in:
parent
4c6b375960
commit
c5e32c6995
1
py/bc.h
1
py/bc.h
|
@ -13,6 +13,7 @@ typedef struct _mp_exc_stack {
|
||||||
mp_vm_return_kind_t mp_execute_byte_code(const byte *code, const mp_obj_t *args, uint n_args, const mp_obj_t *args2, uint n_args2, mp_obj_t *ret);
|
mp_vm_return_kind_t mp_execute_byte_code(const byte *code, const mp_obj_t *args, uint n_args, const mp_obj_t *args2, uint n_args2, mp_obj_t *ret);
|
||||||
mp_vm_return_kind_t mp_execute_byte_code_2(const byte *code_info, const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t **sp_in_out, mp_exc_stack_t *exc_stack, mp_exc_stack_t **exc_sp_in_out, volatile mp_obj_t inject_exc);
|
mp_vm_return_kind_t mp_execute_byte_code_2(const byte *code_info, const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t **sp_in_out, mp_exc_stack_t *exc_stack, mp_exc_stack_t **exc_sp_in_out, volatile mp_obj_t inject_exc);
|
||||||
void mp_byte_code_print(const byte *code, int len);
|
void mp_byte_code_print(const byte *code, int len);
|
||||||
|
void mp_byte_code_print2(const byte *code, int len);
|
||||||
|
|
||||||
// Helper macros to access pointer with least significant bit holding a flag
|
// Helper macros to access pointer with least significant bit holding a flag
|
||||||
#define MP_TAGPTR_PTR(x) ((void*)((machine_uint_t)(x) & ~((machine_uint_t)1)))
|
#define MP_TAGPTR_PTR(x) ((void*)((machine_uint_t)(x) & ~((machine_uint_t)1)))
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
ip += sizeof(machine_uint_t); \
|
ip += sizeof(machine_uint_t); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
void mp_byte_code_print2(const byte *ip, int len);
|
||||||
|
|
||||||
void mp_byte_code_print(const byte *ip, int len) {
|
void mp_byte_code_print(const byte *ip, int len) {
|
||||||
const byte *ip_start = ip;
|
const byte *ip_start = ip;
|
||||||
|
|
||||||
|
@ -71,7 +73,11 @@ void mp_byte_code_print(const byte *ip, int len) {
|
||||||
printf(" bc=" INT_FMT " line=" UINT_FMT "\n", bc, source_line);
|
printf(" bc=" INT_FMT " line=" UINT_FMT "\n", bc, source_line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mp_byte_code_print2(ip, len - 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mp_byte_code_print2(const byte *ip, int len) {
|
||||||
|
const byte *ip_start = ip;
|
||||||
machine_uint_t unum;
|
machine_uint_t unum;
|
||||||
qstr qstr;
|
qstr qstr;
|
||||||
while (ip - ip_start < len) {
|
while (ip - ip_start < len) {
|
||||||
|
|
7
py/vm.c
7
py/vm.c
|
@ -14,6 +14,11 @@
|
||||||
#include "objgenerator.h"
|
#include "objgenerator.h"
|
||||||
|
|
||||||
#define DETECT_VM_STACK_OVERFLOW (0)
|
#define DETECT_VM_STACK_OVERFLOW (0)
|
||||||
|
#if 0
|
||||||
|
#define TRACE(ip) mp_byte_code_print2(ip, 1);
|
||||||
|
#else
|
||||||
|
#define TRACE(ip)
|
||||||
|
#endif
|
||||||
|
|
||||||
// Value stack grows up (this makes it incompatible with native C stack, but
|
// Value stack grows up (this makes it incompatible with native C stack, but
|
||||||
// makes sure that arguments to functions are in natural order arg1..argN
|
// makes sure that arguments to functions are in natural order arg1..argN
|
||||||
|
@ -168,6 +173,7 @@ mp_vm_return_kind_t mp_execute_byte_code_2(const byte *code_info, const byte **i
|
||||||
#if MICROPY_USE_COMPUTED_GOTO
|
#if MICROPY_USE_COMPUTED_GOTO
|
||||||
#include "vmentrytable.h"
|
#include "vmentrytable.h"
|
||||||
#define DISPATCH() do { \
|
#define DISPATCH() do { \
|
||||||
|
TRACE(ip); \
|
||||||
save_ip = ip; \
|
save_ip = ip; \
|
||||||
op = *ip++; \
|
op = *ip++; \
|
||||||
goto *entry_table[op]; \
|
goto *entry_table[op]; \
|
||||||
|
@ -223,6 +229,7 @@ dispatch_loop:
|
||||||
#if MICROPY_USE_COMPUTED_GOTO
|
#if MICROPY_USE_COMPUTED_GOTO
|
||||||
DISPATCH();
|
DISPATCH();
|
||||||
#else
|
#else
|
||||||
|
TRACE(ip);
|
||||||
save_ip = ip;
|
save_ip = ip;
|
||||||
op = *ip++;
|
op = *ip++;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue