-
-
Notifications
You must be signed in to change notification settings - Fork 32.2k
gh-135443: Sometimes Fall Back to __main__.__dict__ For Globals #135491
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
base: main
Are you sure you want to change the base?
gh-135443: Sometimes Fall Back to __main__.__dict__ For Globals #135491
Conversation
Objects/object.c
Outdated
if (_PyEval_GetFrame() != NULL) { | ||
locals = _PyEval_GetFrameLocals(); | ||
} | ||
PyThreadState *tstate = _PyThreadState_GET(); | ||
locals = _PyEval_GetGlobalsFromRunningMain(tstate); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
_PyEval_GetFrameLocals()
returns a new reference (leak), which is overwritten by _PyEval_GetGlobalsFromRunningMain()
. Thus the fallback mechanism looks to be missing.
The same goes for builtin_vars()
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
@@ -1414,6 +1414,41 @@ def test_call_invalid(self): | |||
with self.assertRaises(interpreters.NotShareableError): | |||
interp.call(func, op, 'eggs!') | |||
|
|||
def test_callable_requires_frame(self): | |||
# There are various functions tha require a current frame. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
a typo in the comment.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
notshareable = [ | ||
globals, | ||
locals, | ||
vars, | ||
] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If "notshareable" here means that the result of the functions cannot be pickled, could NotShareableError
differentiate the round-trip in the future? Also, interpreters.is_shareable()
returns False
for both globals
and dir
, which might be confusing at first.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
For several builtin functions, we now fall back to
__main__.__dict__
for the globalswhen there is no current frame and
_PyInterpreterState_IsRunningMain()
returnstrue. This allows those functions to be run with
Interpreter.call()
.The affected builtins:
exec()
eval()
globals()
locals()
vars()
dir()