[pypy-svn] r73915 - in pypy/branch/cpython-extension/pypy/module/cpyext: . test

afa at codespeak.net afa at codespeak.net
Tue Apr 20 17:53:40 CEST 2010


Author: afa
Date: Tue Apr 20 17:53:38 2010
New Revision: 73915

Added:
   pypy/branch/cpython-extension/pypy/module/cpyext/complexobject.py   (contents, props changed)
   pypy/branch/cpython-extension/pypy/module/cpyext/test/test_complexobject.py   (contents, props changed)
Modified:
   pypy/branch/cpython-extension/pypy/module/cpyext/__init__.py
   pypy/branch/cpython-extension/pypy/module/cpyext/api.py
Log:
Some part of PyComplex object.


Modified: pypy/branch/cpython-extension/pypy/module/cpyext/__init__.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/__init__.py	(original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/__init__.py	Tue Apr 20 17:53:38 2010
@@ -65,6 +65,7 @@
 import pypy.module.cpyext.stubsactive
 import pypy.module.cpyext.pystate
 import pypy.module.cpyext.datetime
+import pypy.module.cpyext.complexobject
 
 # now that all rffi_platform.Struct types are registered, configure them
 api.configure_types()

Modified: pypy/branch/cpython-extension/pypy/module/cpyext/api.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/api.py	(original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/api.py	Tue Apr 20 17:53:38 2010
@@ -278,6 +278,7 @@
         "Bool": "space.w_bool",
         "Float": "space.w_float",
         "Long": "space.w_long",
+        "Complex": "space.w_complex",
         "BaseObject": "space.w_object",
         'None': 'space.type(space.w_None)',
         'NotImplemented': 'space.type(space.w_NotImplemented)',

Added: pypy/branch/cpython-extension/pypy/module/cpyext/complexobject.py
==============================================================================
--- (empty file)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/complexobject.py	Tue Apr 20 17:53:38 2010
@@ -0,0 +1,27 @@
+from pypy.rpython.lltypesystem import lltype
+from pypy.module.cpyext.api import cpython_api, PyObject, build_type_checkers
+from pypy.objspace.std.complexobject import W_ComplexObject
+
+PyComplex_Check, PyComplex_CheckExact = build_type_checkers("Complex")
+
+ at cpython_api([lltype.Float, lltype.Float], PyObject)
+def PyComplex_FromDoubles(space, real, imag):
+    return space.newcomplex(real, imag)
+
+ at cpython_api([PyObject], lltype.Float, error=-1)
+def PyComplex_RealAsDouble(space, w_obj):
+    if space.is_true(space.isinstance(w_obj, space.w_complex)):
+        assert isinstance(w_obj, W_ComplexObject)
+        return w_obj.realval
+    else:
+        return space.float_w(w_obj)
+
+ at cpython_api([PyObject], lltype.Float, error=-1)
+def PyComplex_ImagAsDouble(space, w_obj):
+    if space.is_true(space.isinstance(w_obj, space.w_complex)):
+        assert isinstance(w_obj, W_ComplexObject)
+        return w_obj.imagval
+    else:
+        # CPython also accepts anything
+        return 0.0
+

Added: pypy/branch/cpython-extension/pypy/module/cpyext/test/test_complexobject.py
==============================================================================
--- (empty file)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/test/test_complexobject.py	Tue Apr 20 17:53:38 2010
@@ -0,0 +1,19 @@
+from pypy.module.cpyext.test.test_api import BaseApiTest
+
+class TestComplexObject(BaseApiTest):
+    def test_complexobject(self, space, api):
+        w_value = api.PyComplex_FromDoubles(1.2, 3.4)
+        assert space.unwrap(w_value) == 1.2+3.4j
+        assert api.PyComplex_RealAsDouble(w_value) == 1.2
+        assert api.PyComplex_ImagAsDouble(w_value) == 3.4
+
+        assert api.PyComplex_RealAsDouble(space.wrap(42)) == 42
+        assert api.PyComplex_RealAsDouble(space.wrap(1.5)) == 1.5
+        assert api.PyComplex_ImagAsDouble(space.wrap(1.5)) == 0.0
+
+        # cpython accepts anything for PyComplex_ImagAsDouble
+        assert api.PyComplex_ImagAsDouble(space.w_None) == 0.0
+        assert not api.PyErr_Occurred()
+        assert api.PyComplex_RealAsDouble(space.w_None) == -1.0
+        assert api.PyErr_Occurred()
+        api.PyErr_Clear()



More information about the Pypy-commit mailing list