From d65d4877c50afac57e65cd4efd5d4d9debb52ac1 Mon Sep 17 00:00:00 2001 From: Marcell Perger Date: Fri, 13 Jun 2025 23:56:15 +0100 Subject: [PATCH 1/4] ci: Update benchmark.py script --- benchmark.py | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/benchmark.py b/benchmark.py index 9c34707..c2da08a 100644 --- a/benchmark.py +++ b/benchmark.py @@ -8,7 +8,9 @@ from parser.cst.nodes import ProgramNode from parser.cst.cstgen import CstGen from parser.lexer import Tokenizer, format_tokens +from parser.typecheck.typecheck import NameResolver, Scope from util import readfile +from util.pformat import pformat PROFILER = True @@ -31,12 +33,17 @@ class BenchOnce: _tokenizer: Tokenizer _cstgen: CstGen _cst: ProgramNode + _astgen: AstGen _ast: AstProgramNode + _nr: NameResolver + _top_scope: Scope - def __init__(self, src: str, idx: int = -1, do_ast=True): + def __init__(self, src: str, idx: int = -1, do_ast=True, + do_name_resolve=True): self.src = src self.idx = idx self.should_do_ast = do_ast + self.should_name_resolve = do_name_resolve self.lines: list[tuple[float, str]] = [] # First item used as key @classmethod @@ -58,6 +65,9 @@ def run(self): if self.should_do_ast: self.do_ast() self.do_ast_fmt() + if self.should_name_resolve: + self.do_name_resolve() + self.do_name_resolve_fmt() if p: p.dump_stats(f'perf_dump_{self.idx}.prof') print(f'Perf for idx={self.idx} ({PROFILER=}):') @@ -90,7 +100,8 @@ def do_cst_fmt(self): def do_ast(self): with _Timer() as t: - self._ast = AstGen(self._cstgen).parse() + self._astgen = AstGen(self._cstgen) + self._ast = self._astgen.parse() self._add_line(2.0, 'AST', t.get()) def do_ast_fmt(self): @@ -98,14 +109,26 @@ def do_ast_fmt(self): _s = tformat(self._ast) self._add_line(2.5, 'AST_fmt', t.get()) + def do_name_resolve(self): + with _Timer() as t: + self._nr = NameResolver(self._astgen) + self._top_scope = self._nr.run() + self._add_line(3.0, 'NameRes', t.get()) + + def do_name_resolve_fmt(self): + with _Timer() as t: + _s = pformat(self._top_scope) + self._add_line(3.5, 'NameRes_fmt', t.get()) + -def benchmark(src: str, idx: int = -1, do_ast=True): - return BenchOnce(src, idx, do_ast).run() +def benchmark(src: str, idx: int = -1, do_ast=True, do_name_resolve=True): + return BenchOnce(src, idx, do_ast, do_name_resolve).run() def main(): benchmark(readfile('main_example_0.st'), 0, do_ast=False) - benchmark(readfile('main_example_1.st'), 1) + benchmark(readfile('main_example_1.st'), 1, do_name_resolve=False) + benchmark(readfile('main_example_2.st'), 2) if __name__ == '__main__': From 55f377d7a88c43251738b27db756c11d25a39870 Mon Sep 17 00:00:00 2001 From: Marcell Perger Date: Sat, 14 Jun 2025 00:07:55 +0100 Subject: [PATCH 2/4] ci(bench): Add longer run with profiler to benchmark.py --- benchmark.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/benchmark.py b/benchmark.py index c2da08a..460c717 100644 --- a/benchmark.py +++ b/benchmark.py @@ -125,10 +125,28 @@ def benchmark(src: str, idx: int = -1, do_ast=True, do_name_resolve=True): return BenchOnce(src, idx, do_ast, do_name_resolve).run() +def bench_full(n=200): + times = [] + # noinspection PyProtectedMember + with BenchOnce._maybe_profiler() as p: + for _ in range(n): + t0 = time.perf_counter() + _sc = NameResolver(AstGen(CstGen(Tokenizer( + readfile('main_example_2.st'))))).run() + t1 = time.perf_counter() + times.append(t1 - t0) + if p: + p.dump_stats('./long_perf.prof') + print(f'Bench main_example_2.st, {n} iterations, ({PROFILER=}):') + print(f' Min: {min(times)*1000:.2f}ms') + print(f' Avg: {sum(times)/n*1000:.2f}ms') + + def main(): benchmark(readfile('main_example_0.st'), 0, do_ast=False) benchmark(readfile('main_example_1.st'), 1, do_name_resolve=False) benchmark(readfile('main_example_2.st'), 2) + bench_full(200) if __name__ == '__main__': From cd30f888f7f188997de2899824228232da0a4d1e Mon Sep 17 00:00:00 2001 From: Marcell Perger Date: Sat, 14 Jun 2025 00:12:27 +0100 Subject: [PATCH 3/4] ci(fuzzing): Add fuzzing for name resolver --- fuzz.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fuzz.py b/fuzz.py index cb510b8..2893b82 100644 --- a/fuzz.py +++ b/fuzz.py @@ -8,6 +8,8 @@ from pythonfuzz.fuzzer import Fuzzer import pythonfuzz.fuzzer as fuzzer_ns # For patching pythonfuzz +from parser.typecheck.typecheck import NameResolver + class UsePerfCounterInsteadOfTime: """Hack to avoid overwriting everyone's time module so we only @@ -30,7 +32,7 @@ def fuzz(buf): try: string = buf.decode("ascii") try: - AstGen(CstGen(Tokenizer(string))).parse() + NameResolver(AstGen(CstGen(Tokenizer(string)))).run() except BaseParseError: pass except UnicodeDecodeError: From a8481fe51b123bbc6aa17c0941a7c15366532eb9 Mon Sep 17 00:00:00 2001 From: Marcell Perger Date: Sat, 14 Jun 2025 00:22:19 +0100 Subject: [PATCH 4/4] ci: Commit new fuzzing corpus --- ...1212c1f3bd945ca7ea0bf170314af1c3aa82dda3426b6275f457a0b5f0467 | 1 + ...2ebfe2abe7cfcbbe1f0e2487b47a86d90e42c89754a1c654ef40fe9af5f31 | 1 + ...007d19155b764075ed1ee6084a0902daa8d3c6c8a573898c90d13ec2f7bac | 1 + ...f0eeac29022857340a58f7896c22f1d22fc319271e82e2105ed18a298be91 | 1 + ...30f35220868b3f62e1b78e288ecdc9c376896bd5d0fd0aa99c79ae1fac46f | 1 + ...eea59a03cd7f47da234894b4a49e626627bfd674f080af0d19e95c83cb122 | 1 + ...faa81262c12cdfa1a4446803fdf907efa05a6251056c26a4e78da490770a8 | 1 + ...7902628162b8a22412d005b454a1764c604d6852440fda3ffcfd6be75efe4 | 1 + ...a14baa7839606d777aa3c64d3278c8d003bd7a1b4ced83702ea696e5ba5b4 | 1 + ...c046cc0ebd830375612a68696fc046bf31bad35241a23688dcebf7495c078 | 1 + 10 files changed, 10 insertions(+) create mode 100644 pythonfuzz_corpus/8821212c1f3bd945ca7ea0bf170314af1c3aa82dda3426b6275f457a0b5f0467 create mode 100644 pythonfuzz_corpus/9532ebfe2abe7cfcbbe1f0e2487b47a86d90e42c89754a1c654ef40fe9af5f31 create mode 100644 pythonfuzz_corpus/a72007d19155b764075ed1ee6084a0902daa8d3c6c8a573898c90d13ec2f7bac create mode 100644 pythonfuzz_corpus/a94f0eeac29022857340a58f7896c22f1d22fc319271e82e2105ed18a298be91 create mode 100644 pythonfuzz_corpus/acb30f35220868b3f62e1b78e288ecdc9c376896bd5d0fd0aa99c79ae1fac46f create mode 100644 pythonfuzz_corpus/d15eea59a03cd7f47da234894b4a49e626627bfd674f080af0d19e95c83cb122 create mode 100644 pythonfuzz_corpus/dfcfaa81262c12cdfa1a4446803fdf907efa05a6251056c26a4e78da490770a8 create mode 100644 pythonfuzz_corpus/e2e7902628162b8a22412d005b454a1764c604d6852440fda3ffcfd6be75efe4 create mode 100644 pythonfuzz_corpus/f1ba14baa7839606d777aa3c64d3278c8d003bd7a1b4ced83702ea696e5ba5b4 create mode 100644 pythonfuzz_corpus/fd5c046cc0ebd830375612a68696fc046bf31bad35241a23688dcebf7495c078 diff --git a/pythonfuzz_corpus/8821212c1f3bd945ca7ea0bf170314af1c3aa82dda3426b6275f457a0b5f0467 b/pythonfuzz_corpus/8821212c1f3bd945ca7ea0bf170314af1c3aa82dda3426b6275f457a0b5f0467 new file mode 100644 index 0000000..dc77f26 --- /dev/null +++ b/pythonfuzz_corpus/8821212c1f3bd945ca7ea0bf170314af1c3aa82dda3426b6275f457a0b5f0467 @@ -0,0 +1 @@ +s.ss=99.999999; \ No newline at end of file diff --git a/pythonfuzz_corpus/9532ebfe2abe7cfcbbe1f0e2487b47a86d90e42c89754a1c654ef40fe9af5f31 b/pythonfuzz_corpus/9532ebfe2abe7cfcbbe1f0e2487b47a86d90e42c89754a1c654ef40fe9af5f31 new file mode 100644 index 0000000..b2c84d0 --- /dev/null +++ b/pythonfuzz_corpus/9532ebfe2abe7cfcbbe1f0e2487b47a86d90e42c89754a1c654ef40fe9af5f31 @@ -0,0 +1 @@ +ss+=s+99; \ No newline at end of file diff --git a/pythonfuzz_corpus/a72007d19155b764075ed1ee6084a0902daa8d3c6c8a573898c90d13ec2f7bac b/pythonfuzz_corpus/a72007d19155b764075ed1ee6084a0902daa8d3c6c8a573898c90d13ec2f7bac new file mode 100644 index 0000000..a22f44c --- /dev/null +++ b/pythonfuzz_corpus/a72007d19155b764075ed1ee6084a0902daa8d3c6c8a573898c90d13ec2f7bac @@ -0,0 +1 @@ + [b-K,i \ No newline at end of file diff --git a/pythonfuzz_corpus/a94f0eeac29022857340a58f7896c22f1d22fc319271e82e2105ed18a298be91 b/pythonfuzz_corpus/a94f0eeac29022857340a58f7896c22f1d22fc319271e82e2105ed18a298be91 new file mode 100644 index 0000000..3df7725 --- /dev/null +++ b/pythonfuzz_corpus/a94f0eeac29022857340a58f7896c22f1d22fc319271e82e2105ed18a298be91 @@ -0,0 +1 @@ + []ib-K]i- \ No newline at end of file diff --git a/pythonfuzz_corpus/acb30f35220868b3f62e1b78e288ecdc9c376896bd5d0fd0aa99c79ae1fac46f b/pythonfuzz_corpus/acb30f35220868b3f62e1b78e288ecdc9c376896bd5d0fd0aa99c79ae1fac46f new file mode 100644 index 0000000..6c05d12 --- /dev/null +++ b/pythonfuzz_corpus/acb30f35220868b3f62e1b78e288ecdc9c376896bd5d0fd0aa99c79ae1fac46f @@ -0,0 +1 @@ +s.sswQ%=jM99.99;.99; \ No newline at end of file diff --git a/pythonfuzz_corpus/d15eea59a03cd7f47da234894b4a49e626627bfd674f080af0d19e95c83cb122 b/pythonfuzz_corpus/d15eea59a03cd7f47da234894b4a49e626627bfd674f080af0d19e95c83cb122 new file mode 100644 index 0000000..50037c5 --- /dev/null +++ b/pythonfuzz_corpus/d15eea59a03cd7f47da234894b4a49e626627bfd674f080af0d19e95c83cb122 @@ -0,0 +1 @@ + [b-K,i- \ No newline at end of file diff --git a/pythonfuzz_corpus/dfcfaa81262c12cdfa1a4446803fdf907efa05a6251056c26a4e78da490770a8 b/pythonfuzz_corpus/dfcfaa81262c12cdfa1a4446803fdf907efa05a6251056c26a4e78da490770a8 new file mode 100644 index 0000000..22baadc --- /dev/null +++ b/pythonfuzz_corpus/dfcfaa81262c12cdfa1a4446803fdf907efa05a6251056c26a4e78da490770a8 @@ -0,0 +1 @@ +s+=s9; \ No newline at end of file diff --git a/pythonfuzz_corpus/e2e7902628162b8a22412d005b454a1764c604d6852440fda3ffcfd6be75efe4 b/pythonfuzz_corpus/e2e7902628162b8a22412d005b454a1764c604d6852440fda3ffcfd6be75efe4 new file mode 100644 index 0000000..8dca067 --- /dev/null +++ b/pythonfuzz_corpus/e2e7902628162b8a22412d005b454a1764c604d6852440fda3ffcfd6be75efe4 @@ -0,0 +1 @@ +b- [K \ No newline at end of file diff --git a/pythonfuzz_corpus/f1ba14baa7839606d777aa3c64d3278c8d003bd7a1b4ced83702ea696e5ba5b4 b/pythonfuzz_corpus/f1ba14baa7839606d777aa3c64d3278c8d003bd7a1b4ced83702ea696e5ba5b4 new file mode 100644 index 0000000..eff7322 --- /dev/null +++ b/pythonfuzz_corpus/f1ba14baa7839606d777aa3c64d3278c8d003bd7a1b4ced83702ea696e5ba5b4 @@ -0,0 +1 @@ +(!l)(G+l)()(); \ No newline at end of file diff --git a/pythonfuzz_corpus/fd5c046cc0ebd830375612a68696fc046bf31bad35241a23688dcebf7495c078 b/pythonfuzz_corpus/fd5c046cc0ebd830375612a68696fc046bf31bad35241a23688dcebf7495c078 new file mode 100644 index 0000000..b9eefc5 --- /dev/null +++ b/pythonfuzz_corpus/fd5c046cc0ebd830375612a68696fc046bf31bad35241a23688dcebf7495c078 @@ -0,0 +1 @@ + [b-K]i- \ No newline at end of file