diff options
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/complexobject.c | 23 | ||||
-rw-r--r-- | Objects/floatobject.c | 21 | ||||
-rw-r--r-- | Objects/intobject.c | 25 | ||||
-rw-r--r-- | Objects/longobject.c | 22 | ||||
-rw-r--r-- | Objects/object.c | 2 |
5 files changed, 88 insertions, 5 deletions
diff --git a/Objects/complexobject.c b/Objects/complexobject.c index cb081aa..281de13 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -373,6 +373,27 @@ complex_div(PyComplexObject *v, PyComplexObject *w) } static PyObject * +complex_classic_div(PyComplexObject *v, PyComplexObject *w) +{ + Py_complex quot; + + if (Py_DivisionWarningFlag && + PyErr_Warn(PyExc_DeprecationWarning, + "classic complex division") < 0) + return NULL; + + PyFPE_START_PROTECT("complex_classic_div", return 0) + errno = 0; + quot = c_quot(v->cval,w->cval); + PyFPE_END_PROTECT(quot) + if (errno == EDOM) { + PyErr_SetString(PyExc_ZeroDivisionError, "complex division"); + return NULL; + } + return PyComplex_FromCComplex(quot); +} + +static PyObject * complex_remainder(PyComplexObject *v, PyComplexObject *w) { Py_complex div, mod; @@ -854,7 +875,7 @@ static PyNumberMethods complex_as_number = { (binaryfunc)complex_add, /* nb_add */ (binaryfunc)complex_sub, /* nb_subtract */ (binaryfunc)complex_mul, /* nb_multiply */ - (binaryfunc)complex_div, /* nb_divide */ + (binaryfunc)complex_classic_div, /* nb_divide */ (binaryfunc)complex_remainder, /* nb_remainder */ (binaryfunc)complex_divmod, /* nb_divmod */ (ternaryfunc)complex_pow, /* nb_power */ diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 7eb2777..39eba8e 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -414,6 +414,25 @@ float_div(PyObject *v, PyObject *w) } static PyObject * +float_classic_div(PyObject *v, PyObject *w) +{ + double a,b; + CONVERT_TO_DOUBLE(v, a); + CONVERT_TO_DOUBLE(w, b); + if (Py_DivisionWarningFlag && + PyErr_Warn(PyExc_DeprecationWarning, "classic float division") < 0) + return NULL; + if (b == 0.0) { + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + return NULL; + } + PyFPE_START_PROTECT("divide", return 0) + a = a / b; + PyFPE_END_PROTECT(a) + return PyFloat_FromDouble(a); +} + +static PyObject * float_rem(PyObject *v, PyObject *w) { double vx, wx; @@ -677,7 +696,7 @@ static PyNumberMethods float_as_number = { (binaryfunc)float_add, /*nb_add*/ (binaryfunc)float_sub, /*nb_subtract*/ (binaryfunc)float_mul, /*nb_multiply*/ - (binaryfunc)float_div, /*nb_divide*/ + (binaryfunc)float_classic_div, /*nb_divide*/ (binaryfunc)float_rem, /*nb_remainder*/ (binaryfunc)float_divmod, /*nb_divmod*/ (ternaryfunc)float_pow, /*nb_power*/ diff --git a/Objects/intobject.c b/Objects/intobject.c index d1f241d..108e658 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -512,6 +512,27 @@ int_div(PyIntObject *x, PyIntObject *y) } static PyObject * +int_classic_div(PyIntObject *x, PyIntObject *y) +{ + long xi, yi; + long d, m; + CONVERT_TO_LONG(x, xi); + CONVERT_TO_LONG(y, yi); + if (Py_DivisionWarningFlag && + PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0) + return NULL; + switch (i_divmod(xi, yi, &d, &m)) { + case DIVMOD_OK: + return PyInt_FromLong(d); + case DIVMOD_OVERFLOW: + return PyLong_Type.tp_as_number->nb_divide((PyObject *)x, + (PyObject *)y); + default: + return NULL; + } +} + +static PyObject * int_mod(PyIntObject *x, PyIntObject *y) { long xi, yi; @@ -744,7 +765,7 @@ int_or(PyIntObject *v, PyIntObject *w) static PyObject * int_true_divide(PyObject *v, PyObject *w) { - return PyFloat_Type.tp_as_number->nb_divide(v, w); + return PyFloat_Type.tp_as_number->nb_true_divide(v, w); } static PyObject * @@ -855,7 +876,7 @@ static PyNumberMethods int_as_number = { (binaryfunc)int_add, /*nb_add*/ (binaryfunc)int_sub, /*nb_subtract*/ (binaryfunc)int_mul, /*nb_multiply*/ - (binaryfunc)int_div, /*nb_divide*/ + (binaryfunc)int_classic_div, /*nb_divide*/ (binaryfunc)int_mod, /*nb_remainder*/ (binaryfunc)int_divmod, /*nb_divmod*/ (ternaryfunc)int_pow, /*nb_power*/ diff --git a/Objects/longobject.c b/Objects/longobject.c index 25d0377..4209419 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -1509,6 +1509,26 @@ long_div(PyObject *v, PyObject *w) } static PyObject * +long_classic_div(PyObject *v, PyObject *w) +{ + PyLongObject *a, *b, *div, *mod; + + CONVERT_BINOP(v, w, &a, &b); + + if (Py_DivisionWarningFlag && + PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0) + div = NULL; + else if (l_divmod(a, b, &div, &mod) < 0) + div = NULL; + else + Py_DECREF(mod); + + Py_DECREF(a); + Py_DECREF(b); + return (PyObject *)div; +} + +static PyObject * long_mod(PyObject *v, PyObject *w) { PyLongObject *a, *b, *div, *mod; @@ -2115,7 +2135,7 @@ static PyNumberMethods long_as_number = { (binaryfunc) long_add, /*nb_add*/ (binaryfunc) long_sub, /*nb_subtract*/ (binaryfunc) long_mul, /*nb_multiply*/ - (binaryfunc) long_div, /*nb_divide*/ + (binaryfunc) long_classic_div, /*nb_divide*/ (binaryfunc) long_mod, /*nb_remainder*/ (binaryfunc) long_divmod, /*nb_divmod*/ (ternaryfunc) long_pow, /*nb_power*/ diff --git a/Objects/object.c b/Objects/object.c index 7b9e280..66b4eae 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -16,6 +16,8 @@ DL_IMPORT(long) _Py_RefTotal; #endif +DL_IMPORT(int) Py_DivisionWarningFlag; + /* Object allocation routines used by NEWOBJ and NEWVAROBJ macros. These are used by the individual routines for object creation. Do not call them otherwise, they do not initialize the object! */ |