diff --git a/Lib/test/test_capi/test_bytearray.py b/Lib/test/test_capi/test_bytearray.py
index 833122c4e319d8..39099f6b82240f 100644
--- a/Lib/test/test_capi/test_bytearray.py
+++ b/Lib/test/test_capi/test_bytearray.py
@@ -1,7 +1,7 @@
import unittest
from test.support import import_helper
-_testcapi = import_helper.import_module('_testcapi')
+_testlimitedcapi = import_helper.import_module('_testlimitedcapi')
from _testcapi import PY_SSIZE_T_MIN, PY_SSIZE_T_MAX
NULL = None
@@ -19,7 +19,7 @@ def __bytes__(self):
class CAPITest(unittest.TestCase):
def test_check(self):
# Test PyByteArray_Check()
- check = _testcapi.bytearray_check
+ check = _testlimitedcapi.bytearray_check
self.assertTrue(check(bytearray(b'abc')))
self.assertFalse(check(b'abc'))
self.assertTrue(check(ByteArraySubclass(b'abc')))
@@ -32,7 +32,7 @@ def test_check(self):
def test_checkexact(self):
# Test PyByteArray_CheckExact()
- check = _testcapi.bytearray_checkexact
+ check = _testlimitedcapi.bytearray_checkexact
self.assertTrue(check(bytearray(b'abc')))
self.assertFalse(check(b'abc'))
self.assertFalse(check(ByteArraySubclass(b'abc')))
@@ -45,7 +45,7 @@ def test_checkexact(self):
def test_fromstringandsize(self):
# Test PyByteArray_FromStringAndSize()
- fromstringandsize = _testcapi.bytearray_fromstringandsize
+ fromstringandsize = _testlimitedcapi.bytearray_fromstringandsize
self.assertEqual(fromstringandsize(b'abc'), bytearray(b'abc'))
self.assertEqual(fromstringandsize(b'abc', 2), bytearray(b'ab'))
@@ -62,7 +62,7 @@ def test_fromstringandsize(self):
def test_fromobject(self):
# Test PyByteArray_FromObject()
- fromobject = _testcapi.bytearray_fromobject
+ fromobject = _testlimitedcapi.bytearray_fromobject
self.assertEqual(fromobject(b'abc'), bytearray(b'abc'))
self.assertEqual(fromobject(bytearray(b'abc')), bytearray(b'abc'))
@@ -77,7 +77,7 @@ def test_fromobject(self):
def test_size(self):
# Test PyByteArray_Size()
- size = _testcapi.bytearray_size
+ size = _testlimitedcapi.bytearray_size
self.assertEqual(size(bytearray(b'abc')), 3)
self.assertEqual(size(ByteArraySubclass(b'abc')), 3)
@@ -88,7 +88,7 @@ def test_size(self):
def test_asstring(self):
"""Test PyByteArray_AsString()"""
- asstring = _testcapi.bytearray_asstring
+ asstring = _testlimitedcapi.bytearray_asstring
self.assertEqual(asstring(bytearray(b'abc'), 4), b'abc\0')
self.assertEqual(asstring(ByteArraySubclass(b'abc'), 4), b'abc\0')
@@ -100,7 +100,7 @@ def test_asstring(self):
def test_concat(self):
"""Test PyByteArray_Concat()"""
- concat = _testcapi.bytearray_concat
+ concat = _testlimitedcapi.bytearray_concat
ba = bytearray(b'abc')
self.assertEqual(concat(ba, b'def'), bytearray(b'abcdef'))
@@ -133,7 +133,7 @@ def test_concat(self):
def test_resize(self):
"""Test PyByteArray_Resize()"""
- resize = _testcapi.bytearray_resize
+ resize = _testlimitedcapi.bytearray_resize
ba = bytearray(b'abcdef')
self.assertEqual(resize(ba, 3), 0)
diff --git a/Lib/test/test_capi/test_bytes.py b/Lib/test/test_capi/test_bytes.py
index bb5d724ff187d4..a2ba7708f8fd26 100644
--- a/Lib/test/test_capi/test_bytes.py
+++ b/Lib/test/test_capi/test_bytes.py
@@ -1,7 +1,7 @@
import unittest
from test.support import import_helper
-_testcapi = import_helper.import_module('_testcapi')
+_testlimitedcapi = import_helper.import_module('_testlimitedcapi')
from _testcapi import PY_SSIZE_T_MIN, PY_SSIZE_T_MAX
NULL = None
@@ -19,7 +19,7 @@ def __bytes__(self):
class CAPITest(unittest.TestCase):
def test_check(self):
# Test PyBytes_Check()
- check = _testcapi.bytes_check
+ check = _testlimitedcapi.bytes_check
self.assertTrue(check(b'abc'))
self.assertFalse(check('abc'))
self.assertFalse(check(bytearray(b'abc')))
@@ -33,7 +33,7 @@ def test_check(self):
def test_checkexact(self):
# Test PyBytes_CheckExact()
- check = _testcapi.bytes_checkexact
+ check = _testlimitedcapi.bytes_checkexact
self.assertTrue(check(b'abc'))
self.assertFalse(check('abc'))
self.assertFalse(check(bytearray(b'abc')))
@@ -47,7 +47,7 @@ def test_checkexact(self):
def test_fromstringandsize(self):
# Test PyBytes_FromStringAndSize()
- fromstringandsize = _testcapi.bytes_fromstringandsize
+ fromstringandsize = _testlimitedcapi.bytes_fromstringandsize
self.assertEqual(fromstringandsize(b'abc'), b'abc')
self.assertEqual(fromstringandsize(b'abc', 2), b'ab')
@@ -65,7 +65,7 @@ def test_fromstringandsize(self):
def test_fromstring(self):
# Test PyBytes_FromString()
- fromstring = _testcapi.bytes_fromstring
+ fromstring = _testlimitedcapi.bytes_fromstring
self.assertEqual(fromstring(b'abc\0def'), b'abc')
self.assertEqual(fromstring(b''), b'')
@@ -74,7 +74,7 @@ def test_fromstring(self):
def test_fromobject(self):
# Test PyBytes_FromObject()
- fromobject = _testcapi.bytes_fromobject
+ fromobject = _testlimitedcapi.bytes_fromobject
self.assertEqual(fromobject(b'abc'), b'abc')
self.assertEqual(fromobject(bytearray(b'abc')), b'abc')
@@ -88,7 +88,7 @@ def test_fromobject(self):
def test_size(self):
# Test PyBytes_Size()
- size = _testcapi.bytes_size
+ size = _testlimitedcapi.bytes_size
self.assertEqual(size(b'abc'), 3)
self.assertEqual(size(BytesSubclass(b'abc')), 3)
@@ -100,7 +100,7 @@ def test_size(self):
def test_asstring(self):
"""Test PyBytes_AsString()"""
- asstring = _testcapi.bytes_asstring
+ asstring = _testlimitedcapi.bytes_asstring
self.assertEqual(asstring(b'abc', 4), b'abc\0')
self.assertEqual(asstring(b'abc\0def', 8), b'abc\0def\0')
@@ -111,8 +111,8 @@ def test_asstring(self):
def test_asstringandsize(self):
"""Test PyBytes_AsStringAndSize()"""
- asstringandsize = _testcapi.bytes_asstringandsize
- asstringandsize_null = _testcapi.bytes_asstringandsize_null
+ asstringandsize = _testlimitedcapi.bytes_asstringandsize
+ asstringandsize_null = _testlimitedcapi.bytes_asstringandsize_null
self.assertEqual(asstringandsize(b'abc', 4), (b'abc\0', 3))
self.assertEqual(asstringandsize(b'abc\0def', 8), (b'abc\0def\0', 7))
@@ -128,7 +128,7 @@ def test_asstringandsize(self):
def test_repr(self):
# Test PyBytes_Repr()
- bytes_repr = _testcapi.bytes_repr
+ bytes_repr = _testlimitedcapi.bytes_repr
self.assertEqual(bytes_repr(b'''abc''', 0), r"""b'abc'""")
self.assertEqual(bytes_repr(b'''abc''', 1), r"""b'abc'""")
@@ -149,7 +149,7 @@ def test_repr(self):
def test_concat(self, concat=None):
"""Test PyBytes_Concat()"""
if concat is None:
- concat = _testcapi.bytes_concat
+ concat = _testlimitedcapi.bytes_concat
self.assertEqual(concat(b'abc', b'def'), b'abcdef')
self.assertEqual(concat(b'a\0b', b'c\0d'), b'a\0bc\0d')
@@ -182,11 +182,11 @@ def test_concat(self, concat=None):
def test_concatanddel(self):
"""Test PyBytes_ConcatAndDel()"""
- self.test_concat(_testcapi.bytes_concatanddel)
+ self.test_concat(_testlimitedcapi.bytes_concatanddel)
def test_decodeescape(self):
"""Test PyBytes_DecodeEscape()"""
- decodeescape = _testcapi.bytes_decodeescape
+ decodeescape = _testlimitedcapi.bytes_decodeescape
self.assertEqual(decodeescape(b'abc'), b'abc')
self.assertEqual(decodeescape(br'\t\n\r\x0b\x0c\x00\\\'\"'),
diff --git a/Lib/test/test_capi/test_sys.py b/Lib/test/test_capi/test_sys.py
index 08bf0370fc59b5..54a8e026d883d4 100644
--- a/Lib/test/test_capi/test_sys.py
+++ b/Lib/test/test_capi/test_sys.py
@@ -5,9 +5,9 @@
from test.support import import_helper
try:
- import _testcapi
+ import _testlimitedcapi
except ImportError:
- _testcapi = None
+ _testlimitedcapi = None
NULL = None
@@ -20,10 +20,10 @@ class CAPITest(unittest.TestCase):
maxDiff = None
@support.cpython_only
- @unittest.skipIf(_testcapi is None, 'need _testcapi module')
+ @unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module')
def test_sys_getobject(self):
# Test PySys_GetObject()
- getobject = _testcapi.sys_getobject
+ getobject = _testlimitedcapi.sys_getobject
self.assertIs(getobject(b'stdout'), sys.stdout)
with support.swap_attr(sys, '\U0001f40d', 42):
@@ -38,10 +38,10 @@ def test_sys_getobject(self):
# CRASHES getobject(NULL)
@support.cpython_only
- @unittest.skipIf(_testcapi is None, 'need _testcapi module')
+ @unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module')
def test_sys_setobject(self):
# Test PySys_SetObject()
- setobject = _testcapi.sys_setobject
+ setobject = _testlimitedcapi.sys_setobject
value = ['value']
value2 = ['value2']
@@ -70,10 +70,10 @@ def test_sys_setobject(self):
# CRASHES setobject(NULL, value)
@support.cpython_only
- @unittest.skipIf(_testcapi is None, 'need _testcapi module')
+ @unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module')
def test_sys_getxoptions(self):
# Test PySys_GetXOptions()
- getxoptions = _testcapi.sys_getxoptions
+ getxoptions = _testlimitedcapi.sys_getxoptions
self.assertIs(getxoptions(), sys._xoptions)
diff --git a/Modules/Setup.stdlib.in b/Modules/Setup.stdlib.in
index e8eaafd8b99b98..deada66cf1a807 100644
--- a/Modules/Setup.stdlib.in
+++ b/Modules/Setup.stdlib.in
@@ -162,8 +162,8 @@
@MODULE__XXTESTFUZZ_TRUE@_xxtestfuzz _xxtestfuzz/_xxtestfuzz.c _xxtestfuzz/fuzzer.c
@MODULE__TESTBUFFER_TRUE@_testbuffer _testbuffer.c
@MODULE__TESTINTERNALCAPI_TRUE@_testinternalcapi _testinternalcapi.c _testinternalcapi/test_lock.c _testinternalcapi/pytime.c _testinternalcapi/set.c _testinternalcapi/test_critical_sections.c
-@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/heaptype.c _testcapi/abstract.c _testcapi/bytearray.c _testcapi/bytes.c _testcapi/unicode.c _testcapi/dict.c _testcapi/set.c _testcapi/list.c _testcapi/tuple.c _testcapi/getargs.c _testcapi/datetime.c _testcapi/docstring.c _testcapi/mem.c _testcapi/watchers.c _testcapi/long.c _testcapi/float.c _testcapi/complex.c _testcapi/numbers.c _testcapi/structmember.c _testcapi/exceptions.c _testcapi/code.c _testcapi/buffer.c _testcapi/pyatomic.c _testcapi/pyos.c _testcapi/file.c _testcapi/codec.c _testcapi/immortal.c _testcapi/gc.c _testcapi/sys.c _testcapi/hash.c _testcapi/time.c
-@MODULE__TESTLIMITEDCAPI_TRUE@_testlimitedcapi _testlimitedcapi.c _testlimitedcapi/vectorcall_limited.c _testlimitedcapi/heaptype_relative.c
+@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/heaptype.c _testcapi/abstract.c _testcapi/unicode.c _testcapi/dict.c _testcapi/set.c _testcapi/list.c _testcapi/tuple.c _testcapi/getargs.c _testcapi/datetime.c _testcapi/docstring.c _testcapi/mem.c _testcapi/watchers.c _testcapi/long.c _testcapi/float.c _testcapi/complex.c _testcapi/numbers.c _testcapi/structmember.c _testcapi/exceptions.c _testcapi/code.c _testcapi/buffer.c _testcapi/pyatomic.c _testcapi/file.c _testcapi/codec.c _testcapi/immortal.c _testcapi/gc.c _testcapi/hash.c _testcapi/time.c
+@MODULE__TESTLIMITEDCAPI_TRUE@_testlimitedcapi _testlimitedcapi.c _testlimitedcapi/bytearray.c _testlimitedcapi/bytes.c _testlimitedcapi/heaptype_relative.c _testlimitedcapi/pyos.c _testlimitedcapi/sys.c _testlimitedcapi/vectorcall_limited.c
@MODULE__TESTCLINIC_TRUE@_testclinic _testclinic.c
@MODULE__TESTCLINIC_LIMITED_TRUE@_testclinic_limited _testclinic_limited.c
diff --git a/Modules/_testcapi/parts.h b/Modules/_testcapi/parts.h
index 2a043cfa73fa8b..f9bdd830775a75 100644
--- a/Modules/_testcapi/parts.h
+++ b/Modules/_testcapi/parts.h
@@ -31,8 +31,6 @@
int _PyTestCapi_Init_Vectorcall(PyObject *module);
int _PyTestCapi_Init_Heaptype(PyObject *module);
int _PyTestCapi_Init_Abstract(PyObject *module);
-int _PyTestCapi_Init_ByteArray(PyObject *module);
-int _PyTestCapi_Init_Bytes(PyObject *module);
int _PyTestCapi_Init_Unicode(PyObject *module);
int _PyTestCapi_Init_GetArgs(PyObject *module);
int _PyTestCapi_Init_DateTime(PyObject *module);
@@ -52,12 +50,10 @@ int _PyTestCapi_Init_Exceptions(PyObject *module);
int _PyTestCapi_Init_Code(PyObject *module);
int _PyTestCapi_Init_Buffer(PyObject *module);
int _PyTestCapi_Init_PyAtomic(PyObject *module);
-int _PyTestCapi_Init_PyOS(PyObject *module);
int _PyTestCapi_Init_File(PyObject *module);
int _PyTestCapi_Init_Codec(PyObject *module);
int _PyTestCapi_Init_Immortal(PyObject *module);
int _PyTestCapi_Init_GC(PyObject *module);
-int _PyTestCapi_Init_Sys(PyObject *module);
int _PyTestCapi_Init_Hash(PyObject *module);
int _PyTestCapi_Init_Time(PyObject *module);
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index b6536045e645f9..b5e646f904b2d1 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -4017,12 +4017,6 @@ PyInit__testcapi(void)
if (_PyTestCapi_Init_Abstract(m) < 0) {
return NULL;
}
- if (_PyTestCapi_Init_ByteArray(m) < 0) {
- return NULL;
- }
- if (_PyTestCapi_Init_Bytes(m) < 0) {
- return NULL;
- }
if (_PyTestCapi_Init_Unicode(m) < 0) {
return NULL;
}
@@ -4077,18 +4071,12 @@ PyInit__testcapi(void)
if (_PyTestCapi_Init_Buffer(m) < 0) {
return NULL;
}
- if (_PyTestCapi_Init_PyOS(m) < 0) {
- return NULL;
- }
if (_PyTestCapi_Init_File(m) < 0) {
return NULL;
}
if (_PyTestCapi_Init_Codec(m) < 0) {
return NULL;
}
- if (_PyTestCapi_Init_Sys(m) < 0) {
- return NULL;
- }
if (_PyTestCapi_Init_Immortal(m) < 0) {
return NULL;
}
diff --git a/Modules/_testlimitedcapi.c b/Modules/_testlimitedcapi.c
index da09e3f5084464..49bf6a3ea39613 100644
--- a/Modules/_testlimitedcapi.c
+++ b/Modules/_testlimitedcapi.c
@@ -26,11 +26,23 @@ PyInit__testlimitedcapi(void)
return NULL;
}
- if (_PyTestCapi_Init_VectorcallLimited(mod) < 0) {
+ if (_PyTestCapi_Init_ByteArray(mod) < 0) {
+ return NULL;
+ }
+ if (_PyTestCapi_Init_Bytes(mod) < 0) {
return NULL;
}
if (_PyTestCapi_Init_HeaptypeRelative(mod) < 0) {
return NULL;
}
+ if (_PyTestCapi_Init_PyOS(mod) < 0) {
+ return NULL;
+ }
+ if (_PyTestCapi_Init_Sys(mod) < 0) {
+ return NULL;
+ }
+ if (_PyTestCapi_Init_VectorcallLimited(mod) < 0) {
+ return NULL;
+ }
return mod;
}
diff --git a/Modules/_testcapi/bytearray.c b/Modules/_testlimitedcapi/bytearray.c
similarity index 100%
rename from Modules/_testcapi/bytearray.c
rename to Modules/_testlimitedcapi/bytearray.c
diff --git a/Modules/_testcapi/bytes.c b/Modules/_testlimitedcapi/bytes.c
similarity index 95%
rename from Modules/_testcapi/bytes.c
rename to Modules/_testlimitedcapi/bytes.c
index da10503f6f6856..a14c4f9d4d30a8 100644
--- a/Modules/_testcapi/bytes.c
+++ b/Modules/_testlimitedcapi/bytes.c
@@ -160,8 +160,8 @@ bytes_concat(PyObject *Py_UNUSED(module), PyObject *args)
if (new) {
assert(left != NULL);
assert(PyBytes_CheckExact(left));
- left = PyBytes_FromStringAndSize(PyBytes_AS_STRING(left),
- PyBytes_GET_SIZE(left));
+ left = PyBytes_FromStringAndSize(PyBytes_AsString(left),
+ PyBytes_Size(left));
if (left == NULL) {
return NULL;
}
@@ -191,8 +191,8 @@ bytes_concatanddel(PyObject *Py_UNUSED(module), PyObject *args)
if (new) {
assert(left != NULL);
assert(PyBytes_CheckExact(left));
- left = PyBytes_FromStringAndSize(PyBytes_AS_STRING(left),
- PyBytes_GET_SIZE(left));
+ left = PyBytes_FromStringAndSize(PyBytes_AsString(left),
+ PyBytes_Size(left));
if (left == NULL) {
return NULL;
}
diff --git a/Modules/_testlimitedcapi/parts.h b/Modules/_testlimitedcapi/parts.h
index 83590a7afd3228..039576d5cf4c29 100644
--- a/Modules/_testlimitedcapi/parts.h
+++ b/Modules/_testlimitedcapi/parts.h
@@ -21,7 +21,11 @@
# error "Py_BUILD_CORE macro must not be defined"
#endif
-int _PyTestCapi_Init_VectorcallLimited(PyObject *module);
+int _PyTestCapi_Init_ByteArray(PyObject *module);
+int _PyTestCapi_Init_Bytes(PyObject *module);
int _PyTestCapi_Init_HeaptypeRelative(PyObject *module);
+int _PyTestCapi_Init_PyOS(PyObject *module);
+int _PyTestCapi_Init_Sys(PyObject *module);
+int _PyTestCapi_Init_VectorcallLimited(PyObject *module);
#endif // Py_TESTLIMITEDCAPI_PARTS_H
diff --git a/Modules/_testcapi/pyos.c b/Modules/_testlimitedcapi/pyos.c
similarity index 100%
rename from Modules/_testcapi/pyos.c
rename to Modules/_testlimitedcapi/pyos.c
diff --git a/Modules/_testcapi/sys.c b/Modules/_testlimitedcapi/sys.c
similarity index 100%
rename from Modules/_testcapi/sys.c
rename to Modules/_testlimitedcapi/sys.c
diff --git a/Modules/_testlimitedcapi/util.h b/Modules/_testlimitedcapi/util.h
new file mode 100644
index 00000000000000..f26d7656a10138
--- /dev/null
+++ b/Modules/_testlimitedcapi/util.h
@@ -0,0 +1,33 @@
+#define NULLABLE(x) do { \
+ if (x == Py_None) { \
+ x = NULL; \
+ } \
+ } while (0);
+
+#define RETURN_INT(value) do { \
+ int _ret = (value); \
+ if (_ret == -1) { \
+ assert(PyErr_Occurred()); \
+ return NULL; \
+ } \
+ assert(!PyErr_Occurred()); \
+ return PyLong_FromLong(_ret); \
+ } while (0)
+
+#define RETURN_SIZE(value) do { \
+ Py_ssize_t _ret = (value); \
+ if (_ret == -1) { \
+ assert(PyErr_Occurred()); \
+ return NULL; \
+ } \
+ assert(!PyErr_Occurred()); \
+ return PyLong_FromSsize_t(_ret); \
+ } while (0)
+
+/* Marker to check that pointer value was set. */
+static const char uninitialized[] = "uninitialized";
+#define UNINITIALIZED_PTR ((void *)uninitialized)
+/* Marker to check that Py_ssize_t value was set. */
+#define UNINITIALIZED_SIZE ((Py_ssize_t)236892191)
+/* Marker to check that integer value was set. */
+#define UNINITIALIZED_INT (63256717)
diff --git a/PCbuild/_testcapi.vcxproj b/PCbuild/_testcapi.vcxproj
index 3ca4c5f86c783c..6522cb1fcf5c63 100644
--- a/PCbuild/_testcapi.vcxproj
+++ b/PCbuild/_testcapi.vcxproj
@@ -98,8 +98,6 @@
-
-
@@ -118,10 +116,8 @@
-
-
diff --git a/PCbuild/_testcapi.vcxproj.filters b/PCbuild/_testcapi.vcxproj.filters
index 651eb1d6ba0b7f..772a9a861517ec 100644
--- a/PCbuild/_testcapi.vcxproj.filters
+++ b/PCbuild/_testcapi.vcxproj.filters
@@ -30,12 +30,6 @@
Source Files
-
- Source Files
-
-
- Source Files
-
Source Files
@@ -90,18 +84,12 @@
Source Files
-
- Source Files
-
Source Files
Source Files
-
- Source Files
-
Source Files
diff --git a/PCbuild/_testlimitedcapi.vcxproj b/PCbuild/_testlimitedcapi.vcxproj
index 1b27942c1da9ae..1afeacaa93396e 100644
--- a/PCbuild/_testlimitedcapi.vcxproj
+++ b/PCbuild/_testlimitedcapi.vcxproj
@@ -94,8 +94,12 @@
-
+
+
+
+
+
@@ -113,4 +117,4 @@
-
\ No newline at end of file
+
diff --git a/PCbuild/_testlimitedcapi.vcxproj.filters b/PCbuild/_testlimitedcapi.vcxproj.filters
index c4764a55f410a0..b3eeb86185c372 100644
--- a/PCbuild/_testlimitedcapi.vcxproj.filters
+++ b/PCbuild/_testlimitedcapi.vcxproj.filters
@@ -9,12 +9,12 @@
-
- Source Files
-
-
- Source Files
-
+
+
+
+
+
+
@@ -22,4 +22,4 @@
Resource Files
-
\ No newline at end of file
+