|
|
|
@ -1,4 +1,7 @@
|
|
|
|
|
import sys
|
|
|
|
|
import gc
|
|
|
|
|
|
|
|
|
|
from trezor import log
|
|
|
|
|
|
|
|
|
|
type_gen = type((lambda: (yield))())
|
|
|
|
|
type_genfunc = type((lambda: (yield)))
|
|
|
|
@ -11,19 +14,25 @@ def _unimport_func(func):
|
|
|
|
|
ret = func(*args, **kwargs)
|
|
|
|
|
finally:
|
|
|
|
|
for to_remove in set(sys.modules) - mods:
|
|
|
|
|
print('removing module', to_remove)
|
|
|
|
|
# log.info(__name__, 'removing module %s', to_remove)
|
|
|
|
|
del sys.modules[to_remove]
|
|
|
|
|
gc.collect()
|
|
|
|
|
return ret
|
|
|
|
|
return inner
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _unimport_genfunc(genfunc):
|
|
|
|
|
def inner(*args, **kwargs):
|
|
|
|
|
async def inner(*args, **kwargs):
|
|
|
|
|
mods = set(sys.modules)
|
|
|
|
|
try:
|
|
|
|
|
ret = yield from genfunc(*args, **kwargs)
|
|
|
|
|
ret = await genfunc(*args, **kwargs)
|
|
|
|
|
finally:
|
|
|
|
|
for to_remove in set(sys.modules) - mods:
|
|
|
|
|
print('removing module', to_remove)
|
|
|
|
|
# log.info(__name__, 'removing module %s', to_remove)
|
|
|
|
|
del sys.modules[to_remove]
|
|
|
|
|
gc.collect()
|
|
|
|
|
return ret
|
|
|
|
|
return inner
|
|
|
|
|
|
|
|
|
@ -35,14 +44,6 @@ def unimport(func):
|
|
|
|
|
return _unimport_func(func)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def coroutine(func):
|
|
|
|
|
def inner(*args, **kwargs):
|
|
|
|
|
gen = func(*args, **kwargs)
|
|
|
|
|
gen.send(None)
|
|
|
|
|
return gen
|
|
|
|
|
return inner
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def chunks(l, n):
|
|
|
|
|
for i in range(0, len(l), n):
|
|
|
|
|
yield l[i:i + n]
|
|
|
|
|