diff --git a/Lib/test/test_capi/test_marshal.py b/Lib/test/test_capi/test_marshal.py new file mode 100644 index 00000000000000..82a20c44fac424 --- /dev/null +++ b/Lib/test/test_capi/test_marshal.py @@ -0,0 +1,127 @@ +import marshal +import os.path +import unittest + +from test import support +from test.support import import_helper +from test.support import os_helper +from test.test_marshal import HelperMixin, omit_last_byte + + +# Skip this test if _testcapi is are not available. +_testcapi = import_helper.import_module('_testcapi') + + +@support.cpython_only +class CAPI_TestCase(unittest.TestCase, HelperMixin): + + def test_read_from_file_error(self): + # A read error is reported as OSError, not EOFError. + # A directory cannot be read (on some platforms it cannot even + # be opened, which is reported as OSError as well). + os.mkdir(os_helper.TESTFN) + self.addCleanup(os_helper.rmdir, os_helper.TESTFN) + for func in (_testcapi.pymarshal_read_short_from_file, + _testcapi.pymarshal_read_long_from_file, + _testcapi.pymarshal_read_object_from_file, + _testcapi.pymarshal_read_last_object_from_file): + with self.subTest(func=func.__name__): + self.assertRaises(OSError, func, os_helper.TESTFN) + + @unittest.skipUnless(os.path.exists('/dev/full'), 'requires /dev/full') + def test_write_to_file_error(self): + # A write error is reported as OSError. + # The data is large enough to not fit in the stdio buffer, so that + # the error is detected before the file is closed. + obj = b'x' * 100000 + with self.assertRaises(OSError): + _testcapi.pymarshal_write_object_to_file(obj, '/dev/full', + marshal.version) + + def test_write_unmarshallable_to_file(self): + self.addCleanup(os_helper.unlink, os_helper.TESTFN) + with self.assertRaisesRegex(ValueError, 'unmarshallable object'): + _testcapi.pymarshal_write_object_to_file(object(), os_helper.TESTFN, + marshal.version) + + def test_write_long_to_file(self): + for v in range(marshal.version + 1): + _testcapi.pymarshal_write_long_to_file(0x12345678, os_helper.TESTFN, v) + with open(os_helper.TESTFN, 'rb') as f: + data = f.read() + os_helper.unlink(os_helper.TESTFN) + self.assertEqual(data, b'\x78\x56\x34\x12') + + def test_write_object_to_file(self): + obj = ('\u20ac', b'abc', 123, 45.6, 7+8j, 'long line '*1000) + for v in range(marshal.version + 1): + _testcapi.pymarshal_write_object_to_file(obj, os_helper.TESTFN, v) + with open(os_helper.TESTFN, 'rb') as f: + data = f.read() + os_helper.unlink(os_helper.TESTFN) + self.assertEqual(marshal.loads(data), obj) + + def test_read_short_from_file(self): + with open(os_helper.TESTFN, 'wb') as f: + f.write(b'\x34\x12xxxx') + r, p = _testcapi.pymarshal_read_short_from_file(os_helper.TESTFN) + os_helper.unlink(os_helper.TESTFN) + self.assertEqual(r, 0x1234) + self.assertEqual(p, 2) + + with open(os_helper.TESTFN, 'wb') as f: + f.write(b'\x12') + with self.assertRaises(EOFError): + _testcapi.pymarshal_read_short_from_file(os_helper.TESTFN) + os_helper.unlink(os_helper.TESTFN) + + def test_read_long_from_file(self): + with open(os_helper.TESTFN, 'wb') as f: + f.write(b'\x78\x56\x34\x12xxxx') + r, p = _testcapi.pymarshal_read_long_from_file(os_helper.TESTFN) + os_helper.unlink(os_helper.TESTFN) + self.assertEqual(r, 0x12345678) + self.assertEqual(p, 4) + + with open(os_helper.TESTFN, 'wb') as f: + f.write(b'\x56\x34\x12') + with self.assertRaises(EOFError): + _testcapi.pymarshal_read_long_from_file(os_helper.TESTFN) + os_helper.unlink(os_helper.TESTFN) + + def test_read_last_object_from_file(self): + obj = ('\u20ac', b'abc', 123, 45.6, 7+8j) + for v in range(marshal.version + 1): + data = marshal.dumps(obj, v) + with open(os_helper.TESTFN, 'wb') as f: + f.write(data + b'xxxx') + r, p = _testcapi.pymarshal_read_last_object_from_file(os_helper.TESTFN) + os_helper.unlink(os_helper.TESTFN) + self.assertEqual(r, obj) + + with open(os_helper.TESTFN, 'wb') as f: + f.write(omit_last_byte(data)) + with self.assertRaises(EOFError): + _testcapi.pymarshal_read_last_object_from_file(os_helper.TESTFN) + os_helper.unlink(os_helper.TESTFN) + + def test_read_object_from_file(self): + obj = ('\u20ac', b'abc', 123, 45.6, 7+8j) + for v in range(marshal.version + 1): + data = marshal.dumps(obj, v) + with open(os_helper.TESTFN, 'wb') as f: + f.write(data + b'xxxx') + r, p = _testcapi.pymarshal_read_object_from_file(os_helper.TESTFN) + os_helper.unlink(os_helper.TESTFN) + self.assertEqual(r, obj) + self.assertEqual(p, len(data)) + + with open(os_helper.TESTFN, 'wb') as f: + f.write(omit_last_byte(data)) + with self.assertRaises(EOFError): + _testcapi.pymarshal_read_object_from_file(os_helper.TESTFN) + os_helper.unlink(os_helper.TESTFN) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py index 042cad03ce80e7..d7db3d480ff1e2 100644 --- a/Lib/test/test_marshal.py +++ b/Lib/test/test_marshal.py @@ -797,117 +797,6 @@ def test_slice(self): with self.assertRaises(ValueError): marshal.dumps(obj, version) -@support.cpython_only -@unittest.skipUnless(_testcapi, 'requires _testcapi') -class CAPI_TestCase(unittest.TestCase, HelperMixin): - - def test_read_from_file_error(self): - # A read error is reported as OSError, not EOFError. - # A directory cannot be read (on some platforms it cannot even - # be opened, which is reported as OSError as well). - os.mkdir(os_helper.TESTFN) - self.addCleanup(os_helper.rmdir, os_helper.TESTFN) - for func in (_testcapi.pymarshal_read_short_from_file, - _testcapi.pymarshal_read_long_from_file, - _testcapi.pymarshal_read_object_from_file, - _testcapi.pymarshal_read_last_object_from_file): - with self.subTest(func=func.__name__): - self.assertRaises(OSError, func, os_helper.TESTFN) - - @unittest.skipUnless(os.path.exists('/dev/full'), 'requires /dev/full') - def test_write_to_file_error(self): - # A write error is reported as OSError. - # The data is large enough to not fit in the stdio buffer, so that - # the error is detected before the file is closed. - obj = b'x' * 100000 - with self.assertRaises(OSError): - _testcapi.pymarshal_write_object_to_file(obj, '/dev/full', - marshal.version) - - def test_write_unmarshallable_to_file(self): - self.addCleanup(os_helper.unlink, os_helper.TESTFN) - with self.assertRaisesRegex(ValueError, 'unmarshallable object'): - _testcapi.pymarshal_write_object_to_file(object(), os_helper.TESTFN, - marshal.version) - - def test_write_long_to_file(self): - for v in range(marshal.version + 1): - _testcapi.pymarshal_write_long_to_file(0x12345678, os_helper.TESTFN, v) - with open(os_helper.TESTFN, 'rb') as f: - data = f.read() - os_helper.unlink(os_helper.TESTFN) - self.assertEqual(data, b'\x78\x56\x34\x12') - - def test_write_object_to_file(self): - obj = ('\u20ac', b'abc', 123, 45.6, 7+8j, 'long line '*1000) - for v in range(marshal.version + 1): - _testcapi.pymarshal_write_object_to_file(obj, os_helper.TESTFN, v) - with open(os_helper.TESTFN, 'rb') as f: - data = f.read() - os_helper.unlink(os_helper.TESTFN) - self.assertEqual(marshal.loads(data), obj) - - def test_read_short_from_file(self): - with open(os_helper.TESTFN, 'wb') as f: - f.write(b'\x34\x12xxxx') - r, p = _testcapi.pymarshal_read_short_from_file(os_helper.TESTFN) - os_helper.unlink(os_helper.TESTFN) - self.assertEqual(r, 0x1234) - self.assertEqual(p, 2) - - with open(os_helper.TESTFN, 'wb') as f: - f.write(b'\x12') - with self.assertRaises(EOFError): - _testcapi.pymarshal_read_short_from_file(os_helper.TESTFN) - os_helper.unlink(os_helper.TESTFN) - - def test_read_long_from_file(self): - with open(os_helper.TESTFN, 'wb') as f: - f.write(b'\x78\x56\x34\x12xxxx') - r, p = _testcapi.pymarshal_read_long_from_file(os_helper.TESTFN) - os_helper.unlink(os_helper.TESTFN) - self.assertEqual(r, 0x12345678) - self.assertEqual(p, 4) - - with open(os_helper.TESTFN, 'wb') as f: - f.write(b'\x56\x34\x12') - with self.assertRaises(EOFError): - _testcapi.pymarshal_read_long_from_file(os_helper.TESTFN) - os_helper.unlink(os_helper.TESTFN) - - def test_read_last_object_from_file(self): - obj = ('\u20ac', b'abc', 123, 45.6, 7+8j) - for v in range(marshal.version + 1): - data = marshal.dumps(obj, v) - with open(os_helper.TESTFN, 'wb') as f: - f.write(data + b'xxxx') - r, p = _testcapi.pymarshal_read_last_object_from_file(os_helper.TESTFN) - os_helper.unlink(os_helper.TESTFN) - self.assertEqual(r, obj) - - with open(os_helper.TESTFN, 'wb') as f: - f.write(omit_last_byte(data)) - with self.assertRaises(EOFError): - _testcapi.pymarshal_read_last_object_from_file(os_helper.TESTFN) - os_helper.unlink(os_helper.TESTFN) - - def test_read_object_from_file(self): - obj = ('\u20ac', b'abc', 123, 45.6, 7+8j) - for v in range(marshal.version + 1): - data = marshal.dumps(obj, v) - with open(os_helper.TESTFN, 'wb') as f: - f.write(data + b'xxxx') - r, p = _testcapi.pymarshal_read_object_from_file(os_helper.TESTFN) - os_helper.unlink(os_helper.TESTFN) - self.assertEqual(r, obj) - self.assertEqual(p, len(data)) - - with open(os_helper.TESTFN, 'wb') as f: - f.write(omit_last_byte(data)) - with self.assertRaises(EOFError): - _testcapi.pymarshal_read_object_from_file(os_helper.TESTFN) - os_helper.unlink(os_helper.TESTFN) - if __name__ == "__main__": unittest.main() diff --git a/Modules/Setup.stdlib.in b/Modules/Setup.stdlib.in index 9fc0be043bac9b..d10ed146db92b6 100644 --- a/Modules/Setup.stdlib.in +++ b/Modules/Setup.stdlib.in @@ -173,7 +173,7 @@ @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 _testinternalcapi/complex.c _testinternalcapi/interpreter.c _testinternalcapi/tokenizer.c _testinternalcapi/tuple.c _testinternalcapi/typecache.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/run.c _testcapi/file.c _testcapi/codec.c _testcapi/immortal.c _testcapi/gc.c _testcapi/hash.c _testcapi/time.c _testcapi/bytes.c _testcapi/object.c _testcapi/modsupport.c _testcapi/monitoring.c _testcapi/config.c _testcapi/import.c _testcapi/frame.c _testcapi/type.c _testcapi/function.c _testcapi/module.c _testcapi/weakref.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/run.c _testcapi/file.c _testcapi/codec.c _testcapi/immortal.c _testcapi/gc.c _testcapi/hash.c _testcapi/time.c _testcapi/bytes.c _testcapi/object.c _testcapi/modsupport.c _testcapi/monitoring.c _testcapi/config.c _testcapi/import.c _testcapi/frame.c _testcapi/type.c _testcapi/function.c _testcapi/module.c _testcapi/weakref.c _testcapi/marshal.c @MODULE__TESTLIMITEDCAPI_TRUE@_testlimitedcapi _testlimitedcapi.c _testlimitedcapi/abstract.c _testlimitedcapi/bytearray.c _testlimitedcapi/bytes.c _testlimitedcapi/capsule.c _testlimitedcapi/codec.c _testlimitedcapi/complex.c _testlimitedcapi/dict.c _testlimitedcapi/eval.c _testlimitedcapi/float.c _testlimitedcapi/heaptype_relative.c _testlimitedcapi/import.c _testlimitedcapi/list.c _testlimitedcapi/long.c _testlimitedcapi/object.c _testlimitedcapi/pyos.c _testlimitedcapi/set.c _testlimitedcapi/slots.c _testlimitedcapi/sys.c _testlimitedcapi/threadstate.c _testlimitedcapi/tuple.c _testlimitedcapi/unicode.c _testlimitedcapi/vectorcall_limited.c _testlimitedcapi/version.c _testlimitedcapi/file.c _testlimitedcapi/weakref.c _testlimitedcapi/run.c _testlimitedcapi/type.c @MODULE__TESTCLINIC_TRUE@_testclinic _testclinic.c @MODULE__TESTCLINIC_LIMITED_TRUE@_testclinic_limited _testclinic_limited.c diff --git a/Modules/_testcapi/marshal.c b/Modules/_testcapi/marshal.c new file mode 100644 index 00000000000000..fe5b8259b88578 --- /dev/null +++ b/Modules/_testcapi/marshal.c @@ -0,0 +1,172 @@ +// Test PyMarshal C API + +#include "parts.h" +#include "marshal.h" // PyMarshal_WriteLongToFile() + +static PyObject* +pymarshal_write_long_to_file(PyObject* self, PyObject *args) +{ + long value; + PyObject *filename; + int version; + FILE *fp; + + if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file", + &value, &filename, &version)) + return NULL; + + fp = Py_fopen(filename, "wb"); + if (fp == NULL) { + return NULL; + } + + PyMarshal_WriteLongToFile(value, fp, version); + + fclose(fp); + if (PyErr_Occurred()) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject* +pymarshal_write_object_to_file(PyObject* self, PyObject *args) +{ + PyObject *obj; + PyObject *filename; + int version; + FILE *fp; + + if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file", + &obj, &filename, &version)) + return NULL; + + fp = Py_fopen(filename, "wb"); + if (fp == NULL) { + return NULL; + } + + PyMarshal_WriteObjectToFile(obj, fp, version); + + fclose(fp); + if (PyErr_Occurred()) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject* +pymarshal_read_short_from_file(PyObject* self, PyObject *args) +{ + int value; + long pos; + PyObject *filename; + FILE *fp; + + if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename)) + return NULL; + + fp = Py_fopen(filename, "rb"); + if (fp == NULL) { + return NULL; + } + + value = PyMarshal_ReadShortFromFile(fp); + pos = ftell(fp); + + fclose(fp); + if (PyErr_Occurred()) + return NULL; + return Py_BuildValue("il", value, pos); +} + +static PyObject* +pymarshal_read_long_from_file(PyObject* self, PyObject *args) +{ + long value, pos; + PyObject *filename; + FILE *fp; + + if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename)) + return NULL; + + fp = Py_fopen(filename, "rb"); + if (fp == NULL) { + return NULL; + } + + value = PyMarshal_ReadLongFromFile(fp); + pos = ftell(fp); + + fclose(fp); + if (PyErr_Occurred()) + return NULL; + return Py_BuildValue("ll", value, pos); +} + +static PyObject* +pymarshal_read_last_object_from_file(PyObject* self, PyObject *args) +{ + PyObject *filename; + if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename)) + return NULL; + + FILE *fp = Py_fopen(filename, "rb"); + if (fp == NULL) { + return NULL; + } + + PyObject *obj = PyMarshal_ReadLastObjectFromFile(fp); + long pos = ftell(fp); + + fclose(fp); + if (obj == NULL) { + return NULL; + } + return Py_BuildValue("Nl", obj, pos); +} + +static PyObject* +pymarshal_read_object_from_file(PyObject* self, PyObject *args) +{ + PyObject *filename; + if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename)) + return NULL; + + FILE *fp = Py_fopen(filename, "rb"); + if (fp == NULL) { + return NULL; + } + + PyObject *obj = PyMarshal_ReadObjectFromFile(fp); + long pos = ftell(fp); + + fclose(fp); + if (obj == NULL) { + return NULL; + } + return Py_BuildValue("Nl", obj, pos); +} + + +static PyMethodDef test_methods[] = { + {"pymarshal_write_long_to_file", + pymarshal_write_long_to_file, METH_VARARGS}, + {"pymarshal_write_object_to_file", + pymarshal_write_object_to_file, METH_VARARGS}, + {"pymarshal_read_short_from_file", + pymarshal_read_short_from_file, METH_VARARGS}, + {"pymarshal_read_long_from_file", + pymarshal_read_long_from_file, METH_VARARGS}, + {"pymarshal_read_last_object_from_file", + pymarshal_read_last_object_from_file, METH_VARARGS}, + {"pymarshal_read_object_from_file", + pymarshal_read_object_from_file, METH_VARARGS}, + {NULL}, +}; + +int +_PyTestCapi_Init_Marshal(PyObject *mod) +{ + return PyModule_AddFunctions(mod, test_methods); +} diff --git a/Modules/_testcapi/parts.h b/Modules/_testcapi/parts.h index 98b5dd47accde3..1ae3f0773e42f8 100644 --- a/Modules/_testcapi/parts.h +++ b/Modules/_testcapi/parts.h @@ -68,5 +68,6 @@ int _PyTestCapi_Init_Type(PyObject *mod); int _PyTestCapi_Init_Function(PyObject *mod); int _PyTestCapi_Init_Module(PyObject *mod); int _PyTestCapi_Init_Weakref(PyObject *mod); +int _PyTestCapi_Init_Marshal(PyObject *mod); #endif // Py_TESTCAPI_PARTS_H diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 0312ee9066231c..eb769294fd21db 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -13,7 +13,6 @@ #include "_testcapi/parts.h" #include "frameobject.h" // PyFrame_New() -#include "marshal.h" // PyMarshal_WriteLongToFile() #ifdef bool # error "The public headers should not include , see gh-90904" @@ -1416,153 +1415,6 @@ join_temporary_c_thread(PyObject *self, PyObject *Py_UNUSED(ignored)) Py_RETURN_NONE; } -/* marshal */ - -static PyObject* -pymarshal_write_long_to_file(PyObject* self, PyObject *args) -{ - long value; - PyObject *filename; - int version; - FILE *fp; - - if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file", - &value, &filename, &version)) - return NULL; - - fp = Py_fopen(filename, "wb"); - if (fp == NULL) { - return NULL; - } - - PyMarshal_WriteLongToFile(value, fp, version); - - fclose(fp); - if (PyErr_Occurred()) { - return NULL; - } - Py_RETURN_NONE; -} - -static PyObject* -pymarshal_write_object_to_file(PyObject* self, PyObject *args) -{ - PyObject *obj; - PyObject *filename; - int version; - FILE *fp; - - if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file", - &obj, &filename, &version)) - return NULL; - - fp = Py_fopen(filename, "wb"); - if (fp == NULL) { - return NULL; - } - - PyMarshal_WriteObjectToFile(obj, fp, version); - - fclose(fp); - if (PyErr_Occurred()) { - return NULL; - } - Py_RETURN_NONE; -} - -static PyObject* -pymarshal_read_short_from_file(PyObject* self, PyObject *args) -{ - int value; - long pos; - PyObject *filename; - FILE *fp; - - if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename)) - return NULL; - - fp = Py_fopen(filename, "rb"); - if (fp == NULL) { - return NULL; - } - - value = PyMarshal_ReadShortFromFile(fp); - pos = ftell(fp); - - fclose(fp); - if (PyErr_Occurred()) - return NULL; - return Py_BuildValue("il", value, pos); -} - -static PyObject* -pymarshal_read_long_from_file(PyObject* self, PyObject *args) -{ - long value, pos; - PyObject *filename; - FILE *fp; - - if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename)) - return NULL; - - fp = Py_fopen(filename, "rb"); - if (fp == NULL) { - return NULL; - } - - value = PyMarshal_ReadLongFromFile(fp); - pos = ftell(fp); - - fclose(fp); - if (PyErr_Occurred()) - return NULL; - return Py_BuildValue("ll", value, pos); -} - -static PyObject* -pymarshal_read_last_object_from_file(PyObject* self, PyObject *args) -{ - PyObject *filename; - if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename)) - return NULL; - - FILE *fp = Py_fopen(filename, "rb"); - if (fp == NULL) { - return NULL; - } - - PyObject *obj = PyMarshal_ReadLastObjectFromFile(fp); - long pos = ftell(fp); - - fclose(fp); - if (obj == NULL) { - return NULL; - } - return Py_BuildValue("Nl", obj, pos); -} - -static PyObject* -pymarshal_read_object_from_file(PyObject* self, PyObject *args) -{ - PyObject *filename; - if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename)) - return NULL; - - FILE *fp = Py_fopen(filename, "rb"); - if (fp == NULL) { - return NULL; - } - - PyObject *obj = PyMarshal_ReadObjectFromFile(fp); - long pos = ftell(fp); - - fclose(fp); - if (obj == NULL) { - return NULL; - } - return Py_BuildValue("Nl", obj, pos); -} - static PyObject* return_null_without_error(PyObject *self, PyObject *args) { @@ -3077,18 +2929,6 @@ static PyMethodDef TestMethods[] = { {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_VARARGS, PyDoc_STR("set_error_class(error_class) -> None")}, {"join_temporary_c_thread", join_temporary_c_thread, METH_NOARGS}, - {"pymarshal_write_long_to_file", - pymarshal_write_long_to_file, METH_VARARGS}, - {"pymarshal_write_object_to_file", - pymarshal_write_object_to_file, METH_VARARGS}, - {"pymarshal_read_short_from_file", - pymarshal_read_short_from_file, METH_VARARGS}, - {"pymarshal_read_long_from_file", - pymarshal_read_long_from_file, METH_VARARGS}, - {"pymarshal_read_last_object_from_file", - pymarshal_read_last_object_from_file, METH_VARARGS}, - {"pymarshal_read_object_from_file", - pymarshal_read_object_from_file, METH_VARARGS}, {"return_null_without_error", return_null_without_error, METH_NOARGS}, {"return_result_with_error", return_result_with_error, METH_NOARGS}, {"getitem_with_error", getitem_with_error, METH_VARARGS}, @@ -3974,7 +3814,9 @@ _testcapi_exec(PyObject *m) if (_PyTestCapi_Init_Weakref(m) < 0) { return -1; } - + if (_PyTestCapi_Init_Marshal(m) < 0) { + return -1; + } return 0; } diff --git a/PCbuild/_testcapi.vcxproj b/PCbuild/_testcapi.vcxproj index 64e50b67be4656..d856b70bbdd579 100644 --- a/PCbuild/_testcapi.vcxproj +++ b/PCbuild/_testcapi.vcxproj @@ -134,6 +134,7 @@ + diff --git a/PCbuild/_testcapi.vcxproj.filters b/PCbuild/_testcapi.vcxproj.filters index a3b62e1df663e0..554e5f3075f7eb 100644 --- a/PCbuild/_testcapi.vcxproj.filters +++ b/PCbuild/_testcapi.vcxproj.filters @@ -135,6 +135,9 @@ Source Files + + Source Files +