* alt impl using a state machine (& tokenizer or split on delimiters)
"""
+import textwrap
+
from ..info import ParsedItem
from ._info import SourceInfo
return
# At this point either the file ended prematurely
# or there's "too much" text.
- filename, lno, text = srcinfo.filename, srcinfo._start, srcinfo.text
+ filename, lno_from, lno_to = srcinfo.filename, srcinfo.start, srcinfo.end
+ text = srcinfo.text
if len(text) > 500:
text = text[:500] + '...'
- raise Exception(f'unmatched text ({filename} starting at line {lno}):\n{text}')
+
+ if srcinfo.too_much_text(maxtext):
+ msg = f'''
+ too much text, try to increase MAX_SIZES[MAXTEXT] in cpython/_parser.py
+ {filename} starting at line {lno_from} to {lno_to}
+ has code with length {len(text)} greater than {maxtext}:
+ {text}
+ '''
+ raise RuntimeError(textwrap.dedent(msg))
+
+ if srcinfo.too_many_lines(maxlines):
+ msg = f'''
+ too many lines, try to increase MAX_SIZES[MAXLINES] in cpython/_parser.py
+ {filename} starting at line {lno_from} to {lno_to}
+ has code with number of lines {lno_to - lno_from} greater than {maxlines}:
+ {text}
+ '''
+ raise RuntimeError(textwrap.dedent(msg))
+
+ raise RuntimeError(f'unmatched text ({filename} starting at line {lno_from}):\n{text}')
def done(self):
self._set_ready()
+ def too_much_text(self, maxtext):
+ return maxtext and len(self.text) > maxtext
+
+ def too_many_lines(self, maxlines):
+ return maxlines and self.end - self.start > maxlines
+
def too_much(self, maxtext, maxlines):
- if maxtext and len(self.text) > maxtext:
+ if self.too_much_text(maxtext):
pass
- elif maxlines and self.end - self.start > maxlines:
+ elif self.too_many_lines(maxlines):
pass
else:
return False
_abs('Modules/_testcapimodule.c'): (20_000, 400),
_abs('Modules/expat/expat.h'): (10_000, 400),
_abs('Objects/stringlib/unicode_format.h'): (10_000, 400),
- _abs('Objects/typeobject.c'): (35_000, 200),
+ _abs('Objects/typeobject.c'): (380_000, 13_000),
_abs('Python/compile.c'): (20_000, 500),
_abs('Python/optimizer.c'): (100_000, 5_000),
_abs('Python/parking_lot.c'): (40_000, 1000),