summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2022-12-12 14:22:15 (GMT)
committerGitHub <noreply@github.com>2022-12-12 14:22:15 (GMT)
commite4ea33b17807d99ed737f800d9b0006957c008d2 (patch)
tree0e718bf367b6c305a58d2ef79fc69805b8d8b586
parent158b8a07212cea6066afe8bb91f1cd542d922dba (diff)
downloadcpython-e4ea33b17807d99ed737f800d9b0006957c008d2.zip
cpython-e4ea33b17807d99ed737f800d9b0006957c008d2.tar.gz
cpython-e4ea33b17807d99ed737f800d9b0006957c008d2.tar.bz2
gh-99955: standardize return values of functions in compiler's code-gen (#100010)
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-12-12-11-27-54.gh-issue-99955.Ix5Rrg.rst1
-rw-r--r--Python/compile.c1454
2 files changed, 695 insertions, 760 deletions
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-12-12-11-27-54.gh-issue-99955.Ix5Rrg.rst b/Misc/NEWS.d/next/Core and Builtins/2022-12-12-11-27-54.gh-issue-99955.Ix5Rrg.rst
new file mode 100644
index 0000000..e9867b3
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-12-12-11-27-54.gh-issue-99955.Ix5Rrg.rst
@@ -0,0 +1 @@
+Internal compiler functions (in compile.c) now consistently return -1 on error and 0 on success.
diff --git a/Python/compile.c b/Python/compile.c
index d6ed694..17b164a 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -55,6 +55,14 @@
*/
#define STACK_USE_GUIDELINE 30
+#define SUCCESS 0
+#define ERROR -1
+
+#define RETURN_IF_ERROR(X) \
+ if ((X) == -1) { \
+ return ERROR; \
+ }
+
/* If we exceed this limit, it should
* be considered a compiler bug.
* Currently it should be impossible
@@ -498,7 +506,7 @@ static int compiler_annassign(struct compiler *, stmt_ty);
static int compiler_subscript(struct compiler *, expr_ty);
static int compiler_slice(struct compiler *, expr_ty);
-static int are_all_items_const(asdl_expr_seq *, Py_ssize_t, Py_ssize_t);
+static bool are_all_items_const(asdl_expr_seq *, Py_ssize_t, Py_ssize_t);
static int compiler_with(struct compiler *, stmt_ty, int);
@@ -610,18 +618,18 @@ compiler_setup(struct compiler *c, mod_ty mod, PyObject *filename,
{
c->c_const_cache = PyDict_New();
if (!c->c_const_cache) {
- return 0;
+ return ERROR;
}
c->c_stack = PyList_New(0);
if (!c->c_stack) {
- return 0;
+ return ERROR;
}
c->c_filename = Py_NewRef(filename);
c->c_arena = arena;
if (!_PyFuture_FromAST(mod, filename, &c->c_future)) {
- return 0;
+ return ERROR;
}
int merged = c->c_future.ff_features | flags.cf_flags;
c->c_future.ff_features = merged;
@@ -635,16 +643,16 @@ compiler_setup(struct compiler *c, mod_ty mod, PyObject *filename,
state.ff_features = merged;
if (!_PyAST_Optimize(mod, arena, &state)) {
- return 0;
+ return ERROR;
}
c->c_st = _PySymtable_Build(mod, filename, &c->c_future);
if (c->c_st == NULL) {
if (!PyErr_Occurred()) {
PyErr_SetString(PyExc_SystemError, "no symtable");
}
- return 0;
+ return ERROR;
}
- return 1;
+ return SUCCESS;
}
static struct compiler*
@@ -656,7 +664,7 @@ new_compiler(mod_ty mod, PyObject *filename, PyCompilerFlags *pflags,
if (c == NULL) {
return NULL;
}
- if (!compiler_setup(c, mod, filename, flags, optimize, arena)) {
+ if (compiler_setup(c, mod, filename, flags, optimize, arena) < 0) {
compiler_free(c);
return NULL;
}
@@ -800,11 +808,12 @@ cfg_builder_init(cfg_builder *g)
{
g->g_block_list = NULL;
basicblock *block = cfg_builder_new_block(g);
- if (block == NULL)
- return 0;
+ if (block == NULL) {
+ return ERROR;
+ }
g->g_curblock = g->g_entryblock = block;
g->g_current_label = NO_LABEL;
- return 1;
+ return SUCCESS;
}
static void
@@ -862,8 +871,10 @@ compiler_set_qualname(struct compiler *c)
|| u->u_scope_type == COMPILER_SCOPE_CLASS) {
assert(u->u_name);
mangled = _Py_Mangle(parent->u_private, u->u_name);
- if (!mangled)
- return 0;
+ if (!mangled) {
+ return ERROR;
+ }
+
scope = _PyST_GetScope(parent->u_ste, mangled);
Py_DECREF(mangled);
assert(scope != GLOBAL_IMPLICIT);
@@ -879,8 +890,9 @@ compiler_set_qualname(struct compiler *c)
_Py_DECLARE_STR(dot_locals, ".<locals>");
base = PyUnicode_Concat(parent->u_qualname,
&_Py_STR(dot_locals));
- if (base == NULL)
- return 0;
+ if (base == NULL) {
+ return ERROR;
+ }
}
else {
base = Py_NewRef(parent->u_qualname);
@@ -892,18 +904,20 @@ compiler_set_qualname(struct compiler *c)
_Py_DECLARE_STR(dot, ".");
name = PyUnicode_Concat(base, &_Py_STR(dot));
Py_DECREF(base);
- if (name == NULL)
- return 0;
+ if (name == NULL) {
+ return ERROR;
+ }
PyUnicode_Append(&name, u->u_name);
- if (name == NULL)
- return 0;
+ if (name == NULL) {
+ return ERROR;
+ }
}
else {
name = Py_NewRef(u->u_name);
}
u->u_qualname = name;
- return 1;
+ return SUCCESS;
}
static jump_target_label
@@ -1304,10 +1318,6 @@ PyCompile_OpcodeStackEffect(int opcode, int oparg)
return stack_effect(opcode, oparg, -1);
}
-/* Add an opcode with no argument.
- Returns 0 on failure, 1 on success.
-*/
-
static int
basicblock_addop(basicblock *b, int opcode, int oparg, location loc)
{
@@ -1318,7 +1328,7 @@ basicblock_addop(basicblock *b, int opcode, int oparg, location loc)
int off = basicblock_next_instr(b);
if (off < 0) {
- return 0;
+ return ERROR;
}
struct instr *i = &b->b_instr[off];
i->i_opcode = opcode;
@@ -1326,7 +1336,7 @@ basicblock_addop(basicblock *b, int opcode, int oparg, location loc)
i->i_target = NULL;
i->i_loc = loc;
- return 1;
+ return SUCCESS;
}
static bool
@@ -1522,8 +1532,9 @@ static int
compiler_addop_load_const(struct compiler *c, location loc, PyObject *o)
{
Py_ssize_t arg = compiler_add_const(c, o);
- if (arg < 0)
- return 0;
+ if (arg < 0) {
+ return ERROR;
+ }
return cfg_builder_addop_i(CFG_BUILDER(c), LOAD_CONST, arg, loc);
}
@@ -1532,8 +1543,9 @@ compiler_addop_o(struct compiler *c, location loc,
int opcode, PyObject *dict, PyObject *o)
{
Py_ssize_t arg = dict_add_o(dict, o);
- if (arg < 0)
- return 0;
+ if (arg < 0) {
+ return ERROR;
+ }
return cfg_builder_addop_i(CFG_BUILDER(c), opcode, arg, loc);
}
@@ -1544,12 +1556,14 @@ compiler_addop_name(struct compiler *c, location loc,
Py_ssize_t arg;
PyObject *mangled = _Py_Mangle(c->u->u_private, o);
- if (!mangled)
- return 0;
+ if (!mangled) {
+ return ERROR;
+ }
arg = dict_add_o(dict, mangled);
Py_DECREF(mangled);
- if (arg < 0)
- return 0;
+ if (arg < 0) {
+ return ERROR;
+ }
if (opcode == LOAD_ATTR) {
arg <<= 1;
}
@@ -1561,9 +1575,7 @@ compiler_addop_name(struct compiler *c, location loc,
return cfg_builder_addop_i(CFG_BUILDER(c), opcode, arg, loc);
}
-/* Add an opcode with an integer argument.
- Returns 0 on failure, 1 on success.
-*/
+/* Add an opcode with an integer argument */
static int
cfg_builder_addop_i(cfg_builder *g, int opcode, Py_ssize_t oparg, location loc)
{
@@ -1588,94 +1600,79 @@ cfg_builder_addop_j(cfg_builder *g, location loc,
return cfg_builder_addop(g, opcode, target.id, loc);
}
-
-#define ADDOP(C, LOC, OP) { \
- if (!cfg_builder_addop_noarg(CFG_BUILDER(C), (OP), (LOC))) \
- return 0; \
-}
+#define ADDOP(C, LOC, OP) \
+ RETURN_IF_ERROR(cfg_builder_addop_noarg(CFG_BUILDER(C), (OP), (LOC)))
#define ADDOP_IN_SCOPE(C, LOC, OP) { \
- if (!cfg_builder_addop_noarg(CFG_BUILDER(C), (OP), (LOC))) { \
+ if (cfg_builder_addop_noarg(CFG_BUILDER(C), (OP), (LOC)) < 0) { \
compiler_exit_scope(c); \
- return 0; \
+ return -1; \
} \
}
-#define ADDOP_LOAD_CONST(C, LOC, O) { \
- if (!compiler_addop_load_const((C), (LOC), (O))) \
- return 0; \
-}
+#define ADDOP_LOAD_CONST(C, LOC, O) \
+ RETURN_IF_ERROR(compiler_addop_load_const((C), (LOC), (O)))
/* Same as ADDOP_LOAD_CONST, but steals a reference. */
#define ADDOP_LOAD_CONST_NEW(C, LOC, O) { \
PyObject *__new_const = (O); \
if (__new_const == NULL) { \
- return 0; \
+ return ERROR; \
} \
- if (!compiler_addop_load_const((C), (LOC), __new_const)) { \
+ if (compiler_addop_load_const((C), (LOC), __new_const) < 0) { \
Py_DECREF(__new_const); \
- return 0; \
+ return ERROR; \
} \
Py_DECREF(__new_const); \
}
#define ADDOP_N(C, LOC, OP, O, TYPE) { \
assert(!HAS_CONST(OP)); /* use ADDOP_LOAD_CONST_NEW */ \
- if (!compiler_addop_o((C), (LOC), (OP), (C)->u->u_ ## TYPE, (O))) { \
+ if (compiler_addop_o((C), (LOC), (OP), (C)->u->u_ ## TYPE, (O)) < 0) { \
Py_DECREF((O)); \
- return 0; \
+ return ERROR; \
} \
Py_DECREF((O)); \
}
-#define ADDOP_NAME(C, LOC, OP, O, TYPE) { \
- if (!compiler_addop_name((C), (LOC), (OP), (C)->u->u_ ## TYPE, (O))) \
- return 0; \
-}
+#define ADDOP_NAME(C, LOC, OP, O, TYPE) \
+ RETURN_IF_ERROR(compiler_addop_name((C), (LOC), (OP), (C)->u->u_ ## TYPE, (O)))
-#define ADDOP_I(C, LOC, OP, O) { \
- if (!cfg_builder_addop_i(CFG_BUILDER(C), (OP), (O), (LOC))) \
- return 0; \
-}
+#define ADDOP_I(C, LOC, OP, O) \
+ RETURN_IF_ERROR(cfg_builder_addop_i(CFG_BUILDER(C), (OP), (O), (LOC)))
-#define ADDOP_JUMP(C, LOC, OP, O) { \
- if (!cfg_builder_addop_j(CFG_BUILDER(C), (LOC), (OP), (O))) \
- return 0; \
-}
+#define ADDOP_JUMP(C, LOC, OP, O) \
+ RETURN_IF_ERROR(cfg_builder_addop_j(CFG_BUILDER(C), (LOC), (OP), (O)))
-#define ADDOP_COMPARE(C, LOC, CMP) { \
- if (!compiler_addcompare((C), (LOC), (cmpop_ty)(CMP))) \
- return 0; \
-}
+#define ADDOP_COMPARE(C, LOC, CMP) \
+ RETURN_IF_ERROR(compiler_addcompare((C), (LOC), (cmpop_ty)(CMP)))
#define ADDOP_BINARY(C, LOC, BINOP) \
- RETURN_IF_FALSE(addop_binary((C), (LOC), (BINOP), false))
+ RETURN_IF_ERROR(addop_binary((C), (LOC), (BINOP), false))
#define ADDOP_INPLACE(C, LOC, BINOP) \
- RETURN_IF_FALSE(addop_binary((C), (LOC), (BINOP), true))
+ RETURN_IF_ERROR(addop_binary((C), (LOC), (BINOP), true))
#define ADD_YIELD_FROM(C, LOC, await) \
- RETURN_IF_FALSE(compiler_add_yield_from((C), (LOC), (await)))
+ RETURN_IF_ERROR(compiler_add_yield_from((C), (LOC), (await)))
#define POP_EXCEPT_AND_RERAISE(C, LOC) \
- RETURN_IF_FALSE(compiler_pop_except_and_reraise((C), (LOC)))
+ RETURN_IF_ERROR(compiler_pop_except_and_reraise((C), (LOC)))
#define ADDOP_YIELD(C, LOC) \
- RETURN_IF_FALSE(addop_yield((C), (LOC)))
+ RETURN_IF_ERROR(addop_yield((C), (LOC)))
/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
the ASDL name to synthesize the name of the C type and the visit function.
*/
-#define VISIT(C, TYPE, V) {\
- if (!compiler_visit_ ## TYPE((C), (V))) \
- return 0; \
-}
+#define VISIT(C, TYPE, V) \
+ RETURN_IF_ERROR(compiler_visit_ ## TYPE((C), (V)));
#define VISIT_IN_SCOPE(C, TYPE, V) {\
- if (!compiler_visit_ ## TYPE((C), (V))) { \
+ if (compiler_visit_ ## TYPE((C), (V)) < 0) { \
compiler_exit_scope(c); \
- return 0; \
+ return ERROR; \
} \
}
@@ -1684,8 +1681,8 @@ cfg_builder_addop_j(cfg_builder *g, location loc,
asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \
for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
- if (!compiler_visit_ ## TYPE((C), elt)) \
- return 0; \
+ if (compiler_visit_ ## TYPE((C), elt) < 0) \
+ return ERROR; \
} \
}
@@ -1694,17 +1691,13 @@ cfg_builder_addop_j(cfg_builder *g, location loc,
asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \
for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
- if (!compiler_visit_ ## TYPE((C), elt)) { \
+ if (compiler_visit_ ## TYPE((C), elt) < 0) { \
compiler_exit_scope(c); \
- return 0; \
+ return ERROR; \
} \
} \
}
-#define RETURN_IF_FALSE(X) \
- if (!(X)) { \
- return 0; \
- }
static int
compiler_enter_scope(struct compiler *c, identifier name,
@@ -1718,7 +1711,7 @@ compiler_enter_scope(struct compiler *c, identifier name,
struct compiler_unit));
if (!u) {
PyErr_NoMemory();
- return 0;
+ return ERROR;
}
u->u_scope_type = scope_type;
u->u_argcount = 0;
@@ -1727,14 +1720,14 @@ compiler_enter_scope(struct compiler *c, identifier name,
u->u_ste = PySymtable_Lookup(c->c_st, key);
if (!u->u_ste) {
compiler_unit_free(u);
- return 0;
+ return ERROR;
}
u->u_name = Py_NewRef(name);
u->u_varnames = list2dict(u->u_ste->ste_varnames);
u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
if (!u->u_varnames || !u->u_cellvars) {
compiler_unit_free(u);
- return 0;
+ return ERROR;
}
if (u->u_ste->ste_needs_class_closure) {
/* Cook up an implicit __class__ cell. */
@@ -1745,7 +1738,7 @@ compiler_enter_scope(struct compiler *c, identifier name,
_PyLong_GetZero());
if (res < 0) {
compiler_unit_free(u);
- return 0;
+ return ERROR;
}
}
@@ -1753,7 +1746,7 @@ compiler_enter_scope(struct compiler *c, identifier name,
PyDict_GET_SIZE(u->u_cellvars));
if (!u->u_freevars) {
compiler_unit_free(u);
- return 0;
+ return ERROR;
}
u->u_nfblocks = 0;
@@ -1761,12 +1754,12 @@ compiler_enter_scope(struct compiler *c, identifier name,
u->u_consts = PyDict_New();
if (!u->u_consts) {
compiler_unit_free(u);
- return 0;
+ return ERROR;
}
u->u_names = PyDict_New();
if (!u->u_names) {
compiler_unit_free(u);
- return 0;
+ return ERROR;
}
u->u_private = NULL;
@@ -1777,7 +1770,7 @@ compiler_enter_scope(struct compiler *c, identifier name,
if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
Py_XDECREF(capsule);
compiler_unit_free(u);
- return 0;
+ return ERROR;
}
Py_DECREF(capsule);
u->u_private = Py_XNewRef(c->u->u_private);
@@ -1787,23 +1780,20 @@ compiler_enter_scope(struct compiler *c, identifier name,
c->c_nestlevel++;
cfg_builder *g = CFG_BUILDER(c);
- if (!cfg_builder_init(g)) {
- return 0;
- }
+ RETURN_IF_ERROR(cfg_builder_init(g));
if (u->u_scope_type == COMPILER_SCOPE_MODULE) {
loc.lineno = 0;
}
else {
- if (!compiler_set_qualname(c))
- return 0;
+ RETURN_IF_ERROR(compiler_set_qualname(c));
}
ADDOP_I(c, loc, RESUME, 0);
if (u->u_scope_type == COMPILER_SCOPE_MODULE) {
loc.lineno = -1;
}
- return 1;
+ return SUCCESS;
}
static void
@@ -1837,7 +1827,7 @@ compiler_exit_scope(struct compiler *c)
/* Search if variable annotations are present statically in a block. */
-static int
+static bool
find_ann(asdl_stmt_seq *stmts)
{
int i, j, res = 0;
@@ -1847,7 +1837,7 @@ find_ann(asdl_stmt_seq *stmts)
st = (stmt_ty)asdl_seq_GET(stmts, i);
switch (st->kind) {
case AnnAssign_kind:
- return 1;
+ return true;
case For_kind:
res = find_ann(st->v.For.body) ||
find_ann(st->v.For.orelse);
@@ -1875,7 +1865,7 @@ find_ann(asdl_stmt_seq *stmts)
excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
st->v.Try.handlers, j);
if (find_ann(handler->v.ExceptHandler.body)) {
- return 1;
+ return true;
}
}
res = find_ann(st->v.Try.body) ||
@@ -1887,7 +1877,7 @@ find_ann(asdl_stmt_seq *stmts)
excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
st->v.TryStar.handlers, j);
if (find_ann(handler->v.ExceptHandler.body)) {
- return 1;
+ return true;
}
}
res = find_ann(st->v.TryStar.body) ||
@@ -1895,7 +1885,7 @@ find_ann(asdl_stmt_seq *stmts)
find_ann(st->v.TryStar.orelse);
break;
default:
- res = 0;
+ res = false;
}
if (res) {
break;
@@ -1922,7 +1912,7 @@ compiler_push_fblock(struct compiler *c, location loc,
f->fb_block = block_label;
f->fb_exit = exit;
f->fb_datum = datum;
- return 1;
+ return SUCCESS;
}
static void
@@ -1942,7 +1932,7 @@ compiler_call_exit_with_nones(struct compiler *c, location loc)
ADDOP_LOAD_CONST(c, loc, Py_None);
ADDOP_LOAD_CONST(c, loc, Py_None);
ADDOP_I(c, loc, CALL, 2);
- return 1;
+ return SUCCESS;
}
static int
@@ -1966,7 +1956,7 @@ compiler_add_yield_from(struct compiler *c, location loc, int await)
ADDOP(c, loc, CLEANUP_THROW);
USE_LABEL(c, exit);
- return 1;
+ return SUCCESS;
}
static int
@@ -1982,7 +1972,7 @@ compiler_pop_except_and_reraise(struct compiler *c, location loc)
ADDOP_I(c, loc, COPY, 3);
ADDOP(c, loc, POP_EXCEPT);
ADDOP_I(c, loc, RERAISE, 1);
- return 1;
+ return SUCCESS;
}
/* Unwind a frame block. If preserve_tos is true, the TOS before
@@ -1999,7 +1989,7 @@ compiler_unwind_fblock(struct compiler *c, location *ploc,
case EXCEPTION_HANDLER:
case EXCEPTION_GROUP_HANDLER:
case ASYNC_COMPREHENSION_GENERATOR:
- return 1;
+ return SUCCESS;
case FOR_LOOP:
/* Pop the iterator */
@@ -2007,19 +1997,18 @@ compiler_unwind_fblock(struct compiler *c, location *ploc,
ADDOP_I(c, *ploc, SWAP, 2);
}
ADDOP(c, *ploc, POP_TOP);
- return 1;
+ return SUCCESS;
case TRY_EXCEPT:
ADDOP(c, *ploc, POP_BLOCK);
- return 1;
+ return SUCCESS;
case FINALLY_TRY:
/* This POP_BLOCK gets the line number of the unwinding statement */
ADDOP(c, *ploc, POP_BLOCK);
if (preserve_tos) {
- if (!compiler_push_fblock(c, *ploc, POP_VALUE, NO_LABEL, NO_LABEL, NULL)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, *ploc, POP_VALUE, NO_LABEL, NO_LABEL, NULL));
}
/* Emit the finally block */
VISIT_SEQ(c, stmt, info->fb_datum);
@@ -2030,7 +2019,7 @@ compiler_unwind_fblock(struct compiler *c, location *ploc,
* statement causing the unwinding, so make the unwinding
* instruction artificial */
*ploc = NO_LOCATION;
- return 1;
+ return SUCCESS;
case FINALLY_END:
if (preserve_tos) {
@@ -2042,7 +2031,7 @@ compiler_unwind_fblock(struct compiler *c, location *ploc,
}
ADDOP(c, *ploc, POP_BLOCK);
ADDOP(c, *ploc, POP_EXCEPT);
- return 1;
+ return SUCCESS;
case WITH:
case ASYNC_WITH:
@@ -2051,9 +2040,7 @@ compiler_unwind_fblock(struct compiler *c, location *ploc,
if (preserve_tos) {
ADDOP_I(c, *ploc, SWAP, 2);
}
- if(!compiler_call_exit_with_nones(c, *ploc)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_call_exit_with_nones(c, *ploc));
if (info->fb_type == ASYNC_WITH) {
ADDOP_I(c, *ploc, GET_AWAITABLE, 2);
ADDOP_LOAD_CONST(c, *ploc, Py_None);
@@ -2064,7 +2051,7 @@ compiler_unwind_fblock(struct compiler *c, location *ploc,
* statement causing the unwinding, so make the unwinding
* instruction artificial */
*ploc = NO_LOCATION;
- return 1;
+ return SUCCESS;
case HANDLER_CLEANUP: {
if (info->fb_datum) {
@@ -2077,17 +2064,17 @@ compiler_unwind_fblock(struct compiler *c, location *ploc,
ADDOP(c, *ploc, POP_EXCEPT);
if (info->fb_datum) {
ADDOP_LOAD_CONST(c, *ploc, Py_None);
- compiler_nameop(c, *ploc, info->fb_datum, Store);
- compiler_nameop(c, *ploc, info->fb_datum, Del);
+ RETURN_IF_ERROR(compiler_nameop(c, *ploc, info->fb_datum, Store));
+ RETURN_IF_ERROR(compiler_nameop(c, *ploc, info->fb_datum, Del));
}
- return 1;
+ return SUCCESS;
}
case POP_VALUE: {
if (preserve_tos) {
ADDOP_I(c, *ploc, SWAP, 2);
}
ADDOP(c, *ploc, POP_TOP);
- return 1;
+ return SUCCESS;
}
}
Py_UNREACHABLE();
@@ -2099,7 +2086,7 @@ compiler_unwind_fblock_stack(struct compiler *c, location *ploc,
int preserve_tos, struct fblockinfo **loop)
{
if (c->u->u_nfblocks == 0) {
- return 1;
+ return SUCCESS;
}
struct fblockinfo *top = &c->u->u_fblock[c->u->u_nfblocks-1];
if (top->fb_type == EXCEPTION_GROUP_HANDLER) {
@@ -2108,19 +2095,15 @@ compiler_unwind_fblock_stack(struct compiler *c, location *ploc,
}
if (loop != NULL && (top->fb_type == WHILE_LOOP || top->fb_type == FOR_LOOP)) {
*loop = top;
- return 1;
+ return SUCCESS;
}
struct fblockinfo copy = *top;
c->u->u_nfblocks--;
- if (!compiler_unwind_fblock(c, ploc, &copy, preserve_tos)) {
- return 0;
- }
- if (!compiler_unwind_fblock_stack(c, ploc, preserve_tos, loop)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_unwind_fblock(c, ploc, &copy, preserve_tos));
+ RETURN_IF_ERROR(compiler_unwind_fblock_stack(c, ploc, preserve_tos, loop));
c->u->u_fblock[c->u->u_nfblocks] = copy;
c->u->u_nfblocks++;
- return 1;
+ return SUCCESS;
}
/* Compile a sequence of statements, checking for a docstring
@@ -2145,8 +2128,9 @@ compiler_body(struct compiler *c, location loc, asdl_stmt_seq *stmts)
if (find_ann(stmts)) {
ADDOP(c, loc, SETUP_ANNOTATIONS);
}
- if (!asdl_seq_LEN(stmts))
- return 1;
+ if (!asdl_seq_LEN(stmts)) {
+ return SUCCESS;
+ }
/* if not -OO mode, set docstring */
if (c->c_optimize < 2) {
docstring = _PyAST_GetDocString(stmts);
@@ -2155,29 +2139,29 @@ compiler_body(struct compiler *c, location loc, asdl_stmt_seq *stmts)
st = (stmt_ty)asdl_seq_GET(stmts, 0);
assert(st->kind == Expr_kind);
VISIT(c, expr, st->v.Expr.value);
- if (!compiler_nameop(c, NO_LOCATION, &_Py_ID(__doc__), Store))
- return 0;
+ RETURN_IF_ERROR(compiler_nameop(c, NO_LOCATION, &_Py_ID(__doc__), Store));
}
}
- for (; i < asdl_seq_LEN(stmts); i++)
+ for (; i < asdl_seq_LEN(stmts); i++) {
VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
- return 1;
+ }
+ return SUCCESS;
}
static int
compiler_codegen(struct compiler *c, mod_ty mod)
{
_Py_DECLARE_STR(anon_module, "<module>");
- if (!compiler_enter_scope(c, &_Py_STR(anon_module), COMPILER_SCOPE_MODULE,
- mod, 1)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_enter_scope(c, &_Py_STR(anon_module), COMPILER_SCOPE_MODULE,
+ mod, 1));
+
location loc = LOCATION(1, 1, 0, 0);
switch (mod->kind) {
case Module_kind:
- if (!compiler_body(c, loc, mod->v.Module.body)) {
+ if (compiler_body(c, loc, mod->v.Module.body) < 0) {
compiler_exit_scope(c);
- return 0;
+ return ERROR;
}
break;
case Interactive_kind:
@@ -2194,16 +2178,16 @@ compiler_codegen(struct compiler *c, mod_ty mod)
PyErr_Format(PyExc_SystemError,
"module kind %d should not be possible",
mod->kind);
- return 0;
+ return ERROR;
}
- return 1;
+ return SUCCESS;
}
static PyCodeObject *
compiler_mod(struct compiler *c, mod_ty mod)
{
int addNone = mod->kind != Expression_kind;
- if (!compiler_codegen(c, mod)) {
+ if (compiler_codegen(c, mod) < 0) {
return NULL;
}
PyCodeObject *co = assemble(c, addNone);
@@ -2270,7 +2254,7 @@ compiler_make_closure(struct compiler *c, location loc,
*/
int reftype = get_ref_type(c, name);
if (reftype == -1) {
- return 0;
+ return ERROR;
}
int arg;
if (reftype == CELL) {
@@ -2293,7 +2277,7 @@ compiler_make_closure(struct compiler *c, location loc,
co->co_name,
freevars);
Py_DECREF(freevars);
- return 0;
+ return ERROR;
}
ADDOP_I(c, loc, LOAD_CLOSURE, arg);
}
@@ -2302,34 +2286,34 @@ compiler_make_closure(struct compiler *c, location loc,
}
ADDOP_LOAD_CONST(c, loc, (PyObject*)co);
ADDOP_I(c, loc, MAKE_FUNCTION, flags);
- return 1;
+ return SUCCESS;
}
static int
compiler_decorators(struct compiler *c, asdl_expr_seq* decos)
{
- int i;
-
- if (!decos)
- return 1;
+ if (!decos) {
+ return SUCCESS;
+ }
- for (i = 0; i < asdl_seq_LEN(decos); i++) {
+ for (Py_ssize_t i = 0; i < asdl_seq_LEN(decos); i++) {
VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
}
- return 1;
+ return SUCCESS;
}
static int
compiler_apply_decorators(struct compiler *c, asdl_expr_seq* decos)
{
- if (!decos)
- return 1;
+ if (!decos) {
+ return SUCCESS;
+ }
for (Py_ssize_t i = asdl_seq_LEN(decos) - 1; i > -1; i--) {
location loc = LOC((expr_ty)asdl_seq_GET(decos, i));
ADDOP_I(c, loc, CALL, 0);
}
- return 1;
+ return SUCCESS;
}
static int
@@ -2338,7 +2322,7 @@ compiler_visit_kwonlydefaults(struct compiler *c, location loc,
{
/* Push a dict of keyword-only default values.
- Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
+ Return -1 on error, 0 if no dict pushed, 1 if a dict is pushed.
*/
int i;
PyObject *keys = NULL;
@@ -2355,7 +2339,7 @@ compiler_visit_kwonlydefaults(struct compiler *c, location loc,
keys = PyList_New(1);
if (keys == NULL) {
Py_DECREF(mangled);
- return 0;
+ return ERROR;
}
PyList_SET_ITEM(keys, 0, mangled);
}
@@ -2366,7 +2350,7 @@ compiler_visit_kwonlydefaults(struct compiler *c, location loc,
goto error;
}
}
- if (!compiler_visit_expr(c, default_)) {
+ if (compiler_visit_expr(c, default_) < 0) {
goto error;
}
}
@@ -2381,12 +2365,12 @@ compiler_visit_kwonlydefaults(struct compiler *c, location loc,
return 1;
}
else {
- return -1;
+ return 0;
}
error:
Py_XDECREF(keys);
- return 0;
+ return ERROR;
}
static int
@@ -2394,7 +2378,7 @@ compiler_visit_annexpr(struct compiler *c, expr_ty annotation)
{
location loc = LOC(annotation);
ADDOP_LOAD_CONST_NEW(c, loc, _PyAST_ExprAsUnicode(annotation));
- return 1;
+ return SUCCESS;
}
static int
@@ -2402,11 +2386,11 @@ compiler_visit_argannotation(struct compiler *c, identifier id,
expr_ty annotation, Py_ssize_t *annotations_len, location loc)
{
if (!annotation) {
- return 1;
+ return SUCCESS;
}
PyObject *mangled = _Py_Mangle(c->u->u_private, id);
if (!mangled) {
- return 0;
+ return ERROR;
}
ADDOP_LOAD_CONST(c, loc, mangled);
Py_DECREF(mangled);
@@ -2428,7 +2412,7 @@ compiler_visit_argannotation(struct compiler *c, identifier id,
}
}
*annotations_len += 2;
- return 1;
+ return SUCCESS;
}
static int
@@ -2438,15 +2422,15 @@ compiler_visit_argannotations(struct compiler *c, asdl_arg_seq* args,
int i;
for (i = 0; i < asdl_seq_LEN(args); i++) {
arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
- if (!compiler_visit_argannotation(
+ RETURN_IF_ERROR(
+ compiler_visit_argannotation(
c,
arg->arg,
arg->annotation,
annotations_len,
- loc))
- return 0;
+ loc));
}
- return 1;
+ return SUCCESS;
}
static int
@@ -2456,36 +2440,40 @@ compiler_visit_annotations(struct compiler *c, location loc,
/* Push arg annotation names and values.
The expressions are evaluated out-of-order wrt the source code.
- Return 0 on error, -1 if no annotations pushed, 1 if a annotations is pushed.
+ Return -1 on error, 0 if no annotations pushed, 1 if a annotations is pushed.
*/
Py_ssize_t annotations_len = 0;
- if (!compiler_visit_argannotations(c, args->args, &annotations_len, loc))
- return 0;
- if (!compiler_visit_argannotations(c, args->posonlyargs, &annotations_len, loc))
- return 0;
- if (args->vararg && args->vararg->annotation &&
- !compiler_visit_argannotation(c, args->vararg->arg,
- args->vararg->annotation, &annotations_len, loc))
- return 0;
- if (!compiler_visit_argannotations(c, args->kwonlyargs, &annotations_len, loc))
- return 0;
- if (args->kwarg && args->kwarg->annotation &&
- !compiler_visit_argannotation(c, args->kwarg->arg,
- args->kwarg->annotation, &annotations_len, loc))
- return 0;
+ RETURN_IF_ERROR(
+ compiler_visit_argannotations(c, args->args, &annotations_len, loc));
- if (!compiler_visit_argannotation(c, &_Py_ID(return), returns,
- &annotations_len, loc)) {
- return 0;
+ RETURN_IF_ERROR(
+ compiler_visit_argannotations(c, args->posonlyargs, &annotations_len, loc));
+
+ if (args->vararg && args->vararg->annotation) {
+ RETURN_IF_ERROR(
+ compiler_visit_argannotation(c, args->vararg->arg,
+ args->vararg->annotation, &annotations_len, loc));
}
+ RETURN_IF_ERROR(
+ compiler_visit_argannotations(c, args->kwonlyargs, &annotations_len, loc));
+
+ if (args->kwarg && args->kwarg->annotation) {
+ RETURN_IF_ERROR(
+ compiler_visit_argannotation(c, args->kwarg->arg,
+ args->kwarg->annotation, &annotations_len, loc));
+ }
+
+ RETURN_IF_ERROR(
+ compiler_visit_argannotation(c, &_Py_ID(return), returns, &annotations_len, loc));
+
if (annotations_len) {
ADDOP_I(c, loc, BUILD_TUPLE, annotations_len);
return 1;
}
- return -1;
+ return 0;
}
static int
@@ -2494,7 +2482,7 @@ compiler_visit_defaults(struct compiler *c, arguments_ty args,
{
VISIT_SEQ(c, expr, args->defaults);
ADDOP_I(c, loc, BUILD_TUPLE, asdl_seq_LEN(args->defaults));
- return 1;
+ return SUCCESS;
}
static Py_ssize_t
@@ -2503,47 +2491,45 @@ compiler_default_arguments(struct compiler *c, location loc,
{
Py_ssize_t funcflags = 0;
if (args->defaults && asdl_seq_LEN(args->defaults) > 0) {
- if (!compiler_visit_defaults(c, args, loc))
- return -1;
+ RETURN_IF_ERROR(compiler_visit_defaults(c, args, loc));
funcflags |= 0x01;
}
if (args->kwonlyargs) {
int res = compiler_visit_kwonlydefaults(c, loc,
args->kwonlyargs,
args->kw_defaults);
- if (res == 0) {
- return -1;
- }
- else if (res > 0) {
+ RETURN_IF_ERROR(res);
+ if (res > 0) {
funcflags |= 0x02;
}
}
return funcflags;
}
-static int
+static bool
forbidden_name(struct compiler *c, location loc, identifier name,
expr_context_ty ctx)
{
if (ctx == Store && _PyUnicode_EqualToASCIIString(name, "__debug__")) {
compiler_error(c, loc, "cannot assign to __debug__");
- return 1;
+ return true;
}
if (ctx == Del && _PyUnicode_EqualToASCIIString(name, "__debug__")) {
compiler_error(c, loc, "cannot delete __debug__");
- return 1;
+ return true;
}
- return 0;
+ return false;
}
static int
compiler_check_debug_one_arg(struct compiler *c, arg_ty arg)
{
if (arg != NULL) {
- if (forbidden_name(c, LOC(arg), arg->arg, Store))
- return 0;
+ if (forbidden_name(c, LOC(arg), arg->arg, Store)) {
+ return ERROR;
+ }
}
- return 1;
+ return SUCCESS;
}
static int
@@ -2551,39 +2537,32 @@ compiler_check_debug_args_seq(struct compiler *c, asdl_arg_seq *args)
{
if (args != NULL) {
for (Py_ssize_t i = 0, n = asdl_seq_LEN(args); i < n; i++) {
- if (!compiler_check_debug_one_arg(c, asdl_seq_GET(args, i)))
- return 0;
+ RETURN_IF_ERROR(
+ compiler_check_debug_one_arg(c, asdl_seq_GET(args, i)));
}
}
- return 1;
+ return SUCCESS;
}
static int
compiler_check_debug_args(struct compiler *c, arguments_ty args)
{
- if (!compiler_check_debug_args_seq(c, args->posonlyargs))
- return 0;
- if (!compiler_check_debug_args_seq(c, args->args))
- return 0;
- if (!compiler_check_debug_one_arg(c, args->vararg))
- return 0;
- if (!compiler_check_debug_args_seq(c, args->kwonlyargs))
- return 0;
- if (!compiler_check_debug_one_arg(c, args->kwarg))
- return 0;
- return 1;
+ RETURN_IF_ERROR(compiler_check_debug_args_seq(c, args->posonlyargs));
+ RETURN_IF_ERROR(compiler_check_debug_args_seq(c, args->args));
+ RETURN_IF_ERROR(compiler_check_debug_one_arg(c, args->vararg));
+ RETURN_IF_ERROR(compiler_check_debug_args_seq(c, args->kwonlyargs));
+ RETURN_IF_ERROR(compiler_check_debug_one_arg(c, args->kwarg));
+ return SUCCESS;
}
static inline int
insert_instruction(basicblock *block, int pos, struct instr *instr) {
- if (basicblock_next_instr(block) < 0) {
- return -1;
- }
+ RETURN_IF_ERROR(basicblock_next_instr(block));
for (int i = block->b_iused - 1; i > pos; i--) {
block->b_instr[i] = block->b_instr[i-1];
}
block->b_instr[pos] = *instr;
- return 0;
+ return SUCCESS;
}
static int
@@ -2598,16 +2577,15 @@ wrap_in_stopiteration_handler(struct compiler *c)
.i_loc = NO_LOCATION,
.i_target = NULL,
};
- if (insert_instruction(c->u->u_cfg_builder.g_entryblock, 0, &setup)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ insert_instruction(c->u->u_cfg_builder.g_entryblock, 0, &setup));
ADDOP_LOAD_CONST(c, NO_LOCATION, Py_None);
ADDOP(c, NO_LOCATION, RETURN_VALUE);
USE_LABEL(c, handler);
ADDOP(c, NO_LOCATION, STOPITERATION_ERROR);
ADDOP_I(c, NO_LOCATION, RERAISE, 1);
- return 1;
+ return SUCCESS;
}
static int
@@ -2647,11 +2625,8 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async)
scope_type = COMPILER_SCOPE_FUNCTION;
}
- if (!compiler_check_debug_args(c, args))
- return 0;
-
- if (!compiler_decorators(c, decos))
- return 0;
+ RETURN_IF_ERROR(compiler_check_debug_args(c, args));
+ RETURN_IF_ERROR(compiler_decorators(c, decos));
firstlineno = s->lineno;
if (asdl_seq_LEN(decos)) {
@@ -2661,19 +2636,16 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async)
location loc = LOC(s);
funcflags = compiler_default_arguments(c, loc, args);
if (funcflags == -1) {
- return 0;
+ return ERROR;
}
annotations = compiler_visit_annotations(c, loc, args, returns);
- if (annotations == 0) {
- return 0;
- }
- else if (annotations > 0) {
+ RETURN_IF_ERROR(annotations);
+ if (annotations > 0) {
funcflags |= 0x04;
}
- if (!compiler_enter_scope(c, name, scope_type, (void *)s, firstlineno)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_enter_scope(c, name, scope_type, (void *)s, firstlineno));
/* if not -OO mode, add docstring */
if (c->c_optimize < 2) {
@@ -2681,7 +2653,7 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async)
}
if (compiler_add_const(c, docstring ? docstring : Py_None) < 0) {
compiler_exit_scope(c);
- return 0;
+ return ERROR;
}
c->u->u_argcount = asdl_seq_LEN(args->args);
@@ -2691,9 +2663,9 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async)
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 (!wrap_in_stopiteration_handler(c)) {
+ if (wrap_in_stopiteration_handler(c) < 0) {
compiler_exit_scope(c);
- return 0;
+ return ERROR;
}
}
co = assemble(c, 1);
@@ -2702,18 +2674,17 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async)
if (co == NULL) {
Py_XDECREF(qualname);
Py_XDECREF(co);
- return 0;
+ return ERROR;
}
- if (!compiler_make_closure(c, loc, co, funcflags, qualname)) {
+ if (compiler_make_closure(c, loc, co, funcflags, qualname) < 0) {
Py_DECREF(qualname);
Py_DECREF(co);
- return 0;
+ return ERROR;
}
Py_DECREF(qualname);
Py_DECREF(co);
- if (!compiler_apply_decorators(c, decos))
- return 0;
+ RETURN_IF_ERROR(compiler_apply_decorators(c, decos));
return compiler_nameop(c, loc, name, Store);
}
@@ -2724,8 +2695,7 @@ compiler_class(struct compiler *c, stmt_ty s)
int i, firstlineno;
asdl_expr_seq *decos = s->v.ClassDef.decorator_list;
- if (!compiler_decorators(c, decos))
- return 0;
+ RETURN_IF_ERROR(compiler_decorators(c, decos));
firstlineno = s->lineno;
if (asdl_seq_LEN(decos)) {
@@ -2743,35 +2713,35 @@ compiler_class(struct compiler *c, stmt_ty s)
This borrows from compiler_call.
*/
/* 1. compile the class body into a code object */
- if (!compiler_enter_scope(c, s->v.ClassDef.name,
- COMPILER_SCOPE_CLASS, (void *)s, firstlineno)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_enter_scope(c, s->v.ClassDef.name,
+ COMPILER_SCOPE_CLASS, (void *)s, firstlineno));
+
/* this block represents what we do in the new scope */
{
location loc = LOCATION(firstlineno, firstlineno, 0, 0);
/* use the class name for name mangling */
Py_XSETREF(c->u->u_private, Py_NewRef(s->v.ClassDef.name));
/* load (global) __name__ ... */
- if (!compiler_nameop(c, loc, &_Py_ID(__name__), Load)) {
+ if (compiler_nameop(c, loc, &_Py_ID(__name__), Load) < 0) {
compiler_exit_scope(c);
- return 0;
+ return ERROR;
}
/* ... and store it as __module__ */
- if (!compiler_nameop(c, loc, &_Py_ID(__module__), Store)) {
+ if (compiler_nameop(c, loc, &_Py_ID(__module__), Store) < 0) {
compiler_exit_scope(c);
- return 0;
+ return ERROR;
}
assert(c->u->u_qualname);
ADDOP_LOAD_CONST(c, loc, c->u->u_qualname);
- if (!compiler_nameop(c, loc, &_Py_ID(__qualname__), Store)) {
+ if (compiler_nameop(c, loc, &_Py_ID(__qualname__), Store) < 0) {
compiler_exit_scope(c);
- return 0;
+ return ERROR;
}
/* compile the body proper */
- if (!compiler_body(c, loc, s->v.ClassDef.body)) {
+ if (compiler_body(c, loc, s->v.ClassDef.body) < 0) {
compiler_exit_scope(c);
- return 0;
+ return ERROR;
}
/* The following code is artificial */
/* Return __classcell__ if it is referenced, otherwise return None */
@@ -2780,14 +2750,14 @@ compiler_class(struct compiler *c, stmt_ty s)
i = compiler_lookup_arg(c->u->u_cellvars, &_Py_ID(__class__));
if (i < 0) {
compiler_exit_scope(c);
- return 0;
+ return ERROR;
}
assert(i == 0);
ADDOP_I(c, NO_LOCATION, LOAD_CLOSURE, i);
ADDOP_I(c, NO_LOCATION, COPY, 1);
- if (!compiler_nameop(c, NO_LOCATION, &_Py_ID(__classcell__), Store)) {
+ if (compiler_nameop(c, NO_LOCATION, &_Py_ID(__classcell__), Store) < 0) {
compiler_exit_scope(c);
- return 0;
+ return ERROR;
}
}
else {
@@ -2801,8 +2771,9 @@ compiler_class(struct compiler *c, stmt_ty s)
}
/* leave the new scope */
compiler_exit_scope(c);
- if (co == NULL)
- return 0;
+ if (co == NULL) {
+ return ERROR;
+ }
location loc = LOC(s);
/* 2. load the 'build_class' function */
@@ -2810,9 +2781,9 @@ compiler_class(struct compiler *c, stmt_ty s)
ADDOP(c, loc, LOAD_BUILD_CLASS);
/* 3. load a function (or closure) made from the code object */
- if (!compiler_make_closure(c, loc, co, 0, NULL)) {
+ if (compiler_make_closure(c, loc, co, 0, NULL) < 0) {
Py_DECREF(co);
- return 0;
+ return ERROR;
}
Py_DECREF(co);
@@ -2820,27 +2791,25 @@ compiler_class(struct compiler *c, stmt_ty s)
ADDOP_LOAD_CONST(c, loc, s->v.ClassDef.name);
/* 5. generate the rest of the code for the call */
- if (!compiler_call_helper(c, loc, 2,
- s->v.ClassDef.bases,
- s->v.ClassDef.keywords))
- return 0;
+ RETURN_IF_ERROR(compiler_call_helper(c, loc, 2,
+ s->v.ClassDef.bases,
+ s->v.ClassDef.keywords));
+
/* 6. apply decorators */
- if (!compiler_apply_decorators(c, decos))
- return 0;
+ RETURN_IF_ERROR(compiler_apply_decorators(c, decos));
/* 7. store into <name> */
- if (!compiler_nameop(c, loc, s->v.ClassDef.name, Store))
- return 0;
- return 1;
+ RETURN_IF_ERROR(compiler_nameop(c, loc, s->v.ClassDef.name, Store));
+ return SUCCESS;
}
-/* Return 0 if the expression is a constant value except named singletons.
- Return 1 otherwise. */
-static int
+/* Return false if the expression is a constant value except named singletons.
+ Return true otherwise. */
+static bool
check_is_arg(expr_ty e)
{
if (e->kind != Constant_kind) {
- return 1;
+ return true;
}
PyObject *value = e->v.Constant.value;
return (value == Py_None
@@ -2849,19 +2818,18 @@ check_is_arg(expr_ty e)
|| value == Py_Ellipsis);
}
-/* Check operands of identity chacks ("is" and "is not").
+/* Check operands of identity checks ("is" and "is not").
Emit a warning if any operand is a constant except named singletons.
- Return 0 on error.
*/
static int
check_compare(struct compiler *c, expr_ty e)
{
Py_ssize_t i, n;
- int left = check_is_arg(e->v.Compare.left);
+ bool left = check_is_arg(e->v.Compare.left);
n = asdl_seq_LEN(e->v.Compare.ops);
for (i = 0; i < n; i++) {
cmpop_ty op = (cmpop_ty)asdl_seq_GET(e->v.Compare.ops, i);
- int right = check_is_arg((expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
+ bool right = check_is_arg((expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
if (op == Is || op == IsNot) {
if (!right || !left) {
const char *msg = (op == Is)
@@ -2872,7 +2840,7 @@ check_compare(struct compiler *c, expr_ty e)
}
left = right;
}
- return 1;
+ return SUCCESS;
}
static int compiler_addcompare(struct compiler *c, location loc,
@@ -2900,21 +2868,21 @@ static int compiler_addcompare(struct compiler *c, location loc,
break;
case Is:
ADDOP_I(c, loc, IS_OP, 0);
- return 1;
+ return SUCCESS;
case IsNot:
ADDOP_I(c, loc, IS_OP, 1);
- return 1;
+ return SUCCESS;
case In:
ADDOP_I(c, loc, CONTAINS_OP, 0);
- return 1;
+ return SUCCESS;
case NotIn:
ADDOP_I(c, loc, CONTAINS_OP, 1);
- return 1;
+ return SUCCESS;
default:
Py_UNREACHABLE();
}
ADDOP_I(c, loc, COMPARE_OP, cmp);
- return 1;
+ return SUCCESS;
}
@@ -2941,43 +2909,36 @@ compiler_jump_if(struct compiler *c, location loc,
next2 = new_next2;
}
for (i = 0; i < n; ++i) {
- if (!compiler_jump_if(c, loc, (expr_ty)asdl_seq_GET(s, i), next2, cond2)) {
- return 0;
- }
- }
- if (!compiler_jump_if(c, loc, (expr_ty)asdl_seq_GET(s, n), next, cond)) {
- return 0;
+ RETURN_IF_ERROR(
+ compiler_jump_if(c, loc, (expr_ty)asdl_seq_GET(s, i), next2, cond2));
}
+ RETURN_IF_ERROR(
+ compiler_jump_if(c, loc, (expr_ty)asdl_seq_GET(s, n), next, cond));
if (!SAME_LABEL(next2, next)) {
USE_LABEL(c, next2);
}
- return 1;
+ return SUCCESS;
}
case IfExp_kind: {
NEW_JUMP_TARGET_LABEL(c, end);
NEW_JUMP_TARGET_LABEL(c, next2);
- if (!compiler_jump_if(c, loc, e->v.IfExp.test, next2, 0)) {
- return 0;
- }
- if (!compiler_jump_if(c, loc, e->v.IfExp.body, next, cond)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_jump_if(c, loc, e->v.IfExp.test, next2, 0));
+ RETURN_IF_ERROR(
+ compiler_jump_if(c, loc, e->v.IfExp.body, next, cond));
ADDOP_JUMP(c, NO_LOCATION, JUMP, end);
USE_LABEL(c, next2);
- if (!compiler_jump_if(c, loc, e->v.IfExp.orelse, next, cond)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_jump_if(c, loc, e->v.IfExp.orelse, next, cond));
USE_LABEL(c, end);
- return 1;
+ return SUCCESS;
}
case Compare_kind: {
Py_ssize_t n = asdl_seq_LEN(e->v.Compare.ops) - 1;
if (n > 0) {
- if (!check_compare(c, e)) {
- return 0;
- }
+ RETURN_IF_ERROR(check_compare(c, e));
NEW_JUMP_TARGET_LABEL(c, cleanup);
VISIT(c, expr, e->v.Compare.left);
for (Py_ssize_t i = 0; i < n; i++) {
@@ -3001,7 +2962,7 @@ compiler_jump_if(struct compiler *c, location loc,
}
USE_LABEL(c, end);
- return 1;
+ return SUCCESS;
}
/* fallback to general implementation */
break;
@@ -3014,7 +2975,7 @@ compiler_jump_if(struct compiler *c, location loc,
/* general implementation */
VISIT(c, expr, e);
ADDOP_JUMP(c, LOC(e), cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
- return 1;
+ return SUCCESS;
}
static int
@@ -3024,9 +2985,9 @@ compiler_ifexp(struct compiler *c, expr_ty e)
NEW_JUMP_TARGET_LABEL(c, end);
NEW_JUMP_TARGET_LABEL(c, next);
- if (!compiler_jump_if(c, LOC(e), e->v.IfExp.test, next, 0)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_jump_if(c, LOC(e), e->v.IfExp.test, next, 0));
+
VISIT(c, expr, e->v.IfExp.body);
ADDOP_JUMP(c, NO_LOCATION, JUMP, end);
@@ -3034,7 +2995,7 @@ compiler_ifexp(struct compiler *c, expr_ty e)
VISIT(c, expr, e->v.IfExp.orelse);
USE_LABEL(c, end);
- return 1;
+ return SUCCESS;
}
static int
@@ -3046,8 +3007,7 @@ compiler_lambda(struct compiler *c, expr_ty e)
arguments_ty args = e->v.Lambda.args;
assert(e->kind == Lambda_kind);
- if (!compiler_check_debug_args(c, args))
- return 0;
+ RETURN_IF_ERROR(compiler_check_debug_args(c, args));
location loc = LOC(e);
funcflags = compiler_default_arguments(c, loc, args);
@@ -3056,14 +3016,13 @@ compiler_lambda(struct compiler *c, expr_ty e)
}
_Py_DECLARE_STR(anon_lambda, "<lambda>");
- if (!compiler_enter_scope(c, &_Py_STR(anon_lambda), COMPILER_SCOPE_LAMBDA,
- (void *)e, e->lineno)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_enter_scope(c, &_Py_STR(anon_lambda), COMPILER_SCOPE_LAMBDA,
+ (void *)e, e->lineno));
+
/* Make None the first constant, so the lambda can't have a
docstring. */
- if (compiler_add_const(c, Py_None) < 0)
- return 0;
+ RETURN_IF_ERROR(compiler_add_const(c, Py_None));
c->u->u_argcount = asdl_seq_LEN(args->args);
c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
@@ -3081,18 +3040,18 @@ compiler_lambda(struct compiler *c, expr_ty e)
compiler_exit_scope(c);
if (co == NULL) {
Py_DECREF(qualname);
- return 0;
+ return ERROR;
}
- if (!compiler_make_closure(c, loc, co, funcflags, qualname)) {
+ if (compiler_make_closure(c, loc, co, funcflags, qualname) < 0) {
Py_DECREF(qualname);
Py_DECREF(co);
- return 0;
+ return ERROR;
}
Py_DECREF(qualname);
Py_DECREF(co);
- return 1;
+ return SUCCESS;
}
static int
@@ -3108,9 +3067,9 @@ compiler_if(struct compiler *c, stmt_ty s)
else {
next = end;
}
- if (!compiler_jump_if(c, LOC(s), s->v.If.test, next, 0)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_jump_if(c, LOC(s), s->v.If.test, next, 0));
+
VISIT_SEQ(c, stmt, s->v.If.body);
if (asdl_seq_LEN(s->v.If.orelse)) {
ADDOP_JUMP(c, NO_LOCATION, JUMP, end);
@@ -3120,7 +3079,7 @@ compiler_if(struct compiler *c, stmt_ty s)
}
USE_LABEL(c, end);
- return 1;
+ return SUCCESS;
}
static int
@@ -3132,9 +3091,8 @@ compiler_for(struct compiler *c, stmt_ty s)
NEW_JUMP_TARGET_LABEL(c, cleanup);
NEW_JUMP_TARGET_LABEL(c, end);
- if (!compiler_push_fblock(c, loc, FOR_LOOP, start, end, NULL)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_push_fblock(c, loc, FOR_LOOP, start, end, NULL));
+
VISIT(c, expr, s->v.For.iter);
ADDOP(c, loc, GET_ITER);
@@ -3155,7 +3113,7 @@ compiler_for(struct compiler *c, stmt_ty s)
VISIT_SEQ(c, stmt, s->v.For.orelse);
USE_LABEL(c, end);
- return 1;
+ return SUCCESS;
}
@@ -3177,9 +3135,8 @@ compiler_async_for(struct compiler *c, stmt_ty s)
ADDOP(c, loc, GET_AITER);
USE_LABEL(c, start);
- if (!compiler_push_fblock(c, loc, FOR_LOOP, start, end, NULL)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_push_fblock(c, loc, FOR_LOOP, start, end, NULL));
+
/* SETUP_FINALLY to guard the __anext__ call */
ADDOP_JUMP(c, loc, SETUP_FINALLY, except);
ADDOP(c, loc, GET_ANEXT);
@@ -3207,7 +3164,7 @@ compiler_async_for(struct compiler *c, stmt_ty s)
VISIT_SEQ(c, stmt, s->v.For.orelse);
USE_LABEL(c, end);
- return 1;
+ return SUCCESS;
}
static int
@@ -3219,18 +3176,13 @@ compiler_while(struct compiler *c, stmt_ty s)
NEW_JUMP_TARGET_LABEL(c, anchor);
USE_LABEL(c, loop);
- if (!compiler_push_fblock(c, LOC(s), WHILE_LOOP, loop, end, NULL)) {
- return 0;
- }
- if (!compiler_jump_if(c, LOC(s), s->v.While.test, anchor, 0)) {
- return 0;
- }
+
+ RETURN_IF_ERROR(compiler_push_fblock(c, LOC(s), WHILE_LOOP, loop, end, NULL));
+ RETURN_IF_ERROR(compiler_jump_if(c, LOC(s), s->v.While.test, anchor, 0));
USE_LABEL(c, body);
VISIT_SEQ(c, stmt, s->v.While.body);
- if (!compiler_jump_if(c, LOC(s), s->v.While.test, body, 1)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_jump_if(c, LOC(s), s->v.While.test, body, 1));
compiler_pop_fblock(c, WHILE_LOOP, loop);
@@ -3240,7 +3192,7 @@ compiler_while(struct compiler *c, stmt_ty s)
}
USE_LABEL(c, end);
- return 1;
+ return SUCCESS;
}
static int
@@ -3249,13 +3201,13 @@ compiler_return(struct compiler *c, stmt_ty s)
location loc = LOC(s);
int preserve_tos = ((s->v.Return.value != NULL) &&
(s->v.Return.value->kind != Constant_kind));
- if (c->u->u_ste->ste_type != FunctionBlock)
+ if (c->u->u_ste->ste_type != FunctionBlock) {
return compiler_error(c, loc, "'return' outside function");
+ }
if (s->v.Return.value != NULL &&
c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
{
- return compiler_error(
- c, loc, "'return' with value in async generator");
+ return compiler_error(c, loc, "'return' with value in async generator");
}
if (preserve_tos) {
@@ -3272,8 +3224,7 @@ compiler_return(struct compiler *c, stmt_ty s)
ADDOP(c, loc, NOP);
}
- if (!compiler_unwind_fblock_stack(c, &loc, preserve_tos, NULL))
- return 0;
+ RETURN_IF_ERROR(compiler_unwind_fblock_stack(c, &loc, preserve_tos, NULL));
if (s->v.Return.value == NULL) {
ADDOP_LOAD_CONST(c, loc, Py_None);
}
@@ -3282,7 +3233,7 @@ compiler_return(struct compiler *c, stmt_ty s)
}
ADDOP(c, loc, RETURN_VALUE);
- return 1;
+ return SUCCESS;
}
static int
@@ -3291,17 +3242,13 @@ compiler_break(struct compiler *c, location loc)
struct fblockinfo *loop = NULL;
/* Emit instruction with line number */
ADDOP(c, loc, NOP);
- if (!compiler_unwind_fblock_stack(c, &loc, 0, &loop)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_unwind_fblock_stack(c, &loc, 0, &loop));
if (loop == NULL) {
return compiler_error(c, loc, "'break' outside loop");
}
- if (!compiler_unwind_fblock(c, &loc, loop, 0)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_unwind_fblock(c, &loc, loop, 0));
ADDOP_JUMP(c, loc, JUMP, loop->fb_exit);
- return 1;
+ return SUCCESS;
}
static int
@@ -3310,14 +3257,12 @@ compiler_continue(struct compiler *c, location loc)
struct fblockinfo *loop = NULL;
/* Emit instruction with line number */
ADDOP(c, loc, NOP);
- if (!compiler_unwind_fblock_stack(c, &loc, 0, &loop)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_unwind_fblock_stack(c, &loc, 0, &loop));
if (loop == NULL) {
return compiler_error(c, loc, "'continue' not properly in loop");
}
ADDOP_JUMP(c, loc, JUMP, loop->fb_block);
- return 1;
+ return SUCCESS;
}
@@ -3376,11 +3321,12 @@ compiler_try_finally(struct compiler *c, stmt_ty s)
ADDOP_JUMP(c, loc, SETUP_FINALLY, end);
USE_LABEL(c, body);
- if (!compiler_push_fblock(c, loc, FINALLY_TRY, body, end, s->v.Try.finalbody))
- return 0;
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, loc, FINALLY_TRY, body, end,
+ s->v.Try.finalbody));
+
if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
- if (!compiler_try_except(c, s))
- return 0;
+ RETURN_IF_ERROR(compiler_try_except(c, s));
}
else {
VISIT_SEQ(c, stmt, s->v.Try.body);
@@ -3397,8 +3343,8 @@ compiler_try_finally(struct compiler *c, stmt_ty s)
loc = NO_LOCATION;
ADDOP_JUMP(c, loc, SETUP_CLEANUP, cleanup);
ADDOP(c, loc, PUSH_EXC_INFO);
- if (!compiler_push_fblock(c, loc, FINALLY_END, end, NO_LABEL, NULL))
- return 0;
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, loc, FINALLY_END, end, NO_LABEL, NULL));
VISIT_SEQ(c, stmt, s->v.Try.finalbody);
loc = location_of_last_executing_statement(s->v.Try.finalbody);
compiler_pop_fblock(c, FINALLY_END, end);
@@ -3409,7 +3355,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s)
POP_EXCEPT_AND_RERAISE(c, loc);
USE_LABEL(c, exit);
- return 1;
+ return SUCCESS;
}
static int
@@ -3425,13 +3371,12 @@ compiler_try_star_finally(struct compiler *c, stmt_ty s)
ADDOP_JUMP(c, loc, SETUP_FINALLY, end);
USE_LABEL(c, body);
- if (!compiler_push_fblock(c, loc, FINALLY_TRY, body, end, s->v.TryStar.finalbody)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, loc, FINALLY_TRY, body, end,
+ s->v.TryStar.finalbody));
+
if (s->v.TryStar.handlers && asdl_seq_LEN(s->v.TryStar.handlers)) {
- if (!compiler_try_star_except(c, s)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_try_star_except(c, s));
}
else {
VISIT_SEQ(c, stmt, s->v.TryStar.body);
@@ -3448,9 +3393,9 @@ compiler_try_star_finally(struct compiler *c, stmt_ty s)
loc = NO_LOCATION;
ADDOP_JUMP(c, loc, SETUP_CLEANUP, cleanup);
ADDOP(c, loc, PUSH_EXC_INFO);
- if (!compiler_push_fblock(c, loc, FINALLY_END, end, NO_LABEL, NULL)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, loc, FINALLY_END, end, NO_LABEL, NULL));
+
VISIT_SEQ(c, stmt, s->v.TryStar.finalbody);
loc = location_of_last_executing_statement(s->v.Try.finalbody);
@@ -3461,7 +3406,7 @@ compiler_try_star_finally(struct compiler *c, stmt_ty s)
POP_EXCEPT_AND_RERAISE(c, loc);
USE_LABEL(c, exit);
- return 1;
+ return SUCCESS;
}
@@ -3507,8 +3452,8 @@ compiler_try_except(struct compiler *c, stmt_ty s)
ADDOP_JUMP(c, loc, SETUP_FINALLY, except);
USE_LABEL(c, body);
- if (!compiler_push_fblock(c, loc, TRY_EXCEPT, body, NO_LABEL, NULL))
- return 0;
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, loc, TRY_EXCEPT, body, NO_LABEL, NULL));
VISIT_SEQ(c, stmt, s->v.Try.body);
compiler_pop_fblock(c, TRY_EXCEPT, body);
ADDOP(c, NO_LOCATION, POP_BLOCK);
@@ -3522,9 +3467,11 @@ compiler_try_except(struct compiler *c, stmt_ty s)
ADDOP_JUMP(c, NO_LOCATION, SETUP_CLEANUP, cleanup);
ADDOP(c, NO_LOCATION, PUSH_EXC_INFO);
+
/* Runtime will push a block here, so we need to account for that */
- if (!compiler_push_fblock(c, loc, EXCEPTION_HANDLER, NO_LABEL, NO_LABEL, NULL))
- return 0;
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, loc, EXCEPTION_HANDLER, NO_LABEL, NO_LABEL, NULL));
+
for (i = 0; i < n; i++) {
excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
s->v.Try.handlers, i);
@@ -3543,7 +3490,8 @@ compiler_try_except(struct compiler *c, stmt_ty s)
NEW_JUMP_TARGET_LABEL(c, cleanup_end);
NEW_JUMP_TARGET_LABEL(c, cleanup_body);
- compiler_nameop(c, loc, handler->v.ExceptHandler.name, Store);
+ RETURN_IF_ERROR(
+ compiler_nameop(c, loc, handler->v.ExceptHandler.name, Store));
/*
try:
@@ -3560,10 +3508,9 @@ compiler_try_except(struct compiler *c, stmt_ty s)
ADDOP_JUMP(c, loc, SETUP_CLEANUP, cleanup_end);
USE_LABEL(c, cleanup_body);
- if (!compiler_push_fblock(c, loc, HANDLER_CLEANUP, cleanup_body,
- NO_LABEL, handler->v.ExceptHandler.name)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, loc, HANDLER_CLEANUP, cleanup_body,
+ NO_LABEL, handler->v.ExceptHandler.name));
/* second # body */
VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
@@ -3573,8 +3520,10 @@ compiler_try_except(struct compiler *c, stmt_ty s)
ADDOP(c, NO_LOCATION, POP_BLOCK);
ADDOP(c, NO_LOCATION, POP_EXCEPT);
ADDOP_LOAD_CONST(c, NO_LOCATION, Py_None);
- compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Store);
- compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Del);
+ RETURN_IF_ERROR(
+ compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Store));
+ RETURN_IF_ERROR(
+ compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Del));
ADDOP_JUMP(c, NO_LOCATION, JUMP, end);
/* except: */
@@ -3582,8 +3531,10 @@ compiler_try_except(struct compiler *c, stmt_ty s)
/* name = None; del name; # artificial */
ADDOP_LOAD_CONST(c, NO_LOCATION, Py_None);
- compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Store);
- compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Del);
+ RETURN_IF_ERROR(
+ compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Store));
+ RETURN_IF_ERROR(
+ compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Del));
ADDOP_I(c, NO_LOCATION, RERAISE, 1);
}
@@ -3593,8 +3544,10 @@ compiler_try_except(struct compiler *c, stmt_ty s)
ADDOP(c, loc, POP_TOP); /* exc_value */
USE_LABEL(c, cleanup_body);
- if (!compiler_push_fblock(c, loc, HANDLER_CLEANUP, cleanup_body, NO_LABEL, NULL))
- return 0;
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, loc, HANDLER_CLEANUP, cleanup_body,
+ NO_LABEL, NULL));
+
VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
ADDOP(c, NO_LOCATION, POP_BLOCK);
@@ -3612,7 +3565,7 @@ compiler_try_except(struct compiler *c, stmt_ty s)
POP_EXCEPT_AND_RERAISE(c, NO_LOCATION);
USE_LABEL(c, end);
- return 1;
+ return SUCCESS;
}
/*
@@ -3679,9 +3632,8 @@ compiler_try_star_except(struct compiler *c, stmt_ty s)
ADDOP_JUMP(c, loc, SETUP_FINALLY, except);
USE_LABEL(c, body);
- if (!compiler_push_fblock(c, loc, TRY_EXCEPT, body, NO_LABEL, NULL)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, loc, TRY_EXCEPT, body, NO_LABEL, NULL));
VISIT_SEQ(c, stmt, s->v.TryStar.body);
compiler_pop_fblock(c, TRY_EXCEPT, body);
ADDOP(c, NO_LOCATION, POP_BLOCK);
@@ -3692,11 +3644,12 @@ compiler_try_star_except(struct compiler *c, stmt_ty s)
ADDOP_JUMP(c, NO_LOCATION, SETUP_CLEANUP, cleanup);
ADDOP(c, NO_LOCATION, PUSH_EXC_INFO);
+
/* Runtime will push a block here, so we need to account for that */
- if (!compiler_push_fblock(c, loc, EXCEPTION_GROUP_HANDLER,
- NO_LABEL, NO_LABEL, "except handler")) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, loc, EXCEPTION_GROUP_HANDLER,
+ NO_LABEL, NO_LABEL, "except handler"));
+
for (Py_ssize_t i = 0; i < n; i++) {
excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
s->v.TryStar.handlers, i);
@@ -3736,7 +3689,8 @@ compiler_try_star_except(struct compiler *c, stmt_ty s)
NEW_JUMP_TARGET_LABEL(c, cleanup_body);
if (handler->v.ExceptHandler.name) {
- compiler_nameop(c, loc, handler->v.ExceptHandler.name, Store);
+ RETURN_IF_ERROR(
+ compiler_nameop(c, loc, handler->v.ExceptHandler.name, Store));
}
else {
ADDOP(c, loc, POP_TOP); // match
@@ -3756,9 +3710,9 @@ compiler_try_star_except(struct compiler *c, stmt_ty s)
ADDOP_JUMP(c, loc, SETUP_CLEANUP, cleanup_end);
USE_LABEL(c, cleanup_body);
- if (!compiler_push_fblock(c, loc, HANDLER_CLEANUP, cleanup_body, NO_LABEL, handler->v.ExceptHandler.name)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, loc, HANDLER_CLEANUP, cleanup_body,
+ NO_LABEL, handler->v.ExceptHandler.name));
/* second # body */
VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
@@ -3767,8 +3721,10 @@ compiler_try_star_except(struct compiler *c, stmt_ty s)
ADDOP(c, NO_LOCATION, POP_BLOCK);
if (handler->v.ExceptHandler.name) {
ADDOP_LOAD_CONST(c, NO_LOCATION, Py_None);
- compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Store);
- compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Del);
+ RETURN_IF_ERROR(
+ compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Store));
+ RETURN_IF_ERROR(
+ compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Del));
}
ADDOP_JUMP(c, NO_LOCATION, JUMP, except);
@@ -3778,8 +3734,10 @@ compiler_try_star_except(struct compiler *c, stmt_ty s)
/* name = None; del name; # artificial */
if (handler->v.ExceptHandler.name) {
ADDOP_LOAD_CONST(c, NO_LOCATION, Py_None);
- compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Store);
- compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Del);
+ RETURN_IF_ERROR(
+ compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Store));
+ RETURN_IF_ERROR(
+ compiler_nameop(c, NO_LOCATION, handler->v.ExceptHandler.name, Del));
}
/* add exception raised to the res list */
@@ -3823,7 +3781,7 @@ compiler_try_star_except(struct compiler *c, stmt_ty s)
VISIT_SEQ(c, stmt, s->v.TryStar.orelse);
USE_LABEL(c, end);
- return 1;
+ return SUCCESS;
}
static int
@@ -3857,19 +3815,22 @@ compiler_import_as(struct compiler *c, location loc,
*/
Py_ssize_t len = PyUnicode_GET_LENGTH(name);
Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, len, 1);
- if (dot == -2)
- return 0;
+ if (dot == -2) {
+ return ERROR;
+ }
if (dot != -1) {
/* Consume the base module name to get the first attribute */
while (1) {
Py_ssize_t pos = dot + 1;
PyObject *attr;
dot = PyUnicode_FindChar(name, '.', pos, len, 1);
- if (dot == -2)
- return 0;
+ if (dot == -2) {
+ return ERROR;
+ }
attr = PyUnicode_Substring(name, pos, (dot != -1) ? dot : len);
- if (!attr)
- return 0;
+ if (!attr) {
+ return ERROR;
+ }
ADDOP_N(c, loc, IMPORT_FROM, attr, names);
if (dot == -1) {
break;
@@ -3877,11 +3838,9 @@ compiler_import_as(struct compiler *c, location loc,
ADDOP_I(c, loc, SWAP, 2);
ADDOP(c, loc, POP_TOP);
}
- if (!compiler_nameop(c, loc, asname, Store)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_nameop(c, loc, asname, Store));
ADDOP(c, loc, POP_TOP);
- return 1;
+ return SUCCESS;
}
return compiler_nameop(c, loc, asname, Store);
}
@@ -3910,8 +3869,7 @@ compiler_import(struct compiler *c, stmt_ty s)
if (alias->asname) {
r = compiler_import_as(c, loc, alias->name, alias->asname);
- if (!r)
- return r;
+ RETURN_IF_ERROR(r);
}
else {
identifier tmp = alias->name;
@@ -3919,18 +3877,18 @@ compiler_import(struct compiler *c, stmt_ty s)
alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
if (dot != -1) {
tmp = PyUnicode_Substring(alias->name, 0, dot);
- if (tmp == NULL)
- return 0;
+ if (tmp == NULL) {
+ return ERROR;
+ }
}
r = compiler_nameop(c, loc, tmp, Store);
if (dot != -1) {
Py_DECREF(tmp);
}
- if (!r)
- return r;
+ RETURN_IF_ERROR(r);
}
}
- return 1;
+ return SUCCESS;
}
static int
@@ -3942,7 +3900,7 @@ compiler_from_import(struct compiler *c, stmt_ty s)
PyObject *names = PyTuple_New(n);
if (!names) {
- return 0;
+ return ERROR;
}
/* build up the names */
@@ -3975,7 +3933,7 @@ compiler_from_import(struct compiler *c, stmt_ty s)
if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
assert(n == 1);
ADDOP(c, LOC(s), IMPORT_STAR);
- return 1;
+ return SUCCESS;
}
ADDOP_NAME(c, LOC(s), IMPORT_FROM, alias->name, names);
@@ -3984,13 +3942,11 @@ compiler_from_import(struct compiler *c, stmt_ty s)
store_name = alias->asname;
}
- if (!compiler_nameop(c, LOC(s), store_name, Store)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_nameop(c, LOC(s), store_name, Store));
}
/* remove imported module */
ADDOP(c, LOC(s), POP_TOP);
- return 1;
+ return SUCCESS;
}
static int
@@ -4003,19 +3959,15 @@ compiler_assert(struct compiler *c, stmt_ty s)
PyTuple_Check(s->v.Assert.test->v.Constant.value) &&
PyTuple_Size(s->v.Assert.test->v.Constant.value) > 0))
{
- if (!compiler_warn(c, LOC(s), "assertion is always true, "
- "perhaps remove parentheses?"))
- {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_warn(c, LOC(s), "assertion is always true, "
+ "perhaps remove parentheses?"));
}
if (c->c_optimize) {
- return 1;
+ return SUCCESS;
}
NEW_JUMP_TARGET_LABEL(c, end);
- if (!compiler_jump_if(c, LOC(s), s->v.Assert.test, end, 1)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_jump_if(c, LOC(s), s->v.Assert.test, end, 1));
ADDOP(c, LOC(s), LOAD_ASSERTION_ERROR);
if (s->v.Assert.msg) {
VISIT(c, expr, s->v.Assert.msg);
@@ -4024,7 +3976,7 @@ compiler_assert(struct compiler *c, stmt_ty s)
ADDOP_I(c, LOC(s), RAISE_VARARGS, 1);
USE_LABEL(c, end);
- return 1;
+ return SUCCESS;
}
static int
@@ -4033,18 +3985,18 @@ compiler_stmt_expr(struct compiler *c, location loc, expr_ty value)
if (c->c_interactive && c->c_nestlevel <= 1) {
VISIT(c, expr, value);
ADDOP(c, loc, PRINT_EXPR);
- return 1;
+ return SUCCESS;
}
if (value->kind == Constant_kind) {
/* ignore constant statement */
ADDOP(c, loc, NOP);
- return 1;
+ return SUCCESS;
}
VISIT(c, expr, value);
ADDOP(c, NO_LOCATION, POP_TOP); /* artificial */
- return 1;
+ return SUCCESS;
}
static int
@@ -4140,7 +4092,7 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s)
return compiler_async_for(c, s);
}
- return 1;
+ return SUCCESS;
}
static int
@@ -4210,10 +4162,10 @@ addop_binary(struct compiler *c, location loc, operator_ty binop,
default:
PyErr_Format(PyExc_SystemError, "%s op %d should not be possible",
inplace ? "inplace" : "binary", binop);
- return 0;
+ return ERROR;
}
ADDOP_I(c, loc, BINARY_OP, oparg);
- return 1;
+ return SUCCESS;
}
@@ -4224,7 +4176,7 @@ addop_yield(struct compiler *c, location loc) {
}
ADDOP_I(c, loc, YIELD_VALUE, 0);
ADDOP_I(c, loc, RESUME, 1);
- return 1;
+ return SUCCESS;
}
static int
@@ -4242,12 +4194,14 @@ compiler_nameop(struct compiler *c, location loc,
!_PyUnicode_EqualToASCIIString(name, "True") &&
!_PyUnicode_EqualToASCIIString(name, "False"));
- if (forbidden_name(c, loc, name, ctx))
- return 0;
+ if (forbidden_name(c, loc, name, ctx)) {
+ return ERROR;
+ }
mangled = _Py_Mangle(c->u->u_private, name);
- if (!mangled)
- return 0;
+ if (!mangled) {
+ return ERROR;
+ }
op = 0;
optype = OP_NAME;
@@ -4297,7 +4251,7 @@ compiler_nameop(struct compiler *c, location loc,
case Del: op = DELETE_FAST; break;
}
ADDOP_N(c, loc, op, mangled, varnames);
- return 1;
+ return SUCCESS;
case OP_GLOBAL:
switch (ctx) {
case Load: op = LOAD_GLOBAL; break;
@@ -4318,7 +4272,7 @@ compiler_nameop(struct compiler *c, location loc,
arg = dict_add_o(dict, mangled);
Py_DECREF(mangled);
if (arg < 0) {
- return 0;
+ return ERROR;
}
if (op == LOAD_GLOBAL) {
arg <<= 1;
@@ -4353,7 +4307,7 @@ compiler_boolop(struct compiler *c, expr_ty e)
VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
USE_LABEL(c, end);
- return 1;
+ return SUCCESS;
}
static int
@@ -4365,7 +4319,7 @@ starunpack_helper(struct compiler *c, location loc,
if (n > 2 && are_all_items_const(elts, 0, n)) {
PyObject *folded = PyTuple_New(n);
if (folded == NULL) {
- return 0;
+ return ERROR;
}
PyObject *val;
for (Py_ssize_t i = 0; i < n; i++) {
@@ -4378,7 +4332,7 @@ starunpack_helper(struct compiler *c, location loc,
if (add == SET_ADD) {
Py_SETREF(folded, PyFrozenSet_New(folded));
if (folded == NULL) {
- return 0;
+ return ERROR;
}
}
ADDOP_I(c, loc, build, pushed);
@@ -4388,7 +4342,7 @@ starunpack_helper(struct compiler *c, location loc,
ADDOP(c, loc, LIST_TO_TUPLE);
}
}
- return 1;
+ return SUCCESS;
}
int big = n+pushed > STACK_USE_GUIDELINE;
@@ -4410,7 +4364,7 @@ starunpack_helper(struct compiler *c, location loc,
} else {
ADDOP_I(c, loc, build, n+pushed);
}
- return 1;
+ return SUCCESS;
}
int sequence_built = 0;
if (big) {
@@ -4438,7 +4392,7 @@ starunpack_helper(struct compiler *c, location loc,
if (tuple) {
ADDOP(c, loc, LIST_TO_TUPLE);
}
- return 1;
+ return SUCCESS;
}
static int
@@ -4450,10 +4404,11 @@ unpack_helper(struct compiler *c, location loc, asdl_expr_seq *elts)
expr_ty elt = asdl_seq_GET(elts, i);
if (elt->kind == Starred_kind && !seen_star) {
if ((i >= (1 << 8)) ||
- (n-i-1 >= (INT_MAX >> 8)))
+ (n-i-1 >= (INT_MAX >> 8))) {
return compiler_error(c, loc,
"too many expressions in "
"star-unpacking assignment");
+ }
ADDOP_I(c, loc, UNPACK_EX, (i + ((n-i-1) << 8)));
seen_star = 1;
}
@@ -4465,19 +4420,19 @@ unpack_helper(struct compiler *c, location loc, asdl_expr_seq *elts)
if (!seen_star) {
ADDOP_I(c, loc, UNPACK_SEQUENCE, n);
}
- return 1;
+ return SUCCESS;
}
static int
assignment_helper(struct compiler *c, location loc, asdl_expr_seq *elts)
{
Py_ssize_t n = asdl_seq_LEN(elts);
- RETURN_IF_FALSE(unpack_helper(c, loc, elts));
+ RETURN_IF_ERROR(unpack_helper(c, loc, elts));
for (Py_ssize_t i = 0; i < n; i++) {
expr_ty elt = asdl_seq_GET(elts, i);
VISIT(c, expr, elt->kind != Starred_kind ? elt : elt->v.Starred.value);
}
- return 1;
+ return SUCCESS;
}
static int
@@ -4492,9 +4447,10 @@ compiler_list(struct compiler *c, expr_ty e)
return starunpack_helper(c, loc, elts, 0,
BUILD_LIST, LIST_APPEND, LIST_EXTEND, 0);
}
- else
+ else {
VISIT_SEQ(c, expr, elts);
- return 1;
+ }
+ return SUCCESS;
}
static int
@@ -4509,9 +4465,10 @@ compiler_tuple(struct compiler *c, expr_ty e)
return starunpack_helper(c, loc, elts, 0,
BUILD_LIST, LIST_APPEND, LIST_EXTEND, 1);
}
- else
+ else {
VISIT_SEQ(c, expr, elts);
- return 1;
+ }
+ return SUCCESS;
}
static int
@@ -4522,16 +4479,16 @@ compiler_set(struct compiler *c, expr_ty e)
BUILD_SET, SET_ADD, SET_UPDATE, 0);
}
-static int
+static bool
are_all_items_const(asdl_expr_seq *seq, Py_ssize_t begin, Py_ssize_t end)
{
- Py_ssize_t i;
- for (i = begin; i < end; i++) {
+ for (Py_ssize_t i = begin; i < end; i++) {
expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
- if (key == NULL || key->kind != Constant_kind)
- return 0;
+ if (key == NULL || key->kind != Constant_kind) {
+ return false;
+ }
}
- return 1;
+ return true;
}
static int
@@ -4547,7 +4504,7 @@ compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end
}
keys = PyTuple_New(n);
if (keys == NULL) {
- return 0;
+ return SUCCESS;
}
for (i = begin; i < end; i++) {
key = ((expr_ty)asdl_seq_GET(e->v.Dict.keys, i))->v.Constant.value;
@@ -4555,7 +4512,7 @@ compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end
}
ADDOP_LOAD_CONST_NEW(c, loc, keys);
ADDOP_I(c, loc, BUILD_CONST_KEY_MAP, n);
- return 1;
+ return SUCCESS;
}
if (big) {
ADDOP_I(c, loc, BUILD_MAP, 0);
@@ -4570,7 +4527,7 @@ compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end
if (!big) {
ADDOP_I(c, loc, BUILD_MAP, n);
}
- return 1;
+ return SUCCESS;
}
static int
@@ -4587,9 +4544,7 @@ compiler_dict(struct compiler *c, expr_ty e)
is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
if (is_unpacking) {
if (elements) {
- if (!compiler_subdict(c, e, i - elements, i)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_subdict(c, e, i - elements, i));
if (have_dict) {
ADDOP_I(c, loc, DICT_UPDATE, 1);
}
@@ -4605,9 +4560,7 @@ compiler_dict(struct compiler *c, expr_ty e)
}
else {
if (elements*2 > STACK_USE_GUIDELINE) {
- if (!compiler_subdict(c, e, i - elements, i + 1)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_subdict(c, e, i - elements, i + 1));
if (have_dict) {
ADDOP_I(c, loc, DICT_UPDATE, 1);
}
@@ -4620,9 +4573,7 @@ compiler_dict(struct compiler *c, expr_ty e)
}
}
if (elements) {
- if (!compiler_subdict(c, e, n - elements, n)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_subdict(c, e, n - elements, n));
if (have_dict) {
ADDOP_I(c, loc, DICT_UPDATE, 1);
}
@@ -4631,7 +4582,7 @@ compiler_dict(struct compiler *c, expr_ty e)
if (!have_dict) {
ADDOP_I(c, loc, BUILD_MAP, 0);
}
- return 1;
+ return SUCCESS;
}
static int
@@ -4640,9 +4591,7 @@ compiler_compare(struct compiler *c, expr_ty e)
location loc = LOC(e);
Py_ssize_t i, n;
- if (!check_compare(c, e)) {
- return 0;
- }
+ RETURN_IF_ERROR(check_compare(c, e));
VISIT(c, expr, e->v.Compare.left);
assert(asdl_seq_LEN(e->v.Compare.ops) > 0);
n = asdl_seq_LEN(e->v.Compare.ops) - 1;
@@ -4671,7 +4620,7 @@ compiler_compare(struct compiler *c, expr_ty e)
USE_LABEL(c, end);
}
- return 1;
+ return SUCCESS;
}
static PyTypeObject *
@@ -4724,7 +4673,7 @@ check_caller(struct compiler *c, expr_ty e)
infer_type(e)->tp_name);
}
default:
- return 1;
+ return SUCCESS;
}
}
@@ -4740,7 +4689,7 @@ check_subscripter(struct compiler *c, expr_ty e)
PyLong_Check(v) || PyFloat_Check(v) || PyComplex_Check(v) ||
PyAnySet_Check(v)))
{
- return 1;
+ return SUCCESS;
}
/* fall through */
case Set_kind:
@@ -4753,7 +4702,7 @@ check_subscripter(struct compiler *c, expr_ty e)
infer_type(e)->tp_name);
}
default:
- return 1;
+ return SUCCESS;
}
}
@@ -4766,14 +4715,14 @@ check_index(struct compiler *c, expr_ty e, expr_ty s)
if (index_type == NULL
|| PyType_FastSubclass(index_type, Py_TPFLAGS_LONG_SUBCLASS)
|| index_type == &PySlice_Type) {
- return 1;
+ return SUCCESS;
}
switch (e->kind) {
case Constant_kind:
v = e->v.Constant.value;
if (!(PyUnicode_Check(v) || PyBytes_Check(v) || PyTuple_Check(v))) {
- return 1;
+ return SUCCESS;
}
/* fall through */
case Tuple_kind:
@@ -4789,7 +4738,7 @@ check_index(struct compiler *c, expr_ty e, expr_ty s)
index_type->tp_name);
}
default:
- return 1;
+ return SUCCESS;
}
}
@@ -4838,7 +4787,7 @@ update_start_location_to_match_attr(struct compiler *c, location loc,
return loc;
}
-// Return 1 if the method call was optimized, -1 if not, and 0 on error.
+// Return 1 if the method call was optimized, 0 if not, and -1 on error.
static int
maybe_optimize_method_call(struct compiler *c, expr_ty e)
{
@@ -4849,32 +4798,32 @@ maybe_optimize_method_call(struct compiler *c, expr_ty e)
/* Check that the call node is an attribute access */
if (meth->kind != Attribute_kind || meth->v.Attribute.ctx != Load) {
- return -1;
+ return 0;
}
/* Check that the base object is not something that is imported */
if (is_import_originated(c, meth->v.Attribute.value)) {
- return -1;
+ return 0;
}
/* Check that there aren't too many arguments */
argsl = asdl_seq_LEN(args);
kwdsl = asdl_seq_LEN(kwds);
if (argsl + kwdsl + (kwdsl != 0) >= STACK_USE_GUIDELINE) {
- return -1;
+ return 0;
}
/* Check that there are no *varargs types of arguments. */
for (i = 0; i < argsl; i++) {
expr_ty elt = asdl_seq_GET(args, i);
if (elt->kind == Starred_kind) {
- return -1;
+ return 0;
}
}
for (i = 0; i < kwdsl; i++) {
keyword_ty kw = asdl_seq_GET(kwds, i);
if (kw->arg == NULL) {
- return -1;
+ return 0;
}
}
/* Alright, we can optimize the code. */
@@ -4886,9 +4835,8 @@ maybe_optimize_method_call(struct compiler *c, expr_ty e)
if (kwdsl) {
VISIT_SEQ(c, keyword, kwds);
- if (!compiler_call_simple_kw_helper(c, loc, kwds, kwdsl)) {
- return 0;
- };
+ RETURN_IF_ERROR(
+ compiler_call_simple_kw_helper(c, loc, kwds, kwdsl));
}
loc = update_start_location_to_match_attr(c, LOC(e), meth);
ADDOP_I(c, loc, CALL, argsl + kwdsl);
@@ -4906,32 +4854,31 @@ validate_keywords(struct compiler *c, asdl_keyword_seq *keywords)
}
location loc = LOC(key);
if (forbidden_name(c, loc, key->arg, Store)) {
- return -1;
+ return ERROR;
}
for (Py_ssize_t j = i + 1; j < nkeywords; j++) {
keyword_ty other = ((keyword_ty)asdl_seq_GET(keywords, j));
if (other->arg && !PyUnicode_Compare(key->arg, other->arg)) {
compiler_error(c, LOC(other), "keyword argument repeated: %U", key->arg);
- return -1;
+ return ERROR;
}
}
}
- return 0;
+ return SUCCESS;
}
static int
compiler_call(struct compiler *c, expr_ty e)
{
- if (validate_keywords(c, e->v.Call.keywords) == -1) {
- return 0;
- }
+ RETURN_IF_ERROR(validate_keywords(c, e->v.Call.keywords));
int ret = maybe_optimize_method_call(c, e);
- if (ret >= 0) {
- return ret;
+ if (ret < 0) {
+ return ERROR;
}
- if (!check_caller(c, e->v.Call.func)) {
- return 0;
+ if (ret == 1) {
+ return SUCCESS;
}
+ RETURN_IF_ERROR(check_caller(c, e->v.Call.func));
location loc = LOC(e->v.Call.func);
ADDOP(c, loc, PUSH_NULL);
VISIT(c, expr, e->v.Call.func);
@@ -4963,7 +4910,7 @@ compiler_joined_str(struct compiler *c, expr_ty e)
ADDOP_I(c, loc, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
}
}
- return 1;
+ return SUCCESS;
}
/* Used to implement f-strings. Format a single value. */
@@ -4998,7 +4945,7 @@ compiler_formatted_value(struct compiler *c, expr_ty e)
default:
PyErr_Format(PyExc_SystemError,
"Unrecognized conversion character %d", conversion);
- return 0;
+ return ERROR;
}
if (e->v.FormattedValue.format_spec) {
/* Evaluate the format spec, and update our opcode arg. */
@@ -5010,7 +4957,7 @@ compiler_formatted_value(struct compiler *c, expr_ty e)
location loc = LOC(e);
ADDOP_I(c, loc, FORMAT_VALUE, oparg);
- return 1;
+ return SUCCESS;
}
static int
@@ -5030,7 +4977,7 @@ compiler_subkwargs(struct compiler *c, location loc,
}
keys = PyTuple_New(n);
if (keys == NULL) {
- return 0;
+ return ERROR;
}
for (i = begin; i < end; i++) {
key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
@@ -5038,7 +4985,7 @@ compiler_subkwargs(struct compiler *c, location loc,
}
ADDOP_LOAD_CONST_NEW(c, loc, keys);
ADDOP_I(c, loc, BUILD_CONST_KEY_MAP, n);
- return 1;
+ return SUCCESS;
}
if (big) {
ADDOP_I(c, NO_LOCATION, BUILD_MAP, 0);
@@ -5054,12 +5001,11 @@ compiler_subkwargs(struct compiler *c, location loc,
if (!big) {
ADDOP_I(c, loc, BUILD_MAP, n);
}
- return 1;
+ return SUCCESS;
}
/* Used by compiler_call_helper and maybe_optimize_method_call to emit
* KW_NAMES before CALL.
- * Returns 1 on success, 0 on error.
*/
static int
compiler_call_simple_kw_helper(struct compiler *c, location loc,
@@ -5068,7 +5014,7 @@ compiler_call_simple_kw_helper(struct compiler *c, location loc,
PyObject *names;
names = PyTuple_New(nkwelts);
if (names == NULL) {
- return 0;
+ return ERROR;
}
for (int i = 0; i < nkwelts; i++) {
keyword_ty kw = asdl_seq_GET(keywords, i);
@@ -5076,11 +5022,11 @@ compiler_call_simple_kw_helper(struct compiler *c, location loc,
}
Py_ssize_t arg = compiler_add_const(c, names);
if (arg < 0) {
- return 0;
+ return ERROR;
}
Py_DECREF(names);
ADDOP_I(c, loc, KW_NAMES, arg);
- return 1;
+ return SUCCESS;
}
@@ -5093,9 +5039,7 @@ compiler_call_helper(struct compiler *c, location loc,
{
Py_ssize_t i, nseen, nelts, nkwelts;
- if (validate_keywords(c, keywords) == -1) {
- return 0;
- }
+ RETURN_IF_ERROR(validate_keywords(c, keywords));
nelts = asdl_seq_LEN(args);
nkwelts = asdl_seq_LEN(keywords);
@@ -5124,12 +5068,11 @@ compiler_call_helper(struct compiler *c, location loc,
}
if (nkwelts) {
VISIT_SEQ(c, keyword, keywords);
- if (!compiler_call_simple_kw_helper(c, loc, keywords, nkwelts)) {
- return 0;
- };
+ RETURN_IF_ERROR(
+ compiler_call_simple_kw_helper(c, loc, keywords, nkwelts));
}
ADDOP_I(c, loc, CALL, n + nelts + nkwelts);
- return 1;
+ return SUCCESS;
ex_call:
@@ -5138,8 +5081,8 @@ ex_call:
VISIT(c, expr, ((expr_ty)asdl_seq_GET(args, 0))->v.Starred.value);
}
else if (starunpack_helper(c, loc, args, n, BUILD_LIST,
- LIST_APPEND, LIST_EXTEND, 1) == 0) {
- return 0;
+ LIST_APPEND, LIST_EXTEND, 1) < 0) {
+ return ERROR;
}
/* Then keyword arguments */
if (nkwelts) {
@@ -5152,9 +5095,7 @@ ex_call:
if (kw->arg == NULL) {
/* A keyword argument unpacking. */
if (nseen) {
- if (!compiler_subkwargs(c, loc, keywords, i - nseen, i)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_subkwargs(c, loc, keywords, i - nseen, i));
if (have_dict) {
ADDOP_I(c, loc, DICT_MERGE, 1);
}
@@ -5174,9 +5115,7 @@ ex_call:
}
if (nseen) {
/* Pack up any trailing keyword arguments. */
- if (!compiler_subkwargs(c, loc, keywords, nkwelts - nseen, nkwelts)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_subkwargs(c, loc, keywords, nkwelts - nseen, nkwelts));
if (have_dict) {
ADDOP_I(c, loc, DICT_MERGE, 1);
}
@@ -5185,7 +5124,7 @@ ex_call:
assert(have_dict);
}
ADDOP_I(c, loc, CALL_FUNCTION_EX, nkwelts > 0);
- return 1;
+ return SUCCESS;
}
@@ -5280,17 +5219,14 @@ compiler_sync_comprehension_generator(struct compiler *c, location loc,
Py_ssize_t n = asdl_seq_LEN(gen->ifs);
for (Py_ssize_t i = 0; i < n; i++) {
expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
- if (!compiler_jump_if(c, loc, e, if_cleanup, 0)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_jump_if(c, loc, e, if_cleanup, 0));
}
if (++gen_index < asdl_seq_LEN(generators)) {
- if (!compiler_comprehension_generator(c, loc,
- generators, gen_index, depth,
- elt, val, type)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_comprehension_generator(c, loc,
+ generators, gen_index, depth,
+ elt, val, type));
}
location elt_loc = LOC(elt);
@@ -5324,7 +5260,7 @@ compiler_sync_comprehension_generator(struct compiler *c, location loc,
ADDOP_I(c, elt_loc, MAP_ADD, depth + 1);
break;
default:
- return 0;
+ return ERROR;
}
}
@@ -5336,7 +5272,7 @@ compiler_sync_comprehension_generator(struct compiler *c, location loc,
ADDOP(c, NO_LOCATION, END_FOR);
}
- return 1;
+ return SUCCESS;
}
static int
@@ -5365,10 +5301,9 @@ compiler_async_comprehension_generator(struct compiler *c, location loc,
USE_LABEL(c, start);
/* Runtime will push a block here, so we need to account for that */
- if (!compiler_push_fblock(c, loc, ASYNC_COMPREHENSION_GENERATOR,
- start, NO_LABEL, NULL)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_push_fblock(c, loc, ASYNC_COMPREHENSION_GENERATOR,
+ start, NO_LABEL, NULL));
ADDOP_JUMP(c, loc, SETUP_FINALLY, except);
ADDOP(c, loc, GET_ANEXT);
@@ -5380,18 +5315,15 @@ compiler_async_comprehension_generator(struct compiler *c, location loc,
Py_ssize_t n = asdl_seq_LEN(gen->ifs);
for (Py_ssize_t i = 0; i < n; i++) {
expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
- if (!compiler_jump_if(c, loc, e, if_cleanup, 0)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_jump_if(c, loc, e, if_cleanup, 0));
}
depth++;
if (++gen_index < asdl_seq_LEN(generators)) {
- if (!compiler_comprehension_generator(c, loc,
- generators, gen_index, depth,
- elt, val, type)) {
- return 0;
- }
+ RETURN_IF_ERROR(
+ compiler_comprehension_generator(c, loc,
+ generators, gen_index, depth,
+ elt, val, type));
}
location elt_loc = LOC(elt);
@@ -5424,7 +5356,7 @@ compiler_async_comprehension_generator(struct compiler *c, location loc,
ADDOP_I(c, elt_loc, MAP_ADD, depth + 1);
break;
default:
- return 0;
+ return ERROR;
}
}
@@ -5437,7 +5369,7 @@ compiler_async_comprehension_generator(struct compiler *c, location loc,
ADDOP(c, loc, END_ASYNC_FOR);
- return 1;
+ return SUCCESS;
}
static int
@@ -5453,8 +5385,8 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type,
int is_top_level_await = IS_TOP_LEVEL_AWAIT(c);
outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
- if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
- (void *)e, e->lineno))
+ if (compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
+ (void *)e, e->lineno) < 0)
{
goto error;
}
@@ -5493,8 +5425,8 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type,
ADDOP_I(c, loc, op, 0);
}
- if (!compiler_comprehension_generator(c, loc, generators, 0, 0,
- elt, val, type)) {
+ if (compiler_comprehension_generator(c, loc, generators, 0, 0,
+ elt, val, type) < 0) {
goto error_in_scope;
}
@@ -5502,7 +5434,7 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type,
ADDOP(c, LOC(e), RETURN_VALUE);
}
if (type == COMP_GENEXP) {
- if (!wrap_in_stopiteration_handler(c)) {
+ if (wrap_in_stopiteration_handler(c) < 0) {
goto error_in_scope;
}
}
@@ -5513,11 +5445,12 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type,
if (is_top_level_await && is_async_generator){
c->u->u_ste->ste_coroutine = 1;
}
- if (co == NULL)
+ if (co == NULL) {
goto error;
+ }
loc = LOC(e);
- if (!compiler_make_closure(c, loc, co, 0, qualname)) {
+ if (compiler_make_closure(c, loc, co, 0, qualname) < 0) {
goto error;
}
Py_DECREF(qualname);
@@ -5540,13 +5473,13 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type,
ADD_YIELD_FROM(c, loc, 1);
}
- return 1;
+ return SUCCESS;
error_in_scope:
compiler_exit_scope(c);
error:
Py_XDECREF(qualname);
Py_XDECREF(co);
- return 0;
+ return ERROR;
}
static int
@@ -5595,7 +5528,7 @@ static int
compiler_visit_keyword(struct compiler *c, keyword_ty k)
{
VISIT(c, expr, k->value);
- return 1;
+ return SUCCESS;
}
@@ -5618,7 +5551,7 @@ compiler_with_except_finish(struct compiler *c, jump_target_label cleanup) {
POP_EXCEPT_AND_RERAISE(c, NO_LOCATION);
USE_LABEL(c, exit);
- return 1;
+ return SUCCESS;
}
/*
@@ -5675,15 +5608,13 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos)
/* SETUP_WITH pushes a finally block. */
USE_LABEL(c, block);
- if (!compiler_push_fblock(c, loc, ASYNC_WITH, block, final, s)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_push_fblock(c, loc, ASYNC_WITH, block, final, s));
if (item->optional_vars) {
VISIT(c, expr, item->optional_vars);
}
else {
- /* Discard result from context.__aenter__() */
+ /* Discard result from context.__aenter__() */
ADDOP(c, loc, POP_TOP);
}
@@ -5692,8 +5623,8 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos)
/* BLOCK code */
VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
}
- else if (!compiler_async_with(c, s, pos)) {
- return 0;
+ else {
+ RETURN_IF_ERROR(compiler_async_with(c, s, pos));
}
compiler_pop_fblock(c, ASYNC_WITH, block);
@@ -5704,8 +5635,7 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos)
/* For successful outcome:
* call __exit__(None, None, None)
*/
- if(!compiler_call_exit_with_nones(c, loc))
- return 0;
+ RETURN_IF_ERROR(compiler_call_exit_with_nones(c, loc));
ADDOP_I(c, loc, GET_AWAITABLE, 2);
ADDOP_LOAD_CONST(c, loc, Py_None);
ADD_YIELD_FROM(c, loc, 1);
@@ -5723,10 +5653,10 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos)
ADDOP_I(c, loc, GET_AWAITABLE, 2);
ADDOP_LOAD_CONST(c, loc, Py_None);
ADD_YIELD_FROM(c, loc, 1);
- compiler_with_except_finish(c, cleanup);
+ RETURN_IF_ERROR(compiler_with_except_finish(c, cleanup));
USE_LABEL(c, exit);
- return 1;
+ return SUCCESS;
}
@@ -5772,9 +5702,7 @@ compiler_with(struct compiler *c, stmt_ty s, int pos)
/* SETUP_WITH pushes a finally block. */
USE_LABEL(c, block);
- if (!compiler_push_fblock(c, loc, WITH, block, final, s)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_push_fblock(c, loc, WITH, block, final, s));
if (item->optional_vars) {
VISIT(c, expr, item->optional_vars);
@@ -5785,11 +5713,13 @@ compiler_with(struct compiler *c, stmt_ty s, int pos)
}
pos++;
- if (pos == asdl_seq_LEN(s->v.With.items))
+ if (pos == asdl_seq_LEN(s->v.With.items)) {
/* BLOCK code */
VISIT_SEQ(c, stmt, s->v.With.body)
- else if (!compiler_with(c, s, pos))
- return 0;
+ }
+ else {
+ RETURN_IF_ERROR(compiler_with(c, s, pos));
+ }
ADDOP(c, NO_LOCATION, POP_BLOCK);
compiler_pop_fblock(c, WITH, block);
@@ -5800,8 +5730,7 @@ compiler_with(struct compiler *c, stmt_ty s, int pos)
* call __exit__(None, None, None)
*/
loc = LOC(s);
- if (!compiler_call_exit_with_nones(c, loc))
- return 0;
+ RETURN_IF_ERROR(compiler_call_exit_with_nones(c, loc));
ADDOP(c, loc, POP_TOP);
ADDOP_JUMP(c, loc, JUMP, exit);
@@ -5811,10 +5740,10 @@ compiler_with(struct compiler *c, stmt_ty s, int pos)
ADDOP_JUMP(c, loc, SETUP_CLEANUP, cleanup);
ADDOP(c, loc, PUSH_EXC_INFO);
ADDOP(c, loc, WITH_EXCEPT_START);
- compiler_with_except_finish(c, cleanup);
+ RETURN_IF_ERROR(compiler_with_except_finish(c, cleanup));
USE_LABEL(c, exit);
- return 1;
+ return SUCCESS;
}
static int
@@ -5855,8 +5784,9 @@ compiler_visit_expr1(struct compiler *c, expr_ty e)
case DictComp_kind:
return compiler_dictcomp(c, e);
case Yield_kind:
- if (c->u->u_ste->ste_type != FunctionBlock)
+ if (c->u->u_ste->ste_type != FunctionBlock) {
return compiler_error(c, loc, "'yield' outside function");
+ }
if (e->v.Yield.value) {
VISIT(c, expr, e->v.Yield.value);
}
@@ -5866,12 +5796,12 @@ compiler_visit_expr1(struct compiler *c, expr_ty e)
ADDOP_YIELD(c, loc);
break;
case YieldFrom_kind:
- if (c->u->u_ste->ste_type != FunctionBlock)
+ if (c->u->u_ste->ste_type != FunctionBlock) {
return compiler_error(c, loc, "'yield' outside function");
-
- if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
+ }
+ if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION) {
return compiler_error(c, loc, "'yield from' inside async function");
-
+ }
VISIT(c, expr, e->v.YieldFrom.value);
ADDOP(c, loc, GET_YIELD_FROM_ITER);
ADDOP_LOAD_CONST(c, loc, Py_None);
@@ -5884,7 +5814,7 @@ compiler_visit_expr1(struct compiler *c, expr_ty e)
}
if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
- c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION){
+ c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION) {
return compiler_error(c, loc, "'await' outside async function");
}
}
@@ -5916,7 +5846,7 @@ compiler_visit_expr1(struct compiler *c, expr_ty e)
break;
case Store:
if (forbidden_name(c, loc, e->v.Attribute.attr, e->v.Attribute.ctx)) {
- return 0;
+ return ERROR;
}
ADDOP_NAME(c, loc, STORE_ATTR, e->v.Attribute.attr, names);
break;
@@ -5942,9 +5872,7 @@ compiler_visit_expr1(struct compiler *c, expr_ty e)
case Slice_kind:
{
int n = compiler_slice(c, e);
- if (n == 0) {
- return 0;
- }
+ RETURN_IF_ERROR(n);
ADDOP_I(c, loc, BUILD_SLICE, n);
break;
}
@@ -5956,7 +5884,7 @@ compiler_visit_expr1(struct compiler *c, expr_ty e)
case Tuple_kind:
return compiler_tuple(c, e);
}
- return 1;
+ return SUCCESS;
}
static int
@@ -5991,9 +5919,7 @@ compiler_augassign(struct compiler *c, stmt_ty s)
case Subscript_kind:
VISIT(c, expr, e->v.Subscript.value);
if (is_two_element_slice(e->v.Subscript.slice)) {
- if (!compiler_slice(c, e->v.Subscript.slice)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_slice(c, e->v.Subscript.slice));
ADDOP_I(c, loc, COPY, 3);
ADDOP_I(c, loc, COPY, 3);
ADDOP_I(c, loc, COPY, 3);
@@ -6007,14 +5933,13 @@ compiler_augassign(struct compiler *c, stmt_ty s)
}
break;
case Name_kind:
- if (!compiler_nameop(c, loc, e->v.Name.id, Load))
- return 0;
+ RETURN_IF_ERROR(compiler_nameop(c, loc, e->v.Name.id, Load));
break;
default:
PyErr_Format(PyExc_SystemError,
"invalid node type (%d) for augmented assignment",
e->kind);
- return 0;
+ return ERROR;
}
loc = LOC(s);
@@ -6048,7 +5973,7 @@ compiler_augassign(struct compiler *c, stmt_ty s)
default:
Py_UNREACHABLE();
}
- return 1;
+ return SUCCESS;
}
static int
@@ -6056,7 +5981,7 @@ check_ann_expr(struct compiler *c, expr_ty e)
{
VISIT(c, expr, e);
ADDOP(c, LOC(e), POP_TOP);
- return 1;
+ return SUCCESS;
}
static int
@@ -6065,7 +5990,7 @@ check_annotation(struct compiler *c, stmt_ty s)
/* Annotations of complex targets does not produce anything
under annotations future */
if (c->c_future.ff_features & CO_FUTURE_ANNOTATIONS) {
- return 1;
+ return SUCCESS;
}
/* Annotations are only evaluated in a module or class. */
@@ -6073,7 +5998,7 @@ check_annotation(struct compiler *c, stmt_ty s)
c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
return check_ann_expr(c, s->v.AnnAssign.annotation);
}
- return 1;
+ return SUCCESS;
}
static int
@@ -6082,26 +6007,24 @@ check_ann_subscr(struct compiler *c, expr_ty e)
/* We check that everything in a subscript is defined at runtime. */
switch (e->kind) {
case Slice_kind:
- if (e->v.Slice.lower && !check_ann_expr(c, e->v.Slice.lower)) {
- return 0;
+ if (e->v.Slice.lower && check_ann_expr(c, e->v.Slice.lower) < 0) {
+ return ERROR;
}
- if (e->v.Slice.upper && !check_ann_expr(c, e->v.Slice.upper)) {
- return 0;
+ if (e->v.Slice.upper && check_ann_expr(c, e->v.Slice.upper) < 0) {
+ return ERROR;
}
- if (e->v.Slice.step && !check_ann_expr(c, e->v.Slice.step)) {
- return 0;
+ if (e->v.Slice.step && check_ann_expr(c, e->v.Slice.step) < 0) {
+ return ERROR;
}
- return 1;
+ return SUCCESS;
case Tuple_kind: {
/* extended slice */
asdl_expr_seq *elts = e->v.Tuple.elts;
Py_ssize_t i, n = asdl_seq_LEN(elts);
for (i = 0; i < n; i++) {
- if (!check_ann_subscr(c, asdl_seq_GET(elts, i))) {
- return 0;
- }
+ RETURN_IF_ERROR(check_ann_subscr(c, asdl_seq_GET(elts, i)));
}
- return 1;
+ return SUCCESS;
}
default:
return check_ann_expr(c, e);
@@ -6124,8 +6047,9 @@ compiler_annassign(struct compiler *c, stmt_ty s)
}
switch (targ->kind) {
case Name_kind:
- if (forbidden_name(c, loc, targ->v.Name.id, Store))
- return 0;
+ if (forbidden_name(c, loc, targ->v.Name.id, Store)) {
+ return ERROR;
+ }
/* If we have a simple name in a module or class, store annotation. */
if (s->v.AnnAssign.simple &&
(c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
@@ -6143,31 +6067,32 @@ compiler_annassign(struct compiler *c, stmt_ty s)
}
break;
case Attribute_kind:
- if (forbidden_name(c, loc, targ->v.Attribute.attr, Store))
- return 0;
+ if (forbidden_name(c, loc, targ->v.Attribute.attr, Store)) {
+ return ERROR;
+ }
if (!s->v.AnnAssign.value &&
- !check_ann_expr(c, targ->v.Attribute.value)) {
- return 0;
+ check_ann_expr(c, targ->v.Attribute.value) < 0) {
+ return ERROR;
}
break;
case Subscript_kind:
if (!s->v.AnnAssign.value &&
- (!check_ann_expr(c, targ->v.Subscript.value) ||
- !check_ann_subscr(c, targ->v.Subscript.slice))) {
- return 0;
+ (check_ann_expr(c, targ->v.Subscript.value) < 0 ||
+ check_ann_subscr(c, targ->v.Subscript.slice) < 0)) {
+ return ERROR;
}
break;
default:
PyErr_Format(PyExc_SystemError,
"invalid node type (%d) for annotated assignment",
targ->kind);
- return 0;
+ return ERROR;
}
/* Annotation is evaluated last. */
- if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
- return 0;
+ if (!s->v.AnnAssign.simple && check_annotation(c, s) < 0) {
+ return ERROR;
}
- return 1;
+ return SUCCESS;
}
/* Raises a SyntaxError and returns 0.
@@ -6183,7 +6108,7 @@ compiler_error(struct compiler *c, location loc,
PyObject *msg = PyUnicode_FromFormatV(format, vargs);
va_end(vargs);
if (msg == NULL) {
- return 0;
+ return ERROR;
}
PyObject *loc_obj = PyErr_ProgramTextObject(c->c_filename, loc.lineno);
if (loc_obj == NULL) {
@@ -6200,7 +6125,7 @@ compiler_error(struct compiler *c, location loc,
exit:
Py_DECREF(loc_obj);
Py_XDECREF(args);
- return 0;
+ return ERROR;
}
/* Emits a SyntaxWarning and returns 1 on success.
@@ -6216,7 +6141,7 @@ compiler_warn(struct compiler *c, location loc,
PyObject *msg = PyUnicode_FromFormatV(format, vargs);
va_end(vargs);
if (msg == NULL) {
- return 0;
+ return ERROR;
}
if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename,
loc.lineno, NULL, NULL) < 0)
@@ -6229,10 +6154,10 @@ compiler_warn(struct compiler *c, location loc,
compiler_error(c, loc, PyUnicode_AsUTF8(msg));
}
Py_DECREF(msg);
- return 0;
+ return ERROR;
}
Py_DECREF(msg);
- return 1;
+ return SUCCESS;
}
static int
@@ -6243,19 +6168,13 @@ compiler_subscript(struct compiler *c, expr_ty e)
int op = 0;
if (ctx == Load) {
- if (!check_subscripter(c, e->v.Subscript.value)) {
- return 0;
- }
- if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) {
- return 0;
- }
+ RETURN_IF_ERROR(check_subscripter(c, e->v.Subscript.value));
+ RETURN_IF_ERROR(check_index(c, e->v.Subscript.value, e->v.Subscript.slice));
}
VISIT(c, expr, e->v.Subscript.value);
if (is_two_element_slice(e->v.Subscript.slice) && ctx != Del) {
- if (!compiler_slice(c, e->v.Subscript.slice)) {
- return 0;
- }
+ RETURN_IF_ERROR(compiler_slice(c, e->v.Subscript.slice));
if (ctx == Load) {
ADDOP(c, loc, BINARY_SLICE);
}
@@ -6274,11 +6193,11 @@ compiler_subscript(struct compiler *c, expr_ty e)
assert(op);
ADDOP(c, loc, op);
}
- return 1;
+ return SUCCESS;
}
/* Returns the number of the values emitted,
- * thus are needed to build the slice, or 0 if there is an error. */
+ * thus are needed to build the slice, or -1 if there is an error. */
static int
compiler_slice(struct compiler *c, expr_ty s)
{
@@ -6336,20 +6255,20 @@ ensure_fail_pop(struct compiler *c, pattern_context *pc, Py_ssize_t n)
{
Py_ssize_t size = n + 1;
if (size <= pc->fail_pop_size) {
- return 1;
+ return SUCCESS;
}
Py_ssize_t needed = sizeof(jump_target_label) * size;
jump_target_label *resized = PyObject_Realloc(pc->fail_pop, needed);
if (resized == NULL) {
PyErr_NoMemory();
- return 0;
+ return ERROR;
}
pc->fail_pop = resized;
while (pc->fail_pop_size < size) {
NEW_JUMP_TARGET_LABEL(c, new_block);
pc->fail_pop[pc->fail_pop_size++] = new_block;
}
- return 1;
+ return SUCCESS;
}
// Use op to jump to the correct fail_pop block.
@@ -6360,9 +6279,9 @@ jump_to_fail_pop(struct compiler *c, location loc,
// Pop any items on the top of the stack, plus any objects we were going to
// capture on success:
Py_ssize_t pops = pc->on_top + PyList_GET_SIZE(pc->stores);
- RETURN_IF_FALSE(ensure_fail_pop(c, pc, pops));
+ RETURN_IF_ERROR(ensure_fail_pop(c, pc, pops));
ADDOP_JUMP(c, loc, op, pc->fail_pop[pops]);
- return 1;
+ return SUCCESS;
}
// Build all of the fail_pop blocks and reset fail_pop.
@@ -6372,21 +6291,21 @@ emit_and_reset_fail_pop(struct compiler *c, location loc,
{
if (!pc->fail_pop_size) {
assert(pc->fail_pop == NULL);
- return 1;
+ return SUCCESS;
}
while (--pc->fail_pop_size) {
USE_LABEL(c, pc->fail_pop[pc->fail_pop_size]);
- if (!cfg_builder_addop_noarg(CFG_BUILDER(c), POP_TOP, loc)) {
+ if (cfg_builder_addop_noarg(CFG_BUILDER(c), POP_TOP, loc) < 0) {
pc->fail_pop_size = 0;
PyObject_Free(pc->fail_pop);
pc->fail_pop = NULL;
- return 0;
+ return ERROR;
}
}
USE_LABEL(c, pc->fail_pop[0]);
PyObject_Free(pc->fail_pop);
pc->fail_pop = NULL;
- return 1;
+ return SUCCESS;
}
static int
@@ -6403,7 +6322,7 @@ pattern_helper_rotate(struct compiler *c, location loc, Py_ssize_t count)
while (1 < count) {
ADDOP_I(c, loc, SWAP, count--);
}
- return 1;
+ return SUCCESS;
}
static int
@@ -6412,23 +6331,22 @@ pattern_helper_store_name(struct compiler *c, location loc,
{
if (n == NULL) {
ADDOP(c, loc, POP_TOP);
- return 1;
+ return SUCCESS;
}
if (forbidden_name(c, loc, n, Store)) {
- return 0;
+ return ERROR;
}
// Can't assign to the same name twice:
int duplicate = PySequence_Contains(pc->stores, n);
- if (duplicate < 0) {
- return 0;
- }
+ RETURN_IF_ERROR(duplicate);
if (duplicate) {
return compiler_error_duplicate_store(c, loc, n);
}
// Rotate this object underneath any items we need to preserve:
Py_ssize_t rotations = pc->on_top + PyList_GET_SIZE(pc->stores) + 1;
- RETURN_IF_FALSE(pattern_helper_rotate(c, loc, rotations));
- return !PyList_Append(pc->stores, n);
+ RETURN_IF_ERROR(pattern_helper_rotate(c, loc, rotations));
+ RETURN_IF_ERROR(PyList_Append(pc->stores, n));
+ return SUCCESS;
}
@@ -6442,10 +6360,11 @@ pattern_unpack_helper(struct compiler *c, location loc,
pattern_ty elt = asdl_seq_GET(elts, i);
if (elt->kind == MatchStar_kind && !seen_star) {
if ((i >= (1 << 8)) ||
- (n-i-1 >= (INT_MAX >> 8)))
+ (n-i-1 >= (INT_MAX >> 8))) {
return compiler_error(c, loc,
"too many expressions in "
"star-unpacking sequence pattern");
+ }
ADDOP_I(c, loc, UNPACK_EX, (i + ((n-i-1) << 8)));
seen_star = 1;
}
@@ -6457,7 +6376,7 @@ pattern_unpack_helper(struct compiler *c, location loc,
if (!seen_star) {
ADDOP_I(c, loc, UNPACK_SEQUENCE, n);
}
- return 1;
+ return SUCCESS;
}
static int
@@ -6465,7 +6384,7 @@ pattern_helper_sequence_unpack(struct compiler *c, location loc,
asdl_pattern_seq *patterns, Py_ssize_t star,
pattern_context *pc)
{
- RETURN_IF_FALSE(pattern_unpack_helper(c, loc, patterns));
+ RETURN_IF_ERROR(pattern_unpack_helper(c, loc, patterns));
Py_ssize_t size = asdl_seq_LEN(patterns);
// We've now got a bunch of new subjects on the stack. They need to remain
// there after each subpattern match:
@@ -6474,9 +6393,9 @@ pattern_helper_sequence_unpack(struct compiler *c, location loc,
// One less item to keep track of each time we loop through:
pc->on_top--;
pattern_ty pattern = asdl_seq_GET(patterns, i);
- RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
+ RETURN_IF_ERROR(compiler_pattern_subpattern(c, pattern, pc));
}
- return 1;
+ return SUCCESS;
}
// Like pattern_helper_sequence_unpack, but uses BINARY_SUBSCR instead of
@@ -6511,12 +6430,12 @@ pattern_helper_sequence_subscr(struct compiler *c, location loc,
ADDOP_BINARY(c, loc, Sub);
}
ADDOP(c, loc, BINARY_SUBSCR);
- RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
+ RETURN_IF_ERROR(compiler_pattern_subpattern(c, pattern, pc));
}
// Pop the subject, we're done with it:
pc->on_top--;
ADDOP(c, loc, POP_TOP);
- return 1;
+ return SUCCESS;
}
// Like compiler_pattern, but turn off checks for irrefutability.
@@ -6526,9 +6445,9 @@ compiler_pattern_subpattern(struct compiler *c,
{
int allow_irrefutable = pc->allow_irrefutable;
pc->allow_irrefutable = 1;
- RETURN_IF_FALSE(compiler_pattern(c, p, pc));
+ RETURN_IF_ERROR(compiler_pattern(c, p, pc));
pc->allow_irrefutable = allow_irrefutable;
- return 1;
+ return SUCCESS;
}
static int
@@ -6550,19 +6469,20 @@ compiler_pattern_as(struct compiler *c, pattern_ty p, pattern_context *pc)
// Need to make a copy for (possibly) storing later:
pc->on_top++;
ADDOP_I(c, LOC(p), COPY, 1);
- RETURN_IF_FALSE(compiler_pattern(c, p->v.MatchAs.pattern, pc));
+ RETURN_IF_ERROR(compiler_pattern(c, p->v.MatchAs.pattern, pc));
// Success! Store it:
pc->on_top--;
- RETURN_IF_FALSE(pattern_helper_store_name(c, LOC(p), p->v.MatchAs.name, pc));
- return 1;
+ RETURN_IF_ERROR(pattern_helper_store_name(c, LOC(p), p->v.MatchAs.name, pc));
+ return SUCCESS;
}
static int
compiler_pattern_star(struct compiler *c, pattern_ty p, pattern_context *pc)
{
assert(p->kind == MatchStar_kind);
- RETURN_IF_FALSE(pattern_helper_store_name(c, LOC(p), p->v.MatchStar.name, pc));
- return 1;
+ RETURN_IF_ERROR(
+ pattern_helper_store_name(c, LOC(p), p->v.MatchStar.name, pc));
+ return SUCCESS;
}
static int
@@ -6575,18 +6495,18 @@ validate_kwd_attrs(struct compiler *c, asdl_identifier_seq *attrs, asdl_pattern_
identifier attr = ((identifier)asdl_seq_GET(attrs, i));
location loc = LOC((pattern_ty) asdl_seq_GET(patterns, i));
if (forbidden_name(c, loc, attr, Store)) {
- return -1;
+ return ERROR;
}
for (Py_ssize_t j = i + 1; j < nattrs; j++) {
identifier other = ((identifier)asdl_seq_GET(attrs, j));
if (!PyUnicode_Compare(attr, other)) {
location loc = LOC((pattern_ty) asdl_seq_GET(patterns, j));
compiler_error(c, loc, "attribute name repeated in class pattern: %U", attr);
- return -1;
+ return ERROR;
}
}
}
- return 0;
+ return SUCCESS;
}
static int
@@ -6610,11 +6530,13 @@ compiler_pattern_class(struct compiler *c, pattern_ty p, pattern_context *pc)
return compiler_error(c, LOC(p), e, p->v.MatchClass.cls);
}
if (nattrs) {
- RETURN_IF_FALSE(!validate_kwd_attrs(c, kwd_attrs, kwd_patterns));
+ RETURN_IF_ERROR(validate_kwd_attrs(c, kwd_attrs, kwd_patterns));
}
VISIT(c, expr, p->v.MatchClass.cls);
- PyObject *attr_names;
- RETURN_IF_FALSE(attr_names = PyTuple_New(nattrs));
+ PyObject *attr_names = PyTuple_New(nattrs);
+ if (attr_names == NULL) {
+ return ERROR;
+ }
Py_ssize_t i;
for (i = 0; i < nattrs; i++) {
PyObject *name = asdl_seq_GET(kwd_attrs, i);
@@ -6627,7 +6549,7 @@ compiler_pattern_class(struct compiler *c, pattern_ty p, pattern_context *pc)
ADDOP_I(c, LOC(p), IS_OP, 1);
// TOS is now a tuple of (nargs + nattrs) attributes (or None):
pc->on_top++;
- RETURN_IF_FALSE(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
+ RETURN_IF_ERROR(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
ADDOP_I(c, LOC(p), UNPACK_SEQUENCE, nargs + nattrs);
pc->on_top += nargs + nattrs - 1;
for (i = 0; i < nargs + nattrs; i++) {
@@ -6645,10 +6567,10 @@ compiler_pattern_class(struct compiler *c, pattern_ty p, pattern_context *pc)
ADDOP(c, LOC(p), POP_TOP);
continue;
}
- RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
+ RETURN_IF_ERROR(compiler_pattern_subpattern(c, pattern, pc));
}
// Success! Pop the tuple of attributes:
- return 1;
+ return SUCCESS;
}
static int
@@ -6671,19 +6593,19 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p,
// We need to keep the subject on top during the mapping and length checks:
pc->on_top++;
ADDOP(c, LOC(p), MATCH_MAPPING);
- RETURN_IF_FALSE(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
+ RETURN_IF_ERROR(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
if (!size && !star_target) {
// If the pattern is just "{}", we're done! Pop the subject:
pc->on_top--;
ADDOP(c, LOC(p), POP_TOP);
- return 1;
+ return SUCCESS;
}
if (size) {
// If the pattern has any keys in it, perform a length check:
ADDOP(c, LOC(p), GET_LEN);
ADDOP_LOAD_CONST_NEW(c, LOC(p), PyLong_FromSsize_t(size));
ADDOP_COMPARE(c, LOC(p), GtE);
- RETURN_IF_FALSE(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
+ RETURN_IF_ERROR(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
}
if (INT_MAX < size - 1) {
return compiler_error(c, LOC(p), "too many sub-patterns in mapping pattern");
@@ -6695,7 +6617,7 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p,
// SyntaxError in the case of duplicates.
PyObject *seen = PySet_New(NULL);
if (seen == NULL) {
- return 0;
+ return ERROR;
}
// NOTE: goto error on failure in the loop below to avoid leaking `seen`
@@ -6729,7 +6651,7 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p,
compiler_error(c, LOC(p), e);
goto error;
}
- if (!compiler_visit_expr(c, key)) {
+ if (compiler_visit_expr(c, key) < 0) {
goto error;
}
}
@@ -6744,7 +6666,7 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p,
ADDOP_I(c, LOC(p), COPY, 1);
ADDOP_LOAD_CONST(c, LOC(p), Py_None);
ADDOP_I(c, LOC(p), IS_OP, 1);
- RETURN_IF_FALSE(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
+ RETURN_IF_ERROR(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
// So far so good. Use that tuple of values on the stack to match
// sub-patterns against:
ADDOP_I(c, LOC(p), UNPACK_SEQUENCE, size);
@@ -6752,7 +6674,7 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p,
for (Py_ssize_t i = 0; i < size; i++) {
pc->on_top--;
pattern_ty pattern = asdl_seq_GET(patterns, i);
- RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
+ RETURN_IF_ERROR(compiler_pattern_subpattern(c, pattern, pc));
}
// If we get this far, it's a match! Whatever happens next should consume
// the tuple of keys and the subject:
@@ -6773,17 +6695,17 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p,
ADDOP_I(c, LOC(p), SWAP, 2); // [copy, keys..., copy, key]
ADDOP(c, LOC(p), DELETE_SUBSCR); // [copy, keys...]
}
- RETURN_IF_FALSE(pattern_helper_store_name(c, LOC(p), star_target, pc));
+ RETURN_IF_ERROR(pattern_helper_store_name(c, LOC(p), star_target, pc));
}
else {
ADDOP(c, LOC(p), POP_TOP); // Tuple of keys.
ADDOP(c, LOC(p), POP_TOP); // Subject.
}
- return 1;
+ return SUCCESS;
error:
Py_DECREF(seen);
- return 0;
+ return ERROR;
}
static int
@@ -6813,8 +6735,8 @@ compiler_pattern_or(struct compiler *c, pattern_ty p, pattern_context *pc)
pc->fail_pop = NULL;
pc->fail_pop_size = 0;
pc->on_top = 0;
- if (!cfg_builder_addop_i(CFG_BUILDER(c), COPY, 1, LOC(alt)) ||
- !compiler_pattern(c, alt, pc)) {
+ if (cfg_builder_addop_i(CFG_BUILDER(c), COPY, 1, LOC(alt)) < 0 ||
+ compiler_pattern(c, alt, pc) < 0) {
goto error;
}
// Success!
@@ -6868,7 +6790,7 @@ compiler_pattern_or(struct compiler *c, pattern_ty p, pattern_context *pc)
// Do the same thing to the stack, using several
// rotations:
while (rotations--) {
- if (!pattern_helper_rotate(c, LOC(alt), icontrol + 1)){
+ if (pattern_helper_rotate(c, LOC(alt), icontrol + 1) < 0) {
goto error;
}
}
@@ -6876,8 +6798,8 @@ compiler_pattern_or(struct compiler *c, pattern_ty p, pattern_context *pc)
}
}
assert(control);
- if (!cfg_builder_addop_j(CFG_BUILDER(c), LOC(alt), JUMP, end) ||
- !emit_and_reset_fail_pop(c, LOC(alt), pc))
+ if (cfg_builder_addop_j(CFG_BUILDER(c), LOC(alt), JUMP, end) < 0 ||
+ emit_and_reset_fail_pop(c, LOC(alt), pc) < 0)
{
goto error;
}
@@ -6888,8 +6810,8 @@ compiler_pattern_or(struct compiler *c, pattern_ty p, pattern_context *pc)
// Need to NULL this for the PyObject_Free call in the error block.
old_pc.fail_pop = NULL;
// No match. Pop the remaining copy of the subject and fail:
- if (!cfg_builder_addop_noarg(CFG_BUILDER(c), POP_TOP, LOC(p)) ||
- !jump_to_fail_pop(c, LOC(p), pc, JUMP)) {
+ if (cfg_builder_addop_noarg(CFG_BUILDER(c), POP_TOP, LOC(p)) < 0 ||
+ jump_to_fail_pop(c, LOC(p), pc, JUMP) < 0) {
goto error;
}
@@ -6904,7 +6826,7 @@ compiler_pattern_or(struct compiler *c, pattern_ty p, pattern_context *pc)
Py_ssize_t nrots = nstores + 1 + pc->on_top + PyList_GET_SIZE(pc->stores);
for (Py_ssize_t i = 0; i < nstores; i++) {
// Rotate this capture to its proper place on the stack:
- if (!pattern_helper_rotate(c, LOC(p), nrots)) {
+ if (pattern_helper_rotate(c, LOC(p), nrots) < 0) {
goto error;
}
// Update the list of previous stores with this new name, checking for
@@ -6927,14 +6849,14 @@ compiler_pattern_or(struct compiler *c, pattern_ty p, pattern_context *pc)
// NOTE: Returning macros are safe again.
// Pop the copy of the subject:
ADDOP(c, LOC(p), POP_TOP);
- return 1;
+ return SUCCESS;
diff:
compiler_error(c, LOC(p), "alternative patterns bind different names");
error:
PyObject_Free(old_pc.fail_pop);
Py_DECREF(old_pc.stores);
Py_XDECREF(control);
- return 0;
+ return ERROR;
}
@@ -6966,20 +6888,20 @@ compiler_pattern_sequence(struct compiler *c, pattern_ty p,
// We need to keep the subject on top during the sequence and length checks:
pc->on_top++;
ADDOP(c, LOC(p), MATCH_SEQUENCE);
- RETURN_IF_FALSE(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
+ RETURN_IF_ERROR(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
if (star < 0) {
// No star: len(subject) == size
ADDOP(c, LOC(p), GET_LEN);
ADDOP_LOAD_CONST_NEW(c, LOC(p), PyLong_FromSsize_t(size));
ADDOP_COMPARE(c, LOC(p), Eq);
- RETURN_IF_FALSE(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
+ RETURN_IF_ERROR(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
}
else if (size > 1) {
// Star: len(subject) >= size - 1
ADDOP(c, LOC(p), GET_LEN);
ADDOP_LOAD_CONST_NEW(c, LOC(p), PyLong_FromSsize_t(size - 1));
ADDOP_COMPARE(c, LOC(p), GtE);
- RETURN_IF_FALSE(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
+ RETURN_IF_ERROR(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
}
// Whatever comes next should consume the subject:
pc->on_top--;
@@ -6988,12 +6910,12 @@ compiler_pattern_sequence(struct compiler *c, pattern_ty p,
ADDOP(c, LOC(p), POP_TOP);
}
else if (star_wildcard) {
- RETURN_IF_FALSE(pattern_helper_sequence_subscr(c, LOC(p), patterns, star, pc));
+ RETURN_IF_ERROR(pattern_helper_sequence_subscr(c, LOC(p), patterns, star, pc));
}
else {
- RETURN_IF_FALSE(pattern_helper_sequence_unpack(c, LOC(p), patterns, star, pc));
+ RETURN_IF_ERROR(pattern_helper_sequence_unpack(c, LOC(p), patterns, star, pc));
}
- return 1;
+ return SUCCESS;
}
static int
@@ -7007,8 +6929,8 @@ compiler_pattern_value(struct compiler *c, pattern_ty p, pattern_context *pc)
}
VISIT(c, expr, value);
ADDOP_COMPARE(c, LOC(p), Eq);
- RETURN_IF_FALSE(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
- return 1;
+ RETURN_IF_ERROR(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
+ return SUCCESS;
}
static int
@@ -7017,8 +6939,8 @@ compiler_pattern_singleton(struct compiler *c, pattern_ty p, pattern_context *pc
assert(p->kind == MatchSingleton_kind);
ADDOP_LOAD_CONST(c, LOC(p), p->v.MatchSingleton.value);
ADDOP_COMPARE(c, LOC(p), Is);
- RETURN_IF_FALSE(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
- return 1;
+ RETURN_IF_ERROR(jump_to_fail_pop(c, LOC(p), pc, POP_JUMP_IF_FALSE));
+ return SUCCESS;
}
static int
@@ -7063,32 +6985,35 @@ compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc)
if (i != cases - has_default - 1) {
ADDOP_I(c, LOC(m->pattern), COPY, 1);
}
- RETURN_IF_FALSE(pc->stores = PyList_New(0));
+ pc->stores = PyList_New(0);
+ if (pc->stores == NULL) {
+ return ERROR;
+ }
// Irrefutable cases must be either guarded, last, or both:
pc->allow_irrefutable = m->guard != NULL || i == cases - 1;
pc->fail_pop = NULL;
pc->fail_pop_size = 0;
pc->on_top = 0;
// NOTE: Can't use returning macros here (they'll leak pc->stores)!
- if (!compiler_pattern(c, m->pattern, pc)) {
+ if (compiler_pattern(c, m->pattern, pc) < 0) {
Py_DECREF(pc->stores);
- return 0;
+ return ERROR;
}
assert(!pc->on_top);
// It's a match! Store all of the captured names (they're on the stack).
Py_ssize_t nstores = PyList_GET_SIZE(pc->stores);
for (Py_ssize_t n = 0; n < nstores; n++) {
PyObject *name = PyList_GET_ITEM(pc->stores, n);
- if (!compiler_nameop(c, LOC(m->pattern), name, Store)) {
+ if (compiler_nameop(c, LOC(m->pattern), name, Store) < 0) {
Py_DECREF(pc->stores);
- return 0;
+ return ERROR;
}
}
Py_DECREF(pc->stores);
// NOTE: Returning macros are safe again.
if (m->guard) {
- RETURN_IF_FALSE(ensure_fail_pop(c, pc, 0));
- RETURN_IF_FALSE(compiler_jump_if(c, LOC(m->pattern), m->guard, pc->fail_pop[0], 0));
+ RETURN_IF_ERROR(ensure_fail_pop(c, pc, 0));
+ RETURN_IF_ERROR(compiler_jump_if(c, LOC(m->pattern), m->guard, pc->fail_pop[0], 0));
}
// Success! Pop the subject off, we're done with it:
if (i != cases - has_default - 1) {
@@ -7099,7 +7024,7 @@ compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc)
// If the pattern fails to match, we want the line number of the
// cleanup to be associated with the failed pattern, not the last line
// of the body
- RETURN_IF_FALSE(emit_and_reset_fail_pop(c, LOC(m->pattern), pc));
+ RETURN_IF_ERROR(emit_and_reset_fail_pop(c, LOC(m->pattern), pc));
}
if (has_default) {
// A trailing "case _" is common, and lets us save a bit of redundant
@@ -7114,12 +7039,12 @@ compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc)
ADDOP(c, LOC(m->pattern), NOP);
}
if (m->guard) {
- RETURN_IF_FALSE(compiler_jump_if(c, LOC(m->pattern), m->guard, end, 0));
+ RETURN_IF_ERROR(compiler_jump_if(c, LOC(m->pattern), m->guard, end, 0));
}
VISIT_SEQ(c, stmt, m->body);
}
USE_LABEL(c, end);
- return 1;
+ return SUCCESS;
}
static int
@@ -8792,6 +8717,19 @@ prepare_localsplus(struct compiler* c, int code_flags)
return nlocalsplus;
}
+static int
+add_return_at_end_of_block(struct compiler *c, int addNone)
+{
+ /* Make sure every block that falls off the end returns None. */
+ if (!basicblock_returns(CFG_BUILDER(c)->g_curblock)) {
+ if (addNone) {
+ ADDOP_LOAD_CONST(c, NO_LOCATION, Py_None);
+ }
+ ADDOP(c, NO_LOCATION, RETURN_VALUE);
+ }
+ return SUCCESS;
+}
+
static PyCodeObject *
assemble(struct compiler *c, int addNone)
{
@@ -8805,12 +8743,8 @@ assemble(struct compiler *c, int addNone)
return NULL;
}
- /* Make sure every block that falls off the end returns None. */
- if (!basicblock_returns(CFG_BUILDER(c)->g_curblock)) {
- if (addNone) {
- ADDOP_LOAD_CONST(c, NO_LOCATION, Py_None);
- }
- ADDOP(c, NO_LOCATION, RETURN_VALUE);
+ if (add_return_at_end_of_block(c, addNone) < 0) {
+ return NULL;
}
int nblocks = 0;
@@ -9992,7 +9926,7 @@ instructions_to_cfg(PyObject *instructions, cfg_builder *g)
if (PyErr_Occurred()) {
return -1;
}
- if (!cfg_builder_addop(g, opcode, oparg, loc)) {
+ if (cfg_builder_addop(g, opcode, oparg, loc) < 0) {
return -1;
}
}
@@ -10077,7 +10011,7 @@ _PyCompile_CodeGen(PyObject *ast, PyObject *filename, PyCompilerFlags *pflags,
return NULL;
}
- if (!compiler_codegen(c, mod)) {
+ if (compiler_codegen(c, mod) < 0) {
goto finally;
}