Browse Source

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
tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.8.6
Blank Spruce 5 years ago
parent
commit
e5620635c0
1 changed files with 26 additions and 20 deletions
  1. +26
    -20
      lark/parse_tree_builder.py

+ 26
- 20
lark/parse_tree_builder.py View File

@@ -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


Loading…
Cancel
Save