-
Notifications
You must be signed in to change notification settings - Fork 263
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
closure Frame initialization uses wrong outer frame #17
Comments
I thought I fixed this in my branch. Could you check against https://github.com/google/byterun ? I know I did some work on closure capture. It never got merged because I never had the time to clean the code to get it accepted by nedbat. |
Arthur: I'm afraid it's broken in your branch as well - both use f_back to link cells to their function, instead of using the closure parameter of pyobj.Function. The f_back trick is a surprisingly good approximation, though, and all of the existing test cases work with it. But the above is still broken. |
…ixes nedbat#17. (I haven't checked this code against the CPython code, but at least we're more correct than before, by the tests.
See nedbat#17 Thanks to @matthiaskramm noting and reporting the problem, and @darius for providing a test case.
The current version of byterun accesses cellvars through the frame the closure is executing under, instead of the frame it was defined in. The following code illustrates the problem:
def f():
x = ["foo"]
def inner():
x[0] = "bar"
return inner
def g(funcptr):
x = 5
def inner():
return x
y = funcptr()
g(f())
AssertionError: "'int' object does not support item assignment" != 'None'
The text was updated successfully, but these errors were encountered: