[pypy-commit] pypy default: Issue #2023: cpyext: in the 'Concrete Object Layer' API,
amauryfa
noreply at buildbot.pypy.org
Sat Apr 11 22:07:59 CEST 2015
Author: Amaury Forgeot d'Arc <amauryfa at 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)
More information about the pypy-commit
mailing list