From e5620635c098b3f428230cdd01952d0f995d661f Mon Sep 17 00:00:00 2001 From: Blank Spruce <32396809+BlankSpruce@users.noreply.github.com> Date: Mon, 4 May 2020 19:00:30 +0200 Subject: [PATCH] Reduce number of calls to Tree.meta in PropagatePositions Since Tree.meta is property with additional presence check it introduces unnecessary overhead in accessing underlying Meta object once it's already initialized. Having local reference to actual Meta object allows to reduce these presence checks to bare minimum --- lark/parse_tree_builder.py | 46 +++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/lark/parse_tree_builder.py b/lark/parse_tree_builder.py index 904d186..5a7c5d7 100644 --- a/lark/parse_tree_builder.py +++ b/lark/parse_tree_builder.py @@ -27,33 +27,39 @@ class PropagatePositions: def __call__(self, children): res = self.node_builder(children) + # local reference to Tree.meta reduces number of presence checks if isinstance(res, Tree): + res_meta = res.meta for c in children: - if isinstance(c, Tree) and not c.meta.empty: - res.meta.line = c.meta.line - res.meta.column = c.meta.column - res.meta.start_pos = c.meta.start_pos - res.meta.empty = False - break + if isinstance(c, Tree): + child_meta = c.meta + if not child_meta.empty: + res_meta.line = child_meta.line + res_meta.column = child_meta.column + res_meta.start_pos = child_meta.start_pos + res_meta.empty = False + break elif isinstance(c, Token): - res.meta.line = c.line - res.meta.column = c.column - res.meta.start_pos = c.pos_in_stream - res.meta.empty = False + res_meta.line = c.line + res_meta.column = c.column + res_meta.start_pos = c.pos_in_stream + res_meta.empty = False break for c in reversed(children): - if isinstance(c, Tree) and not c.meta.empty: - res.meta.end_line = c.meta.end_line - res.meta.end_column = c.meta.end_column - res.meta.end_pos = c.meta.end_pos - res.meta.empty = False - break + if isinstance(c, Tree): + child_meta = c.meta + if not child_meta.empty: + res_meta.end_line = child_meta.end_line + res_meta.end_column = child_meta.end_column + res_meta.end_pos = child_meta.end_pos + res_meta.empty = False + break elif isinstance(c, Token): - res.meta.end_line = c.end_line - res.meta.end_column = c.end_column - res.meta.end_pos = c.end_pos - res.meta.empty = False + res_meta.end_line = c.end_line + res_meta.end_column = c.end_column + res_meta.end_pos = c.end_pos + res_meta.empty = False break return res