refbug.py
47 lines
| 1.5 KiB
| text/x-python
|
PythonLexer
Fernando Perez
|
r1916 | """Minimal script to reproduce our nasty reference counting bug. | ||
Thomas Kluyver
|
r3917 | The problem is related to https://github.com/ipython/ipython/issues/141 | ||
Fernando Perez
|
r1916 | |||
Fernando Perez
|
r1922 | The original fix for that appeared to work, but John D. Hunter found a | ||
matplotlib example which, when run twice in a row, would break. The problem | ||||
were references held by open figures to internals of Tkinter. | ||||
Fernando Perez
|
r1916 | |||
Fernando Perez
|
r1922 | This code reproduces the problem that John saw, without matplotlib. | ||
This script is meant to be called by other parts of the test suite that call it | ||||
Thomas Kluyver
|
r3917 | via %run as if it were executed interactively by the user. As of 2011-05-29, | ||
test_run.py calls it. | ||||
Fernando Perez
|
r1916 | """ | ||
#----------------------------------------------------------------------------- | ||||
# Module imports | ||||
#----------------------------------------------------------------------------- | ||||
import sys | ||||
Brian Granger
|
r2027 | from IPython.core import ipapi | ||
Fernando Perez
|
r1916 | |||
#----------------------------------------------------------------------------- | ||||
# Globals | ||||
#----------------------------------------------------------------------------- | ||||
Brian Granger
|
r2746 | # This needs to be here because nose and other test runners will import | ||
# this module. Importing this module has potential side effects that we | ||||
# want to prevent. | ||||
if __name__ == '__main__': | ||||
Fernando Perez
|
r1916 | |||
Brian Granger
|
r2746 | ip = ipapi.get() | ||
Fernando Perez
|
r1916 | |||
Brian Granger
|
r2746 | if not '_refbug_cache' in ip.user_ns: | ||
ip.user_ns['_refbug_cache'] = [] | ||||
Fernando Perez
|
r1916 | |||
Brian Granger
|
r2746 | aglobal = 'Hello' | ||
def f(): | ||||
return aglobal | ||||
cache = ip.user_ns['_refbug_cache'] | ||||
cache.append(f) | ||||
def call_f(): | ||||
for func in cache: | ||||
print 'lowercased:',func().lower() | ||||