From: Robert Bradshaw Date: Thu, 14 May 2009 19:36:16 +0000 (-0700) Subject: real and imag attributes for complex X-Git-Tag: 0.11.2.rc1~10^2~1 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=1d19ea12b82f0503b97cd39919b2ffef0f29eed5;p=cython.git real and imag attributes for complex --- diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index f6e2b784..cb59255e 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -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) diff --git a/Cython/Compiler/PyrexTypes.py b/Cython/Compiler/PyrexTypes.py index 6cc6e511..984d7351 100644 --- a/Cython/Compiler/PyrexTypes.py +++ b/Cython/Compiler/PyrexTypes.py @@ -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 diff --git a/tests/run/complex_numbers_T305.pyx b/tests/run/complex_numbers_T305.pyx index 25479abf..6f20aa70 100644 --- a/tests/run/complex_numbers_T305.pyx +++ b/tests/run/complex_numbers_T305.pyx @@ -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