Skip to content

Commit b0f0c45

Browse files
Merge pull request #69 from MarcellPerger1/add-typechecking
Add name resolver fuzzing
2 parents 044b418 + a8481fe commit b0f0c45

12 files changed

+59
-6
lines changed

benchmark.py

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
from parser.cst.nodes import ProgramNode
99
from parser.cst.cstgen import CstGen
1010
from parser.lexer import Tokenizer, format_tokens
11+
from parser.typecheck.typecheck import NameResolver, Scope
1112
from util import readfile
13+
from util.pformat import pformat
1214

1315
PROFILER = True
1416

@@ -31,12 +33,17 @@ class BenchOnce:
3133
_tokenizer: Tokenizer
3234
_cstgen: CstGen
3335
_cst: ProgramNode
36+
_astgen: AstGen
3437
_ast: AstProgramNode
38+
_nr: NameResolver
39+
_top_scope: Scope
3540

36-
def __init__(self, src: str, idx: int = -1, do_ast=True):
41+
def __init__(self, src: str, idx: int = -1, do_ast=True,
42+
do_name_resolve=True):
3743
self.src = src
3844
self.idx = idx
3945
self.should_do_ast = do_ast
46+
self.should_name_resolve = do_name_resolve
4047
self.lines: list[tuple[float, str]] = [] # First item used as key
4148

4249
@classmethod
@@ -58,6 +65,9 @@ def run(self):
5865
if self.should_do_ast:
5966
self.do_ast()
6067
self.do_ast_fmt()
68+
if self.should_name_resolve:
69+
self.do_name_resolve()
70+
self.do_name_resolve_fmt()
6171
if p:
6272
p.dump_stats(f'perf_dump_{self.idx}.prof')
6373
print(f'Perf for idx={self.idx} ({PROFILER=}):')
@@ -90,22 +100,53 @@ def do_cst_fmt(self):
90100

91101
def do_ast(self):
92102
with _Timer() as t:
93-
self._ast = AstGen(self._cstgen).parse()
103+
self._astgen = AstGen(self._cstgen)
104+
self._ast = self._astgen.parse()
94105
self._add_line(2.0, 'AST', t.get())
95106

96107
def do_ast_fmt(self):
97108
with _Timer() as t:
98109
_s = tformat(self._ast)
99110
self._add_line(2.5, 'AST_fmt', t.get())
100111

112+
def do_name_resolve(self):
113+
with _Timer() as t:
114+
self._nr = NameResolver(self._astgen)
115+
self._top_scope = self._nr.run()
116+
self._add_line(3.0, 'NameRes', t.get())
117+
118+
def do_name_resolve_fmt(self):
119+
with _Timer() as t:
120+
_s = pformat(self._top_scope)
121+
self._add_line(3.5, 'NameRes_fmt', t.get())
122+
123+
124+
def benchmark(src: str, idx: int = -1, do_ast=True, do_name_resolve=True):
125+
return BenchOnce(src, idx, do_ast, do_name_resolve).run()
126+
101127

102-
def benchmark(src: str, idx: int = -1, do_ast=True):
103-
return BenchOnce(src, idx, do_ast).run()
128+
def bench_full(n=200):
129+
times = []
130+
# noinspection PyProtectedMember
131+
with BenchOnce._maybe_profiler() as p:
132+
for _ in range(n):
133+
t0 = time.perf_counter()
134+
_sc = NameResolver(AstGen(CstGen(Tokenizer(
135+
readfile('main_example_2.st'))))).run()
136+
t1 = time.perf_counter()
137+
times.append(t1 - t0)
138+
if p:
139+
p.dump_stats('./long_perf.prof')
140+
print(f'Bench main_example_2.st, {n} iterations, ({PROFILER=}):')
141+
print(f' Min: {min(times)*1000:.2f}ms')
142+
print(f' Avg: {sum(times)/n*1000:.2f}ms')
104143

105144

106145
def main():
107146
benchmark(readfile('main_example_0.st'), 0, do_ast=False)
108-
benchmark(readfile('main_example_1.st'), 1)
147+
benchmark(readfile('main_example_1.st'), 1, do_name_resolve=False)
148+
benchmark(readfile('main_example_2.st'), 2)
149+
bench_full(200)
109150

110151

111152
if __name__ == '__main__':

fuzz.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from pythonfuzz.fuzzer import Fuzzer
99
import pythonfuzz.fuzzer as fuzzer_ns # For patching pythonfuzz
1010

11+
from parser.typecheck.typecheck import NameResolver
12+
1113

1214
class UsePerfCounterInsteadOfTime:
1315
"""Hack to avoid overwriting everyone's time module so we only
@@ -30,7 +32,7 @@ def fuzz(buf):
3032
try:
3133
string = buf.decode("ascii")
3234
try:
33-
AstGen(CstGen(Tokenizer(string))).parse()
35+
NameResolver(AstGen(CstGen(Tokenizer(string)))).run()
3436
except BaseParseError:
3537
pass
3638
except UnicodeDecodeError:

pythonfuzz_corpus/8821212c1f3bd945ca7ea0bf170314af1c3aa82dda3426b6275f457a0b5f0467

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pythonfuzz_corpus/9532ebfe2abe7cfcbbe1f0e2487b47a86d90e42c89754a1c654ef40fe9af5f31

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pythonfuzz_corpus/a72007d19155b764075ed1ee6084a0902daa8d3c6c8a573898c90d13ec2f7bac

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pythonfuzz_corpus/a94f0eeac29022857340a58f7896c22f1d22fc319271e82e2105ed18a298be91

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pythonfuzz_corpus/acb30f35220868b3f62e1b78e288ecdc9c376896bd5d0fd0aa99c79ae1fac46f

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pythonfuzz_corpus/d15eea59a03cd7f47da234894b4a49e626627bfd674f080af0d19e95c83cb122

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pythonfuzz_corpus/dfcfaa81262c12cdfa1a4446803fdf907efa05a6251056c26a4e78da490770a8

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pythonfuzz_corpus/e2e7902628162b8a22412d005b454a1764c604d6852440fda3ffcfd6be75efe4

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)