[Python-checkins] r46843 - sandbox/trunk/decimal-c/_decimal.c

mateusz.rukowicz python-checkins at python.org
Sun Jun 11 02:20:35 CEST 2006


Author: mateusz.rukowicz
Date: Sun Jun 11 02:20:34 2006
New Revision: 46843

Modified:
   sandbox/trunk/decimal-c/_decimal.c
Log:
Some bugs repaired. Added conversion of self, that is now 1 + CD("5") works.


Modified: sandbox/trunk/decimal-c/_decimal.c
==============================================================================
--- sandbox/trunk/decimal-c/_decimal.c	(original)
+++ sandbox/trunk/decimal-c/_decimal.c	Sun Jun 11 02:20:34 2006
@@ -1646,7 +1646,7 @@
     if (PyErr_Occurred())
         return NULL;
 
-    if ( (res == 0  && (op == Py_EQ || op == Py_LE || op == Py_GT)) ||
+    if ( (res == 0  && (op == Py_EQ || op == Py_LE || op == Py_GT || op == Py_GE)) ||
          (res == -1 && (op == Py_NE || op == Py_LT || op == Py_LE)) ||
          (res == 1  && (op == Py_NE || op == Py_GT || op == Py_GE)))
         Py_RETURN_TRUE;
@@ -2072,12 +2072,15 @@
         return NULL;
     
     for (i = 0; i < self->ob_size; i++) {
-        d = PyInt_FromLong(self->digits[i]);
+        d = PyInt_FromLong(_limb_get_digit(self->limbs, self->ob_size, i));	/* SLOW */
         if (!d) return NULL;
         PyTuple_SET_ITEM(digits, i, d);
     }
 
-    res = Py_BuildValue("(bOn)", self->sign % 2, digits, self->exp);
+	if(!ISINF(self))
+	    res = Py_BuildValue("(bOn)", self->sign % 2, digits, self->exp);
+	else
+		res = Py_BuildValue("(bOO)", self->sign % 2, digits, PyString_FromString("F"));
     Py_DECREF(digits);
     return res;
 }
@@ -2509,19 +2512,33 @@
    in PyNumberMethods slots. As this can take any objects, but other code
    in this module wants to call some of those methods too, this wrapper
    is a convenience  */
+/* Actually, self might be possibly not decimal I assume that self or other 
+ * will be =] */
 #define DECIMAL_SPECIAL_2FUNC(func)                                     \
     static PyObject *                                                   \
     func (PyObject *self, PyObject *other) {                            \
         decimalobject *res;                                             \
+		decimalobject *to_decref;										\
         contextobject *ctx = getcontext();                              \
         if (!ctx) return NULL;                                          \
+		if(PyDecimal_Check(self))										\
+		{																\
         other = _convert_to_decimal(self->ob_type, other, ctx, 0);      \
-        if (other == NULL || other == Py_NotImplemented) return other;  \
+   	    if (other == NULL || other == Py_NotImplemented) return other;  \
+		to_decref = other;												\
+		}																\
+		else															\
+		{																\
+		assert(PyDecimal_Check(other));									\
+		self = _convert_to_decimal(other->ob_type, self, ctx, 0);	\
+		to_decref = self;												\
+		if(self == NULL || self == Py_NotImplemented) return self;	\
+		}																\
         res = _do_##func((decimalobject *)self,                         \
                          (decimalobject *)other, ctx);                  \
-        Py_DECREF(other);                                               \
+        Py_DECREF(to_decref);                                              \
         return (PyObject *)res;                                         \
-    }
+    }															
 
 /* Same for one-argument methods. */
 #define DECIMAL_SPECIAL_1FUNC(func)                                 \
@@ -2538,6 +2555,8 @@
 _do_decimal_add(decimalobject *self, decimalobject *other,
                 contextobject *ctx)
 {
+	assert(PyDecimal_Check(other));
+	assert(PyDecimal_Check(self));
     int shouldround, sign, negativezero = 0;
     long exp, oexp;
 	long prec,cmp;


More information about the Python-checkins mailing list