Author: Wim Lavrijsen <wlavrij...@lbl.gov> Branch: cling-support Changeset: r85477:107dd38e12c9 Date: 2016-06-30 15:52 -0700 http://bitbucket.org/pypy/pypy/changeset/107dd38e12c9/
Log: from Aditi: test_cppyy.py now succeeds 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 @@ -255,6 +255,8 @@ def convert_argument(self, space, w_obj, address, call_local): x = rffi.cast(self.c_ptrtype, address) x[0] = self._unwrap_object(space, w_obj) + ba = rffi.cast(rffi.CCHARP, address) + ba[capi.c_function_arg_typeoffset(space)] = self.typecode class FloatTypeConverterMixin(NumericTypeConverterMixin): _mixin_ = True @@ -337,7 +339,7 @@ _immutable_fields_ = ['libffitype', 'typecode'] libffitype = jit_libffi.types.pointer - typecode = 'F' + typecode = 'f' def convert_argument_libffi(self, space, w_obj, address, call_local): from pypy.module.cppyy.interp_cppyy import FastCallNotPossible @@ -356,7 +358,7 @@ _immutable_fields_ = ['libffitype', 'typecode'] libffitype = jit_libffi.types.pointer - typecode = 'D' + typecode = 'd' class CStringConverter(TypeConverter): @@ -713,17 +715,18 @@ "NOT_RPYTHON" # signed types (use strtoll in setting of default in __init__) type_info = ( - (rffi.SHORT, ("short", "short int")), - (rffi.INT, ("int",)), + (rffi.SHORT, ("short", "short int"), 'h'), + (rffi.INT, ("int",), 'i'), ) # constref converters exist only b/c the stubs take constref by value, whereas # libffi takes them by pointer (hence it needs the fast-path in testing); note # that this is list is not complete, as some classes are specialized - for c_type, names in type_info: + for c_type, names, c_tc in type_info: class BasicConverter(ffitypes.typeid(c_type), IntTypeConverterMixin, TypeConverter): _immutable_ = True + typecode = c_tc def __init__(self, space, default): self.default = rffi.cast(self.c_type, capi.c_strtoll(space, default)) class ConstRefConverter(ConstRefNumericTypeConverterMixin, BasicConverter): @@ -734,40 +737,35 @@ _converters["const "+name+"&"] = ConstRefConverter type_info = ( - (rffi.LONG, ("long", "long int")), - (rffi.LONGLONG, ("long long", "long long int", "Long64_t")), + (rffi.LONG, ("long", "long int"), 'l'), + (rffi.LONGLONG, ("long long", "long long int", "Long64_t"), 'k'), ) - for c_type, names in type_info: + for c_type, names, c_tc in type_info: class BasicConverter(ffitypes.typeid(c_type), IntTypeConverterMixin, TypeConverter): _immutable_ = True + typecode = c_tc def __init__(self, space, default): self.default = rffi.cast(self.c_type, capi.c_strtoll(space, default)) - class ConstRefConverter(ConstRefNumericTypeConverterMixin, BasicConverter): _immutable_ = True libffitype = jit_libffi.types.pointer - typecode = 'r' - def convert_argument(self, space, w_obj, address, call_local): - x = rffi.cast(self.c_ptrtype, address) - x[0] = self._unwrap_object(space, w_obj) - ba = rffi.cast(rffi.CCHARP, address) - ba[capi.c_function_arg_typeoffset(space)] = self.typecode for name in names: _converters[name] = BasicConverter _converters["const "+name+"&"] = ConstRefConverter # unsigned integer types (use strtoull in setting of default in __init__) type_info = ( - (rffi.USHORT, ("unsigned short", "unsigned short int")), - (rffi.UINT, ("unsigned", "unsigned int")), - (rffi.ULONG, ("unsigned long", "unsigned long int")), - (rffi.ULONGLONG, ("unsigned long long", "unsigned long long int", "ULong64_t")), + (rffi.USHORT, ("unsigned short", "unsigned short int"), 'H'), + (rffi.UINT, ("unsigned", "unsigned int"), 'I'), + (rffi.ULONG, ("unsigned long", "unsigned long int"), 'L'), + (rffi.ULONGLONG, ("unsigned long long", "unsigned long long int", "ULong64_t"), 'K'), ) - for c_type, names in type_info: + for c_type, names, c_tc in type_info: class BasicConverter(ffitypes.typeid(c_type), IntTypeConverterMixin, TypeConverter): _immutable_ = True + typecode = c_tc def __init__(self, space, default): self.default = rffi.cast(self.c_type, capi.c_strtoull(space, default)) class ConstRefConverter(ConstRefNumericTypeConverterMixin, BasicConverter): @@ -776,6 +774,7 @@ for name in names: _converters[name] = BasicConverter _converters["const "+name+"&"] = ConstRefConverter + _build_basic_converters() # create the array and pointer converters; all real work is in the mixins @@ -789,6 +788,8 @@ ('I', rffi.sizeof(rffi.UINT), ("unsigned int", "unsigned")), ('l', rffi.sizeof(rffi.LONG), ("long int", "long")), ('L', rffi.sizeof(rffi.ULONG), ("unsigned long int", "unsigned long")), + ('k', rffi.sizeof(rffi.LONGLONG),("long long", "long long int", "Long64_t")), + ('K', 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",)), ) 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 @@ -318,8 +318,8 @@ (rffi.UINT, capi.c_call_l, ("unsigned", "unsigned int")), (rffi.LONG, capi.c_call_l, ("long", "long int")), (rffi.ULONG, capi.c_call_l, ("unsigned long", "unsigned long int")), - (rffi.LONGLONG, capi.c_call_ll, ("long long", "long long int")), - (rffi.ULONGLONG, capi.c_call_ll, ("unsigned long long", "unsigned long long int")), + (rffi.LONGLONG, capi.c_call_ll, ("long long", "long long int", "Long64_t")), + (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",)), ) diff --git a/pypy/module/cppyy/src/clingcwrapper.cxx b/pypy/module/cppyy/src/clingcwrapper.cxx --- a/pypy/module/cppyy/src/clingcwrapper.cxx +++ b/pypy/module/cppyy/src/clingcwrapper.cxx @@ -341,9 +341,33 @@ std::vector<TParameter>& args = *(std::vector<TParameter>*)args_; for ( std::vector<TParameter>::size_type i = 0; i < args.size(); ++i ) { switch ( args[i].fTypeCode ) { + case 'b': /* bool */ + vargs[i] = (void*)&args[i].fValue.fBool; + break; + case 'h': /* short */ + vargs[i] = (void*)&args[i].fValue.fShort; + break; + case 'H': /* unsigned short */ + vargs[i] = (void*)&args[i].fValue.fUShort; + break; + case 'i': /* int */ + vargs[i] = (void*)&args[i].fValue.fInt; + break; + case 'I': /* unsigned int */ + vargs[i] = (void*)&args[i].fValue.fUInt; + break; case 'l': /* long */ vargs[i] = (void*)&args[i].fValue.fLong; break; + case 'L': /* unsigned long */ + vargs[i] = (void*)&args[i].fValue.fULong; + break; + case 'k': /* long long */ + vargs[i] = (void*)&args[i].fValue.fLongLong; + break; + case 'K': /* unsigned long long */ + vargs[i] = (void*)&args[i].fValue.fULongLong; + break; case 'f': /* double */ vargs[i] = (void*)&args[i].fValue.fFloat; break; @@ -353,9 +377,7 @@ case 'D': /* long double */ vargs[i] = (void*)&args[i].fValue.fLongDouble; break; - case 'k': /* long long */ - case 'K': /* unsigned long long */ - case 'U': /* unsigned long */ + case 'o': case 'p': /* void* */ vargs[i] = (void*)&args[i].fValue.fVoidp; break; @@ -519,6 +541,8 @@ // scope reflection information ---------------------------------------------- Bool_t Cppyy::IsNamespace( TCppScope_t scope ) { // Test if this scope represents a namespace. + if ( scope == GLOBAL_HANDLE ) + return kTRUE; TClassRef& cr = type_from_handle( scope ); if ( cr.GetClass() ) return cr->Property() & kIsNamespace; @@ -665,7 +689,7 @@ return (TCppIndex_t)0; } -Cppyy::TCppIndex_t Cppyy::GetMethodIndexAt( TCppScope_t scope, TCppIndex_t imeth) +Cppyy::TCppIndex_t Cppyy::GetMethodIndexAt( TCppScope_t scope, TCppIndex_t imeth ) { TClassRef& cr = type_from_handle (scope); if (cr.GetClass()) @@ -865,21 +889,8 @@ TClassRef& cr = type_from_handle( scope ); if ( cr.GetClass() && cr->GetListOfDataMembers() ) return cr->GetListOfDataMembers()->GetSize(); - else if ( scope == (TCppScope_t)GLOBAL_HANDLE ) { - std::cerr << " global data should be retrieved lazily " << std::endl; - TCollection* vars = gROOT->GetListOfGlobals( kTRUE ); - if ( g_globalvars.size() != (GlobalVars_t::size_type)vars->GetSize() ) { - g_globalvars.clear(); - g_globalvars.reserve(vars->GetSize()); - TIter ivar(vars); - - TGlobal* var = 0; - while ( (var = (TGlobal*)ivar.Next()) ) - g_globalvars.push_back( var ); - } - return (TCppIndex_t)g_globalvars.size(); - } +// global vars (and unknown classes) are always resolved lazily, so report as '0' return (TCppIndex_t)0; } _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit