self.typedef_cname = cname
self.typedef_base_type = base_type
self.typedef_is_external = is_external
+
+ # Make typecodes in external typedefs use typesize-neutral macros
+ if is_external:
+ typecode = None
+ if base_type.is_int:
+ if base_type.signed == 0:
+ typecode = "__Pyx_T_UNSIGNED_INT"
+ else:
+ typecode = "__Pyx_T_SIGNED_INT"
+ elif base_type.is_float and not rank_to_type_name[base_type.rank] == "long double":
+ typecode = "__Pyx_T_FLOATING"
+ if typecode:
+ self.pymemberdef_typecode = "%s(%s)" % (typecode, cname)
def resolve(self):
return self.typedef_base_type.resolve()
#endif
#endif
+
+#if !defined(T_ULONGLONG)
+#define __Pyx_T_UNSIGNED_INT(x) \\
+ ((sizeof(x) == sizeof(unsigned char)) ? T_UBYTE : \\
+ ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \\
+ ((sizeof(x) == sizeof(unsigned int)) ? T_UINT : \\
+ ((sizeof(x) == sizeof(unsigned long)) ? T_ULONG : -1))))
+#else
+#define __Pyx_T_UNSIGNED_INT(x) \\
+ ((sizeof(x) == sizeof(unsigned char)) ? T_UBYTE : \\
+ ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \\
+ ((sizeof(x) == sizeof(unsigned int)) ? T_UINT : \\
+ ((sizeof(x) == sizeof(unsigned long)) ? T_ULONG : \\
+ ((sizeof(x) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1)))))
+#endif
+#if !defined(T_LONGLONG)
+#define __Pyx_T_SIGNED_INT(x) \\
+ ((sizeof(x) == sizeof(char)) ? T_BYTE : \\
+ ((sizeof(x) == sizeof(short)) ? T_SHORT : \\
+ ((sizeof(x) == sizeof(int)) ? T_INT : \\
+ ((sizeof(x) == sizeof(long)) ? T_LONG : -1))))
+#else
+#define __Pyx_T_SIGNED_INT(x) \\
+ ((sizeof(x) == sizeof(char)) ? T_BYTE : \\
+ ((sizeof(x) == sizeof(short)) ? T_SHORT : \\
+ ((sizeof(x) == sizeof(int)) ? T_INT : \\
+ ((sizeof(x) == sizeof(long)) ? T_LONG : \\
+ ((sizeof(x) == sizeof(PY_LONG_LONG)) ? T_LONGLONG : -1)))))
+#endif
+
+#define __Pyx_T_FLOATING(x) \\
+ ((sizeof(x) == sizeof(float)) ? T_FLOAT : \\
+ ((sizeof(x) == sizeof(double)) ? T_DOUBLE : -1))
+
#if !defined(T_SIZET)
#if !defined(T_ULONGLONG)
#define T_SIZET \\
-
+typedef float FloatTypedef;
typedef double DoubleTypedef;
+typedef long double LongDoubleTypedef;
+
+typedef char CharTypedef;
+typedef short ShortTypedef;
+typedef int IntTypedef;
+typedef long LongTypedef;
+#if defined(T_LONGLONG)
+typedef PY_LONG_LONG LongLongTypedef;
+#else
+typedef long LongLongTypedef;
+#endif
+
+typedef unsigned char UCharTypedef;
+typedef unsigned short UShortTypedef;
+typedef unsigned int UIntTypedef;
+typedef unsigned long ULongTypedef;
+#if defined(T_LONGLONG)
+typedef unsigned PY_LONG_LONG ULongLongTypedef;
+#else
+typedef unsigned long ULongLongTypedef;
+#endif
"""
>>> f()
-42.0 42.0 42.0
+42.0
+42.0
+>>> global_vars(12.0)
+12.0 12.0
>>> readonly()
Traceback (most recent call last):
...
-AttributeError: attribute 'var_nf' of 'typedfieldbug_T303.MyClass' objects is not writable
+TypeError: readonly attribute
+>>> longdouble_access()
+Traceback (most recent call last):
+ ...
+SystemError: bad memberdescr type
+
"""
cdef extern from "external_defs.h":
ctypedef float DoubleTypedef
+ ctypedef float LongDoubleTypedef
+
+cdef public DoubleTypedef global_tdef
+cdef public double global_double
cdef class MyClass:
cdef readonly:
- double var_d
- DoubleTypedef var_nf
- cdef public:
- DoubleTypedef var_mutable
+ double actual_double
+ DoubleTypedef float_isreally_double
+ LongDoubleTypedef float_isreally_longdouble
+
def __init__(self):
- self.var_d = 42.0
- self.var_nf = 42.0
- self.var_mutable = 1
+ self.actual_double = 42.0
+ self.float_isreally_double = 42.0
+ self.float_isreally_longdouble = 42.0
+
+def global_vars(x):
+ global global_tdef, global_double
+ global_tdef = x
+ global_double = x
+ print global_tdef, global_double
def f():
c = MyClass()
- c.var_mutable = 42.0
- print c.var_d, c.var_nf, c.var_mutable
+ print c.actual_double
+ print c.float_isreally_double
+
+def longdouble_access():
+ c = MyClass()
+ print c.float_isreally_longdouble
+
def readonly():
c = MyClass()
- c.var_nf = 3
+ c.actual_double = 3
+