Skip to content

Commit 9274d96

Browse files
authored
gh-148675: Optimize arraydescr structure: use char[3] (GH-149455)
Replace "const char *typecode;" with "char typecode[3];" to make the arraydescr structure smaller and avoids an indirection.
1 parent aeb02ac commit 9274d96

1 file changed

Lines changed: 7 additions & 7 deletions

File tree

Modules/arraymodule.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static struct PyModuleDef arraymodule;
3333
* functions aren't visible yet.
3434
*/
3535
struct arraydescr {
36-
const char *typecode;
36+
char typecode[3]; // big enough to store "Zd\0"
3737
int itemsize;
3838
PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
3939
int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
@@ -784,7 +784,7 @@ static const struct arraydescr descriptors[] = {
784784
{"d", sizeof(double), d_getitem, d_setitem, NULL, 0, 0},
785785
{"Zf", 2*sizeof(float), cf_getitem, cf_setitem, NULL, 0, 0},
786786
{"Zd", 2*sizeof(double), cd_getitem, cd_setitem, NULL, 0, 0},
787-
{NULL, 0, 0, 0, 0, 0, 0} /* Sentinel */
787+
{"", 0, 0, 0, 0, 0, 0} /* Sentinel */
788788
};
789789

790790
/****************************************************************************
@@ -2298,12 +2298,12 @@ array__array_reconstructor_impl(PyObject *module, PyTypeObject *arraytype,
22982298
arraytype->tp_name, state->ArrayType->tp_name);
22992299
return NULL;
23002300
}
2301-
for (descr = descriptors; descr->typecode != NULL; descr++) {
2301+
for (descr = descriptors; descr->typecode[0] != 0; descr++) {
23022302
if (strcmp(descr->typecode, typecode) == 0) {
23032303
break;
23042304
}
23052305
}
2306-
if (descr->typecode == NULL) {
2306+
if (descr->typecode[0] == 0) {
23072307
PyErr_SetString(PyExc_ValueError,
23082308
"second argument must be a valid type code");
23092309
return NULL;
@@ -2500,7 +2500,7 @@ array__array_reconstructor_impl(PyObject *module, PyTypeObject *arraytype,
25002500
*
25012501
* XXX: Is it possible to write a unit test for this?
25022502
*/
2503-
for (descr = descriptors; descr->typecode != NULL; descr++) {
2503+
for (descr = descriptors; descr->typecode[0] != 0; descr++) {
25042504
if (descr->is_integer_type &&
25052505
(size_t)descr->itemsize == mf_descr.size &&
25062506
descr->is_signed == mf_descr.is_signed)
@@ -3047,7 +3047,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
30473047
*/
30483048
initial = NULL;
30493049
}
3050-
for (descr = descriptors; descr->typecode != NULL; descr++) {
3050+
for (descr = descriptors; descr->typecode[0] != 0; descr++) {
30513051
if (strcmp(descr->typecode, s) == 0) {
30523052
PyObject *a;
30533053
Py_ssize_t len;
@@ -3531,7 +3531,7 @@ array_modexec(PyObject *m)
35313531
if (typecodes == NULL) {
35323532
return -1;
35333533
}
3534-
for (descr = descriptors; descr->typecode != NULL; descr++) {
3534+
for (descr = descriptors; descr->typecode[0] != 0; descr++) {
35353535
PyObject *typecode = PyUnicode_DecodeASCII(descr->typecode, strlen(descr->typecode), NULL);
35363536
if (typecode == NULL) {
35373537
Py_DECREF(typecodes);

0 commit comments

Comments
 (0)