mirror of
https://github.com/micropython/micropython.git
synced 2026-01-05 03:30:14 +01:00
51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
# Test the limits of bytecode generation.
|
|
|
|
import sys
|
|
|
|
# Tune the test parameters based on the target's bytecode generator.
|
|
if hasattr(sys.implementation, "_mpy"):
|
|
# Target can load .mpy files so generated bytecode uses 1 byte per qstr.
|
|
number_of_body_copies = (433, 432, 431, 399)
|
|
else:
|
|
# Target can't load .mpy files so generated bytecode uses 2 bytes per qstr.
|
|
number_of_body_copies = (401, 400, 399, 398)
|
|
|
|
body = " with f()()() as a:\n try:\n f()()()\n except Exception:\n pass\n"
|
|
|
|
# Test overflow of jump offset.
|
|
# Print results at the end in case an intermediate value of n fails with MemoryError.
|
|
results = []
|
|
for n in number_of_body_copies:
|
|
try:
|
|
exec("cond = 0\nif cond:\n" + body * n + "else:\n print('cond false')\n")
|
|
results.append("ok")
|
|
except MemoryError:
|
|
print("SKIP")
|
|
raise SystemExit
|
|
except RuntimeError as er:
|
|
results.append(repr(er))
|
|
print(results)
|
|
|
|
# Test changing size of code info (source line/bytecode mapping) due to changing
|
|
# bytecode size in the final passes. This test is very specific to how the
|
|
# code info is encoded, and how jump offsets shrink in the final passes. This
|
|
# test should fail if the bytecode emitter doesn't correctly handle shrinking of
|
|
# the code info section.
|
|
exec(
|
|
"""
|
|
x = 0
|
|
if x:
|
|
"""
|
|
+ body * 13
|
|
+ """
|
|
x = [1 if x else 123]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print(x)
|
|
"""
|
|
)
|