py: Add support for __debug__ constant.
__debug__ now resolves to True or False. Its value needs to be set by mp_set_debug(). TODO: call mp_set_debug in unix/ port. TODO: optimise away "if False:" statements in compiler.
This commit is contained in:
parent
96f137b24a
commit
97f9a2813e
20
py/lexer.c
20
py/lexer.c
|
@ -64,6 +64,13 @@ struct _mp_lexer_t {
|
||||||
mp_token_t tok_cur;
|
mp_token_t tok_cur;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// debug flag for __debug__ constant
|
||||||
|
STATIC mp_token_kind_t mp_debug_value;
|
||||||
|
|
||||||
|
void mp_set_debug(bool value) {
|
||||||
|
mp_debug_value = value ? MP_TOKEN_KW_TRUE : MP_TOKEN_KW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO replace with a call to a standard function
|
// TODO replace with a call to a standard function
|
||||||
bool str_strn_equal(const char *str, const char *strn, int len) {
|
bool str_strn_equal(const char *str, const char *strn, int len) {
|
||||||
uint i = 0;
|
uint i = 0;
|
||||||
|
@ -303,7 +310,7 @@ STATIC const char *tok_kw[] = {
|
||||||
"while",
|
"while",
|
||||||
"with",
|
"with",
|
||||||
"yield",
|
"yield",
|
||||||
NULL,
|
"__debug__",
|
||||||
};
|
};
|
||||||
|
|
||||||
STATIC int hex_digit(unichar c) {
|
STATIC int hex_digit(unichar c) {
|
||||||
|
@ -687,9 +694,18 @@ STATIC void mp_lexer_next_token_into(mp_lexer_t *lex, mp_token_t *tok, bool firs
|
||||||
|
|
||||||
// check for keywords
|
// check for keywords
|
||||||
if (tok->kind == MP_TOKEN_NAME) {
|
if (tok->kind == MP_TOKEN_NAME) {
|
||||||
for (int i = 0; tok_kw[i] != NULL; i++) {
|
// We check for __debug__ here and convert it to its value. This is so
|
||||||
|
// the parser gives a syntax error on, eg, x.__debug__. Otherwise, we
|
||||||
|
// need to check for this special token in many places in the compiler.
|
||||||
|
// TODO improve speed of these string comparisons
|
||||||
|
//for (int i = 0; tok_kw[i] != NULL; i++) {
|
||||||
|
for (int i = 0; i < ARRAY_SIZE(tok_kw); i++) {
|
||||||
if (str_strn_equal(tok_kw[i], tok->str, tok->len)) {
|
if (str_strn_equal(tok_kw[i], tok->str, tok->len)) {
|
||||||
|
if (i == ARRAY_SIZE(tok_kw) - 1) {
|
||||||
|
tok->kind = mp_debug_value;
|
||||||
|
} else {
|
||||||
tok->kind = MP_TOKEN_KW_FALSE + i;
|
tok->kind = MP_TOKEN_KW_FALSE + i;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,6 +74,9 @@ void mp_init(void) {
|
||||||
MICROPY_PORT_INIT_FUNC;
|
MICROPY_PORT_INIT_FUNC;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// __debug__ enabled by default
|
||||||
|
mp_set_debug(true);
|
||||||
|
|
||||||
mp_emit_glue_init();
|
mp_emit_glue_init();
|
||||||
|
|
||||||
// init global module stuff
|
// init global module stuff
|
||||||
|
|
|
@ -54,6 +54,8 @@ typedef struct _mp_arg_t {
|
||||||
void mp_init(void);
|
void mp_init(void);
|
||||||
void mp_deinit(void);
|
void mp_deinit(void);
|
||||||
|
|
||||||
|
void mp_set_debug(bool value); // sets the value of __debug__; see lexer.c
|
||||||
|
|
||||||
void mp_arg_check_num(uint n_args, uint n_kw, uint n_args_min, uint n_args_max, bool takes_kw);
|
void mp_arg_check_num(uint n_args, uint n_kw, uint n_args_min, uint n_args_max, bool takes_kw);
|
||||||
void mp_arg_parse_all(uint n_pos, const mp_obj_t *pos, mp_map_t *kws, uint n_allowed, const mp_arg_t *allowed, mp_arg_val_t *out_vals);
|
void mp_arg_parse_all(uint n_pos, const mp_obj_t *pos, mp_map_t *kws, uint n_allowed, const mp_arg_t *allowed, mp_arg_val_t *out_vals);
|
||||||
void mp_arg_parse_all_kw_array(uint n_pos, uint n_kw, const mp_obj_t *args, uint n_allowed, const mp_arg_t *allowed, mp_arg_val_t *out_vals);
|
void mp_arg_parse_all_kw_array(uint n_pos, uint n_kw, const mp_obj_t *args, uint n_allowed, const mp_arg_t *allowed, mp_arg_val_t *out_vals);
|
||||||
|
|
Loading…
Reference in New Issue