real and imag attributes for complex
authorRobert Bradshaw <robertwb@math.washington.edu>
Thu, 14 May 2009 19:36:16 +0000 (12:36 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Thu, 14 May 2009 19:36:16 +0000 (12:36 -0700)
Cython/Compiler/ExprNodes.py
Cython/Compiler/PyrexTypes.py
tests/run/complex_numbers_T305.pyx

index f6e2b7848bbc16479de00d91188fb1980a9a9b49..cb59255e10fdfc4e6ab5124ec7e44adb438d2797 100644 (file)
@@ -2913,6 +2913,8 @@ class AttributeNode(NewTempExprNode):
                     obj.type.vtabslot_cname, self.member)
             else:
                 return self.member
+        elif obj.type.is_complex:
+            return "__Pyx_%s_PART(%s)" % (self.member.upper(), obj_code)
         else:
             return "%s%s%s" % (obj_code, self.op, self.member)
     
index 6cc6e511929891bca8b49ff76924eb97ddb6af70..984d7351caf6b8e01da2ddaf7968441356596fff 100644 (file)
@@ -713,6 +713,8 @@ class CComplexType(CNumericType):
     
     is_complex = 1
     to_py_function = "__pyx_PyObject_from_complex"
+    has_attributes = 1
+    scope = None
     
     def __init__(self, real_type):
         self.real_type = real_type
@@ -736,6 +738,14 @@ class CComplexType(CNumericType):
         return (src_type.is_complex and self.real_type.assignable_from_resolved_type(src_type.real_type)
                     or src_type.is_numeric and self.real_type.assignable_from_resolved_type(src_type) 
                     or src_type is error_type)
+                    
+    def attributes_known(self):
+        if self.scope is None:
+            import Symtab
+            self.scope = Symtab.StructOrUnionScope(self.specalization_name())
+            self.scope.declare_var("real", self.real_type, None, "real")
+            self.scope.declare_var("imag", self.real_type, None, "imag")
+        return True
 
     def create_declaration_utility_code(self, env):
         # This must always be run, because a single CComplexType instance can be shared
index 25479abfc984ea4fe4bdbe61d206f92fe4c6f630..6f20aa7024e83dba41074111fe6bc4ff55c07d44 100644 (file)
@@ -44,10 +44,22 @@ __doc__ = u"""
     
     >>> test_literal()
     (5j, (1-2.5j))
+    
+    >>> test_real_imag(1-3j)
+    (1.0, -3.0)
+    >>> test_real_imag(5)
+    (5.0, 0.0)
+    >>> test_real_imag(1.5j)
+    (0.0, 1.5)
+    
+    >>> test_real_imag_assignment(1, 2)
+    (1+2j)
+    >>> test_real_imag_assignment(1.5, -3.5)
+    (1.5-3.5j)
 """
 
-#cdef extern from "complex.h":
-#    pass
+cdef extern from "complex.h":
+    pass
 
 cimport cython
 
@@ -81,4 +93,12 @@ def test_compare_coerce(double complex a, int b):
 def test_literal():
     return 5j, 1-2.5j
 
+def test_real_imag(double complex z):
+    return z.real, z.imag
+
+def test_real_imag_assignment(object a, double b):
+    cdef double complex z
+    z.real = a
+    z.imag = b
+    return z