Author: Wim Lavrijsen <wlavrij...@lbl.gov> Branch: reflex-support Changeset: r54321:86397c9e6d24 Date: 2012-04-12 11:52 -0700 http://bitbucket.org/pypy/pypy/changeset/86397c9e6d24/
Log: unlike for stubs (for which a value type is used), libffi requires a pointer type for const builtin& 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 @@ -275,6 +275,10 @@ def _unwrap_object(self, space, w_obj): return rffi.cast(rffi.SHORT, space.int_w(w_obj)) +class ConstShortRefConverter(ShortConverter): + _immutable_ = True + libffitype = lltype.nullptr(clibffi.FFI_TYPE_P.TO) + class UnsignedShortConverter(IntTypeConverterMixin, TypeConverter): _immutable_ = True libffitype = libffi.types.sshort @@ -286,6 +290,10 @@ def _unwrap_object(self, space, w_obj): return rffi.cast(rffi.USHORT, space.int_w(w_obj)) +class ConstUnsignedShortRefConverter(UnsignedShortConverter): + _immutable_ = True + libffitype = lltype.nullptr(clibffi.FFI_TYPE_P.TO) + class IntConverter(IntTypeConverterMixin, TypeConverter): _immutable_ = True libffitype = libffi.types.sint @@ -297,6 +305,10 @@ def _unwrap_object(self, space, w_obj): return rffi.cast(rffi.INT, space.c_int_w(w_obj)) +class ConstIntRefConverter(IntConverter): + _immutable_ = True + libffitype = lltype.nullptr(clibffi.FFI_TYPE_P.TO) + class UnsignedIntConverter(IntTypeConverterMixin, TypeConverter): _immutable_ = True libffitype = libffi.types.uint @@ -308,6 +320,10 @@ def _unwrap_object(self, space, w_obj): return rffi.cast(rffi.UINT, space.uint_w(w_obj)) +class ConstUnsignedIntRefConverter(UnsignedIntConverter): + _immutable_ = True + libffitype = lltype.nullptr(clibffi.FFI_TYPE_P.TO) + class LongConverter(IntTypeConverterMixin, TypeConverter): _immutable_ = True libffitype = libffi.types.slong @@ -319,6 +335,10 @@ def _unwrap_object(self, space, w_obj): return space.int_w(w_obj) +class ConstLongRefConverter(LongConverter): + _immutable_ = True + libffitype = lltype.nullptr(clibffi.FFI_TYPE_P.TO) + class UnsignedLongConverter(IntTypeConverterMixin, TypeConverter): _immutable_ = True libffitype = libffi.types.ulong @@ -330,6 +350,9 @@ def _unwrap_object(self, space, w_obj): return space.uint_w(w_obj) +class ConstUnsignedLongRefConverter(UnsignedLongConverter): + _immutable_ = True + libffitype = lltype.nullptr(clibffi.FFI_TYPE_P.TO) class FloatConverter(FloatTypeConverterMixin, TypeConverter): _immutable_ = True @@ -352,6 +375,10 @@ rffiptr = rffi.cast(self.rffiptype, address) return space.wrap(float(rffiptr[0])) +class ConstFloatRefConverter(FloatConverter): + _immutable_ = True + libffitype = lltype.nullptr(clibffi.FFI_TYPE_P.TO) + class DoubleConverter(FloatTypeConverterMixin, TypeConverter): _immutable_ = True libffitype = libffi.types.double @@ -367,6 +394,10 @@ def _unwrap_object(self, space, w_obj): return space.float_w(w_obj) +class ConstDoubleRefConverter(DoubleConverter): + _immutable_ = True + libffitype = lltype.nullptr(clibffi.FFI_TYPE_P.TO) + class CStringConverter(TypeConverter): _immutable_ = True @@ -593,10 +624,10 @@ # 1) full, exact match # 1a) const-removed match # 2) match of decorated, unqualified type - # 3) accept const ref as by value - # 4) accept ref as pointer - # 5) generalized cases (covers basically all user classes) - # 6) void converter, which fails on use + # 3) accept ref as pointer (for the stubs, const& can be + # by value, but that does not work for the ffi path) + # 4) generalized cases (covers basically all user classes) + # 5) void converter, which fails on use name = capi.c_resolve_name(name) @@ -622,14 +653,9 @@ except KeyError: pass - # 3) accept const ref as by value - if compound and compound[len(compound)-1] == "&": - try: - return _converters[clean_name](space, default) - except KeyError: - pass + # 3) TODO: accept ref as pointer - # 5) generalized cases (covers basically all user classes) + # 4) generalized cases (covers basically all user classes) from pypy.module.cppyy import interp_cppyy cppclass = interp_cppyy.scope_byname(space, clean_name) if cppclass: @@ -643,7 +669,7 @@ elif capi.c_is_enum(clean_name): return UnsignedIntConverter(space, default) - # 6) void converter, which fails on use + # 5) void converter, which fails on use # # return a void converter here, so that the class can be build even # when some types are unknown; this overload will simply fail on use @@ -654,17 +680,29 @@ _converters["char"] = CharConverter _converters["unsigned char"] = CharConverter _converters["short int"] = ShortConverter +_converters["const short int&"] = ConstIntRefConverter _converters["short"] = _converters["short int"] +_converters["const short&"] = _converters["const short int&"] _converters["unsigned short int"] = UnsignedShortConverter +_converters["const unsigned short int&"] = ConstUnsignedShortRefConverter _converters["unsigned short"] = _converters["unsigned short int"] +_converters["const unsigned short&"] = _converters["const unsigned short int&"] _converters["int"] = IntConverter +_converters["const int&"] = ConstIntRefConverter _converters["unsigned int"] = UnsignedIntConverter +_converters["const unsigned int&"] = ConstUnsignedIntRefConverter _converters["long int"] = LongConverter +_converters["const long int&"] = ConstLongRefConverter _converters["long"] = _converters["long int"] +_converters["const long&"] = _converters["const long int&"] _converters["unsigned long int"] = UnsignedLongConverter +_converters["const unsigned long int&"] = ConstUnsignedLongRefConverter _converters["unsigned long"] = _converters["unsigned long int"] +_converters["const unsigned long&"] = _converters["const unsigned long int&"] _converters["float"] = FloatConverter +_converters["const float&"] = ConstFloatRefConverter _converters["double"] = DoubleConverter +_converters["const double&"] = ConstDoubleRefConverter _converters["const char*"] = CStringConverter _converters["char*"] = CStringConverter _converters["void*"] = VoidPtrConverter diff --git a/pypy/module/cppyy/genreflex-methptrgetter.patch b/pypy/module/cppyy/genreflex-methptrgetter.patch --- a/pypy/module/cppyy/genreflex-methptrgetter.patch +++ b/pypy/module/cppyy/genreflex-methptrgetter.patch @@ -1,6 +1,6 @@ Index: cint/reflex/python/genreflex/gendict.py =================================================================== ---- cint/reflex/python/genreflex/gendict.py (revision 40448) +--- cint/reflex/python/genreflex/gendict.py (revision 43705) +++ cint/reflex/python/genreflex/gendict.py (working copy) @@ -52,6 +52,7 @@ self.typedefs_for_usr = [] @@ -10,7 +10,7 @@ # The next is to avoid a known problem with gccxml that it generates a # references to id equal '_0' which is not defined anywhere self.xref['_0'] = {'elem':'Unknown', 'attrs':{'id':'_0','name':''}, 'subelems':[]} -@@ -1281,6 +1282,8 @@ +@@ -1306,6 +1307,8 @@ bases = self.getBases( attrs['id'] ) if inner and attrs.has_key('demangled') and self.isUnnamedType(attrs['demangled']) : cls = attrs['demangled'] @@ -19,7 +19,7 @@ clt = '' else: cls = self.genTypeName(attrs['id'],const=True,colon=True) -@@ -1318,7 +1321,7 @@ +@@ -1343,7 +1346,7 @@ # Inner class/struct/union/enum. for m in memList : member = self.xref[m] @@ -28,7 +28,7 @@ and member['attrs'].get('access') in ('private','protected') \ and not self.isUnnamedType(member['attrs'].get('demangled')): cmem = self.genTypeName(member['attrs']['id'],const=True,colon=True) -@@ -1956,8 +1959,15 @@ +@@ -1981,8 +1984,15 @@ else : params = '0' s = ' .AddFunctionMember(%s, Reflex::Literal("%s"), %s%s, 0, %s, %s)' % (self.genTypeID(id), name, type, id, params, mod) s += self.genCommentProperty(attrs) @@ -44,7 +44,7 @@ def genMCODef(self, type, name, attrs, args): id = attrs['id'] cl = self.genTypeName(attrs['context'],colon=True) -@@ -2024,8 +2034,44 @@ +@@ -2049,8 +2059,44 @@ if returns == 'void' : body += ' }\n' else : body += ' }\n' body += '}\n' @@ -92,7 +92,7 @@ for a in args : Index: cint/reflex/python/genreflex/genreflex.py =================================================================== ---- cint/reflex/python/genreflex/genreflex.py (revision 40448) +--- cint/reflex/python/genreflex/genreflex.py (revision 43705) +++ cint/reflex/python/genreflex/genreflex.py (working copy) @@ -108,6 +108,10 @@ Print extra debug information while processing. Keep intermediate files\n diff --git a/pypy/module/cppyy/test/Makefile b/pypy/module/cppyy/test/Makefile --- a/pypy/module/cppyy/test/Makefile +++ b/pypy/module/cppyy/test/Makefile @@ -46,17 +46,9 @@ ifeq ($(CINT),) # TODO: methptrgetter causes these tests to crash, so don't use it for now -#stltypesDict.so: stltypes.cxx stltypes.h stltypes.xml -# $(genreflex) stltypes.h --selection=stltypes.xml -# g++ -o $@ stltypes_rflx.cpp stltypes.cxx -shared -lReflex $(cppflags) $(cppflags2) - std_streamsDict.so: std_streams.cxx std_streams.h std_streams.xml $(genreflex) std_streams.h --selection=std_streams.xml g++ -o $@ std_streams_rflx.cpp std_streams.cxx -shared -lReflex $(cppflags) $(cppflags2) - -operatorsDict.so: operators.cxx operators.h operators.xml - $(genreflex) operators.h --selection=operators.xml - g++ -o $@ operators_rflx.cpp operators.cxx -shared -lReflex $(cppflags) $(cppflags2) endif .PHONY: clean diff --git a/pypy/module/cppyy/test/datatypes.cxx b/pypy/module/cppyy/test/datatypes.cxx --- a/pypy/module/cppyy/test/datatypes.cxx +++ b/pypy/module/cppyy/test/datatypes.cxx @@ -114,18 +114,26 @@ cppyy_test_pod*& cppyy_test_data::get_pod_ptrref() { return m_ppod; } //- setters ----------------------------------------------------------------- -void cppyy_test_data::set_bool(bool b) { m_bool = b; } -void cppyy_test_data::set_char(char c) { m_char = c; } -void cppyy_test_data::set_uchar(unsigned char uc) { m_uchar = uc; } -void cppyy_test_data::set_short(short s) { m_short = s; } -void cppyy_test_data::set_ushort(unsigned short us) { m_ushort = us; } -void cppyy_test_data::set_int(int i) { m_int = i; } -void cppyy_test_data::set_uint(unsigned int ui) { m_uint = ui; } -void cppyy_test_data::set_long(long l) { m_long = l; } -void cppyy_test_data::set_ulong(unsigned long ul) { m_ulong = ul; } -void cppyy_test_data::set_float(float f) { m_float = f; } -void cppyy_test_data::set_double(double d) { m_double = d; } -void cppyy_test_data::set_enum(what w) { m_enum = w; } +void cppyy_test_data::set_bool(bool b) { m_bool = b; } +void cppyy_test_data::set_char(char c) { m_char = c; } +void cppyy_test_data::set_uchar(unsigned char uc) { m_uchar = uc; } +void cppyy_test_data::set_short(short s) { m_short = s; } +void cppyy_test_data::set_short_c(const short& s) { m_short = s; } +void cppyy_test_data::set_ushort(unsigned short us) { m_ushort = us; } +void cppyy_test_data::set_ushort_c(const unsigned short& us) { m_ushort = us; } +void cppyy_test_data::set_int(int i) { m_int = i; } +void cppyy_test_data::set_int_c(const int& i) { m_int = i; } +void cppyy_test_data::set_uint(unsigned int ui) { m_uint = ui; } +void cppyy_test_data::set_uint_c(const unsigned int& ui) { m_uint = ui; } +void cppyy_test_data::set_long(long l) { m_long = l; } +void cppyy_test_data::set_long_c(const long& l) { m_long = l; } +void cppyy_test_data::set_ulong(unsigned long ul) { m_ulong = ul; } +void cppyy_test_data::set_ulong_c(const unsigned long& ul) { m_ulong = ul; } +void cppyy_test_data::set_float(float f) { m_float = f; } +void cppyy_test_data::set_float_c(const float& f) { m_float = f; } +void cppyy_test_data::set_double(double d) { m_double = d; } +void cppyy_test_data::set_double_c(const double& d) { m_double = d; } +void cppyy_test_data::set_enum(what w) { m_enum = w; } char cppyy_test_data::s_char = 's'; unsigned char cppyy_test_data::s_uchar = 'u'; diff --git a/pypy/module/cppyy/test/datatypes.h b/pypy/module/cppyy/test/datatypes.h --- a/pypy/module/cppyy/test/datatypes.h +++ b/pypy/module/cppyy/test/datatypes.h @@ -62,13 +62,21 @@ void set_char(char c); void set_uchar(unsigned char uc); void set_short(short s); + void set_short_c(const short& s); void set_ushort(unsigned short us); + void set_ushort_c(const unsigned short& us); void set_int(int i); + void set_int_c(const int& i); void set_uint(unsigned int ui); + void set_uint_c(const unsigned int& ui); void set_long(long l); + void set_long_c(const long& l); void set_ulong(unsigned long ul); + void set_ulong_c(const unsigned long& ul); void set_float(float f); + void set_float_c(const float& f); void set_double(double d); + void set_double_c(const double& d); void set_enum(what w); public: 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 @@ -152,8 +152,12 @@ assert eval('c.get_%s()' % names[i]) == i for i in range(len(names)): - exec 'c.set_%s = %d' % (names[i],2*i) - assert eval('c.m_%s' % names[i]) == i + exec 'c.set_%s(%d)' % (names[i],2*i) + assert eval('c.m_%s' % names[i]) == 2*i + + for i in range(len(names)): + exec 'c.set_%s_c(%d)' % (names[i],3*i) + assert eval('c.m_%s' % names[i]) == 3*i # float types through functions c.set_float( 0.123 ); assert round(c.get_float() - 0.123, 5) == 0 @@ -161,9 +165,11 @@ # float types through data members c.m_float = 0.123; assert round(c.get_float() - 0.123, 5) == 0 - c.set_float( 0.234 ); assert round(c.m_float - 0.234, 5) == 0 - c.m_double = 0.456; assert round(c.get_double() - 0.456, 8) == 0 - c.set_double( 0.567 ); assert round(c.m_double - 0.567, 8) == 0 + c.set_float(0.234); assert round(c.m_float - 0.234, 5) == 0 + c.set_float_c(0.456); assert round(c.m_float - 0.456, 5) == 0 + c.m_double = 0.678; assert round(c.get_double() - 0.678, 8) == 0 + c.set_double(0.890); assert round(c.m_double - 0.890, 8) == 0 + c.set_double_c(0.012); assert round(c.m_double - 0.012, 8) == 0 # arrays; there will be pointer copies, so destroy the current ones c.destroy_arrays() _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit