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.
70 lines
1.3 KiB
Python
70 lines
1.3 KiB
Python
# test that iterating doesn't use the heap
|
|
try:
|
|
import array
|
|
except ImportError:
|
|
print("SKIP")
|
|
raise SystemExit
|
|
|
|
try:
|
|
from micropython import heap_lock, heap_unlock
|
|
except (ImportError, AttributeError):
|
|
heap_lock = heap_unlock = lambda:0
|
|
|
|
def do_iter(l):
|
|
heap_lock()
|
|
for i in l:
|
|
print(i)
|
|
heap_unlock()
|
|
|
|
def gen_func():
|
|
yield 1
|
|
yield 2
|
|
|
|
# pre-create collections to iterate over
|
|
ba = bytearray(b'123')
|
|
ar = array.array('H', (123, 456))
|
|
t = (1, 2, 3)
|
|
l = [1, 2]
|
|
d = {1:2}
|
|
s = set((1,))
|
|
fs = frozenset((1,))
|
|
g1 = (100 + x for x in range(2))
|
|
g2 = gen_func()
|
|
|
|
# test containment (both success and failure) with the heap locked
|
|
heap_lock()
|
|
print(49 in b'123', 255 in b'123')
|
|
print(1 in t, -1 in t)
|
|
print(1 in l, -1 in l)
|
|
print(1 in d, -1 in d)
|
|
print(1 in s, -1 in s)
|
|
heap_unlock()
|
|
|
|
# test unpacking with the heap locked
|
|
unp0 = unp1 = unp2 = None # preallocate slots for globals
|
|
heap_lock()
|
|
unp0, unp1, unp2 = t
|
|
print(unp0, unp1, unp2)
|
|
heap_unlock()
|
|
|
|
# test certain builtins with the heap locked
|
|
heap_lock()
|
|
print(all(t))
|
|
print(any(t))
|
|
print(min(t))
|
|
print(max(t))
|
|
print(sum(t))
|
|
heap_unlock()
|
|
|
|
# test iterating over collections with the heap locked
|
|
do_iter(b'123')
|
|
do_iter(ba)
|
|
do_iter(ar)
|
|
do_iter(t)
|
|
do_iter(l)
|
|
do_iter(d)
|
|
do_iter(s)
|
|
do_iter(fs)
|
|
do_iter(g1)
|
|
do_iter(g2)
|