summaryrefslogtreecommitdiff
path: root/py/parse.c
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2022-03-16 00:22:58 +1100
committerDamien George <damien@micropython.org>2022-03-16 00:41:10 +1100
commit3c7cab4e98a31649ed1bc2e728d610856382d6f5 (patch)
tree2dd27b29992d82998a9853af8f356b8c258bf1f0 /py/parse.c
parent65851ebb5126d4940e91c9f2c1d13b4e10753579 (diff)
py/parse: Put const bytes objects in parse tree as const object.
Instead of as an intermediate qstr, which may unnecessarily intern the data of the bytes object. Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'py/parse.c')
-rw-r--r--py/parse.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/py/parse.c b/py/parse.c
index ff639122c..f18f03b3f 100644
--- a/py/parse.c
+++ b/py/parse.c
@@ -388,9 +388,6 @@ void mp_parse_node_print(const mp_print_t *print, mp_parse_node_t pn, size_t ind
case MP_PARSE_NODE_STRING:
mp_printf(print, "str(%s)\n", qstr_str(arg));
break;
- case MP_PARSE_NODE_BYTES:
- mp_printf(print, "bytes(%s)\n", qstr_str(arg));
- break;
default:
assert(MP_PARSE_NODE_LEAF_KIND(pn) == MP_PARSE_NODE_TOKEN);
mp_printf(print, "tok(%u)\n", (uint)arg);
@@ -504,8 +501,8 @@ STATIC void push_result_token(parser_t *parser, uint8_t rule_id) {
} else if (lex->tok_kind == MP_TOKEN_FLOAT_OR_IMAG) {
mp_obj_t o = mp_parse_num_decimal(lex->vstr.buf, lex->vstr.len, true, false, lex);
pn = make_node_const_object(parser, lex->tok_line, o);
- } else if (lex->tok_kind == MP_TOKEN_STRING || lex->tok_kind == MP_TOKEN_BYTES) {
- // Don't automatically intern all strings/bytes. doc strings (which are usually large)
+ } else if (lex->tok_kind == MP_TOKEN_STRING) {
+ // Don't automatically intern all strings. Doc strings (which are usually large)
// will be discarded by the compiler, and so we shouldn't intern them.
qstr qst = MP_QSTRnull;
if (lex->vstr.len <= MICROPY_ALLOC_PARSE_INTERN_STRING_LEN) {
@@ -517,14 +514,16 @@ STATIC void push_result_token(parser_t *parser, uint8_t rule_id) {
}
if (qst != MP_QSTRnull) {
// qstr exists, make a leaf node
- pn = mp_parse_node_new_leaf(lex->tok_kind == MP_TOKEN_STRING ? MP_PARSE_NODE_STRING : MP_PARSE_NODE_BYTES, qst);
+ pn = mp_parse_node_new_leaf(MP_PARSE_NODE_STRING, qst);
} else {
- // not interned, make a node holding a pointer to the string/bytes object
- mp_obj_t o = mp_obj_new_str_copy(
- lex->tok_kind == MP_TOKEN_STRING ? &mp_type_str : &mp_type_bytes,
- (const byte *)lex->vstr.buf, lex->vstr.len);
+ // not interned, make a node holding a pointer to the string object
+ mp_obj_t o = mp_obj_new_str_copy(&mp_type_str, (const byte *)lex->vstr.buf, lex->vstr.len);
pn = make_node_const_object(parser, lex->tok_line, o);
}
+ } else if (lex->tok_kind == MP_TOKEN_BYTES) {
+ // make a node holding a pointer to the bytes object
+ mp_obj_t o = mp_obj_new_bytes((const byte *)lex->vstr.buf, lex->vstr.len);
+ pn = make_node_const_object(parser, lex->tok_line, o);
} else {
pn = mp_parse_node_new_leaf(MP_PARSE_NODE_TOKEN, lex->tok_kind);
}