e02cb9ec31
In strict stackless mode, it's not possible to make a function call with heap locked (because function activation record aka frame is allocated on heap). So, if the only purpose of function is to introduce local variable scope, move heap lock/unlock calls inside the function.
41 lines
887 B
Python
41 lines
887 B
Python
# test that we can generate a traceback without allocating
|
|
|
|
import micropython
|
|
import sys
|
|
try:
|
|
import uio
|
|
except ImportError:
|
|
print("SKIP")
|
|
raise SystemExit
|
|
|
|
# preallocate exception instance with some room for a traceback
|
|
global_exc = StopIteration()
|
|
try:
|
|
raise global_exc
|
|
except:
|
|
pass
|
|
|
|
def test():
|
|
micropython.heap_lock()
|
|
global global_exc
|
|
global_exc.__traceback__ = None
|
|
try:
|
|
raise global_exc
|
|
except StopIteration:
|
|
print('StopIteration')
|
|
micropython.heap_unlock()
|
|
|
|
# call test() with heap allocation disabled
|
|
test()
|
|
|
|
# print the exception that was raised
|
|
buf = uio.StringIO()
|
|
sys.print_exception(global_exc, buf)
|
|
for l in buf.getvalue().split("\n"):
|
|
# uPy on pyboard prints <stdin> as file, so remove filename.
|
|
if l.startswith(" File "):
|
|
l = l.split('"')
|
|
print(l[0], l[2])
|
|
else:
|
|
print(l)
|