aboutsummaryrefslogtreecommitdiff
path: root/py/parse.h
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-09-23 10:50:43 +0100
committerDamien George <damien.p.george@gmail.com>2015-10-02 00:11:11 +0100
commit58e0f4ac50b3dc732cbfe0d7b04bb41951ac1329 (patch)
tree46b94d7f78766e545c0bbda3febeeaf6d7a4bec0 /py/parse.h
parente5635f4ab3d0fd00dd3951865fea82003205dae1 (diff)
py: Allocate parse nodes in chunks to reduce fragmentation and RAM use.
With this patch parse nodes are allocated sequentially in chunks. This reduces fragmentation of the heap and prevents waste at the end of individually allocated parse nodes. Saves roughly 20% of RAM during parse stage.
Diffstat (limited to 'py/parse.h')
-rw-r--r--py/parse.h9
1 files changed, 7 insertions, 2 deletions
diff --git a/py/parse.h b/py/parse.h
index ee2866563..65ca0f4d4 100644
--- a/py/parse.h
+++ b/py/parse.h
@@ -76,7 +76,6 @@ typedef struct _mp_parse_node_struct_t {
#define MP_PARSE_NODE_STRUCT_NUM_NODES(pns) ((pns)->kind_num_nodes >> 8)
mp_parse_node_t mp_parse_node_new_leaf(mp_int_t kind, mp_int_t arg);
-void mp_parse_node_free(mp_parse_node_t pn);
int mp_parse_node_extract_list(mp_parse_node_t *pn, mp_uint_t pn_kind, mp_parse_node_t **nodes);
void mp_parse_node_print(mp_parse_node_t pn, mp_uint_t indent);
@@ -86,8 +85,14 @@ typedef enum {
MP_PARSE_EVAL_INPUT,
} mp_parse_input_kind_t;
+typedef struct _mp_parse_t {
+ mp_parse_node_t root;
+ struct _mp_parse_chunk_t *chunk;
+} mp_parse_tree_t;
+
// the parser will raise an exception if an error occurred
// the parser will free the lexer before it returns
-mp_parse_node_t mp_parse(struct _mp_lexer_t *lex, mp_parse_input_kind_t input_kind);
+mp_parse_tree_t mp_parse(struct _mp_lexer_t *lex, mp_parse_input_kind_t input_kind);
+void mp_parse_tree_clear(mp_parse_tree_t *tree);
#endif // __MICROPY_INCLUDED_PY_PARSE_H__