Skip to content

Commit 12b5a3c

Browse files
gh-93649: Split float/long tests from _testcapimodule.c (GH-99549)
Automerge-Triggered-By: GH:erlend-aasland
1 parent 5fdd49d commit 12b5a3c

9 files changed

+677
-625
lines changed

Makefile.pre.in

+1-1
Original file line numberDiff line numberDiff line change
@@ -2595,7 +2595,7 @@ MODULE__SHA3_DEPS=$(srcdir)/Modules/_sha3/sha3.c $(srcdir)/Modules/_sha3/sha3.h
25952595
MODULE__SHA512_DEPS=$(srcdir)/Modules/hashlib.h
25962596
MODULE__SOCKET_DEPS=$(srcdir)/Modules/socketmodule.h $(srcdir)/Modules/addrinfo.h $(srcdir)/Modules/getaddrinfo.c $(srcdir)/Modules/getnameinfo.c
25972597
MODULE__SSL_DEPS=$(srcdir)/Modules/_ssl.h $(srcdir)/Modules/_ssl/cert.c $(srcdir)/Modules/_ssl/debughelpers.c $(srcdir)/Modules/_ssl/misc.c $(srcdir)/Modules/_ssl_data.h $(srcdir)/Modules/_ssl_data_111.h $(srcdir)/Modules/_ssl_data_300.h $(srcdir)/Modules/socketmodule.h
2598-
MODULE__TESTCAPI_DEPS=$(srcdir)/Modules/testcapi_long.h $(srcdir)/Modules/_testcapi/parts.h
2598+
MODULE__TESTCAPI_DEPS=$(srcdir)/Modules/_testcapi/testcapi_long.h $(srcdir)/Modules/_testcapi/parts.h
25992599
MODULE__SQLITE3_DEPS=$(srcdir)/Modules/_sqlite/connection.h $(srcdir)/Modules/_sqlite/cursor.h $(srcdir)/Modules/_sqlite/microprotocols.h $(srcdir)/Modules/_sqlite/module.h $(srcdir)/Modules/_sqlite/prepare_protocol.h $(srcdir)/Modules/_sqlite/row.h $(srcdir)/Modules/_sqlite/util.h
26002600

26012601
# IF YOU PUT ANYTHING HERE IT WILL GO AWAY

Modules/Setup.stdlib.in

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@
169169
@MODULE__XXTESTFUZZ_TRUE@_xxtestfuzz _xxtestfuzz/_xxtestfuzz.c _xxtestfuzz/fuzzer.c
170170
@MODULE__TESTBUFFER_TRUE@_testbuffer _testbuffer.c
171171
@MODULE__TESTINTERNALCAPI_TRUE@_testinternalcapi _testinternalcapi.c
172-
@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/unicode.c _testcapi/getargs.c _testcapi/pytime.c _testcapi/datetime.c _testcapi/docstring.c _testcapi/mem.c _testcapi/watchers.c
172+
@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/unicode.c _testcapi/getargs.c _testcapi/pytime.c _testcapi/datetime.c _testcapi/docstring.c _testcapi/mem.c _testcapi/watchers.c _testcapi/long.c _testcapi/float.c
173173

174174
# Some testing modules MUST be built as shared libraries.
175175
*shared*

Modules/_testcapi/float.c

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
#define PY_SSIZE_T_CLEAN
2+
3+
#include "parts.h"
4+
5+
6+
// Test PyFloat_Pack2(), PyFloat_Pack4() and PyFloat_Pack8()
7+
static PyObject *
8+
test_float_pack(PyObject *self, PyObject *args)
9+
{
10+
int size;
11+
double d;
12+
int le;
13+
if (!PyArg_ParseTuple(args, "idi", &size, &d, &le)) {
14+
return NULL;
15+
}
16+
switch (size)
17+
{
18+
case 2:
19+
{
20+
char data[2];
21+
if (PyFloat_Pack2(d, data, le) < 0) {
22+
return NULL;
23+
}
24+
return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
25+
}
26+
case 4:
27+
{
28+
char data[4];
29+
if (PyFloat_Pack4(d, data, le) < 0) {
30+
return NULL;
31+
}
32+
return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
33+
}
34+
case 8:
35+
{
36+
char data[8];
37+
if (PyFloat_Pack8(d, data, le) < 0) {
38+
return NULL;
39+
}
40+
return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
41+
}
42+
default: break;
43+
}
44+
45+
PyErr_SetString(PyExc_ValueError, "size must 2, 4 or 8");
46+
return NULL;
47+
}
48+
49+
50+
// Test PyFloat_Unpack2(), PyFloat_Unpack4() and PyFloat_Unpack8()
51+
static PyObject *
52+
test_float_unpack(PyObject *self, PyObject *args)
53+
{
54+
assert(!PyErr_Occurred());
55+
const char *data;
56+
Py_ssize_t size;
57+
int le;
58+
if (!PyArg_ParseTuple(args, "y#i", &data, &size, &le)) {
59+
return NULL;
60+
}
61+
double d;
62+
switch (size)
63+
{
64+
case 2:
65+
d = PyFloat_Unpack2(data, le);
66+
break;
67+
case 4:
68+
d = PyFloat_Unpack4(data, le);
69+
break;
70+
case 8:
71+
d = PyFloat_Unpack8(data, le);
72+
break;
73+
default:
74+
PyErr_SetString(PyExc_ValueError, "data length must 2, 4 or 8 bytes");
75+
return NULL;
76+
}
77+
78+
if (d == -1.0 && PyErr_Occurred()) {
79+
return NULL;
80+
}
81+
return PyFloat_FromDouble(d);
82+
}
83+
84+
static PyMethodDef test_methods[] = {
85+
{"float_pack", test_float_pack, METH_VARARGS, NULL},
86+
{"float_unpack", test_float_unpack, METH_VARARGS, NULL},
87+
{NULL},
88+
};
89+
90+
int
91+
_PyTestCapi_Init_Float(PyObject *mod)
92+
{
93+
if (PyModule_AddFunctions(mod, test_methods) < 0) {
94+
return -1;
95+
}
96+
97+
return 0;
98+
}

0 commit comments

Comments
 (0)