Author: Amaury Forgeot d'Arc <amaur...@gmail.com> Branch: Changeset: r76775:5580e5171f5f Date: 2015-04-11 22:05 +0200 http://bitbucket.org/pypy/pypy/changeset/5580e5171f5f/
Log: Issue #2023: cpyext: in the 'Concrete Object Layer' API, don't call methods on the object (which can be overriden), but directly on the concrete base type. PyDict_Keys(obj) should call dict.keys(obj) and not obj.keys(). diff --git a/pypy/module/cpyext/dictobject.py b/pypy/module/cpyext/dictobject.py --- a/pypy/module/cpyext/dictobject.py +++ b/pypy/module/cpyext/dictobject.py @@ -91,39 +91,39 @@ @cpython_api([PyObject], lltype.Void) def PyDict_Clear(space, w_obj): """Empty an existing dictionary of all key-value pairs.""" - space.call_method(w_obj, "clear") + space.call_method(space.w_dict, "clear", w_obj) @cpython_api([PyObject], PyObject) def PyDict_Copy(space, w_obj): """Return a new dictionary that contains the same key-value pairs as p. """ - return space.call_method(w_obj, "copy") + return space.call_method(space.w_dict, "copy", w_obj) @cpython_api([PyObject, PyObject], rffi.INT_real, error=-1) def PyDict_Update(space, w_obj, w_other): """This is the same as PyDict_Merge(a, b, 1) in C, or a.update(b) in Python. Return 0 on success or -1 if an exception was raised. """ - space.call_method(w_obj, "update", w_other) + space.call_method(space.w_dict, "update", w_obj, w_other) return 0 @cpython_api([PyObject], PyObject) def PyDict_Keys(space, w_obj): """Return a PyListObject containing all the keys from the dictionary, as in the dictionary method dict.keys().""" - return space.call_method(w_obj, "keys") + return space.call_method(space.w_dict, "keys", w_obj) @cpython_api([PyObject], PyObject) def PyDict_Values(space, w_obj): """Return a PyListObject containing all the values from the dictionary p, as in the dictionary method dict.values().""" - return space.call_method(w_obj, "values") + return space.call_method(space.w_dict, "values", w_obj) @cpython_api([PyObject], PyObject) def PyDict_Items(space, w_obj): """Return a PyListObject containing all the items from the dictionary, as in the dictionary method dict.items().""" - return space.call_method(w_obj, "items") + return space.call_method(space.w_dict, "items", w_obj) @cpython_api([PyObject, Py_ssize_tP, PyObjectP, PyObjectP], rffi.INT_real, error=CANNOT_FAIL) def PyDict_Next(space, w_dict, ppos, pkey, pvalue): @@ -175,7 +175,7 @@ # not complete. try: - w_iter = space.call_method(w_dict, "iteritems") + w_iter = space.call_method(space.w_dict, "iteritems", w_dict) pos = ppos[0] while pos: space.call_method(w_iter, "next") diff --git a/pypy/module/cpyext/listobject.py b/pypy/module/cpyext/listobject.py --- a/pypy/module/cpyext/listobject.py +++ b/pypy/module/cpyext/listobject.py @@ -65,7 +65,7 @@ """Insert the item item into list list in front of index index. Return 0 if successful; return -1 and set an exception if unsuccessful. Analogous to list.insert(index, item).""" - space.call_method(w_list, "insert", space.wrap(index), w_item) + space.call_method(space.w_list, "insert", w_list, space.wrap(index), w_item) return 0 @cpython_api([PyObject], Py_ssize_t, error=CANNOT_FAIL) @@ -98,7 +98,7 @@ failure. This is equivalent to list.sort().""" if not isinstance(w_list, W_ListObject): PyErr_BadInternalCall(space) - space.call_method(w_list, "sort") + space.call_method(space.w_list, "sort", w_list) return 0 @cpython_api([PyObject], rffi.INT_real, error=-1) @@ -107,7 +107,7 @@ failure. This is the equivalent of list.reverse().""" if not isinstance(w_list, W_ListObject): PyErr_BadInternalCall(space) - space.call_method(w_list, "reverse") + space.call_method(space.w_list, "reverse", w_list) return 0 @cpython_api([PyObject, Py_ssize_t, Py_ssize_t], PyObject) diff --git a/pypy/module/cpyext/setobject.py b/pypy/module/cpyext/setobject.py --- a/pypy/module/cpyext/setobject.py +++ b/pypy/module/cpyext/setobject.py @@ -36,7 +36,7 @@ values of brand new frozensets before they are exposed to other code.""" if not PySet_Check(space, w_s): PyErr_BadInternalCall(space) - space.call_method(w_s, 'add', w_obj) + space.call_method(space.w_set, 'add', w_s, w_obj) return 0 @cpython_api([PyObject, PyObject], rffi.INT_real, error=-1) @@ -49,7 +49,7 @@ instance of set or its subtype.""" if not PySet_Check(space, w_s): PyErr_BadInternalCall(space) - space.call_method(w_s, 'discard', w_obj) + space.call_method(space.w_set, 'discard', w_s, w_obj) return 0 @@ -59,12 +59,12 @@ object from the set. Return NULL on failure. Raise KeyError if the set is empty. Raise a SystemError if set is an not an instance of set or its subtype.""" - return space.call_method(w_set, "pop") + return space.call_method(space.w_set, "pop", w_set) @cpython_api([PyObject], rffi.INT_real, error=-1) def PySet_Clear(space, w_set): """Empty an existing set of all elements.""" - space.call_method(w_set, 'clear') + space.call_method(space.w_set, 'clear', w_set) return 0 @cpython_api([PyObject], Py_ssize_t, error=CANNOT_FAIL) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit