Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5100171

Browse files
author
Stefan Krah
committed
Clear the context flags if a context is initialized from the DefaultContext.
1 parent 41e0310 commit 5100171

2 files changed

Lines changed: 78 additions & 0 deletions

File tree

Lib/test/test_decimal.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,76 @@
5656
fractions = {C:cfractions, P:pfractions}
5757
sys.modules['decimal'] = orig_sys_decimal
5858

59+
############ RunFirst ############
60+
class RunFirst(unittest.TestCase):
61+
62+
def setUp(self):
63+
self.save_default = self.decimal.DefaultContext.copy()
64+
65+
def tearDown(self):
66+
DefaultContext = self.decimal.DefaultContext
67+
68+
DefaultContext.prec = self.save_default.prec
69+
DefaultContext.rounding = self.save_default.rounding
70+
DefaultContext.Emax = self.save_default.Emax
71+
DefaultContext.Emin = self.save_default.Emin
72+
DefaultContext.capitals = self.save_default.capitals
73+
DefaultContext.clamp = self.save_default.clamp
74+
DefaultContext.flags = self.save_default.flags
75+
DefaultContext.traps = self.save_default.traps
76+
77+
self.decimal.setcontext(self.decimal.DefaultContext)
78+
79+
def test_00default_context(self):
80+
# The test depends on the fact that getcontext() is called
81+
# for the first time.
82+
DefaultContext = self.decimal.DefaultContext
83+
ROUND_05UP = self.decimal.ROUND_05UP
84+
Clamped = self.decimal.Clamped
85+
InvalidOperation = self.decimal.InvalidOperation
86+
87+
DefaultContext.prec = 5001
88+
DefaultContext.rounding = ROUND_05UP
89+
DefaultContext.Emax = 10025
90+
DefaultContext.Emin = -10025
91+
DefaultContext.capitals = 0
92+
DefaultContext.clamp = 1
93+
DefaultContext.flags[InvalidOperation] = True
94+
DefaultContext.clear_traps()
95+
DefaultContext.traps[Clamped] = True
96+
97+
# implicit initialization on first access
98+
c = self.decimal.getcontext()
99+
100+
self.assertEqual(c.prec, 5001)
101+
self.assertEqual(c.rounding, ROUND_05UP)
102+
self.assertEqual(c.Emax, 10025)
103+
self.assertEqual(c.Emin, -10025)
104+
self.assertEqual(c.capitals, 0)
105+
self.assertEqual(c.clamp, 1)
106+
for k in c.flags:
107+
self.assertFalse(c.flags[k])
108+
for k in c.traps:
109+
if k is Clamped:
110+
self.assertTrue(c.traps[k])
111+
else:
112+
self.assertFalse(c.traps[k])
113+
114+
# explicit initialization
115+
self.decimal.setcontext(DefaultContext)
116+
c = self.decimal.getcontext()
117+
for k in c.flags:
118+
self.assertFalse(c.flags[k])
119+
120+
class CRunFirst(RunFirst):
121+
decimal = C
122+
class PyRunFirst(RunFirst):
123+
decimal = P
124+
if C:
125+
run_unittest(CRunFirst, PyRunFirst)
126+
else:
127+
run_unittest(PyRunFirst)
128+
############ END RunFirst ############
59129

60130
# Useful Test Constant
61131
Signals = {

Modules/_decimal/_decimal.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,6 +1494,10 @@ current_context(void)
14941494
}
14951495

14961496
*CTX(module_context) = *CTX(default_context_template);
1497+
CTX(module_context)->status = 0;
1498+
CTX(module_context)->newtrap = 0;
1499+
CtxCaps(module_context) = CtxCaps(default_context_template);
1500+
14971501
module_context_set = 1;
14981502
return module_context;
14991503
}
@@ -1533,6 +1537,7 @@ PyDec_SetCurrentContext(PyObject *self UNUSED, PyObject *v)
15331537
if (v == NULL) {
15341538
return NULL;
15351539
}
1540+
CTX(v)->status = 0;
15361541
}
15371542
else {
15381543
Py_INCREF(v);
@@ -1581,6 +1586,8 @@ current_context(void)
15811586
if (tl_context == NULL) {
15821587
return NULL;
15831588
}
1589+
CTX(tl_context)->status = 0;
1590+
15841591
if (PyDict_SetItem(dict, tls_context_key, tl_context) < 0) {
15851592
Py_DECREF(tl_context);
15861593
return NULL;
@@ -1646,6 +1653,7 @@ PyDec_SetCurrentContext(PyObject *self UNUSED, PyObject *v)
16461653
if (v == NULL) {
16471654
return NULL;
16481655
}
1656+
CTX(v)->status = 0;
16491657
}
16501658
else {
16511659
Py_INCREF(v);

0 commit comments

Comments
 (0)