mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
gh-132775: Unrevert "Add _PyCode_VerifyStateless()" (gh-133528)
This reverts commit3c73cf5
(gh-133497), which itself reverted the original commitd270bb5
(gh-133221). We reverted the original change due to failing android tests. The checks in _PyCode_CheckNoInternalState() were too strict, so we've relaxed them.
This commit is contained in:
parent
61ac88c06e
commit
27128e4fa8
8 changed files with 359 additions and 38 deletions
|
@ -614,6 +614,47 @@ PyAPI_FUNC(int) _PyCode_SetUnboundVarCounts(
|
|||
PyObject *globalsns,
|
||||
PyObject *builtinsns);
|
||||
|
||||
|
||||
/* "Stateless" code is a function or code object which does not rely on
|
||||
* external state or internal state. It may rely on arguments and
|
||||
* builtins, but not globals or a closure. Thus it does not rely
|
||||
* on __globals__ or __closure__, and a stateless function
|
||||
* is equivalent to its code object.
|
||||
*
|
||||
* Stateless code also does not keep any persistent state
|
||||
* of its own, so it can't have any executors, monitoring,
|
||||
* instrumentation, or "extras" (i.e. co_extra).
|
||||
*
|
||||
* Stateless code may create nested functions, including closures.
|
||||
* However, nested functions must themselves be stateless, except they
|
||||
* *can* close on the enclosing locals.
|
||||
*
|
||||
* Stateless code may return any value, including nested functions and closures.
|
||||
*
|
||||
* Stateless code that takes no arguments and doesn't return anything
|
||||
* may be treated like a script.
|
||||
*
|
||||
* We consider stateless code to be "portable" if it does not return
|
||||
* any object that holds a reference to any of the code's locals. Thus
|
||||
* generators and coroutines are not portable. Likewise a function
|
||||
* that returns a closure is not portable. The concept of
|
||||
* portability is useful in cases where the code is run
|
||||
* in a different execution context than where
|
||||
* the return value will be used. */
|
||||
|
||||
PyAPI_FUNC(int) _PyCode_CheckNoInternalState(PyCodeObject *, const char **);
|
||||
PyAPI_FUNC(int) _PyCode_CheckNoExternalState(
|
||||
PyCodeObject *,
|
||||
_PyCode_var_counts_t *,
|
||||
const char **);
|
||||
PyAPI_FUNC(int) _PyCode_VerifyStateless(
|
||||
PyThreadState *,
|
||||
PyCodeObject *,
|
||||
PyObject *globalnames,
|
||||
PyObject *globalsns,
|
||||
PyObject *builtinsns);
|
||||
|
||||
PyAPI_FUNC(int) _PyCode_CheckPureFunction(PyCodeObject *, const char **);
|
||||
PyAPI_FUNC(int) _PyCode_ReturnsOnlyNone(PyCodeObject *);
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue