Memoize a symbol method.
(method: F)
| 38 | |
| 39 | |
| 40 | def memoize(method: F) -> F: |
| 41 | """Memoize a symbol method.""" |
| 42 | method_name = method.__name__ |
| 43 | |
| 44 | def memoize_wrapper(self: "Parser", *args: object) -> Any: |
| 45 | mark = self._mark() |
| 46 | key = mark, method_name, args |
| 47 | # Fast path: cache hit, and not verbose. |
| 48 | if key in self._cache and not self._verbose: |
| 49 | tree, endmark = self._cache[key] |
| 50 | self._reset(endmark) |
| 51 | return tree |
| 52 | # Slow path: no cache hit, or verbose. |
| 53 | verbose = self._verbose |
| 54 | argsr = ",".join(repr(arg) for arg in args) |
| 55 | fill = " " * self._level |
| 56 | if key not in self._cache: |
| 57 | if verbose: |
| 58 | print(f"{fill}{method_name}({argsr}) ... (looking at {self.showpeek()})") |
| 59 | self._level += 1 |
| 60 | tree = method(self, *args) |
| 61 | self._level -= 1 |
| 62 | if verbose: |
| 63 | print(f"{fill}... {method_name}({argsr}) -> {tree!s:.200}") |
| 64 | endmark = self._mark() |
| 65 | self._cache[key] = tree, endmark |
| 66 | else: |
| 67 | tree, endmark = self._cache[key] |
| 68 | if verbose: |
| 69 | print(f"{fill}{method_name}({argsr}) -> {tree!s:.200}") |
| 70 | self._reset(endmark) |
| 71 | return tree |
| 72 | |
| 73 | memoize_wrapper.__wrapped__ = method # type: ignore[attr-defined] |
| 74 | return cast(F, memoize_wrapper) |
| 75 | |
| 76 | |
| 77 | def memoize_left_rec( |
nothing calls this directly
no test coverage detected
searching dependent graphs…