[pypy-commit] pypy cling-support: give up on long double for now ... this just doesn't work :(

wlav pypy.commits at gmail.com
Tue Dec 13 18:53:21 EST 2016


Author: Wim Lavrijsen <WLavrijsen at lbl.gov>
Branch: cling-support
Changeset: r89051:33831e11eab1
Date: 2016-12-13 13:00 -0800
http://bitbucket.org/pypy/pypy/changeset/33831e11eab1/

Log:	give up on long double for now ... this just doesn't work :(

diff --git a/pypy/module/cppyy/converter.py b/pypy/module/cppyy/converter.py
--- a/pypy/module/cppyy/converter.py
+++ b/pypy/module/cppyy/converter.py
@@ -386,14 +386,7 @@
             fval = float(rfloat.rstring_to_float(default))
         else:
             fval = float(0.)
-        # see ffitypes.LongDoubleTypeMixin: long double not really
-        # supported in rffi
-        self.default = fval #r_longfloat(fval)
-
-    def from_memory(self, space, w_obj, w_pycppclass, offset):
-        address = self._get_raw_address(space, w_obj, offset)
-        rffiptr = rffi.cast(self.c_ptrtype, address)
-        return self._wrap_object(space, rffiptr[0])
+        self.default = r_longfloat(fval)
 
 class ConstLongDoubleRefConverter(ConstRefNumericTypeConverterMixin, LongDoubleConverter):
     _immutable_fields_ = ['typecode']
@@ -746,8 +739,8 @@
 _converters["const float&"]             = ConstFloatRefConverter
 _converters["double"]                   = DoubleConverter
 _converters["const double&"]            = ConstDoubleRefConverter
-_converters["long double"]              = LongDoubleConverter
-_converters["const long double&"]       = ConstLongDoubleRefConverter
+#_converters["long double"]              = LongDoubleConverter
+#_converters["const long double&"]       = ConstLongDoubleRefConverter
 _converters["const char*"]              = CStringConverter
 _converters["void*"]                    = VoidPtrConverter
 _converters["void**"]                   = VoidPtrPtrConverter
@@ -841,7 +834,7 @@
         ('Q', rffi.sizeof(rffi.ULONGLONG),  ("unsigned long long", "unsigned long long int", "ULong64_t")),
         ('f', rffi.sizeof(rffi.FLOAT),      ("float",)),
         ('d', rffi.sizeof(rffi.DOUBLE),     ("double",)),
-        ('g', rffi.sizeof(rffi.LONGDOUBLE), ("long double",)),
+#        ('g', rffi.sizeof(rffi.LONGDOUBLE), ("long double",)),
     )
 
     for tcode, tsize, names in array_info:
diff --git a/pypy/module/cppyy/executor.py b/pypy/module/cppyy/executor.py
--- a/pypy/module/cppyy/executor.py
+++ b/pypy/module/cppyy/executor.py
@@ -329,7 +329,7 @@
         (rffi.ULONGLONG,  capi.c_call_ll,  ("unsigned long long", "unsigned long long int", "ULong64_t")),
         (rffi.FLOAT,      capi.c_call_f,   ("float",)),
         (rffi.DOUBLE,     capi.c_call_d,   ("double",)),
-        (rffi.LONGDOUBLE, capi.c_call_ld,  ("long double",)),
+#        (rffi.LONGDOUBLE, capi.c_call_ld,  ("long double",)),
     )
 
     for c_type, stub, names in type_info:
diff --git a/pypy/module/cppyy/ffitypes.py b/pypy/module/cppyy/ffitypes.py
--- a/pypy/module/cppyy/ffitypes.py
+++ b/pypy/module/cppyy/ffitypes.py
@@ -239,25 +239,20 @@
     _mixin_     = True
     _immutable_fields_ = ['c_type', 'c_ptrtype', 'typecode']
 
-    # long double is not really supported, so work with normal
-    # double instead; doing it here keeps this localized
-    c_type      = rffi.DOUBLE  #rffi.LONGDOUBLE
-    c_ptrtype   = rffi.DOUBLEP #rffi.LONGDOUBLEP
+    c_type      = rffi.LONGDOUBLE
+    c_ptrtype   = rffi.LONGDOUBLEP
     typecode    = 'g'
 
+    # long double is not really supported ...
     def _unwrap_object(self, space, w_obj):
-        #return r_longfloat(space.float_w(w_obj))
-        return float(space.float_w(w_obj))
+        return r_longfloat(space.float_w(w_obj))
 
     def _wrap_object(self, space, obj):
-        # return space.wrap(obj)
-        dbl = rffi.cast(rffi.DOUBLE, obj)
-        return space.wrap(float(dbl))
+        return space.wrap(obj)
 
     def cffi_type(self, space):
         state = space.fromcache(State)
-        #return state.c_ldouble
-        return state.c_double
+        return state.c_ldouble
 
 def typeid(c_type):
     "NOT_RPYTHON"
diff --git a/pypy/module/cppyy/test/test_datatypes.py b/pypy/module/cppyy/test/test_datatypes.py
--- a/pypy/module/cppyy/test/test_datatypes.py
+++ b/pypy/module/cppyy/test/test_datatypes.py
@@ -64,9 +64,9 @@
         assert round(c.m_double         + 77., 11) == 0
         assert round(c.get_double_cr()  + 77., 11) == 0
         assert round(c.get_double_r()   + 77., 11) == 0
-        assert round(c.m_ldouble        + 88., 24) == 0
-        assert round(c.get_ldouble_cr() + 88., 24) == 0
-        assert round(c.get_ldouble_r()  + 88., 24) == 0
+        #assert round(c.m_ldouble        + 88., 24) == 0
+        #assert round(c.get_ldouble_cr() + 88., 24) == 0
+        #assert round(c.get_ldouble_r()  + 88., 24) == 0
         assert round(c.m_double + 77., 8) == 0
 
         # reading of enum types


More information about the pypy-commit mailing list