Skip to content

Commit 9e5cfb6

Browse files
authored
perf: reuse arguments in ParallelVisitor (#297)
1 parent 8e04855 commit 9e5cfb6

1 file changed

Lines changed: 24 additions & 15 deletions

File tree

‎src/graphql/language/visitor.py‎

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -448,43 +448,52 @@ def get_enter_leave_for_kind(self, kind: str) -> EnterLeaveVisitor:
448448
return self.enter_leave_map[kind]
449449
except KeyError:
450450
has_visitor = False
451-
enter_list: list[Callable[..., VisitorAction | None] | None] = []
452-
leave_list: list[Callable[..., VisitorAction | None] | None] = []
453-
for visitor in self.visitors:
451+
enter_list: list[
452+
tuple[int, Callable[..., VisitorAction | None] | None]
453+
] = []
454+
leave_list: list[
455+
tuple[int, Callable[..., VisitorAction | None] | None]
456+
] = []
457+
for i, visitor in enumerate(self.visitors):
454458
enter, leave = visitor.get_enter_leave_for_kind(kind)
455459
if not has_visitor and (enter or leave):
456460
has_visitor = True
457-
enter_list.append(enter)
458-
leave_list.append(leave)
461+
enter_list.append((i, enter))
462+
leave_list.append((i, leave))
463+
464+
enter_pairs = tuple(enter_list)
465+
leave_pairs = tuple(leave_list)
459466

460467
if has_visitor:
461468

462469
def enter(node: Node, *args: Any) -> VisitorAction | None:
463470
skipping = self.skipping
464-
for i, fn in enumerate(enter_list):
471+
args = (node, *args)
472+
for i, fn in enter_pairs:
465473
if not skipping[i] and fn:
466-
result = fn(node, *args)
474+
result = fn(*args)
475+
if result is None:
476+
continue
467477
if result is SKIP or result is False:
468478
skipping[i] = node
469479
elif result is BREAK or result is True:
470480
skipping[i] = BREAK
471-
elif result is not None:
481+
else:
472482
return result
473483
return None
474484

475485
def leave(node: Node, *args: Any) -> VisitorAction | None:
476486
skipping = self.skipping
477-
for i, fn in enumerate(leave_list):
487+
args = (node, *args)
488+
for i, fn in leave_pairs:
478489
if not skipping[i]:
479490
if fn:
480-
result = fn(node, *args)
491+
result = fn(*args)
492+
if result is None:
493+
continue
481494
if result is BREAK or result is True:
482495
skipping[i] = BREAK
483-
elif (
484-
result is not None
485-
and result is not SKIP
486-
and result is not False
487-
):
496+
elif result is not SKIP and result is not False:
488497
return result
489498
elif skipping[i] is node:
490499
skipping[i] = None

0 commit comments

Comments
 (0)