[Python-checkins] r78254 - python/branches/py3k-cdecimal/Modules/cdecimal/cdecimal.c

stefan.krah python-checkins at python.org
Sat Feb 20 17:58:57 CET 2010


Author: stefan.krah
Date: Sat Feb 20 17:58:57 2010
New Revision: 78254

Log:
1. ValueError/TypeError were used incorrectly in many places.

2. Fix refleaks in dec_new() and PyDecContext_CreateDecimal().

3. Take over recent context method changes for integer arguments
   from decimal.py.



Modified:
   python/branches/py3k-cdecimal/Modules/cdecimal/cdecimal.c

Modified: python/branches/py3k-cdecimal/Modules/cdecimal/cdecimal.c
==============================================================================
--- python/branches/py3k-cdecimal/Modules/cdecimal/cdecimal.c	(original)
+++ python/branches/py3k-cdecimal/Modules/cdecimal/cdecimal.c	Sat Feb 20 17:58:57 2010
@@ -229,7 +229,8 @@
 	int x;
 
 	if (!PyDict_Check(val)) {
-		PyErr_SetString(PyExc_ValueError, "argument must be a signal dict");
+		PyErr_SetString(PyExc_TypeError,
+		                "argument must be a signal dict");
 		return -1;
 	}
 
@@ -258,7 +259,7 @@
 	long x;
 
 	if (!PyLong_Check(v)) {
-		PyErr_SetString(PyExc_TypeError, "long argument required");
+		PyErr_SetString(PyExc_TypeError, "integer argument required");
 		return UINT32_MAX;
 	}
 
@@ -282,7 +283,7 @@
 #endif
 
 	if (!PyLong_Check(v)) {
-		PyErr_SetString(PyExc_TypeError, "long argument required");
+		PyErr_SetString(PyExc_TypeError, "integer argument required");
 		return MPD_SSIZE_MAX;
 	}
 
@@ -376,7 +377,6 @@
 	int x;
 
 	if ((flag = exception_as_flags(key)) == UINT_MAX) {
-		PyErr_SetString(PyExc_ValueError, "invalid signal key");
 		return -1;
 	}
 
@@ -840,7 +840,8 @@
 		return -1;
 	}
 	if (x < 0 || x >= MPD_ROUND_GUARD) {
-		PyErr_SetString(PyExc_TypeError, "invalid value for context.round");
+		PyErr_SetString(PyExc_ValueError,
+		                "invalid value for context.round");
 		return -1;
 	}
 
@@ -863,7 +864,8 @@
 		return -1;
 	}
 	if (x != 0 && x != 1) {
-		PyErr_SetString(PyExc_TypeError, "invalid value for context.capitals");
+		PyErr_SetString(PyExc_ValueError,
+		                "invalid value for context.capitals");
 		return -1;
 	}
 
@@ -1318,10 +1320,10 @@
         }
 
 #define CONTEXT_CHECK_VA(obj) \
-        if (!PyDecContext_Check(obj)) {                       \
-                PyErr_SetString( PyExc_TypeError,             \
-                    "optional argument must be a context" );  \
-                return NULL;                                  \
+        if (!PyDecContext_Check(obj)) {                      \
+                PyErr_SetString( PyExc_TypeError,            \
+                    "optional argument must be a context" ); \
+                return NULL;                                 \
         }
 
 
@@ -1903,7 +1905,7 @@
 
 	dtuple = PyTuple_GET_ITEM(v, 1);
 	if (!PyTuple_Check(dtuple)) {
-		PyErr_SetString(PyExc_ValueError,
+		PyErr_SetString(PyExc_TypeError,
 		                "coefficient must be a tuple of digits");
 		return NULL;
 	}
@@ -1937,7 +1939,7 @@
 		if (l < 0 || l > 9) {
 			PyMem_Free(decstring);
 			PyErr_SetString(PyExc_ValueError,
-		        	        "coefficient must be a tuple of digits");
+			                "coefficient must be a tuple of digits");
 			return NULL;
 		}
 		*cp++ = (char)l + '0';
@@ -2148,6 +2150,7 @@
 
 	if (v == NULL) {
 		v = PyLong_FromLong(0);
+		Py_DECREF(v);
 	}
 
 	CONTEXT_CHECK_VA(ctxobj);
@@ -2213,6 +2216,7 @@
 
 	if (v == NULL) {
 		v = PyLong_FromLong(0);
+		Py_DECREF(v);
 	}
 
 	ctx = CtxAddr(self);
@@ -2496,7 +2500,7 @@
 		return NULL;
 	}
 	if (!PyDecContext_Check(dctx)) {
-		PyErr_SetString(PyExc_ValueError,
+		PyErr_SetString(PyExc_TypeError,
 		                "optional second arg must be a context");
 		return NULL;
 	}
@@ -2537,7 +2541,7 @@
 		return NULL;
 	}
 	if (!PyDecContext_Check(dctx)) {
-		PyErr_SetString(PyExc_ValueError,
+		PyErr_SetString(PyExc_TypeError,
 		                "optional second arg must be a context");
 		return NULL;
 	}
@@ -2749,7 +2753,7 @@
 		mpd_ssize_t y;
 
 		if (!PyLong_Check(x)) {
-			PyErr_SetString(PyExc_ValueError,
+			PyErr_SetString(PyExc_TypeError,
 			                "optional arg must be an integer");
 			return NULL;
 		}
@@ -2817,7 +2821,7 @@
 	}
 	if (override) {
 		if (!PyDict_Check(override)) {
-			PyErr_SetString(PyExc_ValueError, "optional argument "
+			PyErr_SetString(PyExc_TypeError, "optional argument "
 			                "must be a dict");
 			goto finish;
 		}
@@ -3394,7 +3398,7 @@
 	mpd_context_t *ctx;
 
 	ctx = mpd_ctx();
-	CONVERT_BINOP(v, w, &a, &b, ctx);
+	CONVERT_BINOP_SET(v, w, &a, &b, ctx);
 
 	if ((result = dec_alloc()) == NULL) {
 		Py_DECREF(a);
@@ -3673,7 +3677,7 @@
 
 	if (mpd_isspecial(a->dec)) {
 		if (mpd_isnan(a->dec)) {
-			PyErr_SetString(PyExc_TypeError,
+			PyErr_SetString(PyExc_ValueError,
 			                "cannot hash a NaN value");
 			result = -1;
 		}
@@ -3980,7 +3984,7 @@
         mpd_context_t *ctx;                                              \
                                                                          \
         ctx = CtxAddr(self);                                             \
-        CONVERT_OP(v, &a, ctx);                                          \
+        CONVERT_OP_SET(v, &a, ctx);                                      \
                                                                          \
         ret = MPDFUNC(a->dec, ctx) ? Dec_INCREF_TRUE : Dec_INCREF_FALSE; \
         Py_DECREF(a);                                                    \
@@ -4000,7 +4004,7 @@
         mpd_context_t *ctx;                                         \
                                                                     \
         ctx = CtxAddr(self);                                        \
-        CONVERT_OP(v, &a, ctx);                                     \
+        CONVERT_OP_SET(v, &a, ctx);                                 \
                                                                     \
         ret = MPDFUNC(a->dec) ? Dec_INCREF_TRUE : Dec_INCREF_FALSE; \
         Py_DECREF(a);                                               \
@@ -4020,7 +4024,7 @@
         uint32_t status = 0;                        \
                                                     \
         ctx = CtxAddr(self);                        \
-        CONVERT_OP(v, &a, ctx);                     \
+        CONVERT_OP_SET(v, &a, ctx);                 \
                                                     \
         if ((result = dec_alloc()) == NULL) {       \
                 Py_DECREF(a);                       \
@@ -4148,13 +4152,13 @@
 static PyObject *
 _DecCtx_copy_decimal(PyObject *self UNUSED, PyObject *v)
 {
-	if (!PyDec_Check(v)) {
-		PyErr_SetString(PyExc_TypeError, "argument must be a Decimal");
-		return NULL;
-	}
+	PyDecObject *result;
+	mpd_context_t *ctx;
 
-	Py_INCREF(v);
-	return v;
+	ctx = CtxAddr(self);
+	CONVERT_OP_SET(v, &result, ctx);
+
+	return (PyObject *)result;
 }
 
 /* Arithmetic operations */
@@ -4168,6 +4172,8 @@
 _DecCtx_UnaryFunc(mpd_qnext_plus)
 _DecCtx_UnaryFunc(mpd_qplus)
 _DecCtx_UnaryFunc(mpd_qreduce)
+_DecCtx_UnaryFunc(mpd_qround_to_int)
+_DecCtx_UnaryFunc(mpd_qround_to_intx)
 _DecCtx_UnaryFunc(mpd_qsqrt)
 
 _DecCtx_BinaryFunc(mpd_qadd)
@@ -4193,7 +4199,6 @@
 /* Miscellaneous */
 _DecCtx_BoolFunc(mpd_isnormal)
 _DecCtx_BoolFunc(mpd_issubnormal)
-_DecCtx_BoolFunc_NoCtx(mpd_iscanonical)
 _DecCtx_BoolFunc_NoCtx(mpd_isfinite)
 _DecCtx_BoolFunc_NoCtx(mpd_isinfinite)
 _DecCtx_BoolFunc_NoCtx(mpd_isnan)
@@ -4202,7 +4207,6 @@
 _DecCtx_BoolFunc_NoCtx(mpd_issnan)
 _DecCtx_BoolFunc_NoCtx(mpd_iszero)
 
-
 static PyObject *
 _DecCtx_mpd_qcopy_abs(PyObject *self, PyObject *v)
 {
@@ -4211,7 +4215,7 @@
 	mpd_context_t *ctx;
 
 	ctx = CtxAddr(self);
-	CONVERT_OP(v, &a, ctx);
+	CONVERT_OP_SET(v, &a, ctx);
 
 	if ((result = dec_alloc()) == NULL) {
 		Py_DECREF(a);
@@ -4236,7 +4240,7 @@
 	mpd_context_t *ctx;
 
 	ctx = CtxAddr(self);
-	CONVERT_OP(v, &a, ctx);
+	CONVERT_OP_SET(v, &a, ctx);
 
 	if ((result = dec_alloc()) == NULL) {
 		Py_DECREF(a);
@@ -4273,7 +4277,7 @@
 	}
 
 	ctx = CtxAddr(self);
-	CONVERT_BINOP(v, w, &a, &b, ctx);
+	CONVERT_BINOP_SET(v, w, &a, &b, ctx);
 
 	if ((result = dec_alloc()) == NULL) {
 		Py_DECREF(a);
@@ -4301,10 +4305,21 @@
 _DecCtx_BinaryFunc(mpd_qshift)
 
 static PyObject *
+_DecCtx_iscanonical(PyObject *self UNUSED, PyObject *v)
+{
+	if (!PyDec_Check(v)) {
+		PyErr_SetString(PyExc_TypeError, "argument must be a Decimal");
+		return NULL;
+	}
+
+	return mpd_iscanonical(DecAddr(v)) ? Dec_INCREF_TRUE : Dec_INCREF_FALSE;
+}
+
+static PyObject *
 _DecCtx_canonical(PyObject *self UNUSED, PyObject *v)
 {
 	if (!PyDec_Check(v)) {
-		PyErr_SetString(PyExc_ValueError, "argument must be a Decimal");
+		PyErr_SetString(PyExc_TypeError, "argument must be a Decimal");
 		return NULL;
 	}
 
@@ -4315,16 +4330,16 @@
 static PyObject *
 _DecCtx_mpd_class(PyObject *self, PyObject *v)
 {
+	PyDecObject *a;
 	mpd_context_t *ctx;
 	const char *cp;
 
-	if (!PyDec_Check(v)) {
-		PyErr_SetString(PyExc_ValueError, "argument must be a Decimal");
-		return NULL;
-	}
 	ctx = CtxAddr(self);
+	CONVERT_OP_SET(v, &a, ctx);
+
+	cp = mpd_class(a->dec, ctx);
+	Py_DECREF(a);
 
-	cp = mpd_class(DecAddr(v), ctx);
 	return Py_BuildValue("s", cp);
 }
 
@@ -4372,15 +4387,15 @@
 _DecCtx_mpd_to_sci(PyObject *self, PyObject *v)
 {
 	PyObject *result;
+	PyDecObject *a;
+	mpd_context_t *ctx;
 	char *s;
 
-	if (!PyDec_Check(v)) {
-		PyErr_SetString(PyExc_TypeError, "argument must be a Decimal");
-		return NULL;
-	}
+	ctx = CtxAddr(self);
+	CONVERT_OP_SET(v, &a, ctx);
 
-	s = mpd_to_sci(((PyDecObject *)v)->dec,
-	               ((PyDecContextObject *)self)->capitals);
+	s = mpd_to_sci(a->dec, ((PyDecContextObject *)self)->capitals);
+	Py_DECREF(a);
 	if (s == NULL) {
 		PyErr_NoMemory();
 		return NULL;
@@ -4396,15 +4411,15 @@
 _DecCtx_mpd_to_eng(PyObject *self, PyObject *v)
 {
 	PyObject *result;
+	PyDecObject *a;
+	mpd_context_t *ctx;
 	char *s;
 
-	if (!PyDec_Check(v)) {
-		PyErr_SetString(PyExc_TypeError, "argument must be a Decimal");
-		return NULL;
-	}
+	ctx = CtxAddr(self);
+	CONVERT_OP_SET(v, &a, ctx);
 
-	s = mpd_to_eng(((PyDecObject *)v)->dec,
-	               ((PyDecContextObject *)self)->capitals);
+	s = mpd_to_eng(a->dec, ((PyDecContextObject *)self)->capitals);
+	Py_DECREF(a);
 	if (s == NULL) {
 		PyErr_NoMemory();
 		return NULL;
@@ -4445,58 +4460,6 @@
 	return result;
 }
 
-static PyObject *
-PyDecContext_ToIntegralValue(PyObject *self, PyObject *a)
-{
-	PyDecObject *result;
-	mpd_context_t *ctx;
-	uint32_t status = 0;
-
-	if (!PyDec_Check(a)) {
-		PyErr_SetString(PyExc_ValueError, "argument must be a Decimal");
-		return NULL;
-	}
-	if ((result = dec_alloc()) == NULL) {
-		return NULL;
-	}
-
-	ctx = CtxAddr(self);
-
-	mpd_qround_to_int(result->dec, DecAddr(a), ctx, &status);
-	if (dec_addstatus(ctx, status)) {
-		Py_DECREF(result);
-		return NULL;
-	}
-
-	return (PyObject *)result;
-}
-
-static PyObject *
-PyDecContext_ToIntegralExact(PyObject *self, PyObject *a)
-{
-	PyDecObject *result;
-	mpd_context_t *ctx;
-	uint32_t status = 0;
-
-	if (!PyDec_Check(a)) {
-		PyErr_SetString(PyExc_ValueError, "argument must be a Decimal");
-		return NULL;
-	}
-	if ((result = dec_alloc()) == NULL) {
-		return NULL;
-	}
-
-	ctx = CtxAddr(self);
-
-	mpd_qround_to_intx(result->dec, DecAddr(a), ctx, &status);
-	if (dec_addstatus(ctx, status)) {
-		Py_DECREF(result);
-		return NULL;
-	}
-
-	return (PyObject *)result;
-}
-
 
 static PyMethodDef context_methods [] =
 {
@@ -4512,9 +4475,9 @@
 	{ "normalize", _DecCtx_mpd_qreduce, METH_O, doc_ctx_normalize }, /* alias for reduce */
 	{ "plus", _DecCtx_mpd_qplus, METH_O, doc_ctx_plus },
 	{ "reduce", _DecCtx_mpd_qreduce, METH_O, doc_ctx_reduce },
-	{ "to_integral", PyDecContext_ToIntegralValue, METH_O, doc_ctx_to_integral },
-	{ "to_integral_exact", PyDecContext_ToIntegralExact, METH_O, doc_ctx_to_integral_exact },
-	{ "to_integral_value", PyDecContext_ToIntegralValue, METH_O, doc_ctx_to_integral_value },
+	{ "to_integral", _DecCtx_mpd_qround_to_int, METH_O, doc_ctx_to_integral },
+	{ "to_integral_exact", _DecCtx_mpd_qround_to_intx, METH_O, doc_ctx_to_integral_exact },
+	{ "to_integral_value", _DecCtx_mpd_qround_to_int, METH_O, doc_ctx_to_integral_value },
 	{ "sqrt", _DecCtx_mpd_qsqrt, METH_O, doc_ctx_sqrt },
 
 	/* Binary arithmetic functions */
@@ -4552,7 +4515,7 @@
 	{ "radix", _DecCtx_mpd_radix, METH_NOARGS, doc_ctx_radix },
 
 	/* Boolean functions */
-	{ "is_canonical", _DecCtx_mpd_iscanonical, METH_O, doc_ctx_is_canonical },
+	{ "is_canonical", _DecCtx_iscanonical, METH_O, doc_ctx_is_canonical },
 	{ "is_finite", _DecCtx_mpd_isfinite, METH_O, doc_ctx_is_finite },
 	{ "is_infinite", _DecCtx_mpd_isinfinite, METH_O, doc_ctx_is_infinite },
 	{ "is_nan", _DecCtx_mpd_isnan, METH_O, doc_ctx_is_nan },


More information about the Python-checkins mailing list