aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/Python/compile.c
diff options
context:
space:
mode:
authorrobot-contrib <robot-contrib@yandex-team.com>2024-07-02 22:47:57 +0300
committerrobot-contrib <robot-contrib@yandex-team.com>2024-07-02 22:59:47 +0300
commit96b239778766d32d5158aca805e08199b3c0a743 (patch)
treea9c8679261a62138ec4735d878a11f6478cd196a /contrib/tools/python3/Python/compile.c
parent292e7317266c2136a1e1bd027e16e6eefb639028 (diff)
downloadydb-96b239778766d32d5158aca805e08199b3c0a743.tar.gz
Update contrib/tools/python3 to 3.12.4
6e8edffbef193b35b45ddccdc3beda6bb2627186
Diffstat (limited to 'contrib/tools/python3/Python/compile.c')
-rw-r--r--contrib/tools/python3/Python/compile.c111
1 files changed, 64 insertions, 47 deletions
diff --git a/contrib/tools/python3/Python/compile.c b/contrib/tools/python3/Python/compile.c
index a871e9c417..40335f6dc3 100644
--- a/contrib/tools/python3/Python/compile.c
+++ b/contrib/tools/python3/Python/compile.c
@@ -129,7 +129,8 @@ compiler IR.
enum fblocktype { WHILE_LOOP, FOR_LOOP, TRY_EXCEPT, FINALLY_TRY, FINALLY_END,
WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE, EXCEPTION_HANDLER,
- EXCEPTION_GROUP_HANDLER, ASYNC_COMPREHENSION_GENERATOR };
+ EXCEPTION_GROUP_HANDLER, ASYNC_COMPREHENSION_GENERATOR,
+ STOP_ITERATION };
struct fblockinfo {
enum fblocktype fb_type;
@@ -1070,7 +1071,7 @@ static int
compiler_addop_name(struct compiler_unit *u, location loc,
int opcode, PyObject *dict, PyObject *o)
{
- PyObject *mangled = _Py_Mangle(u->u_private, o);
+ PyObject *mangled = _Py_MaybeMangle(u->u_private, u->u_ste, o);
if (!mangled) {
return ERROR;
}
@@ -1546,6 +1547,7 @@ compiler_unwind_fblock(struct compiler *c, location *ploc,
case EXCEPTION_HANDLER:
case EXCEPTION_GROUP_HANDLER:
case ASYNC_COMPREHENSION_GENERATOR:
+ case STOP_ITERATION:
return SUCCESS;
case FOR_LOOP:
@@ -1887,7 +1889,7 @@ compiler_visit_kwonlydefaults(struct compiler *c, location loc,
arg_ty arg = asdl_seq_GET(kwonlyargs, i);
expr_ty default_ = asdl_seq_GET(kw_defaults, i);
if (default_) {
- PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
+ PyObject *mangled = _Py_MaybeMangle(c->u->u_private, c->u->u_ste, arg->arg);
if (!mangled) {
goto error;
}
@@ -1944,7 +1946,7 @@ compiler_visit_argannotation(struct compiler *c, identifier id,
if (!annotation) {
return SUCCESS;
}
- PyObject *mangled = _Py_Mangle(c->u->u_private, id);
+ PyObject *mangled = _Py_MaybeMangle(c->u->u_private, c->u->u_ste, id);
if (!mangled) {
return ERROR;
}
@@ -2235,14 +2237,26 @@ compiler_function_body(struct compiler *c, stmt_ty s, int is_async, Py_ssize_t f
c->u->u_metadata.u_argcount = asdl_seq_LEN(args->args);
c->u->u_metadata.u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
c->u->u_metadata.u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
+
+ NEW_JUMP_TARGET_LABEL(c, start);
+ USE_LABEL(c, start);
+ bool add_stopiteration_handler = c->u->u_ste->ste_coroutine || c->u->u_ste->ste_generator;
+ if (add_stopiteration_handler) {
+ /* wrap_in_stopiteration_handler will push a block, so we need to account for that */
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, NO_LOCATION, STOP_ITERATION,
+ start, NO_LABEL, NULL));
+ }
+
for (Py_ssize_t i = docstring ? 1 : 0; i < asdl_seq_LEN(body); i++) {
VISIT_IN_SCOPE(c, stmt, (stmt_ty)asdl_seq_GET(body, i));
}
- if (c->u->u_ste->ste_coroutine || c->u->u_ste->ste_generator) {
+ if (add_stopiteration_handler) {
if (wrap_in_stopiteration_handler(c) < 0) {
compiler_exit_scope(c);
return ERROR;
}
+ compiler_pop_fblock(c, STOP_ITERATION, start);
}
PyCodeObject *co = optimize_and_assemble(c, 1);
compiler_exit_scope(c);
@@ -2540,7 +2554,6 @@ compiler_class(struct compiler *c, stmt_ty s)
asdl_type_param_seq *type_params = s->v.ClassDef.type_params;
int is_generic = asdl_seq_LEN(type_params) > 0;
if (is_generic) {
- Py_XSETREF(c->u->u_private, Py_NewRef(s->v.ClassDef.name));
ADDOP(c, loc, PUSH_NULL);
PyObject *type_params_name = PyUnicode_FromFormat("<generic parameters of %U>",
s->v.ClassDef.name);
@@ -2553,6 +2566,7 @@ compiler_class(struct compiler *c, stmt_ty s)
return ERROR;
}
Py_DECREF(type_params_name);
+ Py_XSETREF(c->u->u_private, Py_NewRef(s->v.ClassDef.name));
RETURN_IF_ERROR_IN_SCOPE(c, compiler_type_params(c, type_params));
_Py_DECLARE_STR(type_params, ".type_params");
RETURN_IF_ERROR_IN_SCOPE(c, compiler_nameop(c, loc, &_Py_STR(type_params), Store));
@@ -4109,7 +4123,7 @@ compiler_nameop(struct compiler *c, location loc,
return ERROR;
}
- mangled = _Py_Mangle(c->u->u_private, name);
+ mangled = _Py_MaybeMangle(c->u->u_private, c->u->u_ste, name);
if (!mangled) {
return ERROR;
}
@@ -5444,10 +5458,48 @@ push_inlined_comprehension_state(struct compiler *c, location loc,
while (PyDict_Next(entry->ste_symbols, &pos, &k, &v)) {
assert(PyLong_Check(v));
long symbol = PyLong_AS_LONG(v);
- // only values bound in the comprehension (DEF_LOCAL) need to be handled
- // at all; DEF_LOCAL | DEF_NONLOCAL can occur in the case of an
- // assignment expression to a nonlocal in the comprehension, these don't
- // need handling here since they shouldn't be isolated
+ long scope = (symbol >> SCOPE_OFFSET) & SCOPE_MASK;
+ PyObject *outv = PyDict_GetItemWithError(c->u->u_ste->ste_symbols, k);
+ if (outv == NULL) {
+ if (PyErr_Occurred()) {
+ return ERROR;
+ }
+ outv = _PyLong_GetZero();
+ }
+ assert(PyLong_CheckExact(outv));
+ long outsc = (PyLong_AS_LONG(outv) >> SCOPE_OFFSET) & SCOPE_MASK;
+ // If a name has different scope inside than outside the comprehension,
+ // we need to temporarily handle it with the right scope while
+ // compiling the comprehension. If it's free in the comprehension
+ // scope, no special handling; it should be handled the same as the
+ // enclosing scope. (If it's free in outer scope and cell in inner
+ // scope, we can't treat it as both cell and free in the same function,
+ // but treating it as free throughout is fine; it's *_DEREF
+ // either way.)
+ if ((scope != outsc && scope != FREE && !(scope == CELL && outsc == FREE))
+ || in_class_block) {
+ if (state->temp_symbols == NULL) {
+ state->temp_symbols = PyDict_New();
+ if (state->temp_symbols == NULL) {
+ return ERROR;
+ }
+ }
+ // update the symbol to the in-comprehension version and save
+ // the outer version; we'll restore it after running the
+ // comprehension
+ Py_INCREF(outv);
+ if (PyDict_SetItem(c->u->u_ste->ste_symbols, k, v) < 0) {
+ Py_DECREF(outv);
+ return ERROR;
+ }
+ if (PyDict_SetItem(state->temp_symbols, k, outv) < 0) {
+ Py_DECREF(outv);
+ return ERROR;
+ }
+ Py_DECREF(outv);
+ }
+ // locals handling for names bound in comprehension (DEF_LOCAL |
+ // DEF_NONLOCAL occurs in assignment expression to nonlocal)
if ((symbol & DEF_LOCAL && !(symbol & DEF_NONLOCAL)) || in_class_block) {
if (!_PyST_IsFunctionLike(c->u->u_ste)) {
// non-function scope: override this name to use fast locals
@@ -5467,41 +5519,6 @@ push_inlined_comprehension_state(struct compiler *c, location loc,
}
}
}
- long scope = (symbol >> SCOPE_OFFSET) & SCOPE_MASK;
- PyObject *outv = PyDict_GetItemWithError(c->u->u_ste->ste_symbols, k);
- if (outv == NULL) {
- outv = _PyLong_GetZero();
- }
- assert(PyLong_Check(outv));
- long outsc = (PyLong_AS_LONG(outv) >> SCOPE_OFFSET) & SCOPE_MASK;
- if (scope != outsc && !(scope == CELL && outsc == FREE)) {
- // If a name has different scope inside than outside the
- // comprehension, we need to temporarily handle it with the
- // right scope while compiling the comprehension. (If it's free
- // in outer scope and cell in inner scope, we can't treat it as
- // both cell and free in the same function, but treating it as
- // free throughout is fine; it's *_DEREF either way.)
-
- if (state->temp_symbols == NULL) {
- state->temp_symbols = PyDict_New();
- if (state->temp_symbols == NULL) {
- return ERROR;
- }
- }
- // update the symbol to the in-comprehension version and save
- // the outer version; we'll restore it after running the
- // comprehension
- Py_INCREF(outv);
- if (PyDict_SetItem(c->u->u_ste->ste_symbols, k, v) < 0) {
- Py_DECREF(outv);
- return ERROR;
- }
- if (PyDict_SetItem(state->temp_symbols, k, outv) < 0) {
- Py_DECREF(outv);
- return ERROR;
- }
- Py_DECREF(outv);
- }
// local names bound in comprehension must be isolated from
// outer scope; push existing value (which may be NULL if
// not defined) on stack
@@ -6366,7 +6383,7 @@ compiler_annassign(struct compiler *c, stmt_ty s)
VISIT(c, expr, s->v.AnnAssign.annotation);
}
ADDOP_NAME(c, loc, LOAD_NAME, &_Py_ID(__annotations__), names);
- mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
+ mangled = _Py_MaybeMangle(c->u->u_private, c->u->u_ste, targ->v.Name.id);
ADDOP_LOAD_CONST_NEW(c, loc, mangled);
ADDOP(c, loc, STORE_SUBSCR);
}