Page 1 of 1
[SOLVED]what is MP_QSTR__lt_stdin_gt_
Posted: Wed Dec 13, 2017 4:43 pm
by jickster
Code: Select all
#if MICROPY_ENABLE_COMPILER
void do_str(const char *src, mp_parse_input_kind_t input_kind) {
nlr_buf_t nlr;
if (nlr_push(&nlr) == 0) {
mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, src, strlen(src), 0);
qstr source_name = lex->source_name;
mp_parse_tree_t parse_tree = mp_parse(lex, input_kind);
mp_obj_t module_fun = mp_compile(&parse_tree, source_name, MP_EMIT_OPT_NONE, true);
mp_call_function_0(module_fun);
nlr_pop();
} else {
// uncaught exception
mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val);
}
}
#endif
I know it's a qstring
Code: Select all
QDEF(MP_QSTR__lt_stdin_gt_, (const byte*)"\xe3\x07" "<stdin>")
but is a "special" value? i.e. when you pass it in to
Code: Select all
mp_lexer_t *mp_lexer_new_from_str_len(qstr src_name, const char *str, size_t len, size_t free_len) {
mp_reader_t reader;
mp_reader_new_mem(&reader, (const byte*)str, len, free_len);
return mp_lexer_new(src_name, reader);
}
mp_lexer_t *mp_lexer_new(qstr src_name, mp_reader_t reader) {
mp_lexer_t *lex = m_new_obj(mp_lexer_t);
lex->source_name = src_name;
...
does it have some special side effects?
Re: what is MP_QSTR__lt_stdin_gt_
Posted: Wed Dec 13, 2017 6:39 pm
by dhylands
The reason that it's "special" is that the less-than and greater than signs make it non-parseable as a regular symbol. There is a script which will look for usages of MP_QSTR_foo and create a qstr for "foo". But since you can't have MP_QSTR_<stdin> as a valid symbol in C, we needed to allow another mechanism to map it.
The use of <stdin> is just to differentiate it from a real filename, since <stdin> isn't considered a valid filename. It's also what python 3 uses. For example:
Code: Select all
Python 3.5.3 (default, Sep 24 2017, 15:18:48)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> prnt(xxx)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'prnt' is not defined
>>>
Re: what is MP_QSTR__lt_stdin_gt_
Posted: Wed Dec 13, 2017 8:25 pm
by jickster
dhylands wrote: ↑Wed Dec 13, 2017 6:39 pm
The reason that it's "special" is that the less-than and greater than signs make it non-parseable as a regular symbol. There is a script which will look for usages of MP_QSTR_foo and create a qstr for "foo". But since you can't have MP_QSTR_<stdin> as a valid symbol in C, we needed to allow another mechanism to map it.
The use of <stdin> is just to differentiate it from a real filename, since <stdin> isn't considered a valid filename. It's also what python 3 uses. For example:
Code: Select all
Python 3.5.3 (default, Sep 24 2017, 15:18:48)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> prnt(xxx)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'prnt' is not defined
>>>
Thanks! Your replies are greatly appreciated