def get_converter(space, name, default): # The matching of the name to a converter should follow: # 1) full, exact match # 1a) const-removed match # 2) match of decorated, unqualified type # 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(space, name) # 1) full, exact match try: return _converters[name](space, default) except KeyError: pass # 1a) const-removed match try: return _converters[helper.remove_const(name)](space, default) except KeyError: pass # 2) match of decorated, unqualified type compound = helper.compound(name) clean_name = capi.c_resolve_name(space, helper.clean_type(name)) try: # array_index may be negative to indicate no size or no size found array_size = helper.array_size(name) return _a_converters[clean_name + compound](space, array_size) except KeyError: pass # 3) TODO: accept ref as pointer # 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: # type check for the benefit of the annotator from pypy.module.cppyy.interp_cppyy import W_CPPClass cppclass = space.interp_w(W_CPPClass, cppclass, can_be_None=False) if compound == "*": return InstancePtrConverter(space, cppclass) elif compound == "&": return InstanceRefConverter(space, cppclass) elif compound == "**": return InstancePtrPtrConverter(space, cppclass) elif compound == "": return InstanceConverter(space, cppclass) elif capi.c_is_enum(space, clean_name): return _converters['unsigned'](space, default) # 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 return VoidConverter(space, name)
def get_converter(space, name, default): # The matching of the name to a converter should follow: # 1) full, exact match # 1a) const-removed match # 2) match of decorated, unqualified type # 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(space, name) # 1) full, exact match try: return _converters[name](space, default) except KeyError: pass # 1a) const-removed match try: return _converters[helper.remove_const(name)](space, default) except KeyError: pass # 2) match of decorated, unqualified type compound = helper.compound(name) clean_name = capi.c_resolve_name(space, helper.clean_type(name)) try: # array_index may be negative to indicate no size or no size found array_size = helper.array_size(name) return _a_converters[clean_name+compound](space, array_size) except KeyError: pass # 3) TODO: accept ref as pointer # 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: # type check for the benefit of the annotator from pypy.module.cppyy.interp_cppyy import W_CPPClass cppclass = space.interp_w(W_CPPClass, cppclass, can_be_None=False) if compound == "*": return InstancePtrConverter(space, cppclass) elif compound == "&": return InstanceRefConverter(space, cppclass) elif compound == "**": return InstancePtrPtrConverter(space, cppclass) elif compound == "": return InstanceConverter(space, cppclass) elif capi.c_is_enum(space, clean_name): return _converters['unsigned'](space, default) # 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 return VoidConverter(space, name)
def test_remove_const(): assert helper.remove_const("const int") == "int" assert helper.remove_const("const some_class*") == "some_class*" assert helper.remove_const("const some_class const*") == "some_class*" assert helper.remove_const("some_class const*const") == "some_class*" assert helper.remove_const("const some_class<const aap>*") == "some_class<const aap>*" assert helper.remove_const("const some_class<const aap> const*") == "some_class<const aap>*" assert helper.remove_const("some_class const<const aap*const>*const") == "some_class<const aap*const>*"
def test_remove_const(): assert helper.remove_const("const int") == "int"