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:
Stefan Krah 2012-03-25 18:59:21 +02:00
parent 1d5617958f
commit fe17b2bc77
2 changed files with 9 additions and 2 deletions

View File

@ -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):

View File

@ -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 */