Author: Matti Picus <matti.pi...@gmail.com>
Branch: py3.5
Changeset: r93685:6742308b0f34
Date: 2018-01-19 14:45 +0200
http://bitbucket.org/pypy/pypy/changeset/6742308b0f34/

Log:    merge default into py3.5

diff too long, truncating to 2000 out of 2456 lines

diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -10,3 +10,7 @@
 Big refactoring of some cpyext code, which avoids a lot of nonsense when
 calling C from Python and vice-versa: the result is a big speedup in
 function/method calls, up to 6 times faster.
+
+.. branch: cpyext-datetime2
+
+Support ``tzinfo`` field on C-API datetime objects, fixes latest pandas HEAD
diff --git a/pypy/interpreter/astcompiler/assemble.py 
b/pypy/interpreter/astcompiler/assemble.py
--- a/pypy/interpreter/astcompiler/assemble.py
+++ b/pypy/interpreter/astcompiler/assemble.py
@@ -1,7 +1,7 @@
 """Python control flow graph generation and bytecode assembly."""
 
+import math
 import os
-from rpython.rlib import rfloat
 from rpython.rlib.objectmodel import specialize, we_are_translated
 
 from pypy.interpreter.astcompiler import ast, consts, misc, symtable
@@ -269,7 +269,7 @@
         w_type = space.type(obj)
         if space.is_w(w_type, space.w_float):
             val = space.float_w(obj)
-            if val == 0.0 and rfloat.copysign(1., val) < 0:
+            if val == 0.0 and math.copysign(1., val) < 0:
                 w_key = space.newtuple([obj, space.w_float, space.w_None])
             else:
                 w_key = space.newtuple([obj, space.w_float])
@@ -279,9 +279,9 @@
             real = space.float_w(w_real)
             imag = space.float_w(w_imag)
             real_negzero = (real == 0.0 and
-                            rfloat.copysign(1., real) < 0)
+                            math.copysign(1., real) < 0)
             imag_negzero = (imag == 0.0 and
-                            rfloat.copysign(1., imag) < 0)
+                            math.copysign(1., imag) < 0)
             if real_negzero and imag_negzero:
                 tup = [obj, space.w_complex, space.w_None, space.w_None,
                        space.w_None]
diff --git a/pypy/module/__builtin__/operation.py 
b/pypy/module/__builtin__/operation.py
--- a/pypy/module/__builtin__/operation.py
+++ b/pypy/module/__builtin__/operation.py
@@ -2,6 +2,8 @@
 Interp-level implementation of the basic space operations.
 """
 
+import math
+
 from pypy.interpreter import gateway
 from pypy.interpreter.error import OperationError, oefmt
 from pypy.interpreter.gateway import unwrap_spec, WrappedDefault
diff --git a/pypy/module/__pypy__/__init__.py b/pypy/module/__pypy__/__init__.py
--- a/pypy/module/__pypy__/__init__.py
+++ b/pypy/module/__pypy__/__init__.py
@@ -58,6 +58,14 @@
     }
 
 
+class PyPyDateTime(MixedModule):
+    appleveldefs = {}
+    interpleveldefs = {
+        'dateinterop': 'interp_pypydatetime.W_DateTime_Date',
+        'timeinterop'    : 'interp_pypydatetime.W_DateTime_Time',
+        'deltainterop'   : 'interp_pypydatetime.W_DateTime_Delta',
+    }
+
 class Module(MixedModule):
     """ PyPy specific "magic" functions. A lot of them are experimental and
     subject to change, many are internal. """
@@ -107,6 +115,7 @@
         "thread": ThreadModule,
         "intop": IntOpModule,
         "os": OsModule,
+        '_pypydatetime': PyPyDateTime,
     }
 
     def setup_after_space_initialization(self):
diff --git a/pypy/module/__pypy__/interp_pypydatetime.py 
b/pypy/module/__pypy__/interp_pypydatetime.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/__pypy__/interp_pypydatetime.py
@@ -0,0 +1,24 @@
+from pypy.interpreter.baseobjspace import W_Root
+from pypy.interpreter.typedef import TypeDef
+from pypy.interpreter.gateway import interp2app
+from rpython.tool.sourcetools import func_with_new_name
+
+def create_class(name):
+    class W_Class(W_Root):
+        'builtin base clasee for datetime.%s to allow interop with cpyext' % 
name
+        def descr_new__(space, w_type):
+            return space.allocate_instance(W_Class, w_type)
+
+    W_Class.typedef = TypeDef(name,
+        __new__ = interp2app(func_with_new_name(
+                                    W_Class.descr_new__.im_func,
+                                    '%s_new' % (name,))),
+        )
+    W_Class.typedef.acceptable_as_base_class = True
+    return W_Class
+
+W_DateTime_Time = create_class('pypydatetime_time')
+W_DateTime_Date = create_class('pypydatetime_date')
+W_DateTime_Delta = create_class('pypydatetime_delta')
+
+
diff --git a/pypy/module/cmath/test/test_cmath.py 
b/pypy/module/cmath/test/test_cmath.py
--- a/pypy/module/cmath/test/test_cmath.py
+++ b/pypy/module/cmath/test/test_cmath.py
@@ -1,5 +1,4 @@
 from __future__ import with_statement
-from rpython.rlib.rfloat import copysign, isnan, isinf
 from pypy.module.cmath import interp_cmath
 import os, sys, math
 
@@ -11,7 +10,7 @@
     assert isinstance(sqrt_special_values[5][1], tuple)
     assert sqrt_special_values[5][1][0] == 1e200 * 1e200
     assert sqrt_special_values[5][1][1] == -0.
-    assert copysign(1., sqrt_special_values[5][1][1]) == -1.
+    assert math.copysign(1., sqrt_special_values[5][1][1]) == -1.
 
 
 class AppTestCMath:
@@ -170,12 +169,12 @@
     """
 
     # special values testing
-    if isnan(a):
-        if isnan(b):
+    if math.isnan(a):
+        if math.isnan(b):
             return
         raise AssertionError(msg + '%r should be nan' % (b,))
 
-    if isinf(a):
+    if math.isinf(a):
         if a == b:
             return
         raise AssertionError(msg + 'finite result where infinity expected: '
@@ -186,8 +185,7 @@
     # and b to have opposite signs; in practice these hardly ever
     # occur).
     if not a and not b:
-        # only check it if we are running on top of CPython >= 2.6
-        if sys.version_info >= (2, 6) and copysign(1., a) != copysign(1., b):
+        if math.copysign(1., a) != math.copysign(1., b):
             raise AssertionError(msg + 'zero has wrong sign: expected %r, '
                                        'got %r' % (a, b))
 
diff --git a/pypy/module/cpyext/cdatetime.py b/pypy/module/cpyext/cdatetime.py
--- a/pypy/module/cpyext/cdatetime.py
+++ b/pypy/module/cpyext/cdatetime.py
@@ -1,43 +1,28 @@
 from rpython.rtyper.lltypesystem import rffi, lltype
 from rpython.rtyper.annlowlevel import llhelper
-from pypy.module.cpyext.pyobject import PyObject, make_ref
+from rpython.rlib.rarithmetic import widen
+from pypy.module.cpyext.pyobject import (PyObject, make_ref, make_typedescr,
+    decref)
 from pypy.module.cpyext.api import (cpython_api, CANNOT_FAIL, cpython_struct,
-    PyObjectFields)
+    PyObjectFields, cts, parse_dir, bootstrap_function, slot_function)
 from pypy.module.cpyext.import_ import PyImport_Import
 from pypy.module.cpyext.typeobject import PyTypeObjectPtr
 from pypy.interpreter.error import OperationError
+from pypy.module.__pypy__.interp_pypydatetime import (W_DateTime_Date,
+    W_DateTime_Time, W_DateTime_Delta)
 from rpython.tool.sourcetools import func_renamer
 
-# API import function
+cts.parse_header(parse_dir / 'cpyext_datetime.h')
 
-PyDateTime_CAPI = cpython_struct(
-    'PyDateTime_CAPI',
-    (('DateType', PyTypeObjectPtr),
-     ('DateTimeType', PyTypeObjectPtr),
-     ('TimeType', PyTypeObjectPtr),
-     ('DeltaType', PyTypeObjectPtr),
-     ('TZInfoType', PyTypeObjectPtr),
 
-     ('Date_FromDate', lltype.Ptr(lltype.FuncType(
-         [rffi.INT_real, rffi.INT_real, rffi.INT_real, PyTypeObjectPtr],
-         PyObject))),
-     ('Time_FromTime', lltype.Ptr(lltype.FuncType(
-         [rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real,
-          PyObject, PyTypeObjectPtr],
-         PyObject))),
-     ('DateTime_FromDateAndTime', lltype.Ptr(lltype.FuncType(
-         [rffi.INT_real, rffi.INT_real, rffi.INT_real,
-          rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real,
-          PyObject, PyTypeObjectPtr],
-         PyObject))),
-     ('Delta_FromDelta', lltype.Ptr(lltype.FuncType(
-         [rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real,
-          PyTypeObjectPtr],
-         PyObject))),
-     ))
+PyDateTime_CAPI = cts.gettype('PyDateTime_CAPI')
+
+datetimeAPI_global = []
 
 @cpython_api([], lltype.Ptr(PyDateTime_CAPI))
 def _PyDateTime_Import(space):
+    if len(datetimeAPI_global) >0:
+        return datetimeAPI_global[0]
     datetimeAPI = lltype.malloc(PyDateTime_CAPI, flavor='raw',
                                 track_allocation=False)
 
@@ -76,21 +61,13 @@
         _PyDelta_FromDelta.api_func.functype,
         _PyDelta_FromDelta.api_func.get_wrapper(space))
 
+    datetimeAPI_global.append(datetimeAPI)
     return datetimeAPI
 
-PyDateTime_DateStruct = lltype.ForwardReference()
-PyDateTime_TimeStruct = lltype.ForwardReference()
-PyDateTime_DateTimeStruct = lltype.ForwardReference()
-cpython_struct("PyDateTime_Date", PyObjectFields, PyDateTime_DateStruct)
-PyDateTime_Date = lltype.Ptr(PyDateTime_DateStruct)
-cpython_struct("PyDateTime_Time", PyObjectFields, PyDateTime_TimeStruct)
-PyDateTime_Time = lltype.Ptr(PyDateTime_TimeStruct)
-cpython_struct("PyDateTime_DateTime", PyObjectFields, 
PyDateTime_DateTimeStruct)
-PyDateTime_DateTime = lltype.Ptr(PyDateTime_DateTimeStruct)
-
-PyDeltaObjectStruct = lltype.ForwardReference()
-cpython_struct("PyDateTime_Delta", PyObjectFields, PyDeltaObjectStruct)
-PyDateTime_Delta = lltype.Ptr(PyDeltaObjectStruct)
+PyDateTime_Time = cts.gettype('PyDateTime_Time*')
+PyDateTime_DateTime = cts.gettype('PyDateTime_DateTime*')
+PyDateTime_Date = cts.gettype('PyDateTime_Date*')
+PyDateTime_Delta = cts.gettype('PyDateTime_Delta*')
 
 # Check functions
 
@@ -102,6 +79,8 @@
             return space.is_true(
                 space.appexec([w_obj], """(obj):
                     from datetime import %s as datatype
+                    if not isinstance(obj, datatype):
+                        print datatype
                     return isinstance(obj, datatype)
                     """ % (type_name,)))
         except OperationError:
@@ -129,6 +108,72 @@
 PyTZInfo_Check, PyTZInfo_CheckExact = make_check_function(
     "PyTZInfo_Check", "tzinfo")
 
+@bootstrap_function
+def init_datetime(space):
+    # no realize functions since there are no getters
+    make_typedescr(W_DateTime_Time.typedef,
+                   basestruct=PyDateTime_Time.TO,
+                   attach=type_attach,
+                   dealloc=type_dealloc,
+                  )
+
+    # why do we need date_dealloc? Since W_DateTime_Date is the base class for
+    # app level datetime.date. If a c-extension class uses datetime.date for 
its
+    # base class and defines a tp_dealloc, we will get this:
+    # c_class->tp_dealloc == tp_dealloc_func
+    # c_class->tp_base == datetime.date, 
+    #                     datetime.date->tp_dealloc = _PyPy_subtype_dealloc
+    # datetime.date->tp_base = W_DateTime_Date
+    #                    W_DateTime_Date->tp_dealloc = _PyPy_subtype_dealloc
+    # but _PyPy_subtype_dealloc will call tp_dealloc_func, which can call its
+    # base's tp_dealloc and we get recursion. So break the recursion by setting
+    # W_DateTime_Date->tp_dealloc
+    make_typedescr(W_DateTime_Date.typedef,
+                   basestruct=PyDateTime_DateTime.TO,
+                   dealloc=date_dealloc,
+                  )
+
+    make_typedescr(W_DateTime_Delta.typedef,
+                   basestruct=PyDateTime_Delta.TO,
+                   attach=timedeltatype_attach,
+                  )
+
+def type_attach(space, py_obj, w_obj, w_userdata=None):
+    '''Fills a newly allocated py_obj from the w_obj
+       Can be called with a datetime, or a time
+    '''
+    py_datetime = rffi.cast(PyDateTime_Time, py_obj)
+    w_tzinfo = space.getattr(w_obj, space.newtext('tzinfo'))
+    if space.is_none(w_tzinfo):
+        py_datetime.c_hastzinfo = cts.cast('unsigned char', 0)
+        py_datetime.c_tzinfo = lltype.nullptr(PyObject.TO)
+    else:
+        py_datetime.c_hastzinfo = cts.cast('unsigned char', 1)
+        py_datetime.c_tzinfo = make_ref(space, w_tzinfo)
+
+@slot_function([PyObject], lltype.Void)
+def type_dealloc(space, py_obj):
+    py_datetime = rffi.cast(PyDateTime_Time, py_obj)
+    if (widen(py_datetime.c_hastzinfo) != 0):
+        decref(space, py_datetime.c_tzinfo)
+    from pypy.module.cpyext.object import _dealloc
+    _dealloc(space, py_obj)
+
+@slot_function([PyObject], lltype.Void)
+def date_dealloc(space, py_obj):
+    from pypy.module.cpyext.object import _dealloc
+    _dealloc(space, py_obj)
+
+def timedeltatype_attach(space, py_obj, w_obj, w_userdata=None):
+    "Fills a newly allocated py_obj from the w_obj"
+    py_delta = rffi.cast(PyDateTime_Delta, py_obj)
+    days = space.int_w(space.getattr(w_obj, space.newtext('days')))
+    py_delta.c_days = cts.cast('int', days)
+    seconds = space.int_w(space.getattr(w_obj, space.newtext('seconds')))
+    py_delta.c_seconds = cts.cast('int', seconds)
+    microseconds = space.int_w(space.getattr(w_obj, 
space.newtext('microseconds')))
+    py_delta.c_microseconds = cts.cast('int', microseconds)
+
 # Constructors. They are better used as macros.
 
 @cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real, PyTypeObjectPtr],
diff --git a/pypy/module/cpyext/include/datetime.h 
b/pypy/module/cpyext/include/datetime.h
--- a/pypy/module/cpyext/include/datetime.h
+++ b/pypy/module/cpyext/include/datetime.h
@@ -4,49 +4,11 @@
 extern "C" {
 #endif
 
-/* Define structure for C API. */
-typedef struct {
-    /* type objects */
-    PyTypeObject *DateType;
-    PyTypeObject *DateTimeType;
-    PyTypeObject *TimeType;
-    PyTypeObject *DeltaType;
-    PyTypeObject *TZInfoType;
-
-    /* constructors */
-    PyObject *(*Date_FromDate)(int, int, int, PyTypeObject*);
-    PyObject *(*DateTime_FromDateAndTime)(int, int, int, int, int, int, int,
-        PyObject*, PyTypeObject*);
-    PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*);
-    PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*);
-} PyDateTime_CAPI;
+#include "cpyext_datetime.h"
 
 PyAPI_DATA(PyDateTime_CAPI*) PyDateTimeAPI;
-#define PyDateTime_IMPORT                           \
-    do {                                            \
-        if(PyDateTimeAPI==NULL)                     \
-            PyDateTimeAPI = _PyDateTime_Import();   \
-    } while (0)
 
-typedef struct {
-    PyObject_HEAD
-} PyDateTime_Delta;
-
-typedef struct {
-    PyObject_HEAD
-} PyDateTime_Date;
-
-typedef struct {
-    PyObject_HEAD
-} PyDateTime_Time;
-
-typedef struct {
-    PyObject_HEAD
-} PyDateTime_DateTime;
-
-typedef struct {
-    PyObject_HEAD
-} PyDateTime_TZInfo;
+#define PyDateTime_IMPORT (PyDateTimeAPI = _PyDateTime_Import())
 
 /* Macros for accessing constructors in a simplified fashion. */
 #define PyDate_FromDate(year, month, day) \
diff --git a/pypy/module/cpyext/parse/cpyext_datetime.h 
b/pypy/module/cpyext/parse/cpyext_datetime.h
new file mode 100644
--- /dev/null
+++ b/pypy/module/cpyext/parse/cpyext_datetime.h
@@ -0,0 +1,52 @@
+/* Define structure for C API. */
+typedef struct {
+    /* type objects */
+    PyTypeObject *DateType;
+    PyTypeObject *DateTimeType;
+    PyTypeObject *TimeType;
+    PyTypeObject *DeltaType;
+    PyTypeObject *TZInfoType;
+
+    /* constructors */
+    PyObject *(*Date_FromDate)(int, int, int, PyTypeObject*);
+    PyObject *(*DateTime_FromDateAndTime)(int, int, int, int, int, int, int,
+        PyObject*, PyTypeObject*);
+    PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*);
+    PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*);
+} PyDateTime_CAPI;
+
+typedef struct
+{
+    PyObject_HEAD
+    int days;                   /* -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS */
+    int seconds;                /* 0 <= seconds < 24*3600 is invariant */
+    int microseconds;           /* 0 <= microseconds < 1000000 is invariant */
+} PyDateTime_Delta;
+
+/* The datetime and time types have an optional tzinfo member,
+ * PyNone if hastzinfo is false.
+ */
+typedef struct
+{
+    PyObject_HEAD
+    unsigned char hastzinfo;
+    PyObject *tzinfo;
+} PyDateTime_Time;
+
+typedef struct
+{
+    PyObject_HEAD
+    unsigned char hastzinfo;
+    PyObject *tzinfo;
+} PyDateTime_DateTime;
+
+
+typedef struct {
+    PyObject_HEAD
+} PyDateTime_Date;
+
+
+typedef struct {
+    PyObject_HEAD
+} PyDateTime_TZInfo;
+
diff --git a/pypy/module/math/interp_math.py b/pypy/module/math/interp_math.py
--- a/pypy/module/math/interp_math.py
+++ b/pypy/module/math/interp_math.py
@@ -67,15 +67,15 @@
     # No exceptions possible.
     x = _get_double(space, w_x)
     y = _get_double(space, w_y)
-    return space.newfloat(rfloat.copysign(x, y))
+    return space.newfloat(math.copysign(x, y))
 
 def isinf(space, w_x):
     """Return True if x is infinity."""
-    return space.newbool(rfloat.isinf(_get_double(space, w_x)))
+    return space.newbool(math.isinf(_get_double(space, w_x)))
 
 def isnan(space, w_x):
     """Return True if x is not a number."""
-    return space.newbool(rfloat.isnan(_get_double(space, w_x)))
+    return space.newbool(math.isnan(_get_double(space, w_x)))
 
 def isfinite(space, w_x):
     """isfinite(x) -> bool
@@ -358,14 +358,14 @@
             if not rfloat.isfinite(v):
                 if rfloat.isfinite(original):
                     raise oefmt(space.w_OverflowError, "intermediate overflow")
-                if rfloat.isinf(original):
+                if math.isinf(original):
                     inf_sum += original
                 special_sum += original
                 del partials[:]
             else:
                 partials.append(v)
     if special_sum != 0.0:
-        if rfloat.isnan(inf_sum):
+        if math.isnan(inf_sum):
             raise oefmt(space.w_ValueError, "-inf + inf")
         return space.newfloat(special_sum)
     hi = 0.0
diff --git a/pypy/module/micronumpy/test/test_complex.py 
b/pypy/module/micronumpy/test/test_complex.py
--- a/pypy/module/micronumpy/test/test_complex.py
+++ b/pypy/module/micronumpy/test/test_complex.py
@@ -1,12 +1,12 @@
 from __future__ import with_statement
 
+import math
 import sys
 
 from pypy.conftest import option
 from pypy.interpreter.error import OperationError
 from pypy.interpreter.gateway import interp2app
 from pypy.module.micronumpy.test.test_base import BaseNumpyAppTest
-from rpython.rlib.rfloat import isnan, isinf, copysign
 from rpython.rlib.rcomplex import c_pow
 
 
@@ -21,12 +21,12 @@
     """
 
     # special values testing
-    if isnan(a):
-        if isnan(b):
+    if math.isnan(a):
+        if math.isnan(b):
             return True,''
         raise AssertionError(msg + '%r should be nan' % (b,))
 
-    if isinf(a):
+    if math.isinf(a):
         if a == b:
             return True,''
         raise AssertionError(msg + 'finite result where infinity expected: '+ \
@@ -37,8 +37,7 @@
     # and b to have opposite signs; in practice these hardly ever
     # occur).
     if not a and not b:
-        # only check it if we are running on top of CPython >= 2.6
-        if sys.version_info >= (2, 6) and copysign(1., a) != copysign(1., b):
+        if math.copysign(1., a) != math.copysign(1., b):
             raise AssertionError( msg + \
                     'zero has wrong sign: expected %r, got %r' % (a, b))
 
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -767,7 +767,7 @@
         except ZeroDivisionError:
             if v1 == v2 == 0.0:
                 return rfloat.NAN
-            return rfloat.copysign(rfloat.INFINITY, v1 * v2)
+            return math.copysign(rfloat.INFINITY, v1 * v2)
 
     @simple_binary_op
     def floordiv(self, v1, v2):
@@ -776,7 +776,7 @@
         except ZeroDivisionError:
             if v1 == v2 == 0.0:
                 return rfloat.NAN
-            return rfloat.copysign(rfloat.INFINITY, v1 * v2)
+            return math.copysign(rfloat.INFINITY, v1 * v2)
 
     @simple_binary_op
     def mod(self, v1, v2):
@@ -793,7 +793,7 @@
             # fmod returns different results across platforms; ensure
             # it has the same sign as the denominator; we'd like to do
             # "mod = v2 * 0.0", but that may get optimized away
-            mod = rfloat.copysign(0.0, v2)
+            mod = math.copysign(0.0, v2)
         return mod
 
     @simple_binary_op
@@ -805,7 +805,7 @@
         except OverflowError:
             if math.modf(v2)[0] == 0 and math.modf(v2 / 2)[0] != 0:
                 # Odd integer powers result in the same sign as the base
-                return rfloat.copysign(rfloat.INFINITY, v1)
+                return math.copysign(rfloat.INFINITY, v1)
             return rfloat.INFINITY
 
     @simple_binary_op
@@ -816,13 +816,13 @@
     def sign(self, v):
         if v == 0.0:
             return 0.0
-        if rfloat.isnan(v):
+        if math.isnan(v):
             return rfloat.NAN
-        return rfloat.copysign(1.0, v)
+        return math.copysign(1.0, v)
 
     @raw_unary_op
     def signbit(self, v):
-        return rfloat.copysign(1.0, v) < 0.0
+        return math.copysign(1.0, v) < 0.0
 
     @simple_unary_op
     def fabs(self, v):
@@ -830,27 +830,27 @@
 
     @simple_binary_op
     def max(self, v1, v2):
-        return v1 if v1 >= v2 or rfloat.isnan(v1) else v2
+        return v1 if v1 >= v2 or math.isnan(v1) else v2
 
     @simple_binary_op
     def min(self, v1, v2):
-        return v1 if v1 <= v2 or rfloat.isnan(v1) else v2
+        return v1 if v1 <= v2 or math.isnan(v1) else v2
 
     @raw_binary_op
     def argmax(self, v1, v2):
-        return v1 >= v2 or rfloat.isnan(v1)
+        return v1 >= v2 or math.isnan(v1)
 
     @raw_binary_op
     def argmin(self, v1, v2):
-        return v1 <= v2 or rfloat.isnan(v1)
+        return v1 <= v2 or math.isnan(v1)
 
     @simple_binary_op
     def fmax(self, v1, v2):
-        return v1 if v1 >= v2 or rfloat.isnan(v2) else v2
+        return v1 if v1 >= v2 or math.isnan(v2) else v2
 
     @simple_binary_op
     def fmin(self, v1, v2):
-        return v1 if v1 <= v2 or rfloat.isnan(v2) else v2
+        return v1 if v1 <= v2 or math.isnan(v2) else v2
 
     @simple_binary_op
     def fmod(self, v1, v2):
@@ -862,7 +862,7 @@
     @simple_unary_op
     def reciprocal(self, v):
         if v == 0.0:
-            return rfloat.copysign(rfloat.INFINITY, v)
+            return math.copysign(rfloat.INFINITY, v)
         return 1.0 / v
 
     @simple_unary_op
@@ -876,9 +876,9 @@
     @specialize.argtype(1)
     def round(self, v, decimals=0):
         raw = self.for_computation(self.unbox(v))
-        if rfloat.isinf(raw):
+        if math.isinf(raw):
             return v
-        elif rfloat.isnan(raw):
+        elif math.isnan(raw):
             return v
         ans = rfloat.round_double(raw, decimals, half_even=True)
         return self.box(ans)
@@ -986,11 +986,11 @@
 
     @raw_unary_op
     def isnan(self, v):
-        return rfloat.isnan(v)
+        return math.isnan(v)
 
     @raw_unary_op
     def isinf(self, v):
-        return rfloat.isinf(v)
+        return math.isinf(v)
 
     @raw_unary_op
     def isfinite(self, v):
@@ -1189,7 +1189,7 @@
             return imag_str
 
         real_str = str_format(real)
-        op = '+' if imag >= 0 or rfloat.isnan(imag) else ''
+        op = '+' if imag >= 0 or math.isnan(imag) else ''
         return ''.join(['(', real_str, op, imag_str, ')'])
 
     def runpack_str(self, space, s, native):
@@ -1318,7 +1318,7 @@
             return rcomplex.c_div(v1, v2)
         except ZeroDivisionError:
             if rcomplex.c_abs(*v1) == 0 or \
-                    (rfloat.isnan(v1[0]) and rfloat.isnan(v1[1])):
+                    (math.isnan(v1[0]) and math.isnan(v1[1])):
                 return rfloat.NAN, rfloat.NAN
             return rfloat.INFINITY, rfloat.INFINITY
 
@@ -1353,12 +1353,12 @@
     @raw_unary_op
     def isnan(self, v):
         '''a complex number is nan if one of the parts is nan'''
-        return rfloat.isnan(v[0]) or rfloat.isnan(v[1])
+        return math.isnan(v[0]) or math.isnan(v[1])
 
     @raw_unary_op
     def isinf(self, v):
         '''a complex number is inf if one of the parts is inf'''
-        return rfloat.isinf(v[0]) or rfloat.isinf(v[1])
+        return math.isinf(v[0]) or math.isinf(v[1])
 
     def _eq(self, v1, v2):
         return v1[0] == v2[0] and v1[1] == v2[1]
@@ -1374,7 +1374,7 @@
 
     def _lt(self, v1, v2):
         (r1, i1), (r2, i2) = v1, v2
-        if r1 < r2 and not rfloat.isnan(i1) and not rfloat.isnan(i2):
+        if r1 < r2 and not math.isnan(i1) and not math.isnan(i2):
             return True
         if r1 == r2 and i1 < i2:
             return True
@@ -1459,7 +1459,7 @@
                 ratio = i2 / r2
                 denom = r2 + i2 * ratio
                 rr = (r1 + i1 * ratio) / denom
-        elif rfloat.isnan(r2):
+        elif math.isnan(r2):
             rr = rfloat.NAN
         else:
             ratio = r2 / i2
@@ -1503,7 +1503,7 @@
         sign of complex number could be either the point closest to the unit 
circle
         or {-1,0,1}, for compatability with numpy we choose the latter
         '''
-        if rfloat.isnan(v[0]) or rfloat.isnan(v[1]):
+        if math.isnan(v[0]) or math.isnan(v[1]):
             return rfloat.NAN, 0
         if v[0] == 0.0:
             if v[1] == 0:
@@ -1534,11 +1534,11 @@
 
     @complex_unary_op
     def reciprocal(self, v):
-        if rfloat.isinf(v[1]) and rfloat.isinf(v[0]):
+        if math.isinf(v[1]) and math.isinf(v[0]):
             return rfloat.NAN, rfloat.NAN
-        if rfloat.isinf(v[0]):
-            return (rfloat.copysign(0., v[0]),
-                    rfloat.copysign(0., -v[1]))
+        if math.isinf(v[0]):
+            return (math.copysign(0., v[0]),
+                    math.copysign(0., -v[1]))
         a2 = v[0]*v[0] + v[1]*v[1]
         try:
             return rcomplex.c_div((v[0], -v[1]), (a2, 0.))
@@ -1575,13 +1575,13 @@
 
     @complex_unary_op
     def exp(self, v):
-        if rfloat.isinf(v[1]):
-            if rfloat.isinf(v[0]):
+        if math.isinf(v[1]):
+            if math.isinf(v[0]):
                 if v[0] < 0:
                     return 0., 0.
                 return rfloat.INFINITY, rfloat.NAN
             elif (rfloat.isfinite(v[0]) or \
-                                 (rfloat.isinf(v[0]) and v[0] > 0)):
+                                 (math.isinf(v[0]) and v[0] > 0)):
                 return rfloat.NAN, rfloat.NAN
         try:
             return rcomplex.c_exp(*v)
@@ -1603,13 +1603,13 @@
     def expm1(self, v):
         # duplicate exp() so in the future it will be easier
         # to implement seterr
-        if rfloat.isinf(v[1]):
-            if rfloat.isinf(v[0]):
+        if math.isinf(v[1]):
+            if math.isinf(v[0]):
                 if v[0] < 0:
                     return -1., 0.
                 return rfloat.NAN, rfloat.NAN
             elif (rfloat.isfinite(v[0]) or \
-                                 (rfloat.isinf(v[0]) and v[0] > 0)):
+                                 (math.isinf(v[0]) and v[0] > 0)):
                 return rfloat.NAN, rfloat.NAN
         try:
             res = rcomplex.c_exp(*v)
@@ -1622,29 +1622,29 @@
 
     @complex_unary_op
     def sin(self, v):
-        if rfloat.isinf(v[0]):
+        if math.isinf(v[0]):
             if v[1] == 0.:
                 return rfloat.NAN, 0.
             if rfloat.isfinite(v[1]):
                 return rfloat.NAN, rfloat.NAN
-            elif not rfloat.isnan(v[1]):
+            elif not math.isnan(v[1]):
                 return rfloat.NAN, rfloat.INFINITY
         return rcomplex.c_sin(*v)
 
     @complex_unary_op
     def cos(self, v):
-        if rfloat.isinf(v[0]):
+        if math.isinf(v[0]):
             if v[1] == 0.:
                 return rfloat.NAN, 0.0
             if rfloat.isfinite(v[1]):
                 return rfloat.NAN, rfloat.NAN
-            elif not rfloat.isnan(v[1]):
+            elif not math.isnan(v[1]):
                 return rfloat.INFINITY, rfloat.NAN
         return rcomplex.c_cos(*v)
 
     @complex_unary_op
     def tan(self, v):
-        if rfloat.isinf(v[0]) and rfloat.isfinite(v[1]):
+        if math.isinf(v[0]) and rfloat.isfinite(v[1]):
             return rfloat.NAN, rfloat.NAN
         return rcomplex.c_tan(*v)
 
@@ -1669,29 +1669,29 @@
 
     @complex_unary_op
     def sinh(self, v):
-        if rfloat.isinf(v[1]):
+        if math.isinf(v[1]):
             if rfloat.isfinite(v[0]):
                 if v[0] == 0.0:
                     return 0.0, rfloat.NAN
                 return rfloat.NAN, rfloat.NAN
-            elif not rfloat.isnan(v[0]):
+            elif not math.isnan(v[0]):
                 return rfloat.INFINITY, rfloat.NAN
         return rcomplex.c_sinh(*v)
 
     @complex_unary_op
     def cosh(self, v):
-        if rfloat.isinf(v[1]):
+        if math.isinf(v[1]):
             if rfloat.isfinite(v[0]):
                 if v[0] == 0.0:
                     return rfloat.NAN, 0.0
                 return rfloat.NAN, rfloat.NAN
-            elif not rfloat.isnan(v[0]):
+            elif not math.isnan(v[0]):
                 return rfloat.INFINITY, rfloat.NAN
         return rcomplex.c_cosh(*v)
 
     @complex_unary_op
     def tanh(self, v):
-        if rfloat.isinf(v[1]) and rfloat.isfinite(v[0]):
+        if math.isinf(v[1]) and rfloat.isfinite(v[0]):
             return rfloat.NAN, rfloat.NAN
         return rcomplex.c_tanh(*v)
 
diff --git a/pypy/objspace/std/complexobject.py 
b/pypy/objspace/std/complexobject.py
--- a/pypy/objspace/std/complexobject.py
+++ b/pypy/objspace/std/complexobject.py
@@ -4,7 +4,7 @@
 from rpython.rlib.rarithmetic import intmask, r_ulonglong
 from rpython.rlib.rbigint import rbigint
 from rpython.rlib.rfloat import (
-    DTSF_STR_PRECISION, copysign, formatd, isinf, isnan, string_to_float)
+    DTSF_STR_PRECISION, formatd, string_to_float)
 from rpython.rlib.rstring import ParseStringError
 from rpython.tool.sourcetools import func_with_new_name
 
@@ -115,12 +115,12 @@
 
 def format_float(x, code, precision):
     # like float2string, except that the ".0" is not necessary
-    if isinf(x):
+    if math.isinf(x):
         if x > 0.0:
             return "inf"
         else:
             return "-inf"
-    elif isnan(x):
+    elif math.isnan(x):
         return "nan"
     else:
         return formatd(x, code, precision)
@@ -323,18 +323,18 @@
                                space.newfloat(self.imagval)])
 
     def descr_repr(self, space):
-        if self.realval == 0 and copysign(1., self.realval) == 1.:
+        if self.realval == 0 and math.copysign(1., self.realval) == 1.:
             return space.newtext(repr_format(self.imagval) + 'j')
-        sign = (copysign(1., self.imagval) == 1. or
-                isnan(self.imagval)) and '+' or ''
+        sign = (math.copysign(1., self.imagval) == 1. or
+                math.isnan(self.imagval)) and '+' or ''
         return space.newtext('(' + repr_format(self.realval)
                              + sign + repr_format(self.imagval) + 'j)')
 
     def descr_str(self, space):
-        if self.realval == 0 and copysign(1., self.realval) == 1.:
+        if self.realval == 0 and math.copysign(1., self.realval) == 1.:
             return space.newtext(str_format(self.imagval) + 'j')
-        sign = (copysign(1., self.imagval) == 1. or
-                isnan(self.imagval)) and '+' or ''
+        sign = (math.copysign(1., self.imagval) == 1. or
+                math.isnan(self.imagval)) and '+' or ''
         return space.newtext('(' + str_format(self.realval)
                              + sign + str_format(self.imagval) + 'j)')
 
diff --git a/pypy/objspace/std/floatobject.py b/pypy/objspace/std/floatobject.py
--- a/pypy/objspace/std/floatobject.py
+++ b/pypy/objspace/std/floatobject.py
@@ -8,7 +8,7 @@
 from rpython.rlib.rbigint import rbigint
 from rpython.rlib.rfloat import (
     DTSF_ADD_DOT_0, INFINITY, NAN, copysign,
-    float_as_rbigint_ratio, formatd, isfinite, isinf, isnan)
+    float_as_rbigint_ratio, formatd, isfinite)
 from rpython.rlib.rstring import ParseStringError
 from rpython.rlib.unroll import unrolling_iterable
 from rpython.rtyper.lltypesystem.module.ll_math import math_fmod
@@ -37,7 +37,7 @@
     # we special-case explicitly inf and nan here
     if isfinite(x):
         s = formatd(x, code, precision, DTSF_ADD_DOT_0)
-    elif isinf(x):
+    elif math.isinf(x):
         if x > 0.0:
             s = "inf"
         else:
@@ -536,7 +536,7 @@
             # fmod returns different results across platforms; ensure
             # it has the same sign as the denominator; we'd like to do
             # "mod = y * 0.0", but that may get optimized away
-            mod = copysign(0.0, y)
+            mod = math.copysign(0.0, y)
 
         return W_FloatObject(mod)
 
@@ -647,7 +647,7 @@
         if not isfinite(value):
             return self.descr_str(space)
         if value == 0.0:
-            if copysign(1., value) == -1.:
+            if math.copysign(1., value) == -1.:
                 return space.newtext("-0x0.0p+0")
             else:
                 return space.newtext("0x0.0p+0")
@@ -731,10 +731,8 @@
 
 
 def _hash_float(space, v):
-    if not isfinite(v):
-        if isinf(v):
-            return HASH_INF if v > 0 else -HASH_INF
-        return HASH_NAN
+    if math.isnan(v):
+        return 0
 
     m, e = math.frexp(v)
 
@@ -812,16 +810,16 @@
     if y == 0.0:
         # x**0 is 1, even 0**0
         return 1.0
-    if isnan(x):
+    if math.isnan(x):
         # nan**y = nan, unless y == 0
         return x
-    if isnan(y):
+    if math.isnan(y):
         # x**nan = nan, unless x == 1; x**nan = x
         if x == 1.0:
             return 1.0
         else:
             return y
-    if isinf(y):
+    if math.isinf(y):
         # x**inf is: 0.0 if abs(x) < 1; 1.0 if abs(x) == 1; inf if
         # abs(x) > 1 (including case where x infinite)
         #
@@ -834,7 +832,7 @@
             return INFINITY
         else:
             return 0.0
-    if isinf(x):
+    if math.isinf(x):
         # (+-inf)**w is: inf for w positive, 0 for w negative; in oth
         # cases, we need to add the appropriate sign if w is an odd
         # integer.
@@ -846,7 +844,7 @@
                 return abs(x)
         else:
             if y_is_odd:
-                return copysign(0.0, x)
+                return math.copysign(0.0, x)
             else:
                 return 0.0
 
@@ -860,7 +858,7 @@
     # unlike "math.pow(-1.0, bignum)".  See http://mail.python.org/
     # -           pipermail/python-bugs-list/2003-March/016795.html
     if x < 0.0:
-        if isnan(y):
+        if math.isnan(y):
             return NAN
         if math.floor(y) != y:
             raise PowDomainError
diff --git a/pypy/objspace/std/formatting.py b/pypy/objspace/std/formatting.py
--- a/pypy/objspace/std/formatting.py
+++ b/pypy/objspace/std/formatting.py
@@ -1,10 +1,11 @@
 """String formatting routines"""
+import math
 import sys
 
 from rpython.rlib import jit
 from rpython.rlib.objectmodel import specialize
 from rpython.rlib.rarithmetic import INT_MAX
-from rpython.rlib.rfloat import DTSF_ALT, formatd, isnan, isinf
+from rpython.rlib.rfloat import DTSF_ALT, formatd
 from rpython.rlib.rstring import StringBuilder, UnicodeBuilder
 from rpython.rlib.unroll import unrolling_iterable
 from rpython.tool.sourcetools import func_with_new_name
@@ -112,12 +113,12 @@
     def format_float(self, w_value, char):
         space = self.space
         x = space.float_w(maybe_float(space, w_value))
-        if isnan(x):
+        if math.isnan(x):
             if char in 'EFG':
                 r = 'NAN'
             else:
                 r = 'nan'
-        elif isinf(x):
+        elif math.isinf(x):
             if x < 0:
                 if char in 'EFG':
                     r = '-INF'
diff --git a/pypy/objspace/std/listobject.py b/pypy/objspace/std/listobject.py
--- a/pypy/objspace/std/listobject.py
+++ b/pypy/objspace/std/listobject.py
@@ -7,6 +7,7 @@
 
 """
 
+import math
 import operator
 import sys
 
@@ -1774,11 +1775,9 @@
 
 
     def _safe_find(self, w_list, obj, start, stop):
-        from rpython.rlib.rfloat import isnan
-        #
         l = self.unerase(w_list.lstorage)
         stop = min(stop, len(l))
-        if not isnan(obj):
+        if not math.isnan(obj):
             for i in range(start, stop):
                 val = l[i]
                 if val == obj:
diff --git a/pypy/objspace/std/newformat.py b/pypy/objspace/std/newformat.py
--- a/pypy/objspace/std/newformat.py
+++ b/pypy/objspace/std/newformat.py
@@ -1,12 +1,13 @@
 """The unicode/str format() method"""
 
+import math
 import sys
 import string
 
 from pypy.interpreter.error import OperationError, oefmt
 from rpython.rlib import rstring, runicode, rlocale, rfloat, jit
 from rpython.rlib.objectmodel import specialize
-from rpython.rlib.rfloat import copysign, formatd
+from rpython.rlib.rfloat import formatd
 from rpython.rlib.rarithmetic import r_uint, intmask
 from pypy.interpreter.signature import Signature
 
@@ -1047,7 +1048,7 @@
                 default_precision = 12
                 #test if real part is non-zero
                 if (w_complex.realval == 0 and
-                    copysign(1., w_complex.realval) == 1.):
+                    math.copysign(1., w_complex.realval) == 1.):
                     skip_re = 1
                 else:
                     add_parens = 1
diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py
--- a/pypy/objspace/std/objspace.py
+++ b/pypy/objspace/std/objspace.py
@@ -144,7 +144,6 @@
         return self.fromcache(TypeCache).getorbuild(typedef)
 
     @not_rpython # only for tests
-    @specialize.argtype(1)
     def wrap(self, x):
         """ Wraps the Python value 'x' into one of the wrapper classes. This
         should only be used for tests, in real code you need to use the
diff --git a/rpython/annotator/model.py b/rpython/annotator/model.py
--- a/rpython/annotator/model.py
+++ b/rpython/annotator/model.py
@@ -30,6 +30,7 @@
 from __future__ import absolute_import
 
 import inspect
+import math
 import weakref
 from types import BuiltinFunctionType, MethodType
 from collections import OrderedDict, defaultdict
@@ -169,13 +170,12 @@
     def __eq__(self, other):
         if (type(self) is SomeFloat and type(other) is SomeFloat and
             self.is_constant() and other.is_constant()):
-            from rpython.rlib.rfloat import isnan, copysign
             # NaN unpleasantness.
-            if isnan(self.const) and isnan(other.const):
+            if math.isnan(self.const) and math.isnan(other.const):
                 return True
             # 0.0 vs -0.0 unpleasantness.
             if not self.const and not other.const:
-                return copysign(1., self.const) == copysign(1., other.const)
+                return math.copysign(1., self.const) == math.copysign(1., 
other.const)
             #
         return super(SomeFloat, self).__eq__(other)
 
diff --git a/rpython/jit/backend/test/runner_test.py 
b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -1,4 +1,4 @@
-import py, sys, random, os, struct, operator
+import py, sys, random, os, struct, operator, math
 from rpython.jit.metainterp.history import (AbstractFailDescr,
                                          AbstractDescr,
                                          BasicFailDescr,
@@ -1696,7 +1696,7 @@
         if not self.cpu.supports_floats:
             py.test.skip("requires floats")
 
-        from rpython.rlib.rfloat import INFINITY, NAN, isinf, isnan
+        from rpython.rlib.rfloat import INFINITY, NAN
         from rpython.jit.metainterp.resoperation import opname
 
         fzer = 0.0
@@ -1724,10 +1724,10 @@
                                              expectedtype)
                 if not isinstance(expected, bool):
                     got = longlong.getrealfloat(got)
-                if isnan(expected):
-                    ok = isnan(got)
-                elif isinf(expected):
-                    ok = isinf(got)
+                if math.isnan(expected):
+                    ok = math.isnan(got)
+                elif math.isinf(expected):
+                    ok = math.isinf(got)
                 else:
                     ok = got == expected
                 if not ok:
diff --git a/rpython/jit/metainterp/test/support.py 
b/rpython/jit/metainterp/test/support.py
--- a/rpython/jit/metainterp/test/support.py
+++ b/rpython/jit/metainterp/test/support.py
@@ -1,5 +1,4 @@
-
-import py, sys
+import py, sys, math
 from rpython.rtyper.lltypesystem import lltype, llmemory
 from rpython.jit.backend.llgraph import runner
 from rpython.jit.metainterp.warmspot import ll_meta_interp, get_stats
@@ -10,7 +9,6 @@
 from rpython.jit.codewriter.policy import JitPolicy
 from rpython.jit.codewriter import codewriter, longlong
 from rpython.jit.backend.llsupport.vector_ext import VectorExt
-from rpython.rlib.rfloat import isnan
 from rpython.rlib.jit import ENABLE_ALL_OPTS
 from rpython.translator.backendopt.all import backend_optimizations
 
@@ -274,11 +272,11 @@
         result1 = _run_with_blackhole(self, args)
         # try to run it with pyjitpl.py
         result2 = _run_with_pyjitpl(self, args, stats)
-        assert result1 == result2 or isnan(result1) and isnan(result2)
+        assert result1 == result2 or math.isnan(result1) and 
math.isnan(result2)
         # try to run it by running the code compiled just before
         df, result3 = _run_with_machine_code(self, args)
         self._lastframe = df
-        assert result1 == result3 or result3 == NotImplemented or 
isnan(result1) and isnan(result3)
+        assert result1 == result3 or result3 == NotImplemented or 
math.isnan(result1) and math.isnan(result3)
         #
         if (longlong.supports_longlong and
             isinstance(result1, longlong.r_float_storage)):
diff --git a/rpython/jit/metainterp/test/test_ajit.py 
b/rpython/jit/metainterp/test/test_ajit.py
--- a/rpython/jit/metainterp/test/test_ajit.py
+++ b/rpython/jit/metainterp/test/test_ajit.py
@@ -1,3 +1,4 @@
+import math
 import sys
 
 import py
@@ -3973,7 +3974,6 @@
         assert res == 3
 
     def test_float_bytes(self):
-        from rpython.rlib.rfloat import isnan
         def f(n):
             ll = float2longlong(n)
             return longlong2float(ll)
@@ -3981,7 +3981,7 @@
         for x in [2.5, float("nan"), -2.5, float("inf")]:
             # There are tests elsewhere to verify the correctness of this.
             res = self.interp_operations(f, [x])
-            assert res == x or isnan(x) and isnan(res)
+            assert res == x or math.isnan(x) and math.isnan(res)
 
 
 class TestLLtype(BaseLLtypeTests, LLJitMixin):
diff --git a/rpython/jit/metainterp/test/test_math.py 
b/rpython/jit/metainterp/test/test_math.py
--- a/rpython/jit/metainterp/test/test_math.py
+++ b/rpython/jit/metainterp/test/test_math.py
@@ -1,6 +1,6 @@
 import math
 from rpython.jit.metainterp.test.support import LLJitMixin
-from rpython.rlib.rfloat import isinf, isnan, INFINITY, NAN
+from rpython.rlib.rfloat import INFINITY, NAN
 
 class MathTests:
 
@@ -32,11 +32,11 @@
         self.check_operations_history(call_pure_f=0)
         #
         res = self.interp_operations(f, [INFINITY])
-        assert isinf(res) and not isnan(res) and res > 0.0
+        assert math.isinf(res) and not math.isnan(res) and res > 0.0
         self.check_operations_history(call_pure_f=0)
         #
         res = self.interp_operations(f, [NAN])
-        assert isnan(res) and not isinf(res)
+        assert math.isnan(res) and not math.isinf(res)
         self.check_operations_history(call_pure_f=0)
 
 
diff --git a/rpython/jit/metainterp/test/test_zvector.py 
b/rpython/jit/metainterp/test/test_zvector.py
--- a/rpython/jit/metainterp/test/test_zvector.py
+++ b/rpython/jit/metainterp/test/test_zvector.py
@@ -11,7 +11,6 @@
 from rpython.jit.metainterp import history
 from rpython.rlib.jit import JitDriver, hint, set_param
 from rpython.rlib.objectmodel import compute_hash
-from rpython.rlib import rfloat
 from rpython.rtyper.lltypesystem import lltype, rffi
 from rpython.rlib.rarithmetic import r_uint, intmask, r_int
 from rpython.rlib.rawstorage import (alloc_raw_storage, raw_storage_setitem,
@@ -309,7 +308,7 @@
                                 reds = 'auto',
                                 vectorize=True)
         def fmax(v1, v2):
-            return v1 if v1 >= v2 or rfloat.isnan(v2) else v2
+            return v1 if v1 >= v2 or math.isnan(v2) else v2
         T = lltype.Array(rffi.DOUBLE, hints={'nolength': True})
         def f(d):
             i = 0
diff --git a/rpython/rlib/constant.py b/rpython/rlib/constant.py
--- a/rpython/rlib/constant.py
+++ b/rpython/rlib/constant.py
@@ -1,5 +1,4 @@
 import math
-from rpython.rlib.rfloat import isinf
 from rpython.rtyper.tool import rffi_platform
 from rpython.translator.tool.cbuild import ExternalCompilationInfo
 
@@ -18,7 +17,7 @@
 
 
 assert 0.0 < DBL_MAX < (1e200*1e200)
-assert isinf(DBL_MAX * 1.0001)
+assert math.isinf(DBL_MAX * 1.0001)
 assert DBL_MIN > 0.0
 assert DBL_MIN * (2**-53) == 0.0
 
diff --git a/rpython/rlib/objectmodel.py b/rpython/rlib/objectmodel.py
--- a/rpython/rlib/objectmodel.py
+++ b/rpython/rlib/objectmodel.py
@@ -549,9 +549,9 @@
     In RPython, floats cannot be used with ints in dicts, anyway.
     """
     from rpython.rlib.rarithmetic import intmask
-    from rpython.rlib.rfloat import isfinite, isinf
+    from rpython.rlib.rfloat import isfinite
     if not isfinite(f):
-        if isinf(f):
+        if math.isinf(f):
             if f < 0.0:
                 return -271828
             else:
diff --git a/rpython/rlib/rarithmetic.py b/rpython/rlib/rarithmetic.py
--- a/rpython/rlib/rarithmetic.py
+++ b/rpython/rlib/rarithmetic.py
@@ -36,7 +36,7 @@
 
 
 """
-import sys, struct
+import sys, struct, math
 from rpython.rtyper import extregistry
 from rpython.rlib import objectmodel
 from rpython.flowspace.model import Constant, const
@@ -191,8 +191,7 @@
 # Note the "<= x <" here, as opposed to "< x <" above.
 # This is justified by test_typed in translator/c/test.
 def ovfcheck_float_to_longlong(x):
-    from rpython.rlib.rfloat import isnan
-    if isnan(x):
+    if math.isnan(x):
         raise OverflowError
     if -9223372036854776832.0 <= x < 9223372036854775296.0:
         return r_longlong(x)
@@ -200,8 +199,7 @@
 
 if sys.maxint == 2147483647:
     def ovfcheck_float_to_int(x):
-        from rpython.rlib.rfloat import isnan
-        if isnan(x):
+        if math.isnan(x):
             raise OverflowError
         if -2147483649.0 < x < 2147483648.0:
             return int(x)
diff --git a/rpython/rlib/rbigint.py b/rpython/rlib/rbigint.py
--- a/rpython/rlib/rbigint.py
+++ b/rpython/rlib/rbigint.py
@@ -1,7 +1,6 @@
 from rpython.rlib.rarithmetic import LONG_BIT, intmask, longlongmask, r_uint, 
r_ulonglong
 from rpython.rlib.rarithmetic import ovfcheck, r_longlong, widen
 from rpython.rlib.rarithmetic import most_neg_value_of_same_type
-from rpython.rlib.rfloat import isinf, isnan
 from rpython.rlib.rstring import StringBuilder
 from rpython.rlib.debug import make_sure_not_resized, check_regular_int
 from rpython.rlib.objectmodel import we_are_translated, specialize, not_rpython
@@ -227,9 +226,9 @@
     def fromfloat(dval):
         """ Create a new bigint object from a float """
         # This function is not marked as pure because it can raise
-        if isinf(dval):
+        if math.isinf(dval):
             raise OverflowError("cannot convert float infinity to integer")
-        if isnan(dval):
+        if math.isnan(dval):
             raise ValueError("cannot convert float NaN to integer")
         return rbigint._fromfloat_finite(dval)
 
diff --git a/rpython/rlib/rcomplex.py b/rpython/rlib/rcomplex.py
--- a/rpython/rlib/rcomplex.py
+++ b/rpython/rlib/rcomplex.py
@@ -1,6 +1,6 @@
 import math
 from math import fabs
-from rpython.rlib.rfloat import copysign, asinh, log1p, isfinite, isinf, isnan
+from rpython.rlib.rfloat import asinh, log1p, isfinite
 from rpython.rlib.constant import DBL_MIN, CM_SCALE_UP, CM_SCALE_DOWN
 from rpython.rlib.constant import CM_LARGE_DOUBLE, DBL_MANT_DIG
 from rpython.rlib.constant import M_LN2, M_LN10
@@ -57,7 +57,7 @@
             denom = r2 + i2 * ratio
             rr = (r1 + i1 * ratio) / denom
             ir = (i1 - r1 * ratio) / denom
-    elif isnan(r2):
+    elif math.isnan(r2):
         rr = NAN
         ir = NAN
     else:
@@ -151,9 +151,9 @@
     d = ay/(2.*s)
 
     if x >= 0.:
-        return (s, copysign(d, y))
+        return (s, math.copysign(d, y))
     else:
-        return (d, copysign(s, y))
+        return (d, math.copysign(s, y))
 
 
 
@@ -167,10 +167,10 @@
         # split into cases to make sure that the branch cut has the
         # correct continuity on systems with unsigned zeros
         if x < 0.:
-            imag = -copysign(math.log(math.hypot(x/2., y/2.)) +
+            imag = -math.copysign(math.log(math.hypot(x/2., y/2.)) +
                              M_LN2*2., y)
         else:
-            imag = copysign(math.log(math.hypot(x/2., y/2.)) +
+            imag = math.copysign(math.log(math.hypot(x/2., y/2.)) +
                             M_LN2*2., -y)
     else:
         s1x, s1y = c_sqrt(1.-x, -y)
@@ -210,10 +210,10 @@
 
     if fabs(x) > CM_LARGE_DOUBLE or fabs(y) > CM_LARGE_DOUBLE:
         if y >= 0.:
-            real = copysign(math.log(math.hypot(x/2., y/2.)) +
+            real = math.copysign(math.log(math.hypot(x/2., y/2.)) +
                             M_LN2*2., x)
         else:
-            real = -copysign(math.log(math.hypot(x/2., y/2.)) +
+            real = -math.copysign(math.log(math.hypot(x/2., y/2.)) +
                              M_LN2*2., -x)
         imag = math.atan2(y, fabs(x))
     else:
@@ -249,7 +249,7 @@
         # except when working with unsigned zeros: they're there to
         # ensure that the branch cut has the correct continuity on
         # systems that don't support signed zeros
-        imag = -copysign(math.pi/2., -y)
+        imag = -math.copysign(math.pi/2., -y)
     elif x == 1. and ay < CM_SQRT_DBL_MIN:
         # C99 standard says:  atanh(1+/-0.) should be inf +/- 0i
         if ay == 0.:
@@ -258,7 +258,7 @@
             #imag = y
         else:
             real = -math.log(math.sqrt(ay)/math.sqrt(math.hypot(ay, 2.)))
-            imag = copysign(math.atan2(2., -ay) / 2, y)
+            imag = math.copysign(math.atan2(2., -ay) / 2, y)
     else:
         real = log1p(4.*x/((1-x)*(1-x) + ay*ay))/4.
         imag = -math.atan2(-2.*y, (1-x)*(1+x) - ay*ay) / 2.
@@ -330,20 +330,20 @@
 
 def c_exp(x, y):
     if not isfinite(x) or not isfinite(y):
-        if isinf(x) and isfinite(y) and y != 0.:
+        if math.isinf(x) and isfinite(y) and y != 0.:
             if x > 0:
-                real = copysign(INF, math.cos(y))
-                imag = copysign(INF, math.sin(y))
+                real = math.copysign(INF, math.cos(y))
+                imag = math.copysign(INF, math.sin(y))
             else:
-                real = copysign(0., math.cos(y))
-                imag = copysign(0., math.sin(y))
+                real = math.copysign(0., math.cos(y))
+                imag = math.copysign(0., math.sin(y))
             r = (real, imag)
         else:
             r = exp_special_values[special_type(x)][special_type(y)]
 
         # need to raise ValueError if y is +/- infinity and x is not
         # a NaN and not -infinity
-        if isinf(y) and (isfinite(x) or (isinf(x) and x > 0)):
+        if math.isinf(y) and (isfinite(x) or (math.isinf(x) and x > 0)):
             raise ValueError("math domain error")
         return r
 
@@ -355,40 +355,40 @@
         l = math.exp(x)
         real = l * math.cos(y)
         imag = l * math.sin(y)
-    if isinf(real) or isinf(imag):
+    if math.isinf(real) or math.isinf(imag):
         raise OverflowError("math range error")
     return real, imag
 
 
 def c_cosh(x, y):
     if not isfinite(x) or not isfinite(y):
-        if isinf(x) and isfinite(y) and y != 0.:
+        if math.isinf(x) and isfinite(y) and y != 0.:
             if x > 0:
-                real = copysign(INF, math.cos(y))
-                imag = copysign(INF, math.sin(y))
+                real = math.copysign(INF, math.cos(y))
+                imag = math.copysign(INF, math.sin(y))
             else:
-                real = copysign(INF, math.cos(y))
-                imag = -copysign(INF, math.sin(y))
+                real = math.copysign(INF, math.cos(y))
+                imag = -math.copysign(INF, math.sin(y))
             r = (real, imag)
         else:
             r = cosh_special_values[special_type(x)][special_type(y)]
 
         # need to raise ValueError if y is +/- infinity and x is not
         # a NaN
-        if isinf(y) and not isnan(x):
+        if math.isinf(y) and not math.isnan(x):
             raise ValueError("math domain error")
         return r
 
     if fabs(x) > CM_LOG_LARGE_DOUBLE:
         # deal correctly with cases where cosh(x) overflows but
         # cosh(z) does not.
-        x_minus_one = x - copysign(1., x)
+        x_minus_one = x - math.copysign(1., x)
         real = math.cos(y) * math.cosh(x_minus_one) * math.e
         imag = math.sin(y) * math.sinh(x_minus_one) * math.e
     else:
         real = math.cos(y) * math.cosh(x)
         imag = math.sin(y) * math.sinh(x)
-    if isinf(real) or isinf(imag):
+    if math.isinf(real) or math.isinf(imag):
         raise OverflowError("math range error")
     return real, imag
 
@@ -396,31 +396,31 @@
 def c_sinh(x, y):
     # special treatment for sinh(+/-inf + iy) if y is finite and nonzero
     if not isfinite(x) or not isfinite(y):
-        if isinf(x) and isfinite(y) and y != 0.:
+        if math.isinf(x) and isfinite(y) and y != 0.:
             if x > 0:
-                real = copysign(INF, math.cos(y))
-                imag = copysign(INF, math.sin(y))
+                real = math.copysign(INF, math.cos(y))
+                imag = math.copysign(INF, math.sin(y))
             else:
-                real = -copysign(INF, math.cos(y))
-                imag = copysign(INF, math.sin(y))
+                real = -math.copysign(INF, math.cos(y))
+                imag = math.copysign(INF, math.sin(y))
             r = (real, imag)
         else:
             r = sinh_special_values[special_type(x)][special_type(y)]
 
         # need to raise ValueError if y is +/- infinity and x is not
         # a NaN
-        if isinf(y) and not isnan(x):
+        if math.isinf(y) and not math.isnan(x):
             raise ValueError("math domain error")
         return r
 
     if fabs(x) > CM_LOG_LARGE_DOUBLE:
-        x_minus_one = x - copysign(1., x)
+        x_minus_one = x - math.copysign(1., x)
         real = math.cos(y) * math.sinh(x_minus_one) * math.e
         imag = math.sin(y) * math.cosh(x_minus_one) * math.e
     else:
         real = math.cos(y) * math.sinh(x)
         imag = math.sin(y) * math.cosh(x)
-    if isinf(real) or isinf(imag):
+    if math.isinf(real) or math.isinf(imag):
         raise OverflowError("math range error")
     return real, imag
 
@@ -437,24 +437,24 @@
     #   computation of cosh(x).
 
     if not isfinite(x) or not isfinite(y):
-        if isinf(x) and isfinite(y) and y != 0.:
+        if math.isinf(x) and isfinite(y) and y != 0.:
             if x > 0:
                 real = 1.0        # vv XXX why is the 2. there?
-                imag = copysign(0., 2. * math.sin(y) * math.cos(y))
+                imag = math.copysign(0., 2. * math.sin(y) * math.cos(y))
             else:
                 real = -1.0
-                imag = copysign(0., 2. * math.sin(y) * math.cos(y))
+                imag = math.copysign(0., 2. * math.sin(y) * math.cos(y))
             r = (real, imag)
         else:
             r = tanh_special_values[special_type(x)][special_type(y)]
 
         # need to raise ValueError if y is +/-infinity and x is finite
-        if isinf(y) and isfinite(x):
+        if math.isinf(y) and isfinite(x):
             raise ValueError("math domain error")
         return r
 
     if fabs(x) > CM_LOG_LARGE_DOUBLE:
-        real = copysign(1., x)
+        real = math.copysign(1., x)
         imag = 4. * math.sin(y) * math.cos(y) * math.exp(-2.*fabs(x))
     else:
         tx = math.tanh(x)
@@ -487,20 +487,20 @@
         # if r is +/-infinity and phi is finite but nonzero then
         # result is (+-INF +-INF i), but we need to compute cos(phi)
         # and sin(phi) to figure out the signs.
-        if isinf(r) and isfinite(phi) and phi != 0.:
+        if math.isinf(r) and isfinite(phi) and phi != 0.:
             if r > 0:
-                real = copysign(INF, math.cos(phi))
-                imag = copysign(INF, math.sin(phi))
+                real = math.copysign(INF, math.cos(phi))
+                imag = math.copysign(INF, math.sin(phi))
             else:
-                real = -copysign(INF, math.cos(phi))
-                imag = -copysign(INF, math.sin(phi))
+                real = -math.copysign(INF, math.cos(phi))
+                imag = -math.copysign(INF, math.sin(phi))
             z = (real, imag)
         else:
             z = rect_special_values[special_type(r)][special_type(phi)]
 
         # need to raise ValueError if r is a nonzero number and phi
         # is infinite
-        if r != 0. and not isnan(r) and isinf(phi):
+        if r != 0. and not math.isnan(r) and math.isinf(phi):
             raise ValueError("math domain error")
         return z
 
@@ -512,25 +512,25 @@
 def c_phase(x, y):
     # Windows screws up atan2 for inf and nan, and alpha Tru64 5.1 doesn't
     # follow C99 for atan2(0., 0.).
-    if isnan(x) or isnan(y):
+    if math.isnan(x) or math.isnan(y):
         return NAN
-    if isinf(y):
-        if isinf(x):
-            if copysign(1., x) == 1.:
+    if math.isinf(y):
+        if math.isinf(x):
+            if math.copysign(1., x) == 1.:
                 # atan2(+-inf, +inf) == +-pi/4
-                return copysign(0.25 * math.pi, y)
+                return math.copysign(0.25 * math.pi, y)
             else:
                 # atan2(+-inf, -inf) == +-pi*3/4
-                return copysign(0.75 * math.pi, y)
+                return math.copysign(0.75 * math.pi, y)
         # atan2(+-inf, x) == +-pi/2 for finite x
-        return copysign(0.5 * math.pi, y)
-    if isinf(x) or y == 0.:
-        if copysign(1., x) == 1.:
+        return math.copysign(0.5 * math.pi, y)
+    if math.isinf(x) or y == 0.:
+        if math.copysign(1., x) == 1.:
             # atan2(+-y, +inf) = atan2(+-0, +x) = +-0.
-            return copysign(0., y)
+            return math.copysign(0., y)
         else:
             # atan2(+-y, -inf) = atan2(+-0., -x) = +-pi.
-            return copysign(math.pi, y)
+            return math.copysign(math.pi, y)
     return math.atan2(y, x)
 
 
@@ -538,9 +538,9 @@
     if not isfinite(r) or not isfinite(i):
         # C99 rules: if either the real or the imaginary part is an
         # infinity, return infinity, even if the other part is a NaN.
-        if isinf(r):
+        if math.isinf(r):
             return INF
-        if isinf(i):
+        if math.isinf(i):
             return INF
 
         # either the real or imaginary part is a NaN,
@@ -560,11 +560,11 @@
 
 
 def c_isinf(r, i):
-    return isinf(r) or isinf(i)
+    return math.isinf(r) or math.isinf(i)
 
 
 def c_isnan(r, i):
-    return isnan(r) or isnan(i)
+    return math.isnan(r) or math.isnan(i)
 
 
 def c_isfinite(r, i):
diff --git a/rpython/rlib/rfloat.py b/rpython/rlib/rfloat.py
--- a/rpython/rlib/rfloat.py
+++ b/rpython/rlib/rfloat.py
@@ -1,7 +1,7 @@
 """Float constants"""
 
 import math, struct
-from math import isinf, isnan, copysign, acosh, asinh, atanh, log1p, expm1
+from math import acosh, asinh, atanh, log1p, expm1
 
 from rpython.annotator.model import SomeString, SomeChar
 from rpython.rlib import objectmodel, unroll
@@ -85,7 +85,7 @@
 def double_to_string(value, tp, precision, flags):
     if isfinite(value):
         special = DIST_FINITE
-    elif isinf(value):
+    elif math.isinf(value):
         special = DIST_INFINITY
     else:  #isnan(value):
         special = DIST_NAN
@@ -131,7 +131,7 @@
     # multiple of 0.5 * 10**n for n >= 23 takes at least 54 bits of
     # precision to represent exactly.
 
-    sign = copysign(1.0, value)
+    sign = math.copysign(1.0, value)
     value = abs(value)
 
     # find 2-valuation value
@@ -204,7 +204,7 @@
     #   (a) produce exact results for powers of 2, and
     #   (b) be monotonic, assuming that the system log is monotonic.
     if not isfinite(x):
-        if isnan(x):
+        if math.isnan(x):
             return x  # log2(nan) = nan
         elif x > 0.0:
             return x  # log2(+inf) = +inf
@@ -234,7 +234,7 @@
     absx = abs(x)
     r = math.floor(absx + 0.5)
     if r - absx < 1.0:
-        return copysign(r, x)
+        return math.copysign(r, x)
     else:
         # 'absx' is just in the wrong range: its exponent is precisely
         # the one for which all integers are representable but not any
@@ -258,18 +258,18 @@
         # absx == n + 0.5  for a non-negative integer 'n'
         # absx * 0.5 == n//2 + 0.25 or 0.75, which we round to nearest
         r = math.floor(absx * 0.5 + 0.5) * 2.0
-    return copysign(r, x)
+    return math.copysign(r, x)
 
 @not_rpython
 def isfinite(x):
-    return not isinf(x) and not isnan(x)
+    return not math.isinf(x) and not math.isnan(x)
 
 def float_as_rbigint_ratio(value):
     from rpython.rlib.rbigint import rbigint
 
-    if isinf(value):
+    if math.isinf(value):
         raise OverflowError("cannot pass infinity to as_integer_ratio()")
-    elif isnan(value):
+    elif math.isnan(value):
         raise ValueError("cannot pass nan to as_integer_ratio()")
     float_part, exp_int = math.frexp(value)
     for i in range(300):
@@ -327,7 +327,7 @@
 
 def erf(x):
     """The error function at x."""
-    if isnan(x):
+    if math.isnan(x):
         return x
     absx = abs(x)
     if absx < ERF_SERIES_CUTOFF:
@@ -338,7 +338,7 @@
 
 def erfc(x):
     """The complementary error function at x."""
-    if isnan(x):
+    if math.isnan(x):
         return x
     absx = abs(x)
     if absx < ERF_SERIES_CUTOFF:
@@ -362,7 +362,7 @@
         r = math.sin(math.pi * (y - 2.))
     else:
         raise AssertionError("should not reach")
-    return copysign(1., x) * r
+    return math.copysign(1., x) * r
 
 _lanczos_g = 6.024680040776729583740234375
 _lanczos_g_minus_half = 5.524680040776729583740234375
@@ -410,9 +410,9 @@
 
 def gamma(x):
     """Compute the gamma function for x."""
-    if isnan(x) or (isinf(x) and x > 0.):
+    if math.isnan(x) or (math.isinf(x) and x > 0.):
         return x
-    if isinf(x):
+    if math.isinf(x):
         raise ValueError("math domain error")
     if x == 0.:
         raise ValueError("math domain error")
@@ -424,7 +424,7 @@
     absx = abs(x)
     if absx < 1e-20:
         r = 1. / x
-        if isinf(r):
+        if math.isinf(r):
             raise OverflowError("math range error")
         return r
     if absx > 200.:
@@ -458,15 +458,15 @@
             sqrtpow = math.pow(y, absx / 2. - .25)
             r *= sqrtpow
             r *= sqrtpow
-    if isinf(r):
+    if math.isinf(r):
         raise OverflowError("math range error")
     return r
 
 def lgamma(x):
     """Compute the natural logarithm of the gamma function for x."""
-    if isnan(x):
+    if math.isnan(x):
         return x
-    if isinf(x):
+    if math.isinf(x):
         return INFINITY
     if x == math.floor(x) and x <= 2.:
         if x <= 0.:
@@ -482,7 +482,7 @@
         r = (math.log(math.pi) - math.log(abs(_sinpi(absx))) - math.log(absx) -
              (math.log(_lanczos_sum(absx)) - _lanczos_g +
               (absx - .5) * (math.log(absx + _lanczos_g - .5) - 1)))
-    if isinf(r):
+    if math.isinf(r):
         raise OverflowError("math domain error")
     return r
 
diff --git a/rpython/rlib/rstruct/ieee.py b/rpython/rlib/rstruct/ieee.py
--- a/rpython/rlib/rstruct/ieee.py
+++ b/rpython/rlib/rstruct/ieee.py
@@ -151,11 +151,11 @@
     else:
         raise ValueError("invalid size value")
 
-    sign = rfloat.copysign(1.0, x) < 0.0
-    if rfloat.isinf(x):
+    sign = math.copysign(1.0, x) < 0.0
+    if math.isinf(x):
         mant = r_ulonglong(0)
         exp = MAX_EXP - MIN_EXP + 2
-    elif rfloat.isnan(x):
+    elif math.isnan(x):
         asint = cast(ULONGLONG, float2longlong(x))
         sign = asint >> 63
         # shift off lower bits, perhaps losing data
@@ -216,11 +216,11 @@
     else:
         raise ValueError("invalid size value")
 
-    sign = rfloat.copysign(1.0, x) < 0.0
-    if rfloat.isinf(x):
+    sign = math.copysign(1.0, x) < 0.0
+    if math.isinf(x):
         mant = r_ulonglong(0)
         exp = MAX_EXP - MIN_EXP + 2
-    elif rfloat.isnan(x):  # rfloat.isnan(x):
+    elif math.isnan(x):
         asint = cast(ULONGLONG, float2longlong(x))
         mant = asint & ((r_ulonglong(1) << 51) - 1)
         if mant == 0:
diff --git a/rpython/rlib/rstruct/test/test_ieee.py 
b/rpython/rlib/rstruct/test/test_ieee.py
--- a/rpython/rlib/rstruct/test/test_ieee.py
+++ b/rpython/rlib/rstruct/test/test_ieee.py
@@ -1,3 +1,4 @@
+import math
 import py
 import sys
 import random
@@ -5,7 +6,7 @@
 
 from rpython.rlib.mutbuffer import MutableStringBuffer
 from rpython.rlib.rstruct import ieee
-from rpython.rlib.rfloat import isnan, NAN, INFINITY
+from rpython.rlib.rfloat import NAN, INFINITY
 from rpython.translator.c.test.test_genc import compile
 
 
@@ -30,7 +31,6 @@
             assert f == ieee.float_unpack(h, 2)
 
     def test_halffloat_overunderflow(self):
-        import math
         cases = [[670000, float('inf')], [-67000, -float('inf')],
                  [1e-08, 0], [-1e-8, -0.]]
         for f1, f2 in cases:
@@ -59,9 +59,6 @@
 
 
 class TestFloatPacking:
-    def setup_class(cls):
-        if sys.version_info < (2, 6):
-            py.test.skip("the 'struct' module of this old CPython is broken")
 
     def check_float(self, x):
         # check roundtrip
@@ -176,7 +173,7 @@
             # nans are tricky:  we can't hope to reproduce the bit
             # pattern exactly, so check_float will fail for a nan
             # whose mantissa does not fit into float16's mantissa.
-            if isnan(x) and (Q & mantissa_mask) >=  1 << 11:
+            if math.isnan(x) and (Q & mantissa_mask) >=  1 << 11:
                 continue
             self.check_float(x)
 
@@ -189,7 +186,7 @@
         for i in range(20):
             val_to_preserve = exp | ((maxmant16 - i) << 42)
             a = ieee.float_unpack(val_to_preserve, 8)
-            assert isnan(a), 'i %d, maxmant %s' % (i, hex(val_to_preserve))
+            assert math.isnan(a), 'i %d, maxmant %s' % (i, 
hex(val_to_preserve))
             b = ieee.float_pack(a, 8)
             assert b == val_to_preserve, 'i %d, val %s b %s' % (i, 
hex(val_to_preserve), hex(b)) 
             b = ieee.float_pack(a, 2)
@@ -214,14 +211,14 @@
 
         def check_roundtrip(x, size):
             s = c_pack(x, size)
-            if not isnan(x):
+            if not math.isnan(x):
                 # pack uses copysign which is ambiguous for NAN
                 assert s == pack(x, size)
                 assert unpack(s) == x
                 assert c_unpack(s) == x
             else:
-                assert isnan(unpack(s))
-                assert isnan(c_unpack(s))
+                assert math.isnan(unpack(s))
+                assert math.isnan(c_unpack(s))
 
         for size in [2, 4, 8]:
             check_roundtrip(123.4375, size)
diff --git a/rpython/rlib/special_value.py b/rpython/rlib/special_value.py
--- a/rpython/rlib/special_value.py
+++ b/rpython/rlib/special_value.py
@@ -1,5 +1,4 @@
 import math
-from rpython.rlib.rfloat import isnan, isinf, copysign
 
 # code to deal with special values (infinities, NaNs, ...)
 #
@@ -13,9 +12,9 @@
 ST_NAN     = 6         # Not a Number
 
 def special_type(d):
-    if isnan(d):
+    if math.isnan(d):
         return ST_NAN
-    elif isinf(d):
+    elif math.isinf(d):
         if d > 0.0:
             return ST_PINF
         else:
@@ -27,7 +26,7 @@
             else:
                 return ST_NEG
         else:
-            if copysign(1., d) == 1.:
+            if math.copysign(1., d) == 1.:
                 return ST_PZERO
             else:
                 return ST_NZERO
@@ -166,4 +165,4 @@
     (N,N),   (N,N), (N,Z),    (N,Z),     (N,N), (N,N),   (N,N),
     ])
 
-assert copysign(1., acosh_special_values[5][2][1]) == -1.
+assert math.copysign(1., acosh_special_values[5][2][1]) == -1.
diff --git a/rpython/rlib/test/test_longlong2float.py 
b/rpython/rlib/test/test_longlong2float.py
--- a/rpython/rlib/test/test_longlong2float.py
+++ b/rpython/rlib/test/test_longlong2float.py
@@ -1,3 +1,4 @@
+import math
 from rpython.translator.c.test.test_genc import compile
 from rpython.rlib.longlong2float import longlong2float, float2longlong
 from rpython.rlib.longlong2float import uint2singlefloat, singlefloat2uint
@@ -74,7 +75,6 @@
     from rpython.rlib.longlong2float import encode_int32_into_longlong_nan
     from rpython.rlib.longlong2float import decode_int32_from_longlong_nan
     from rpython.rlib.longlong2float import is_int32_from_longlong_nan
-    from rpython.rlib.rfloat import isnan
     assert can_encode_float(f1)
     assert can_encode_int32(i2)
     l1 = float2longlong(f1)
@@ -82,7 +82,7 @@
     assert not is_int32_from_longlong_nan(l1)
     assert is_int32_from_longlong_nan(l2)
     f1b = longlong2float(l1)
-    assert f1b == f1 or (isnan(f1b) and isnan(f1))
+    assert f1b == f1 or (math.isnan(f1b) and math.isnan(f1))
     assert decode_int32_from_longlong_nan(l2) == i2
     return 42
 
diff --git a/rpython/rlib/test/test_rcomplex.py 
b/rpython/rlib/test/test_rcomplex.py
--- a/rpython/rlib/test/test_rcomplex.py
+++ b/rpython/rlib/test/test_rcomplex.py
@@ -1,7 +1,6 @@
 from __future__ import with_statement
 
 import rpython.rlib.rcomplex as c
-from rpython.rlib.rfloat import copysign, isnan, isinf
 import os, sys, math, struct
 
 
@@ -120,12 +119,12 @@
     """
 
     # special values testing
-    if isnan(a):
-        if isnan(b):
+    if math.isnan(a):
+        if math.isnan(b):
             return
         raise AssertionError(msg + '%r should be nan' % (b,))
 
-    if isinf(a):
+    if math.isinf(a):
         if a == b:
             return
         raise AssertionError(msg + 'finite result where infinity expected: '
@@ -136,8 +135,7 @@
     # and b to have opposite signs; in practice these hardly ever
     # occur).
     if not a and not b:
-        # only check it if we are running on top of CPython >= 2.6
-        if sys.version_info >= (2, 6) and copysign(1., a) != copysign(1., b):
+        if math.copysign(1., a) != math.copysign(1., b):
             raise AssertionError(msg + 'zero has wrong sign: expected %r, '
                                        'got %r' % (a, b))
 
diff --git a/rpython/rlib/test/test_rfloat.py b/rpython/rlib/test/test_rfloat.py
--- a/rpython/rlib/test/test_rfloat.py
+++ b/rpython/rlib/test/test_rfloat.py
@@ -1,21 +1,13 @@
-import sys, py
+import sys, py, math
 
 from rpython.rlib.rfloat import float_as_rbigint_ratio
-from rpython.rlib.rfloat import copysign
 from rpython.rlib.rfloat import round_away
 from rpython.rlib.rfloat import round_double
-from rpython.rlib.rfloat import erf, erfc, gamma, lgamma, isnan
+from rpython.rlib.rfloat import erf, erfc, gamma, lgamma
 from rpython.rlib.rfloat import ulps_check, acc_check
 from rpython.rlib.rfloat import string_to_float
 from rpython.rlib.rbigint import rbigint
 
-def test_copysign():
-    assert copysign(1, 1) == 1
-    assert copysign(-1, 1) == 1
-    assert copysign(-1, -1) == -1
-    assert copysign(1, -1) == -1
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to