Author: Armin Rigo <ar...@tunes.org>
Branch: cpyext-gc-support
Changeset: r80396:3444872d2fb9
Date: 2015-10-22 16:10 +0200
http://bitbucket.org/pypy/pypy/changeset/3444872d2fb9/

Log:    fixes

diff --git a/pypy/module/cpyext/stringobject.py 
b/pypy/module/cpyext/stringobject.py
--- a/pypy/module/cpyext/stringobject.py
+++ b/pypy/module/cpyext/stringobject.py
@@ -66,6 +66,7 @@
 @bootstrap_function
 def init_stringobject(space):
     "Type description of PyStringObject"
+    global _basic_size
     setup_class_for_cpyext(
         W_AbstractBytesObject,
         basestruct=PyStringObjectStruct,
@@ -86,6 +87,8 @@
         #   be freed with free() by the GC--
         alloc_pypy_light_if=PyString_CheckExact,
         )
+    W_BytesObject.typedef.cpyext_basicsize += 1    # includes the NULL
+    _basic_size = W_BytesObject.typedef.cpyext_basicsize
 
 def _string_fill_pyobj(s, ob):
     rffi.str2chararray(s, ob.c_ob_sval_pypy, len(s))
@@ -97,7 +100,7 @@
     """
     assert isinstance(w_obj, W_AbstractBytesObject)
     size = w_obj.string_length()
-    ob = lltype.malloc(PyStringObjectStruct, size + 1, flavor='raw',
+    ob = lltype.malloc(PyStringObjectStruct, _basic_size + size, flavor='raw',
                        track_allocation=False)
     ob.c_ob_size = size
     if size > 8:
@@ -152,7 +155,7 @@
         raise OperationError(space.w_TypeError, space.wrap(
             "PyString_AsString only support strings"))
     ref_str = rffi.cast(PyStringObject, ref)
-    last_char = ref_str.c_ob_sval_pypy[ref_str.ob_size]
+    last_char = ref_str.c_ob_sval_pypy[ref_str.c_ob_size]
     if last_char != '\x00':
         assert last_char == '*'
         # copy string buffer
diff --git a/pypy/module/cpyext/test/test_stringobject.py 
b/pypy/module/cpyext/test/test_stringobject.py
--- a/pypy/module/cpyext/test/test_stringobject.py
+++ b/pypy/module/cpyext/test/test_stringobject.py
@@ -28,7 +28,7 @@
                  if(PyString_Size(s) == 11) {
                      result = 1;
                  }
-                 if(s->ob_type->tp_basicsize != sizeof(void*)*4)
+                 if(s->ob_type->tp_basicsize != sizeof(void*) * 4 + 1)
                      result = 0;
                  if(s->ob_type->tp_itemsize != sizeof(char))
                      result = 0;
@@ -79,8 +79,7 @@
             ])
         s = module.getstring()
         assert len(s) == 4
-        assert s == 'ab\x00c'
-
+        assert s[:2] == 'ab' and s[3] == 'c'      # s[2] undefined
 
 
     def test_AsString(self):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to