mirror of https://github.com/python/cpython.git
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 @@ def test_module_attributes(self):
|
||||||
|
|
||||||
x = dir(C)
|
x = dir(C)
|
||||||
y = [s for s in dir(P) if '__' in s or not s.startswith('_')]
|
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):
|
def test_context_attributes(self):
|
||||||
|
|
||||||
|
|
|
@ -168,7 +168,9 @@ static DecCondMap cond_map[] = {
|
||||||
{"DivisionImpossible", "decimal.DivisionImpossible", MPD_Division_impossible, NULL},
|
{"DivisionImpossible", "decimal.DivisionImpossible", MPD_Division_impossible, NULL},
|
||||||
{"DivisionUndefined", "decimal.DivisionUndefined", MPD_Division_undefined, NULL},
|
{"DivisionUndefined", "decimal.DivisionUndefined", MPD_Division_undefined, NULL},
|
||||||
{"InvalidContext", "decimal.InvalidContext", MPD_Invalid_context, NULL},
|
{"InvalidContext", "decimal.InvalidContext", MPD_Invalid_context, NULL},
|
||||||
|
#ifdef EXTRA_FUNCTIONALITY
|
||||||
{"MallocError", "decimal.MallocError", MPD_Malloc_error, NULL},
|
{"MallocError", "decimal.MallocError", MPD_Malloc_error, NULL},
|
||||||
|
#endif
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -466,9 +468,14 @@ dec_addstatus(PyObject *context, uint32_t status)
|
||||||
mpd_context_t *ctx = CTX(context);
|
mpd_context_t *ctx = CTX(context);
|
||||||
|
|
||||||
ctx->status |= status;
|
ctx->status |= status;
|
||||||
if (ctx->traps&status) {
|
if (status & (ctx->traps|MPD_Malloc_error)) {
|
||||||
PyObject *ex, *siglist;
|
PyObject *ex, *siglist;
|
||||||
|
|
||||||
|
if (status & MPD_Malloc_error) {
|
||||||
|
PyErr_NoMemory();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
ex = flags_as_exception(ctx->traps&status);
|
ex = flags_as_exception(ctx->traps&status);
|
||||||
if (ex == NULL) {
|
if (ex == NULL) {
|
||||||
return 1; /* GCOV_NOT_REACHED */
|
return 1; /* GCOV_NOT_REACHED */
|
||||||
|
|
Loading…
Reference in New Issue