Skip to content

Commit 3aaabd1

Browse files
committed
Merge branch 'keep-strings-uninterned' of github.com:pfalcon/micropython into pfalcon-keep-strings-uninterned
Conflicts: py/parse.c
2 parents ff4b6da + 9e76b11 commit 3aaabd1

2 files changed

Lines changed: 29 additions & 3 deletions

File tree

py/parse.c

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <stdint.h>
2929
#include <stdio.h>
3030
#include <assert.h>
31+
#include <memory.h>
3132

3233
#include "misc.h"
3334
#include "mpconfig.h"
@@ -70,6 +71,7 @@ enum {
7071
#include "grammar.h"
7172
#undef DEF_RULE
7273
RULE_maximum_number_of,
74+
RULE_string,
7375
};
7476

7577
#define or(n) (RULE_ACT_OR | n)
@@ -218,6 +220,9 @@ void mp_parse_node_print(mp_parse_node_t pn, int indent) {
218220
case MP_PARSE_NODE_TOKEN: printf("tok(" INT_FMT ")\n", arg); break;
219221
default: assert(0);
220222
}
223+
} else if (MP_PARSE_NODE_IS_STRING(pn)) {
224+
mp_parse_node_struct_t *pns = (mp_parse_node_struct_t*)pn;
225+
printf("literal str(%.*s)\n", (int)pns->nodes[1], (char*)pns->nodes[0]);
221226
} else {
222227
mp_parse_node_struct_t *pns = (mp_parse_node_struct_t*)pn;
223228
uint n = MP_PARSE_NODE_STRUCT_NUM_NODES(pns);
@@ -274,6 +279,8 @@ STATIC void push_result_node(parser_t *parser, mp_parse_node_t pn) {
274279
parser->result_stack[parser->result_stack_top++] = pn;
275280
}
276281

282+
STATIC void push_string(parser_t *parser, int src_line, const char *str, uint len);
283+
277284
STATIC void push_result_token(parser_t *parser, const mp_lexer_t *lex) {
278285
const mp_token_t *tok = mp_lexer_cur(lex);
279286
mp_parse_node_t pn;
@@ -319,7 +326,10 @@ STATIC void push_result_token(parser_t *parser, const mp_lexer_t *lex) {
319326
pn = mp_parse_node_new_leaf(MP_PARSE_NODE_INTEGER, qstr_from_strn(str, len));
320327
}
321328
} else if (tok->kind == MP_TOKEN_STRING) {
322-
pn = mp_parse_node_new_leaf(MP_PARSE_NODE_STRING, qstr_from_strn(tok->str, tok->len));
329+
printf("Pushing string\n");
330+
push_string(parser, mp_lexer_cur(lex)->src_line, tok->str, tok->len);
331+
return;
332+
// pn = mp_parse_node_new_leaf(MP_PARSE_NODE_STRING, qstr_from_strn(tok->str, tok->len));
323333
} else if (tok->kind == MP_TOKEN_BYTES) {
324334
pn = mp_parse_node_new_leaf(MP_PARSE_NODE_BYTES, qstr_from_strn(tok->str, tok->len));
325335
} else {
@@ -328,6 +338,21 @@ STATIC void push_result_token(parser_t *parser, const mp_lexer_t *lex) {
328338
push_result_node(parser, pn);
329339
}
330340

341+
STATIC void push_string(parser_t *parser, int src_line, const char *str, uint len) {
342+
mp_parse_node_struct_t *pn = m_new_obj_var_maybe(mp_parse_node_struct_t, mp_parse_node_t, 2);
343+
if (pn == NULL) {
344+
memory_error(parser);
345+
return;
346+
}
347+
pn->source_line = src_line;
348+
pn->kind_num_nodes = RULE_string | (2 << 8);
349+
char *p = m_new(char, len);
350+
memcpy(p, str, len);
351+
pn->nodes[0] = (machine_int_t)p;
352+
pn->nodes[1] = len;
353+
push_result_node(parser, (mp_parse_node_t)pn);
354+
}
355+
331356
STATIC void push_result_rule(parser_t *parser, int src_line, const rule_t *rule, int num_args) {
332357
mp_parse_node_struct_t *pn = m_new_obj_var_maybe(mp_parse_node_struct_t, mp_parse_node_t, num_args);
333358
if (pn == NULL) {
@@ -516,12 +541,12 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, mp_p
516541
}
517542
}
518543

519-
#if 0 && !MICROPY_ENABLE_DOC_STRING
544+
#if 1 && !MICROPY_ENABLE_DOC_STRING
520545
// this code discards lonely statement, such as doc strings
521546
// problem is that doc strings have already been interned, so this doesn't really help reduce RAM usage
522547
if (input_kind != MP_PARSE_SINGLE_INPUT && rule->rule_id == RULE_expr_stmt && peek_result(&parser, 0) == MP_PARSE_NODE_NULL) {
523548
mp_parse_node_t p = peek_result(&parser, 1);
524-
if (MP_PARSE_NODE_IS_LEAF(p) && !MP_PARSE_NODE_IS_ID(p)) {
549+
if ((MP_PARSE_NODE_IS_LEAF(p) && !MP_PARSE_NODE_IS_ID(p)) || MP_PARSE_NODE_IS_STRING(p)) {
525550
pop_result(parser);
526551
pop_result(parser);
527552
push_result_rule(&parser, rule_src_line, rules[RULE_pass_stmt], 0);

py/parse.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ typedef struct _mp_parse_node_struct_t {
8080
#define MP_PARSE_NODE_LEAF_SMALL_INT(pn) (((machine_int_t)(pn)) >> 1)
8181
#define MP_PARSE_NODE_STRUCT_KIND(pns) ((pns)->kind_num_nodes & 0xff)
8282
#define MP_PARSE_NODE_STRUCT_NUM_NODES(pns) ((pns)->kind_num_nodes >> 8)
83+
#define MP_PARSE_NODE_IS_STRING(pn) (MP_PARSE_NODE_STRUCT_KIND((mp_parse_node_struct_t*)pn) == RULE_string)
8384

8485
mp_parse_node_t mp_parse_node_new_leaf(machine_int_t kind, machine_int_t arg);
8586
uint mp_parse_node_free(mp_parse_node_t pn);

0 commit comments

Comments
 (0)