mirror of
https://github.com/python/cpython.git
synced 2025-09-28 11:15:17 +00:00
gh-105751: test_ctypes avoids the operator module (GH-105797)
* Replace operator.delitem(obj, index) with "del obj[index]". * Replace operator.setitem(obj, index, value) with "obj[index] = value". * Replace delattr(obj, "attr) with "del obj.attr". * Replace grc() with sys.getrefcount() for readability.
This commit is contained in:
parent
e7507bd131
commit
5ab13c5f97
10 changed files with 84 additions and 79 deletions
|
@ -46,9 +46,9 @@ class ArrayTestCase(unittest.TestCase):
|
||||||
with self.assertRaises(IndexError): ia[-alen-1]
|
with self.assertRaises(IndexError): ia[-alen-1]
|
||||||
|
|
||||||
# change the items
|
# change the items
|
||||||
from operator import setitem
|
|
||||||
new_values = list(range(42, 42+alen))
|
new_values = list(range(42, 42+alen))
|
||||||
[setitem(ia, n, new_values[n]) for n in range(alen)]
|
for n in range(alen):
|
||||||
|
ia[n] = new_values[n]
|
||||||
values = [ia[i] for i in range(alen)]
|
values = [ia[i] for i in range(alen)]
|
||||||
self.assertEqual(values, new_values)
|
self.assertEqual(values, new_values)
|
||||||
|
|
||||||
|
@ -78,8 +78,8 @@ class ArrayTestCase(unittest.TestCase):
|
||||||
self.assertEqual(len(ca), 3)
|
self.assertEqual(len(ca), 3)
|
||||||
|
|
||||||
# cannot delete items
|
# cannot delete items
|
||||||
from operator import delitem
|
with self.assertRaises(TypeError):
|
||||||
self.assertRaises(TypeError, delitem, ca, 0)
|
del ca[0]
|
||||||
|
|
||||||
def test_step_overflow(self):
|
def test_step_overflow(self):
|
||||||
a = (c_int * 5)()
|
a = (c_int * 5)()
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import functools
|
import functools
|
||||||
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
from test import support
|
from test import support
|
||||||
|
|
||||||
|
@ -106,15 +107,14 @@ class Callbacks(unittest.TestCase):
|
||||||
|
|
||||||
def test_pyobject(self):
|
def test_pyobject(self):
|
||||||
o = ()
|
o = ()
|
||||||
from sys import getrefcount as grc
|
|
||||||
for o in (), [], object():
|
for o in (), [], object():
|
||||||
initial = grc(o)
|
initial = sys.getrefcount(o)
|
||||||
# This call leaks a reference to 'o'...
|
# This call leaks a reference to 'o'...
|
||||||
self.check_type(py_object, o)
|
self.check_type(py_object, o)
|
||||||
before = grc(o)
|
before = sys.getrefcount(o)
|
||||||
# ...but this call doesn't leak any more. Where is the refcount?
|
# ...but this call doesn't leak any more. Where is the refcount?
|
||||||
self.check_type(py_object, o)
|
self.check_type(py_object, o)
|
||||||
after = grc(o)
|
after = sys.getrefcount(o)
|
||||||
self.assertEqual((after, o), (before, o))
|
self.assertEqual((after, o), (before, o))
|
||||||
|
|
||||||
def test_unsupported_restype_1(self):
|
def test_unsupported_restype_1(self):
|
||||||
|
|
|
@ -8,16 +8,18 @@ class X(Structure):
|
||||||
|
|
||||||
class TestCase(unittest.TestCase):
|
class TestCase(unittest.TestCase):
|
||||||
def test_simple(self):
|
def test_simple(self):
|
||||||
self.assertRaises(TypeError,
|
with self.assertRaises(TypeError):
|
||||||
delattr, c_int(42), "value")
|
del c_int(42).value
|
||||||
|
|
||||||
def test_chararray(self):
|
def test_chararray(self):
|
||||||
self.assertRaises(TypeError,
|
chararray = (c_char * 5)()
|
||||||
delattr, (c_char * 5)(), "value")
|
with self.assertRaises(TypeError):
|
||||||
|
del chararray.value
|
||||||
|
|
||||||
def test_struct(self):
|
def test_struct(self):
|
||||||
self.assertRaises(TypeError,
|
struct = X()
|
||||||
delattr, X(), "foo")
|
with self.assertRaises(TypeError):
|
||||||
|
del struct.foo
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# This tests the internal _objects attribute
|
# This tests the internal _objects attribute
|
||||||
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
from ctypes import Structure, POINTER, c_char_p, c_int
|
from ctypes import Structure, POINTER, c_char_p, c_int
|
||||||
from sys import getrefcount as grc
|
|
||||||
|
|
||||||
# XXX This test must be reviewed for correctness!!!
|
# XXX This test must be reviewed for correctness!!!
|
||||||
|
|
||||||
|
@ -20,16 +20,16 @@ class ObjectsTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def test_ints(self):
|
def test_ints(self):
|
||||||
i = 42000123
|
i = 42000123
|
||||||
refcnt = grc(i)
|
refcnt = sys.getrefcount(i)
|
||||||
ci = c_int(i)
|
ci = c_int(i)
|
||||||
self.assertEqual(refcnt, grc(i))
|
self.assertEqual(refcnt, sys.getrefcount(i))
|
||||||
self.assertEqual(ci._objects, None)
|
self.assertEqual(ci._objects, None)
|
||||||
|
|
||||||
def test_c_char_p(self):
|
def test_c_char_p(self):
|
||||||
s = b"Hello, World"
|
s = b"Hello, World"
|
||||||
refcnt = grc(s)
|
refcnt = sys.getrefcount(s)
|
||||||
cs = c_char_p(s)
|
cs = c_char_p(s)
|
||||||
self.assertEqual(refcnt + 1, grc(s))
|
self.assertEqual(refcnt + 1, sys.getrefcount(s))
|
||||||
self.assertSame(cs._objects, s)
|
self.assertSame(cs._objects, s)
|
||||||
|
|
||||||
def test_simple_struct(self):
|
def test_simple_struct(self):
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
from ctypes import Structure, POINTER, pointer, c_char_p, c_int
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
|
from ctypes import Structure, POINTER, pointer, c_char_p, c_int
|
||||||
|
|
||||||
|
|
||||||
class SimpleTestCase(unittest.TestCase):
|
class SimpleTestCase(unittest.TestCase):
|
||||||
def test_cint(self):
|
def test_cint(self):
|
||||||
|
@ -100,16 +102,15 @@ class DeletePointerTestCase(unittest.TestCase):
|
||||||
_fields_ = [("p", POINTER(c_char_p))]
|
_fields_ = [("p", POINTER(c_char_p))]
|
||||||
x = X()
|
x = X()
|
||||||
i = c_char_p("abc def")
|
i = c_char_p("abc def")
|
||||||
from sys import getrefcount as grc
|
print("2?", sys.getrefcount(i))
|
||||||
print("2?", grc(i))
|
|
||||||
x.p = pointer(i)
|
x.p = pointer(i)
|
||||||
print("3?", grc(i))
|
print("3?", sys.getrefcount(i))
|
||||||
for i in range(320):
|
for i in range(320):
|
||||||
c_int(99)
|
c_int(99)
|
||||||
x.p[0]
|
x.p[0]
|
||||||
print(x.p[0])
|
print(x.p[0])
|
||||||
## del x
|
## del x
|
||||||
## print "2?", grc(i)
|
## print "2?", sys.getrefcount(i)
|
||||||
## del i
|
## del i
|
||||||
import gc
|
import gc
|
||||||
gc.collect()
|
gc.collect()
|
||||||
|
|
|
@ -97,7 +97,6 @@ class PointersTestCase(unittest.TestCase):
|
||||||
## print self.result
|
## print self.result
|
||||||
|
|
||||||
def test_basics(self):
|
def test_basics(self):
|
||||||
from operator import delitem
|
|
||||||
for ct, pt in zip(ctype_types, python_types):
|
for ct, pt in zip(ctype_types, python_types):
|
||||||
i = ct(42)
|
i = ct(42)
|
||||||
p = pointer(i)
|
p = pointer(i)
|
||||||
|
@ -108,7 +107,8 @@ class PointersTestCase(unittest.TestCase):
|
||||||
## self.assertEqual(p.contents, 42)
|
## self.assertEqual(p.contents, 42)
|
||||||
## self.assertEqual(p[0], 42)
|
## self.assertEqual(p[0], 42)
|
||||||
|
|
||||||
self.assertRaises(TypeError, delitem, p, 0)
|
with self.assertRaises(TypeError):
|
||||||
|
del p[0]
|
||||||
|
|
||||||
def test_from_address(self):
|
def test_from_address(self):
|
||||||
from array import array
|
from array import array
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import unittest
|
import unittest
|
||||||
|
import sys
|
||||||
from test import support
|
from test import support
|
||||||
from ctypes import (pythonapi, POINTER, c_buffer, sizeof,
|
from ctypes import (pythonapi, POINTER, c_buffer, sizeof,
|
||||||
py_object, c_char_p, c_char, c_long, c_size_t)
|
py_object, c_char_p, c_char, c_long, c_size_t)
|
||||||
|
@ -11,7 +12,6 @@ from _ctypes import PyObj_FromPtr
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
|
|
||||||
from sys import getrefcount as grc
|
|
||||||
|
|
||||||
class PythonAPITestCase(unittest.TestCase):
|
class PythonAPITestCase(unittest.TestCase):
|
||||||
|
|
||||||
|
@ -29,41 +29,41 @@ class PythonAPITestCase(unittest.TestCase):
|
||||||
pythonapi.PyBytes_FromString.argtypes = (c_char_p,)
|
pythonapi.PyBytes_FromString.argtypes = (c_char_p,)
|
||||||
|
|
||||||
s = b"abc"
|
s = b"abc"
|
||||||
refcnt = grc(s)
|
refcnt = sys.getrefcount(s)
|
||||||
pyob = pythonapi.PyBytes_FromString(s)
|
pyob = pythonapi.PyBytes_FromString(s)
|
||||||
self.assertEqual(grc(s), refcnt)
|
self.assertEqual(sys.getrefcount(s), refcnt)
|
||||||
self.assertEqual(s, pyob)
|
self.assertEqual(s, pyob)
|
||||||
del pyob
|
del pyob
|
||||||
self.assertEqual(grc(s), refcnt)
|
self.assertEqual(sys.getrefcount(s), refcnt)
|
||||||
|
|
||||||
@support.refcount_test
|
@support.refcount_test
|
||||||
def test_PyLong_Long(self):
|
def test_PyLong_Long(self):
|
||||||
ref42 = grc(42)
|
ref42 = sys.getrefcount(42)
|
||||||
pythonapi.PyLong_FromLong.restype = py_object
|
pythonapi.PyLong_FromLong.restype = py_object
|
||||||
self.assertEqual(pythonapi.PyLong_FromLong(42), 42)
|
self.assertEqual(pythonapi.PyLong_FromLong(42), 42)
|
||||||
|
|
||||||
self.assertEqual(grc(42), ref42)
|
self.assertEqual(sys.getrefcount(42), ref42)
|
||||||
|
|
||||||
pythonapi.PyLong_AsLong.argtypes = (py_object,)
|
pythonapi.PyLong_AsLong.argtypes = (py_object,)
|
||||||
pythonapi.PyLong_AsLong.restype = c_long
|
pythonapi.PyLong_AsLong.restype = c_long
|
||||||
|
|
||||||
res = pythonapi.PyLong_AsLong(42)
|
res = pythonapi.PyLong_AsLong(42)
|
||||||
# Small int refcnts don't change
|
# Small int refcnts don't change
|
||||||
self.assertEqual(grc(res), ref42)
|
self.assertEqual(sys.getrefcount(res), ref42)
|
||||||
del res
|
del res
|
||||||
self.assertEqual(grc(42), ref42)
|
self.assertEqual(sys.getrefcount(42), ref42)
|
||||||
|
|
||||||
@support.refcount_test
|
@support.refcount_test
|
||||||
def test_PyObj_FromPtr(self):
|
def test_PyObj_FromPtr(self):
|
||||||
s = "abc def ghi jkl"
|
s = "abc def ghi jkl"
|
||||||
ref = grc(s)
|
ref = sys.getrefcount(s)
|
||||||
# id(python-object) is the address
|
# id(python-object) is the address
|
||||||
pyobj = PyObj_FromPtr(id(s))
|
pyobj = PyObj_FromPtr(id(s))
|
||||||
self.assertIs(s, pyobj)
|
self.assertIs(s, pyobj)
|
||||||
|
|
||||||
self.assertEqual(grc(s), ref + 1)
|
self.assertEqual(sys.getrefcount(s), ref + 1)
|
||||||
del pyobj
|
del pyobj
|
||||||
self.assertEqual(grc(s), ref)
|
self.assertEqual(sys.getrefcount(s), ref)
|
||||||
|
|
||||||
def test_PyOS_snprintf(self):
|
def test_PyOS_snprintf(self):
|
||||||
PyOS_snprintf = pythonapi.PyOS_snprintf
|
PyOS_snprintf = pythonapi.PyOS_snprintf
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import unittest
|
|
||||||
from test import support
|
|
||||||
import ctypes
|
import ctypes
|
||||||
import gc
|
import gc
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
from test import support
|
||||||
|
|
||||||
MyCallback = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int)
|
MyCallback = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int)
|
||||||
OtherCallback = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_ulonglong)
|
OtherCallback = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_ulonglong)
|
||||||
|
@ -13,8 +14,6 @@ class RefcountTestCase(unittest.TestCase):
|
||||||
|
|
||||||
@support.refcount_test
|
@support.refcount_test
|
||||||
def test_1(self):
|
def test_1(self):
|
||||||
from sys import getrefcount as grc
|
|
||||||
|
|
||||||
f = dll._testfunc_callback_i_if
|
f = dll._testfunc_callback_i_if
|
||||||
f.restype = ctypes.c_int
|
f.restype = ctypes.c_int
|
||||||
f.argtypes = [ctypes.c_int, MyCallback]
|
f.argtypes = [ctypes.c_int, MyCallback]
|
||||||
|
@ -23,38 +22,37 @@ class RefcountTestCase(unittest.TestCase):
|
||||||
#print "called back with", value
|
#print "called back with", value
|
||||||
return value
|
return value
|
||||||
|
|
||||||
self.assertEqual(grc(callback), 2)
|
self.assertEqual(sys.getrefcount(callback), 2)
|
||||||
cb = MyCallback(callback)
|
cb = MyCallback(callback)
|
||||||
|
|
||||||
self.assertGreater(grc(callback), 2)
|
self.assertGreater(sys.getrefcount(callback), 2)
|
||||||
result = f(-10, cb)
|
result = f(-10, cb)
|
||||||
self.assertEqual(result, -18)
|
self.assertEqual(result, -18)
|
||||||
cb = None
|
cb = None
|
||||||
|
|
||||||
gc.collect()
|
gc.collect()
|
||||||
|
|
||||||
self.assertEqual(grc(callback), 2)
|
self.assertEqual(sys.getrefcount(callback), 2)
|
||||||
|
|
||||||
|
|
||||||
@support.refcount_test
|
@support.refcount_test
|
||||||
def test_refcount(self):
|
def test_refcount(self):
|
||||||
from sys import getrefcount as grc
|
|
||||||
def func(*args):
|
def func(*args):
|
||||||
pass
|
pass
|
||||||
# this is the standard refcount for func
|
# this is the standard refcount for func
|
||||||
self.assertEqual(grc(func), 2)
|
self.assertEqual(sys.getrefcount(func), 2)
|
||||||
|
|
||||||
# the CFuncPtr instance holds at least one refcount on func:
|
# the CFuncPtr instance holds at least one refcount on func:
|
||||||
f = OtherCallback(func)
|
f = OtherCallback(func)
|
||||||
self.assertGreater(grc(func), 2)
|
self.assertGreater(sys.getrefcount(func), 2)
|
||||||
|
|
||||||
# and may release it again
|
# and may release it again
|
||||||
del f
|
del f
|
||||||
self.assertGreaterEqual(grc(func), 2)
|
self.assertGreaterEqual(sys.getrefcount(func), 2)
|
||||||
|
|
||||||
# but now it must be gone
|
# but now it must be gone
|
||||||
gc.collect()
|
gc.collect()
|
||||||
self.assertEqual(grc(func), 2)
|
self.assertEqual(sys.getrefcount(func), 2)
|
||||||
|
|
||||||
class X(ctypes.Structure):
|
class X(ctypes.Structure):
|
||||||
_fields_ = [("a", OtherCallback)]
|
_fields_ = [("a", OtherCallback)]
|
||||||
|
@ -62,27 +60,27 @@ class RefcountTestCase(unittest.TestCase):
|
||||||
x.a = OtherCallback(func)
|
x.a = OtherCallback(func)
|
||||||
|
|
||||||
# the CFuncPtr instance holds at least one refcount on func:
|
# the CFuncPtr instance holds at least one refcount on func:
|
||||||
self.assertGreater(grc(func), 2)
|
self.assertGreater(sys.getrefcount(func), 2)
|
||||||
|
|
||||||
# and may release it again
|
# and may release it again
|
||||||
del x
|
del x
|
||||||
self.assertGreaterEqual(grc(func), 2)
|
self.assertGreaterEqual(sys.getrefcount(func), 2)
|
||||||
|
|
||||||
# and now it must be gone again
|
# and now it must be gone again
|
||||||
gc.collect()
|
gc.collect()
|
||||||
self.assertEqual(grc(func), 2)
|
self.assertEqual(sys.getrefcount(func), 2)
|
||||||
|
|
||||||
f = OtherCallback(func)
|
f = OtherCallback(func)
|
||||||
|
|
||||||
# the CFuncPtr instance holds at least one refcount on func:
|
# the CFuncPtr instance holds at least one refcount on func:
|
||||||
self.assertGreater(grc(func), 2)
|
self.assertGreater(sys.getrefcount(func), 2)
|
||||||
|
|
||||||
# create a cycle
|
# create a cycle
|
||||||
f.cycle = f
|
f.cycle = f
|
||||||
|
|
||||||
del f
|
del f
|
||||||
gc.collect()
|
gc.collect()
|
||||||
self.assertEqual(grc(func), 2)
|
self.assertEqual(sys.getrefcount(func), 2)
|
||||||
|
|
||||||
class AnotherLeak(unittest.TestCase):
|
class AnotherLeak(unittest.TestCase):
|
||||||
def test_callback(self):
|
def test_callback(self):
|
||||||
|
|
|
@ -46,18 +46,21 @@ class SlicesTestCase(unittest.TestCase):
|
||||||
b[33::-3] = range(12)
|
b[33::-3] = range(12)
|
||||||
self.assertEqual(a[:], b)
|
self.assertEqual(a[:], b)
|
||||||
|
|
||||||
from operator import setitem
|
# TypeError: int expected instead of str instance
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
a[:5] = "abcde"
|
||||||
|
|
||||||
# TypeError: int expected instead of str instance
|
# TypeError: int expected instead of str instance
|
||||||
self.assertRaises(TypeError, setitem, a, slice(0, 5), "abcde")
|
with self.assertRaises(TypeError):
|
||||||
# TypeError: int expected instead of str instance
|
a[:5] = ["a", "b", "c", "d", "e"]
|
||||||
self.assertRaises(TypeError, setitem, a, slice(0, 5),
|
|
||||||
["a", "b", "c", "d", "e"])
|
|
||||||
# TypeError: int expected instead of float instance
|
# TypeError: int expected instead of float instance
|
||||||
self.assertRaises(TypeError, setitem, a, slice(0, 5),
|
with self.assertRaises(TypeError):
|
||||||
[1, 2, 3, 4, 3.14])
|
a[:5] = [1, 2, 3, 4, 3.14]
|
||||||
|
|
||||||
# ValueError: Can only assign sequence of same size
|
# ValueError: Can only assign sequence of same size
|
||||||
self.assertRaises(ValueError, setitem, a, slice(0, 5), range(32))
|
with self.assertRaises(ValueError):
|
||||||
|
a[:5] = range(32)
|
||||||
|
|
||||||
def test_char_ptr(self):
|
def test_char_ptr(self):
|
||||||
s = b"abcdefghijklmnopqrstuvwxyz"
|
s = b"abcdefghijklmnopqrstuvwxyz"
|
||||||
|
@ -73,18 +76,20 @@ class SlicesTestCase(unittest.TestCase):
|
||||||
self.assertEqual(res[len(s)-1:5:-7], s[:5:-7])
|
self.assertEqual(res[len(s)-1:5:-7], s[:5:-7])
|
||||||
self.assertEqual(res[0:-1:-1], s[0::-1])
|
self.assertEqual(res[0:-1:-1], s[0::-1])
|
||||||
|
|
||||||
import operator
|
# get items
|
||||||
self.assertRaises(ValueError, operator.getitem,
|
with self.assertRaises(ValueError):
|
||||||
res, slice(None, None, None))
|
res[:]
|
||||||
self.assertRaises(ValueError, operator.getitem,
|
with self.assertRaises(ValueError):
|
||||||
res, slice(0, None, None))
|
res[0:]
|
||||||
self.assertRaises(ValueError, operator.getitem,
|
with self.assertRaises(ValueError):
|
||||||
res, slice(None, 5, -1))
|
res[:5:-1]
|
||||||
self.assertRaises(ValueError, operator.getitem,
|
with self.assertRaises(ValueError):
|
||||||
res, slice(-5, None, None))
|
res[-5:]
|
||||||
|
|
||||||
|
# set items
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
res[:5] = "abcde"
|
||||||
|
|
||||||
self.assertRaises(TypeError, operator.setitem,
|
|
||||||
res, slice(0, 5), "abcde")
|
|
||||||
dll.my_free(res)
|
dll.my_free(res)
|
||||||
|
|
||||||
dll.my_strdup.restype = POINTER(c_byte)
|
dll.my_strdup.restype = POINTER(c_byte)
|
||||||
|
@ -139,9 +144,8 @@ class SlicesTestCase(unittest.TestCase):
|
||||||
self.assertEqual(res[len(s)-1:-1:-1], s[::-1])
|
self.assertEqual(res[len(s)-1:-1:-1], s[::-1])
|
||||||
self.assertEqual(res[len(s)-1:5:-7], s[:5:-7])
|
self.assertEqual(res[len(s)-1:5:-7], s[:5:-7])
|
||||||
|
|
||||||
import operator
|
with self.assertRaises(TypeError):
|
||||||
self.assertRaises(TypeError, operator.setitem,
|
res[:5] = "abcde"
|
||||||
res, slice(0, 5), "abcde")
|
|
||||||
dll.my_free(res)
|
dll.my_free(res)
|
||||||
|
|
||||||
if sizeof(c_wchar) == sizeof(c_short):
|
if sizeof(c_wchar) == sizeof(c_short):
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import unittest
|
import unittest
|
||||||
|
import sys
|
||||||
from test import support
|
from test import support
|
||||||
from ctypes import CDLL, Structure, POINTER, c_buffer, c_char, c_char_p
|
from ctypes import CDLL, Structure, POINTER, c_buffer, c_char, c_char_p
|
||||||
|
|
||||||
|
@ -17,10 +18,9 @@ class StringPtrTestCase(unittest.TestCase):
|
||||||
# NULL pointer access
|
# NULL pointer access
|
||||||
self.assertRaises(ValueError, getattr, x.str, "contents")
|
self.assertRaises(ValueError, getattr, x.str, "contents")
|
||||||
b = c_buffer(b"Hello, World")
|
b = c_buffer(b"Hello, World")
|
||||||
from sys import getrefcount as grc
|
self.assertEqual(sys.getrefcount(b), 2)
|
||||||
self.assertEqual(grc(b), 2)
|
|
||||||
x.str = b
|
x.str = b
|
||||||
self.assertEqual(grc(b), 3)
|
self.assertEqual(sys.getrefcount(b), 3)
|
||||||
|
|
||||||
# POINTER(c_char) and Python string is NOT compatible
|
# POINTER(c_char) and Python string is NOT compatible
|
||||||
# POINTER(c_char) and c_buffer() is compatible
|
# POINTER(c_char) and c_buffer() is compatible
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue