[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