mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
Clear the context flags if a context is initialized from the DefaultContext.
This commit is contained in:
parent
41e031004b
commit
5100171d81
2 changed files with 78 additions and 0 deletions
|
@ -56,6 +56,76 @@ sys.modules['decimal'] = C
|
|||
fractions = {C:cfractions, P:pfractions}
|
||||
sys.modules['decimal'] = orig_sys_decimal
|
||||
|
||||
############ RunFirst ############
|
||||
class RunFirst(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.save_default = self.decimal.DefaultContext.copy()
|
||||
|
||||
def tearDown(self):
|
||||
DefaultContext = self.decimal.DefaultContext
|
||||
|
||||
DefaultContext.prec = self.save_default.prec
|
||||
DefaultContext.rounding = self.save_default.rounding
|
||||
DefaultContext.Emax = self.save_default.Emax
|
||||
DefaultContext.Emin = self.save_default.Emin
|
||||
DefaultContext.capitals = self.save_default.capitals
|
||||
DefaultContext.clamp = self.save_default.clamp
|
||||
DefaultContext.flags = self.save_default.flags
|
||||
DefaultContext.traps = self.save_default.traps
|
||||
|
||||
self.decimal.setcontext(self.decimal.DefaultContext)
|
||||
|
||||
def test_00default_context(self):
|
||||
# The test depends on the fact that getcontext() is called
|
||||
# for the first time.
|
||||
DefaultContext = self.decimal.DefaultContext
|
||||
ROUND_05UP = self.decimal.ROUND_05UP
|
||||
Clamped = self.decimal.Clamped
|
||||
InvalidOperation = self.decimal.InvalidOperation
|
||||
|
||||
DefaultContext.prec = 5001
|
||||
DefaultContext.rounding = ROUND_05UP
|
||||
DefaultContext.Emax = 10025
|
||||
DefaultContext.Emin = -10025
|
||||
DefaultContext.capitals = 0
|
||||
DefaultContext.clamp = 1
|
||||
DefaultContext.flags[InvalidOperation] = True
|
||||
DefaultContext.clear_traps()
|
||||
DefaultContext.traps[Clamped] = True
|
||||
|
||||
# implicit initialization on first access
|
||||
c = self.decimal.getcontext()
|
||||
|
||||
self.assertEqual(c.prec, 5001)
|
||||
self.assertEqual(c.rounding, ROUND_05UP)
|
||||
self.assertEqual(c.Emax, 10025)
|
||||
self.assertEqual(c.Emin, -10025)
|
||||
self.assertEqual(c.capitals, 0)
|
||||
self.assertEqual(c.clamp, 1)
|
||||
for k in c.flags:
|
||||
self.assertFalse(c.flags[k])
|
||||
for k in c.traps:
|
||||
if k is Clamped:
|
||||
self.assertTrue(c.traps[k])
|
||||
else:
|
||||
self.assertFalse(c.traps[k])
|
||||
|
||||
# explicit initialization
|
||||
self.decimal.setcontext(DefaultContext)
|
||||
c = self.decimal.getcontext()
|
||||
for k in c.flags:
|
||||
self.assertFalse(c.flags[k])
|
||||
|
||||
class CRunFirst(RunFirst):
|
||||
decimal = C
|
||||
class PyRunFirst(RunFirst):
|
||||
decimal = P
|
||||
if C:
|
||||
run_unittest(CRunFirst, PyRunFirst)
|
||||
else:
|
||||
run_unittest(PyRunFirst)
|
||||
############ END RunFirst ############
|
||||
|
||||
# Useful Test Constant
|
||||
Signals = {
|
||||
|
|
|
@ -1494,6 +1494,10 @@ current_context(void)
|
|||
}
|
||||
|
||||
*CTX(module_context) = *CTX(default_context_template);
|
||||
CTX(module_context)->status = 0;
|
||||
CTX(module_context)->newtrap = 0;
|
||||
CtxCaps(module_context) = CtxCaps(default_context_template);
|
||||
|
||||
module_context_set = 1;
|
||||
return module_context;
|
||||
}
|
||||
|
@ -1533,6 +1537,7 @@ PyDec_SetCurrentContext(PyObject *self UNUSED, PyObject *v)
|
|||
if (v == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
CTX(v)->status = 0;
|
||||
}
|
||||
else {
|
||||
Py_INCREF(v);
|
||||
|
@ -1581,6 +1586,8 @@ current_context(void)
|
|||
if (tl_context == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
CTX(tl_context)->status = 0;
|
||||
|
||||
if (PyDict_SetItem(dict, tls_context_key, tl_context) < 0) {
|
||||
Py_DECREF(tl_context);
|
||||
return NULL;
|
||||
|
@ -1646,6 +1653,7 @@ PyDec_SetCurrentContext(PyObject *self UNUSED, PyObject *v)
|
|||
if (v == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
CTX(v)->status = 0;
|
||||
}
|
||||
else {
|
||||
Py_INCREF(v);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue