[pypy-svn] r72813 - in pypy/branch/cpython-extension/pypy/module/cpyext: . test
xoraxax at codespeak.net
xoraxax at codespeak.net
Thu Mar 25 15:50:16 CET 2010
Author: xoraxax
Date: Thu Mar 25 15:50:14 2010
New Revision: 72813
Modified:
pypy/branch/cpython-extension/pypy/module/cpyext/api.py
pypy/branch/cpython-extension/pypy/module/cpyext/macros.py
pypy/branch/cpython-extension/pypy/module/cpyext/stringobject.py
pypy/branch/cpython-extension/pypy/module/cpyext/test/test_stringobject.py
pypy/branch/cpython-extension/pypy/module/cpyext/typeobject.py
Log:
Also introduce the string objects to Py_DECREF.
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/api.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/api.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/api.py Thu Mar 25 15:50:14 2010
@@ -280,7 +280,7 @@
try:
obj = state.py_objects_r2w[ptr]
except KeyError:
- if from_ref(space, ref.c_obj_type) is space.w_str:
+ if space.is_w(from_ref(space, ref.c_obj_type), space.w_str):
return force_string(space, ref)
else:
raise InvalidPointerException("Got invalid reference to a PyObject: %r" % (ref, ))
@@ -343,6 +343,7 @@
if callable.api_func.restype is rffi.INT_real:
retval = rffi.cast(rffi.INT_real, retval)
return retval
+ wrapper.__name__ = "wrapper for %r" % (callable, )
return wrapper
#_____________________________________________________
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/macros.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/macros.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/macros.py Thu Mar 25 15:50:14 2010
@@ -1,19 +1,24 @@
import ctypes
from pypy.rpython.lltypesystem import rffi, lltype
-from pypy.module.cpyext.api import cpython_api, PyObject, make_ref
+from pypy.module.cpyext.api import cpython_api, PyObject, make_ref, from_ref
from pypy.module.cpyext.state import State
# XXX Optimize these functions and put them into macro definitions
@cpython_api([PyObject], lltype.Void)
def Py_DECREF(space, obj):
+ from pypy.module.cpyext.typeobject import string_dealloc
obj.c_obj_refcnt -= 1
if obj.c_obj_refcnt == 0:
state = space.fromcache(State)
ptr = ctypes.addressof(obj._obj._storage)
- w_obj = state.py_objects_r2w.pop(ptr)
- _Py_Dealloc(space, obj)
- del state.py_objects_w2r[w_obj]
+ if ptr not in state.py_objects_r2w and \
+ space.is_w(from_ref(space, obj.c_obj_type), space.w_str):
+ string_dealloc(space, obj)
+ else:
+ w_obj = state.py_objects_r2w.pop(ptr)
+ _Py_Dealloc(space, obj)
+ del state.py_objects_w2r[w_obj]
else:
assert obj.c_obj_refcnt > 0
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/stringobject.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/stringobject.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/stringobject.py Thu Mar 25 15:50:14 2010
@@ -2,7 +2,8 @@
from pypy.module.cpyext.api import cpython_api, PyObject, PyVarObjectFields, \
PyStringObject, Py_ssize_t, cpython_struct, make_ref, from_ref
- at cpython_api([rffi.CCHARP, Py_ssize_t], PyStringObject, error=None)
+
+ at cpython_api([rffi.CCHARP, Py_ssize_t], PyStringObject, error=lltype.nullptr(PyStringObject.TO))
def PyString_FromStringAndSize(space, char_p, length):
if char_p:
s = rffi.charpsize2str(char_p, length)
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/test/test_stringobject.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/test/test_stringobject.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/test/test_stringobject.py Thu Mar 25 15:50:14 2010
@@ -54,6 +54,10 @@
PyObject* s = PyString_FromStringAndSize(NULL, 3);
if (s == NULL)
return NULL;
+ PyObject* t = PyString_FromStringAndSize(NULL, 3);
+ if (t == NULL)
+ return NULL;
+ Py_DECREF(t);
char* c = PyString_AsString(s);
//Py_ssize_t len = PyString_Size(s);
c[0] = 'a';
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/typeobject.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/typeobject.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/typeobject.py Thu Mar 25 15:50:14 2010
@@ -11,14 +11,14 @@
from pypy.interpreter.typedef import TypeDef, GetSetProperty
from pypy.module.cpyext.api import cpython_api, cpython_api_c, cpython_struct, \
PyObject, PyVarObjectFields, Py_ssize_t, Py_TPFLAGS_READYING, \
- Py_TPFLAGS_READY, make_wrapper, Py_TPFLAGS_HEAPTYPE, make_ref
+ Py_TPFLAGS_READY, make_wrapper, Py_TPFLAGS_HEAPTYPE, make_ref, \
+ PyStringObject
from pypy.interpreter.module import Module
from pypy.module.cpyext.modsupport import PyMethodDef, convert_method_defs
from pypy.module.cpyext.state import State
from pypy.module.cpyext.methodobject import generic_cpy_call
from pypy.module.cpyext.macros import Py_DECREF, Py_XDECREF
-
PyTypeObject = lltype.ForwardReference()
PyTypeObjectPtr = lltype.Ptr(PyTypeObject)
PyCFunction = Ptr(FuncType([PyObject, PyObject], PyObject))
@@ -238,12 +238,22 @@
@cpython_api([PyObject], lltype.Void, external=False)
+def string_dealloc(space, obj):
+ obj = rffi.cast(PyStringObject, obj)
+ pto = rffi.cast(PyTypeObjectPtr, obj.c_obj_type)
+ if obj.c_buffer:
+ lltype.free(obj.c_buffer, flavor="raw")
+ obj_voidp = rffi.cast(rffi.VOIDP_real, obj)
+ generic_cpy_call(space, pto.c_tp_free, obj_voidp)
+ pto = rffi.cast(PyObject, pto)
+ Py_DECREF(space, pto)
+
+ at cpython_api([PyObject], lltype.Void, external=False)
def type_dealloc(space, obj):
obj_pto = rffi.cast(PyTypeObjectPtr, obj)
type_pto = rffi.cast(PyTypeObjectPtr, obj.c_obj_type)
base_pyo = rffi.cast(PyObject, obj_pto.c_tp_base)
Py_XDECREF(space, base_pyo)
- # type_dealloc code follows:
# XXX XDECREF tp_dict, tp_bases, tp_mro, tp_cache,
# tp_subclasses
# free tp_doc
@@ -251,7 +261,7 @@
obj_pto_voidp = rffi.cast(rffi.VOIDP_real, obj_pto)
generic_cpy_call(space, type_pto.c_tp_free, obj_pto_voidp)
pto = rffi.cast(PyObject, type_pto)
- Py_DECREF(space, type_pto)
+ Py_DECREF(space, pto)
def allocate_type_obj(space, w_type):
""" Allocates a pto from a w_type which must be a PyPy type. """
@@ -263,6 +273,8 @@
pto.c_tp_dealloc = PyObject_dealloc.api_func.get_llhelper(space)
elif space.is_w(w_type, space.w_type):
pto.c_tp_dealloc = type_dealloc.api_func.get_llhelper(space)
+ elif space.is_w(w_type, space.w_str):
+ pto.c_tp_dealloc = string_dealloc.api_func.get_llhelper(space)
else:
pto.c_tp_dealloc = subtype_dealloc.api_func.get_llhelper(space)
pto.c_tp_flags = Py_TPFLAGS_HEAPTYPE
More information about the Pypy-commit
mailing list