summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
Diffstat (limited to 'Python')
-rw-r--r--Python/ceval.c25
-rw-r--r--Python/compile.c37
-rw-r--r--Python/opcode_targets.h20
3 files changed, 36 insertions, 46 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 43925e6..81bea44 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -2725,31 +2725,6 @@ check_eval_breaker:
DISPATCH();
}
- TARGET(POP_EXCEPT_AND_RERAISE) {
- PyObject *lasti = PEEK(2);
- if (PyLong_Check(lasti)) {
- frame->f_lasti = PyLong_AsLong(lasti);
- assert(!_PyErr_Occurred(tstate));
- }
- else {
- _PyErr_SetString(tstate, PyExc_SystemError, "lasti is not an int");
- goto error;
- }
- PyObject *value = POP();
- assert(value);
- assert(PyExceptionInstance_Check(value));
- PyObject *type = Py_NewRef(PyExceptionInstance_Class(value));
- PyObject *traceback = PyException_GetTraceback(value);
- Py_DECREF(POP()); /* lasti */
- _PyErr_Restore(tstate, type, value, traceback);
-
- _PyErr_StackItem *exc_info = tstate->exc_info;
- value = exc_info->exc_value;
- exc_info->exc_value = POP();
- Py_XDECREF(value);
- goto exception_unwind;
- }
-
TARGET(RERAISE) {
if (oparg) {
PyObject *lasti = PEEK(oparg + 1);
diff --git a/Python/compile.c b/Python/compile.c
index 48250b5..9d37529 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -1049,8 +1049,6 @@ stack_effect(int opcode, int oparg, int jump)
return 0;
case POP_EXCEPT:
return -1;
- case POP_EXCEPT_AND_RERAISE:
- return -3;
case STORE_NAME:
return -1;
@@ -1669,6 +1667,9 @@ compiler_addop_j_noline(struct compiler *c, int opcode, basicblock *b)
#define ADD_YIELD_FROM(C) \
RETURN_IF_FALSE(compiler_add_yield_from((C)))
+#define POP_EXCEPT_AND_RERAISE(C) \
+ RETURN_IF_FALSE(compiler_pop_except_and_reraise((C)))
+
#define VISIT(C, TYPE, V) {\
if (!compiler_visit_ ## TYPE((C), (V))) \
return 0; \
@@ -1839,6 +1840,22 @@ compiler_add_yield_from(struct compiler *c)
return 1;
}
+static int
+compiler_pop_except_and_reraise(struct compiler *c)
+{
+ /* Stack contents
+ * [exc_info, lasti, exc] COPY 3
+ * [exc_info, lasti, exc, exc_info] POP_EXCEPT
+ * [exc_info, lasti, exc] RERAISE 1
+ * (exception_unwind clears the stack)
+ */
+
+ ADDOP_I(c, COPY, 3);
+ ADDOP(c, POP_EXCEPT);
+ ADDOP_I(c, RERAISE, 1);
+ return 1;
+}
+
/* Unwind a frame block. If preserve_tos is true, the TOS before
* popping the blocks will be restored afterwards, unless another
* return, break or continue is found. In which case, the TOS will
@@ -3235,7 +3252,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s)
compiler_pop_fblock(c, FINALLY_END, end);
ADDOP_I(c, RERAISE, 0);
compiler_use_next_block(c, cleanup);
- ADDOP(c, POP_EXCEPT_AND_RERAISE);
+ POP_EXCEPT_AND_RERAISE(c);
compiler_use_next_block(c, exit);
return 1;
}
@@ -3290,7 +3307,7 @@ compiler_try_star_finally(struct compiler *c, stmt_ty s)
compiler_pop_fblock(c, FINALLY_END, end);
ADDOP_I(c, RERAISE, 0);
compiler_use_next_block(c, cleanup);
- ADDOP(c, POP_EXCEPT_AND_RERAISE);
+ POP_EXCEPT_AND_RERAISE(c);
compiler_use_next_block(c, exit);
return 1;
}
@@ -3446,7 +3463,7 @@ compiler_try_except(struct compiler *c, stmt_ty s)
compiler_pop_fblock(c, EXCEPTION_HANDLER, NULL);
ADDOP_I(c, RERAISE, 0);
compiler_use_next_block(c, cleanup);
- ADDOP(c, POP_EXCEPT_AND_RERAISE);
+ POP_EXCEPT_AND_RERAISE(c);
compiler_use_next_block(c, orelse);
VISIT_SEQ(c, stmt, s->v.Try.orelse);
ADDOP_JUMP(c, JUMP_FORWARD, end);
@@ -3497,7 +3514,7 @@ compiler_try_except(struct compiler *c, stmt_ty s)
[exc] RER: ROT_TWO
[exc, prev_exc_info] POP_EXCEPT
- [exc] RERAISE 0
+ [exc] RERAISE 0
[] L0: <next statement>
*/
@@ -3677,7 +3694,7 @@ compiler_try_star_except(struct compiler *c, stmt_ty s)
ADDOP(c, POP_EXCEPT);
ADDOP_I(c, RERAISE, 0);
compiler_use_next_block(c, cleanup);
- ADDOP(c, POP_EXCEPT_AND_RERAISE);
+ POP_EXCEPT_AND_RERAISE(c);
compiler_use_next_block(c, orelse);
VISIT_SEQ(c, stmt, s->v.TryStar.orelse);
ADDOP_JUMP(c, JUMP_FORWARD, end);
@@ -5429,7 +5446,7 @@ compiler_with_except_finish(struct compiler *c, basicblock * cleanup) {
NEXT_BLOCK(c);
ADDOP_I(c, RERAISE, 2);
compiler_use_next_block(c, cleanup);
- ADDOP(c, POP_EXCEPT_AND_RERAISE);
+ POP_EXCEPT_AND_RERAISE(c);
compiler_use_next_block(c, exit);
ADDOP(c, POP_TOP); /* exc_value */
ADDOP(c, POP_BLOCK);
@@ -7032,8 +7049,7 @@ stackdepth(struct compiler *c)
instr->i_opcode == JUMP_FORWARD ||
instr->i_opcode == RETURN_VALUE ||
instr->i_opcode == RAISE_VARARGS ||
- instr->i_opcode == RERAISE ||
- instr->i_opcode == POP_EXCEPT_AND_RERAISE)
+ instr->i_opcode == RERAISE)
{
/* remaining code is dead */
next = NULL;
@@ -8756,7 +8772,6 @@ normalize_basic_block(basicblock *bb) {
case RETURN_VALUE:
case RAISE_VARARGS:
case RERAISE:
- case POP_EXCEPT_AND_RERAISE:
bb->b_exit = 1;
bb->b_nofallthrough = 1;
break;
diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h
index 3ee0b9c..a8f1398 100644
--- a/Python/opcode_targets.h
+++ b/Python/opcode_targets.h
@@ -36,7 +36,6 @@ static void *opcode_targets[256] = {
&&TARGET_BINARY_SUBSCR_DICT,
&&TARGET_PUSH_EXC_INFO,
&&TARGET_STORE_SUBSCR_ADAPTIVE,
- &&TARGET_POP_EXCEPT_AND_RERAISE,
&&TARGET_STORE_SUBSCR_LIST_INT,
&&TARGET_STORE_SUBSCR_DICT,
&&TARGET_CALL_NO_KW_ADAPTIVE,
@@ -48,45 +47,46 @@ static void *opcode_targets[256] = {
&&TARGET_CALL_NO_KW_LIST_APPEND,
&&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_O,
&&TARGET_CALL_NO_KW_TYPE_1,
+ &&TARGET_CALL_NO_KW_BUILTIN_CLASS_1,
&&TARGET_WITH_EXCEPT_START,
&&TARGET_GET_AITER,
&&TARGET_GET_ANEXT,
&&TARGET_BEFORE_ASYNC_WITH,
&&TARGET_BEFORE_WITH,
&&TARGET_END_ASYNC_FOR,
- &&TARGET_CALL_NO_KW_BUILTIN_CLASS_1,
&&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_FAST,
&&TARGET_JUMP_ABSOLUTE_QUICK,
&&TARGET_LOAD_ATTR_ADAPTIVE,
&&TARGET_LOAD_ATTR_INSTANCE_VALUE,
+ &&TARGET_LOAD_ATTR_WITH_HINT,
&&TARGET_STORE_SUBSCR,
&&TARGET_DELETE_SUBSCR,
- &&TARGET_LOAD_ATTR_WITH_HINT,
&&TARGET_LOAD_ATTR_SLOT,
&&TARGET_LOAD_ATTR_MODULE,
&&TARGET_LOAD_GLOBAL_ADAPTIVE,
&&TARGET_LOAD_GLOBAL_MODULE,
&&TARGET_LOAD_GLOBAL_BUILTIN,
+ &&TARGET_LOAD_METHOD_ADAPTIVE,
&&TARGET_GET_ITER,
&&TARGET_GET_YIELD_FROM_ITER,
&&TARGET_PRINT_EXPR,
&&TARGET_LOAD_BUILD_CLASS,
- &&TARGET_LOAD_METHOD_ADAPTIVE,
+ &&TARGET_LOAD_METHOD_CACHED,
&&TARGET_GET_AWAITABLE,
&&TARGET_LOAD_ASSERTION_ERROR,
- &&TARGET_LOAD_METHOD_CACHED,
&&TARGET_LOAD_METHOD_CLASS,
&&TARGET_LOAD_METHOD_MODULE,
&&TARGET_LOAD_METHOD_NO_DICT,
&&TARGET_STORE_ATTR_ADAPTIVE,
&&TARGET_STORE_ATTR_INSTANCE_VALUE,
&&TARGET_STORE_ATTR_SLOT,
+ &&TARGET_STORE_ATTR_WITH_HINT,
&&TARGET_LIST_TO_TUPLE,
&&TARGET_RETURN_VALUE,
&&TARGET_IMPORT_STAR,
&&TARGET_SETUP_ANNOTATIONS,
&&TARGET_YIELD_VALUE,
- &&TARGET_STORE_ATTR_WITH_HINT,
+ &&TARGET_LOAD_FAST__LOAD_FAST,
&&TARGET_PREP_RERAISE_STAR,
&&TARGET_POP_EXCEPT,
&&TARGET_STORE_NAME,
@@ -127,20 +127,20 @@ static void *opcode_targets[256] = {
&&TARGET_STORE_FAST,
&&TARGET_DELETE_FAST,
&&TARGET_JUMP_IF_NOT_EG_MATCH,
- &&TARGET_LOAD_FAST__LOAD_FAST,
+ &&TARGET_STORE_FAST__LOAD_FAST,
&&TARGET_GEN_START,
&&TARGET_RAISE_VARARGS,
- &&TARGET_STORE_FAST__LOAD_FAST,
+ &&TARGET_LOAD_FAST__LOAD_CONST,
&&TARGET_MAKE_FUNCTION,
&&TARGET_BUILD_SLICE,
- &&TARGET_LOAD_FAST__LOAD_CONST,
+ &&TARGET_LOAD_CONST__LOAD_FAST,
&&TARGET_MAKE_CELL,
&&TARGET_LOAD_CLOSURE,
&&TARGET_LOAD_DEREF,
&&TARGET_STORE_DEREF,
&&TARGET_DELETE_DEREF,
- &&TARGET_LOAD_CONST__LOAD_FAST,
&&TARGET_STORE_FAST__STORE_FAST,
+ &&_unknown_opcode,
&&TARGET_CALL_FUNCTION_EX,
&&_unknown_opcode,
&&TARGET_EXTENDED_ARG,