Author: Matti Picus <matti.pi...@gmail.com> Branch: Changeset: r92268:e45fdeb7813a Date: 2017-08-26 20:02 +0300 http://bitbucket.org/pypy/pypy/changeset/e45fdeb7813a/
Log: test, fix - any str subtype should never have tp_as_a_number.* functions set diff --git a/pypy/module/cpyext/test/test_bytesobject.py b/pypy/module/cpyext/test/test_bytesobject.py --- a/pypy/module/cpyext/test/test_bytesobject.py +++ b/pypy/module/cpyext/test/test_bytesobject.py @@ -367,6 +367,16 @@ """ return PyLong_FromLong(PyObject_Size(args)); """), + ('has_nb_add', "METH_O", + ''' + if (args->ob_type->tp_as_number == NULL) { + Py_RETURN_FALSE; + } + if (args->ob_type->tp_as_number->nb_add == NULL) { + Py_RETURN_FALSE; + } + Py_RETURN_TRUE; + '''), ], prologue=""" #include <Python.h> PyTypeObject PyStringArrType_Type = { @@ -447,6 +457,8 @@ ''') a = module.newsubstr('abc') + assert module.has_nb_add('a') is False + assert module.has_nb_add(a) is False assert type(a).__name__ == 'string_' assert a == 'abc' assert 3 == module.get_len(a) diff --git a/pypy/module/cpyext/typeobject.py b/pypy/module/cpyext/typeobject.py --- a/pypy/module/cpyext/typeobject.py +++ b/pypy/module/cpyext/typeobject.py @@ -309,13 +309,17 @@ setattr(pto, slot_names[0], slot_func_helper) elif ((w_type is space.w_list or w_type is space.w_tuple) and slot_names[0] == 'c_tp_as_number'): - # XXX hack - hwo can we generalize this? The problem is method + # XXX hack - how can we generalize this? The problem is method # names like __mul__ map to more than one slot, and we have no # convenient way to indicate which slots CPython have filled # # We need at least this special case since Numpy checks that # (list, tuple) do __not__ fill tp_as_number pass + elif (space.issubtype_w(w_type, space.w_basestring) and + slot_names[0] == 'c_tp_as_number'): + # like above but for any str type + pass else: assert len(slot_names) == 2 struct = getattr(pto, slot_names[0]) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit