[pypy-commit] pypy remove-remaining-smm: Kill complextype.py, kill conjugate SMM.

Manuel Jacob noreply at buildbot.pypy.org
Sun Feb 23 22:16:38 CET 2014


Author: Manuel Jacob
Branch: remove-remaining-smm
Changeset: r69299:4286faa95835
Date: 2014-02-23 21:36 +0100
http://bitbucket.org/pypy/pypy/changeset/4286faa95835/

Log:	Kill complextype.py, kill conjugate SMM.

diff --git a/pypy/module/micronumpy/interp_boxes.py b/pypy/module/micronumpy/interp_boxes.py
--- a/pypy/module/micronumpy/interp_boxes.py
+++ b/pypy/module/micronumpy/interp_boxes.py
@@ -6,7 +6,7 @@
 from pypy.objspace.std.floattype import float_typedef
 from pypy.objspace.std.unicodeobject import W_UnicodeObject
 from pypy.objspace.std.intobject import W_IntObject
-from pypy.objspace.std.complextype import complex_typedef
+from pypy.objspace.std.complexobject import W_ComplexObject
 from rpython.rlib.rarithmetic import LONG_BIT
 from rpython.rtyper.lltypesystem import rffi
 from rpython.tool.sourcetools import func_with_new_name
@@ -770,7 +770,7 @@
     imag = GetSetProperty(W_ComplexFloatingBox.descr_get_imag),
 )
 
-W_Complex128Box.typedef = TypeDef("complex128", (W_ComplexFloatingBox.typedef, complex_typedef),
+W_Complex128Box.typedef = TypeDef("complex128", (W_ComplexFloatingBox.typedef, W_ComplexObject.typedef),
     __module__ = "numpy",
     __new__ = interp2app(W_Complex128Box.descr__new__.im_func),
     __reduce__ = interp2app(W_Complex128Box.descr_reduce),
@@ -785,7 +785,7 @@
         __reduce__ = interp2app(W_FloatLongBox.descr_reduce),
     )
 
-    W_ComplexLongBox.typedef = TypeDef("complex%d" % (long_double_size * 16), (W_ComplexFloatingBox.typedef, complex_typedef),
+    W_ComplexLongBox.typedef = TypeDef("complex%d" % (long_double_size * 16), (W_ComplexFloatingBox.typedef, W_ComplexObject.typedef),
         __module__ = "numpy",
         __new__ = interp2app(W_ComplexLongBox.descr__new__.im_func),
         __reduce__ = interp2app(W_ComplexLongBox.descr_reduce),
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
@@ -1,18 +1,27 @@
-from pypy.interpreter import gateway
-from pypy.interpreter.error import OperationError
+import math
+
+from pypy.interpreter.error import OperationError, oefmt
+from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault
 from pypy.objspace.std import newformat
+from pypy.objspace.std.floatobject import W_FloatObject, _hash_float
 from pypy.objspace.std.intobject import W_IntObject
+from pypy.objspace.std.longobject import W_LongObject
 from pypy.objspace.std.model import registerimplementation, W_Object
+from pypy.objspace.std.noneobject import W_NoneObject
 from pypy.objspace.std.register_all import register_all
-from pypy.objspace.std.floatobject import W_FloatObject, _hash_float
-from pypy.objspace.std.longobject import W_LongObject
+from pypy.objspace.std.stdtypedef import GetSetProperty, StdTypeDef
+from rpython.rlib import jit, rcomplex
+from rpython.rlib.rarithmetic import intmask, r_ulonglong
 from rpython.rlib.rbigint import rbigint
 from rpython.rlib.rfloat import (
-    formatd, DTSF_STR_PRECISION, isinf, isnan, copysign)
-from rpython.rlib import jit, rcomplex
-from rpython.rlib.rarithmetic import intmask, r_ulonglong
+    formatd, DTSF_STR_PRECISION, isinf, isnan, copysign, string_to_float)
+from rpython.rlib.rstring import ParseStringError
 
-import math
+
+# ERRORCODES
+
+ERR_WRONG_SECOND = "complex() can't take second arg if first is a string"
+ERR_MALFORMED = "complex() arg is a malformed string"
 
 
 class W_AbstractComplexObject(W_Object):
@@ -47,10 +56,168 @@
         return space.newlong_from_rbigint(val)
 
 
+def _split_complex(s):
+    slen = len(s)
+    if slen == 0:
+        raise ValueError
+    realstart = 0
+    realstop = 0
+    imagstart = 0
+    imagstop = 0
+    imagsign = ' '
+    i = 0
+    # ignore whitespace at beginning and end
+    while i < slen and s[i] == ' ':
+        i += 1
+    while slen > 0 and s[slen-1] == ' ':
+        slen -= 1
+
+    if s[i] == '(' and s[slen-1] == ')':
+        i += 1
+        slen -= 1
+        # ignore whitespace after bracket
+        while i < slen and s[i] == ' ':
+            i += 1
+
+    # extract first number
+    realstart = i
+    pc = s[i]
+    while i < slen and s[i] != ' ':
+        if s[i] in ('+','-') and pc not in ('e','E') and i != realstart:
+            break
+        pc = s[i]
+        i += 1
+
+    realstop = i
+
+    # ignore whitespace
+    while i < slen and s[i] == ' ':
+        i += 1
+
+    # return appropriate strings is only one number is there
+    if i >= slen:
+        newstop = realstop - 1
+        if newstop < 0:
+            raise ValueError
+        if s[newstop] in ('j', 'J'):
+            if realstart == newstop:
+                imagpart = '1.0'
+            elif realstart == newstop-1 and s[realstart] == '+':
+                imagpart = '1.0'
+            elif realstart == newstop-1 and s[realstart] == '-':
+                imagpart = '-1.0'
+            else:
+                imagpart = s[realstart:newstop]
+            return '0.0', imagpart
+        else:
+            return s[realstart:realstop], '0.0'
+
+    # find sign for imaginary part
+    if s[i] == '-' or s[i] == '+':
+        imagsign = s[i]
+    if imagsign == ' ':
+        raise ValueError
+
+    i+=1
+    # whitespace
+    while i < slen and s[i] == ' ':
+        i += 1
+    if i >= slen:
+        raise ValueError
+
+    imagstart = i
+    pc = s[i]
+    while i < slen and s[i] != ' ':
+        if s[i] in ('+','-') and pc not in ('e','E'):
+            break
+        pc = s[i]
+        i += 1
+
+    imagstop = i - 1
+    if imagstop < 0:
+        raise ValueError
+    if s[imagstop] not in ('j','J'):
+        raise ValueError
+    if imagstop < imagstart:
+        raise ValueError
+
+    while i<slen and s[i] == ' ':
+        i += 1
+    if i <  slen:
+        raise ValueError
+
+    realpart = s[realstart:realstop]
+    if imagstart == imagstop:
+        imagpart = '1.0'
+    else:
+        imagpart = s[imagstart:imagstop]
+    if imagsign == '-':
+        imagpart = imagsign + imagpart
+
+    return realpart, imagpart
+
+
+
+def unpackcomplex(space, w_complex, strict_typing=True):
+    """
+    convert w_complex into a complex and return the unwrapped (real, imag)
+    tuple. If strict_typing==True, we also typecheck the value returned by
+    __complex__ to actually be a complex (and not e.g. a float).
+    See test___complex___returning_non_complex.
+    """
+    from pypy.objspace.std.complexobject import W_ComplexObject
+    if type(w_complex) is W_ComplexObject:
+        return (w_complex.realval, w_complex.imagval)
+    #
+    # test for a '__complex__' method, and call it if found.
+    # special case old-style instances, like CPython does.
+    w_z = None
+    if space.is_oldstyle_instance(w_complex):
+        try:
+            w_method = space.getattr(w_complex, space.wrap('__complex__'))
+        except OperationError, e:
+            if not e.match(space, space.w_AttributeError):
+                raise
+        else:
+            w_z = space.call_function(w_method)
+    else:
+        w_method = space.lookup(w_complex, '__complex__')
+        if w_method is not None:
+            w_z = space.get_and_call_function(w_method, w_complex)
+    #
+    if w_z is not None:
+        # __complex__() must return a complex or (float,int,long) object
+        # (XXX should not use isinstance here)
+        if not strict_typing and (space.isinstance_w(w_z, space.w_int) or
+                                  space.isinstance_w(w_z, space.w_long) or
+                                  space.isinstance_w(w_z, space.w_float)):
+            return (space.float_w(w_z), 0.0)
+        elif isinstance(w_z, W_ComplexObject):
+            return (w_z.realval, w_z.imagval)
+        raise OperationError(space.w_TypeError,
+                             space.wrap("__complex__() must return"
+                                        " a complex number"))
+
+    #
+    # no '__complex__' method, so we assume it is a float,
+    # unless it is an instance of some subclass of complex.
+    if space.isinstance_w(w_complex, space.gettypefor(W_ComplexObject)):
+        real = space.float(space.getattr(w_complex, space.wrap("real")))
+        imag = space.float(space.getattr(w_complex, space.wrap("imag")))
+        return (space.float_w(real), space.float_w(imag))
+    #
+    # Check that it is not a string (on which space.float() would succeed).
+    if (space.isinstance_w(w_complex, space.w_str) or
+        space.isinstance_w(w_complex, space.w_unicode)):
+        raise oefmt(space.w_TypeError,
+                    "complex number expected, got '%T'", w_complex)
+    #
+    return (space.float_w(space.float(w_complex)), 0.0)
+
+
 class W_ComplexObject(W_AbstractComplexObject):
     """This is a reimplementation of the CPython "PyComplexObject"
     """
-    from pypy.objspace.std.complextype import complex_typedef as typedef
     _immutable_fields_ = ['realval', 'imagval']
 
     def __init__(self, realval=0.0, imgval=0.0):
@@ -115,6 +282,67 @@
     def int(self, space):
         raise OperationError(space.w_TypeError, space.wrap("can't convert complex to int; use int(abs(z))"))
 
+    @staticmethod
+    @unwrap_spec(w_real = WrappedDefault(0.0))
+    def descr__new__(space, w_complextype, w_real, w_imag=None):
+        from pypy.objspace.std.complexobject import W_ComplexObject
+
+        # if w_real is already a complex number and there is no second
+        # argument, return it.  Note that we cannot return w_real if
+        # it is an instance of a *subclass* of complex, or if w_complextype
+        # is itself a subclass of complex.
+        noarg2 = w_imag is None
+        if (noarg2 and space.is_w(w_complextype, space.w_complex)
+                   and space.is_w(space.type(w_real), space.w_complex)):
+            return w_real
+
+        if space.isinstance_w(w_real, space.w_str) or \
+                space.isinstance_w(w_real, space.w_unicode):
+            # a string argument
+            if not noarg2:
+                raise OperationError(space.w_TypeError,
+                                     space.wrap("complex() can't take second arg"
+                                                " if first is a string"))
+            try:
+                realstr, imagstr = _split_complex(space.str_w(w_real))
+            except ValueError:
+                raise OperationError(space.w_ValueError, space.wrap(ERR_MALFORMED))
+            try:
+                realval = string_to_float(realstr)
+                imagval = string_to_float(imagstr)
+            except ParseStringError:
+                raise OperationError(space.w_ValueError, space.wrap(ERR_MALFORMED))
+
+        else:
+            # non-string arguments
+            realval, imagval = unpackcomplex(space, w_real, strict_typing=False)
+
+            # now take w_imag into account
+            if not noarg2:
+                # complex(x, y) == x+y*j, even if 'y' is already a complex.
+                realval2, imagval2 = unpackcomplex(space, w_imag, strict_typing=False)
+
+                # try to preserve the signs of zeroes of realval and realval2
+                if imagval2 != 0.0:
+                    realval -= imagval2
+
+                if imagval != 0.0:
+                    imagval += realval2
+                else:
+                    imagval = realval2
+        # done
+        w_obj = space.allocate_instance(W_ComplexObject, w_complextype)
+        W_ComplexObject.__init__(w_obj, realval, imagval)
+        return w_obj
+
+    def descr___getnewargs__(self, space):
+        return space.newtuple([space.newfloat(self.realval),
+                               space.newfloat(self.imagval)])
+
+    def descr_conjugate(self, space):
+        """(A+Bj).conjugate() -> A-Bj"""
+        return space.newcomplex(self.realval, -self.imagval)
+
 registerimplementation(W_ComplexObject)
 
 w_one = W_ComplexObject(1, 0)
@@ -250,11 +478,6 @@
 def float__Complex(space, w_complex):
     raise OperationError(space.w_TypeError, space.wrap("can't convert complex to float; use abs(z)"))
 
-def complex_conjugate__Complex(space, w_self):
-    #w_real = space.call_function(space.w_float,space.wrap(w_self.realval))
-    #w_imag = space.call_function(space.w_float,space.wrap(-w_self.imagval))
-    return space.newcomplex(w_self.realval,-w_self.imagval)
-
 def format_float(x, code, precision):
     # like float2string, except that the ".0" is not necessary
     if isinf(x):
@@ -291,5 +514,26 @@
 def format__Complex_ANY(space, w_complex, w_format_spec):
     return newformat.run_formatter(space, w_format_spec, "format_complex", w_complex)
 
-from pypy.objspace.std import complextype
-register_all(vars(), complextype)
+def complexwprop(name):
+    def fget(space, w_obj):
+        from pypy.objspace.std.complexobject import W_ComplexObject
+        if not isinstance(w_obj, W_ComplexObject):
+            raise OperationError(space.w_TypeError,
+                                 space.wrap("descriptor is for 'complex'"))
+        return space.newfloat(getattr(w_obj, name))
+    return GetSetProperty(fget)
+
+W_ComplexObject.typedef = StdTypeDef("complex",
+    __doc__ = """complex(real[, imag]) -> complex number
+
+Create a complex number from a real part and an optional imaginary part.
+This is equivalent to (real + imag*1j) where imag defaults to 0.""",
+    __new__ = interp2app(W_ComplexObject.descr__new__),
+    __getnewargs__ = interp2app(W_ComplexObject.descr___getnewargs__),
+    real = complexwprop('realval'),
+    imag = complexwprop('imagval'),
+    conjugate = interp2app(W_ComplexObject.descr_conjugate)
+    )
+
+W_ComplexObject.typedef.registermethods(globals())
+register_all(vars(), globals())
diff --git a/pypy/objspace/std/complextype.py b/pypy/objspace/std/complextype.py
deleted file mode 100644
--- a/pypy/objspace/std/complextype.py
+++ /dev/null
@@ -1,257 +0,0 @@
-from pypy.interpreter.error import OperationError, oefmt
-from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault
-from pypy.objspace.std.register_all import register_all
-from pypy.objspace.std.noneobject import W_NoneObject
-from pypy.objspace.std.stdtypedef import GetSetProperty, StdTypeDef
-from pypy.objspace.std.stdtypedef import StdObjSpaceMultiMethod
-from rpython.rlib.rfloat import string_to_float
-from rpython.rlib.rstring import ParseStringError
-
-# ERRORCODES
-
-ERR_WRONG_SECOND = "complex() can't take second arg if first is a string"
-ERR_MALFORMED = "complex() arg is a malformed string"
-
-complex_conjugate = StdObjSpaceMultiMethod('conjugate', 1,
-                                           doc="(A+Bj).conjugate() -> A-Bj")
-
-register_all(vars(),globals())
-
-def _split_complex(s):
-    slen = len(s)
-    if slen == 0:
-        raise ValueError
-    realstart = 0
-    realstop = 0
-    imagstart = 0
-    imagstop = 0
-    imagsign = ' '
-    i = 0
-    # ignore whitespace at beginning and end
-    while i < slen and s[i] == ' ':
-        i += 1
-    while slen > 0 and s[slen-1] == ' ':
-        slen -= 1
-
-    if s[i] == '(' and s[slen-1] == ')':
-        i += 1
-        slen -= 1
-        # ignore whitespace after bracket
-        while i < slen and s[i] == ' ':
-            i += 1
-
-    # extract first number
-    realstart = i
-    pc = s[i]
-    while i < slen and s[i] != ' ':
-        if s[i] in ('+','-') and pc not in ('e','E') and i != realstart:
-            break
-        pc = s[i]
-        i += 1
-
-    realstop = i
-
-    # ignore whitespace
-    while i < slen and s[i] == ' ':
-        i += 1
-
-    # return appropriate strings is only one number is there
-    if i >= slen:
-        newstop = realstop - 1
-        if newstop < 0:
-            raise ValueError
-        if s[newstop] in ('j', 'J'):
-            if realstart == newstop:
-                imagpart = '1.0'
-            elif realstart == newstop-1 and s[realstart] == '+':
-                imagpart = '1.0'
-            elif realstart == newstop-1 and s[realstart] == '-':
-                imagpart = '-1.0'
-            else:
-                imagpart = s[realstart:newstop]
-            return '0.0', imagpart
-        else:
-            return s[realstart:realstop], '0.0'
-
-    # find sign for imaginary part
-    if s[i] == '-' or s[i] == '+':
-        imagsign = s[i]
-    if imagsign == ' ':
-        raise ValueError
-
-    i+=1
-    # whitespace
-    while i < slen and s[i] == ' ':
-        i += 1
-    if i >= slen:
-        raise ValueError
-
-    imagstart = i
-    pc = s[i]
-    while i < slen and s[i] != ' ':
-        if s[i] in ('+','-') and pc not in ('e','E'):
-            break
-        pc = s[i]
-        i += 1
-
-    imagstop = i - 1
-    if imagstop < 0:
-        raise ValueError
-    if s[imagstop] not in ('j','J'):
-        raise ValueError
-    if imagstop < imagstart:
-        raise ValueError
-
-    while i<slen and s[i] == ' ':
-        i += 1
-    if i <  slen:
-        raise ValueError
-
-    realpart = s[realstart:realstop]
-    if imagstart == imagstop:
-        imagpart = '1.0'
-    else:
-        imagpart = s[imagstart:imagstop]
-    if imagsign == '-':
-        imagpart = imagsign + imagpart
-
-    return realpart, imagpart
-
-
- at unwrap_spec(w_real = WrappedDefault(0.0))
-def descr__new__(space, w_complextype, w_real, w_imag=None):
-    from pypy.objspace.std.complexobject import W_ComplexObject
-
-    # if w_real is already a complex number and there is no second
-    # argument, return it.  Note that we cannot return w_real if
-    # it is an instance of a *subclass* of complex, or if w_complextype
-    # is itself a subclass of complex.
-    noarg2 = w_imag is None
-    if (noarg2 and space.is_w(w_complextype, space.w_complex)
-               and space.is_w(space.type(w_real), space.w_complex)):
-        return w_real
-
-    if space.isinstance_w(w_real, space.w_str) or \
-            space.isinstance_w(w_real, space.w_unicode):
-        # a string argument
-        if not noarg2:
-            raise OperationError(space.w_TypeError,
-                                 space.wrap("complex() can't take second arg"
-                                            " if first is a string"))
-        try:
-            realstr, imagstr = _split_complex(space.str_w(w_real))
-        except ValueError:
-            raise OperationError(space.w_ValueError, space.wrap(ERR_MALFORMED))
-        try:
-            realval = string_to_float(realstr)
-            imagval = string_to_float(imagstr)
-        except ParseStringError:
-            raise OperationError(space.w_ValueError, space.wrap(ERR_MALFORMED))
-
-    else:
-        # non-string arguments
-        realval, imagval = unpackcomplex(space, w_real, strict_typing=False)
-
-        # now take w_imag into account
-        if not noarg2:
-            # complex(x, y) == x+y*j, even if 'y' is already a complex.
-            realval2, imagval2 = unpackcomplex(space, w_imag, strict_typing=False)
-
-            # try to preserve the signs of zeroes of realval and realval2
-            if imagval2 != 0.0:
-                realval -= imagval2
-
-            if imagval != 0.0:
-                imagval += realval2
-            else:
-                imagval = realval2
-    # done
-    w_obj = space.allocate_instance(W_ComplexObject, w_complextype)
-    W_ComplexObject.__init__(w_obj, realval, imagval)
-    return w_obj
-
-
-def unpackcomplex(space, w_complex, strict_typing=True):
-    """
-    convert w_complex into a complex and return the unwrapped (real, imag)
-    tuple. If strict_typing==True, we also typecheck the value returned by
-    __complex__ to actually be a complex (and not e.g. a float).
-    See test___complex___returning_non_complex.
-    """
-    from pypy.objspace.std.complexobject import W_ComplexObject
-    if type(w_complex) is W_ComplexObject:
-        return (w_complex.realval, w_complex.imagval)
-    #
-    # test for a '__complex__' method, and call it if found.
-    # special case old-style instances, like CPython does.
-    w_z = None
-    if space.is_oldstyle_instance(w_complex):
-        try:
-            w_method = space.getattr(w_complex, space.wrap('__complex__'))
-        except OperationError, e:
-            if not e.match(space, space.w_AttributeError):
-                raise
-        else:
-            w_z = space.call_function(w_method)
-    else:
-        w_method = space.lookup(w_complex, '__complex__')
-        if w_method is not None:
-            w_z = space.get_and_call_function(w_method, w_complex)
-    #
-    if w_z is not None:
-        # __complex__() must return a complex or (float,int,long) object
-        # (XXX should not use isinstance here)
-        if not strict_typing and (space.isinstance_w(w_z, space.w_int) or
-                                  space.isinstance_w(w_z, space.w_long) or
-                                  space.isinstance_w(w_z, space.w_float)):
-            return (space.float_w(w_z), 0.0)
-        elif isinstance(w_z, W_ComplexObject):
-            return (w_z.realval, w_z.imagval)
-        raise OperationError(space.w_TypeError,
-                             space.wrap("__complex__() must return"
-                                        " a complex number"))
-
-    #
-    # no '__complex__' method, so we assume it is a float,
-    # unless it is an instance of some subclass of complex.
-    if space.isinstance_w(w_complex, space.gettypefor(W_ComplexObject)):
-        real = space.float(space.getattr(w_complex, space.wrap("real")))
-        imag = space.float(space.getattr(w_complex, space.wrap("imag")))
-        return (space.float_w(real), space.float_w(imag))
-    #
-    # Check that it is not a string (on which space.float() would succeed).
-    if (space.isinstance_w(w_complex, space.w_str) or
-        space.isinstance_w(w_complex, space.w_unicode)):
-        raise oefmt(space.w_TypeError,
-                    "complex number expected, got '%T'", w_complex)
-    #
-    return (space.float_w(space.float(w_complex)), 0.0)
-
-
-def complexwprop(name):
-    def fget(space, w_obj):
-        from pypy.objspace.std.complexobject import W_ComplexObject
-        if not isinstance(w_obj, W_ComplexObject):
-            raise OperationError(space.w_TypeError,
-                                 space.wrap("descriptor is for 'complex'"))
-        return space.newfloat(getattr(w_obj, name))
-    return GetSetProperty(fget)
-
-def descr___getnewargs__(space,  w_self):
-    from pypy.objspace.std.complexobject import W_ComplexObject
-    assert isinstance(w_self, W_ComplexObject)
-    return space.newtuple([space.newfloat(w_self.realval),
-                           space.newfloat(w_self.imagval)])
-
-complex_typedef = StdTypeDef("complex",
-    __doc__ = """complex(real[, imag]) -> complex number
-
-Create a complex number from a real part and an optional imaginary part.
-This is equivalent to (real + imag*1j) where imag defaults to 0.""",
-    __new__ = interp2app(descr__new__),
-    __getnewargs__ = interp2app(descr___getnewargs__),
-    real = complexwprop('realval'),
-    imag = complexwprop('imagval'),
-    )
-
-complex_typedef.registermethods(globals())
diff --git a/pypy/objspace/std/model.py b/pypy/objspace/std/model.py
--- a/pypy/objspace/std/model.py
+++ b/pypy/objspace/std/model.py
@@ -33,7 +33,6 @@
         class result:
             from pypy.objspace.std.objecttype import object_typedef
             from pypy.objspace.std.floattype  import float_typedef
-            from pypy.objspace.std.complextype  import complex_typedef
             from pypy.objspace.std.typeobject   import type_typedef
             from pypy.objspace.std.slicetype  import slice_typedef
             from pypy.objspace.std.nonetype import none_typedef
@@ -58,6 +57,7 @@
         from pypy.objspace.std import typeobject
         from pypy.objspace.std import sliceobject
         from pypy.objspace.std import longobject
+        from pypy.objspace.std import complexobject
         from pypy.objspace.std import noneobject
         from pypy.objspace.std import iterobject
         from pypy.objspace.std import unicodeobject
@@ -82,6 +82,7 @@
         self.pythontypes.append(intobject.W_IntObject.typedef)
         self.pythontypes.append(boolobject.W_BoolObject.typedef)
         self.pythontypes.append(longobject.W_LongObject.typedef)
+        self.pythontypes.append(complexobject.W_ComplexObject.typedef)
 
         # the set of implementation types
         self.typeorder = {
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
@@ -270,7 +270,7 @@
         return W_ComplexObject(realval, imagval)
 
     def unpackcomplex(self, w_complex):
-        from pypy.objspace.std.complextype import unpackcomplex
+        from pypy.objspace.std.complexobject import unpackcomplex
         return unpackcomplex(self, w_complex)
 
     def newlong(self, val): # val is an int
diff --git a/pypy/objspace/std/test/test_complexobject.py b/pypy/objspace/std/test/test_complexobject.py
--- a/pypy/objspace/std/test/test_complexobject.py
+++ b/pypy/objspace/std/test/test_complexobject.py
@@ -1,7 +1,6 @@
 import py
 from pypy.objspace.std.complexobject import W_ComplexObject, \
-    pow__Complex_Complex_ANY
-from pypy.objspace.std import complextype as cobjtype
+    pow__Complex_Complex_ANY, _split_complex
 from pypy.objspace.std.multimethod import FailedToImplement
 from pypy.objspace.std import StdObjSpace
 
@@ -21,7 +20,7 @@
             _t_complex(r,i)
 
     def test_parse_complex(self):
-        f = cobjtype._split_complex
+        f = _split_complex
         def test_cparse(cnum, realnum, imagnum):
             result = f(cnum)
             assert len(result) == 2


More information about the pypy-commit mailing list