Raise MemoryError instead of InvalidOperation/MallocError for compatibility
with decimal.py. The standard specifies InsufficientStorage (MallocError) as a sub-condition of InvalidOperation. This allows a calculation to continue with NaN results when allocation fails.
This commit is contained in:
parent
1d5617958f
commit
fe17b2bc77
|
@ -3837,7 +3837,7 @@ class CheckAttributes(unittest.TestCase):
|
|||
|
||||
x = dir(C)
|
||||
y = [s for s in dir(P) if '__' in s or not s.startswith('_')]
|
||||
self.assertEqual(set(x) - set(y), {'MallocError'})
|
||||
self.assertEqual(set(x) - set(y), set())
|
||||
|
||||
def test_context_attributes(self):
|
||||
|
||||
|
|
|
@ -168,7 +168,9 @@ static DecCondMap cond_map[] = {
|
|||
{"DivisionImpossible", "decimal.DivisionImpossible", MPD_Division_impossible, NULL},
|
||||
{"DivisionUndefined", "decimal.DivisionUndefined", MPD_Division_undefined, NULL},
|
||||
{"InvalidContext", "decimal.InvalidContext", MPD_Invalid_context, NULL},
|
||||
#ifdef EXTRA_FUNCTIONALITY
|
||||
{"MallocError", "decimal.MallocError", MPD_Malloc_error, NULL},
|
||||
#endif
|
||||
{NULL}
|
||||
};
|
||||
|
||||
|
@ -466,9 +468,14 @@ dec_addstatus(PyObject *context, uint32_t status)
|
|||
mpd_context_t *ctx = CTX(context);
|
||||
|
||||
ctx->status |= status;
|
||||
if (ctx->traps&status) {
|
||||
if (status & (ctx->traps|MPD_Malloc_error)) {
|
||||
PyObject *ex, *siglist;
|
||||
|
||||
if (status & MPD_Malloc_error) {
|
||||
PyErr_NoMemory();
|
||||
return 1;
|
||||
}
|
||||
|
||||
ex = flags_as_exception(ctx->traps&status);
|
||||
if (ex == NULL) {
|
||||
return 1; /* GCOV_NOT_REACHED */
|
||||
|
|
Loading…
Reference in New Issue