diff options
author | Irit Katriel <1055913+iritkatriel@users.noreply.github.com> | 2023-04-24 18:30:49 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-24 18:30:49 (GMT) |
commit | 6751a4af9512d4a6d65b5eedd60ff9923c519ad2 (patch) | |
tree | 849d50f919277a39981b83c416b21eafef246698 /Python | |
parent | cb157a1a353675cb6f08bdae5d7aadd6b28bb0a9 (diff) | |
download | cpython-6751a4af9512d4a6d65b5eedd60ff9923c519ad2.zip cpython-6751a4af9512d4a6d65b5eedd60ff9923c519ad2.tar.gz cpython-6751a4af9512d4a6d65b5eedd60ff9923c519ad2.tar.bz2 |
gh-87092: fix a few cases of incorrect error handling in compiler (#103456)
gh-87092: fix a few cases of incorrect error handling
Diffstat (limited to 'Python')
-rw-r--r-- | Python/compile.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/Python/compile.c b/Python/compile.c index d6882c3..9c5f3aa 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -6688,7 +6688,10 @@ insert_prefix_instructions(struct compiler_unit *u, basicblock *entryblock, .i_loc = NO_LOCATION, .i_target = NULL, }; - RETURN_IF_ERROR(_PyBasicblock_InsertInstruction(entryblock, ncellsused, &make_cell)); + if (_PyBasicblock_InsertInstruction(entryblock, ncellsused, &make_cell) < 0) { + PyMem_RawFree(sorted); + return ERROR; + } ncellsused += 1; } PyMem_RawFree(sorted); @@ -6860,7 +6863,7 @@ optimize_and_assemble_code_unit(struct compiler_unit *u, PyObject *const_cache, maxdepth, g.g_entryblock, nlocalsplus, code_flags, filename); - error: +error: Py_XDECREF(consts); instr_sequence_fini(&optimized_instrs); _PyCfgBuilder_Fini(&g); @@ -6958,7 +6961,9 @@ instructions_to_instr_sequence(PyObject *instructions, instr_sequence *seq) for (int i = 0; i < num_insts; i++) { if (is_target[i]) { - RETURN_IF_ERROR(instr_sequence_use_label(seq, i)); + if (instr_sequence_use_label(seq, i) < 0) { + goto error; + } } PyObject *item = PyList_GET_ITEM(instructions, i); if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 6) { @@ -6996,10 +7001,14 @@ instructions_to_instr_sequence(PyObject *instructions, instr_sequence *seq) if (PyErr_Occurred()) { goto error; } - RETURN_IF_ERROR(instr_sequence_addop(seq, opcode, oparg, loc)); + if (instr_sequence_addop(seq, opcode, oparg, loc) < 0) { + goto error; + } } if (seq->s_used && !IS_TERMINATOR_OPCODE(seq->s_instrs[seq->s_used-1].i_opcode)) { - RETURN_IF_ERROR(instr_sequence_addop(seq, RETURN_VALUE, 0, NO_LOCATION)); + if (instr_sequence_addop(seq, RETURN_VALUE, 0, NO_LOCATION) < 0) { + goto error; + } } PyMem_Free(is_target); return SUCCESS; @@ -7014,12 +7023,17 @@ instructions_to_cfg(PyObject *instructions, cfg_builder *g) instr_sequence seq; memset(&seq, 0, sizeof(instr_sequence)); - RETURN_IF_ERROR( - instructions_to_instr_sequence(instructions, &seq)); - - RETURN_IF_ERROR(instr_sequence_to_cfg(&seq, g)); + if (instructions_to_instr_sequence(instructions, &seq) < 0) { + goto error; + } + if (instr_sequence_to_cfg(&seq, g) < 0) { + goto error; + } instr_sequence_fini(&seq); return SUCCESS; +error: + instr_sequence_fini(&seq); + return ERROR; } static PyObject * |