Files
typthon/Modules/_testcapi/structmember.c
copilot-swe-agent[bot] b198f511d2 Rename Py_ to Ty_ throughout C API
Massive automated renaming of all Py_/PyObject/etc. prefixes to Ty_/TyObject/etc.
This includes:
- All public API types (TyObject, TyTypeObject, etc.)
- All public API functions (Ty_Initialize, Ty_BuildValue, etc.)
- All internal API (_Ty_ prefixes)
- Reference counting macros (Ty_INCREF, Ty_DECREF, etc.)
- Type flags (Ty_TPFLAGS_*)
- Debug flags (Ty_DEBUG, Ty_TRACE_REFS, etc.)
- All object type APIs (TyList_, TyDict_, TyUnicode_, etc.)

This changes over 60,000 occurrences across 1000+ files.

Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com>
2025-12-29 17:37:49 +00:00

221 lines
9.1 KiB
C

#include "parts.h"
#include <stddef.h> // for offsetof()
// This defines two classes that contain all the simple member types, one
// using "new" Ty_-prefixed API, and the other using "old" <structmember.h>.
// They should behave identically in Python.
typedef struct {
char bool_member;
char byte_member;
unsigned char ubyte_member;
short short_member;
unsigned short ushort_member;
int int_member;
unsigned int uint_member;
long long_member;
unsigned long ulong_member;
Ty_ssize_t pyssizet_member;
float float_member;
double double_member;
char inplace_member[6];
long long longlong_member;
unsigned long long ulonglong_member;
char char_member;
} all_structmembers;
typedef struct {
PyObject_HEAD
all_structmembers structmembers;
} test_structmembers;
static struct TyMemberDef test_members_newapi[] = {
{"T_BOOL", Ty_T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
{"T_BYTE", Ty_T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
{"T_UBYTE", Ty_T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
{"T_SHORT", Ty_T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
{"T_USHORT", Ty_T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
{"T_INT", Ty_T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
{"T_UINT", Ty_T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
{"T_LONG", Ty_T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
{"T_ULONG", Ty_T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
{"T_PYSSIZET", Ty_T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
{"T_FLOAT", Ty_T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
{"T_DOUBLE", Ty_T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
{"T_STRING_INPLACE", Ty_T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
{"T_LONGLONG", Ty_T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
{"T_ULONGLONG", Ty_T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
{"T_CHAR", Ty_T_CHAR, offsetof(test_structmembers, structmembers.char_member), 0, NULL},
{NULL}
};
static TyObject *
test_structmembers_new(TyTypeObject *type, TyObject *args, TyObject *kwargs)
{
static char *keywords[] = {
"T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
"T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
"T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
"T_LONGLONG", "T_ULONGLONG", "T_CHAR",
NULL};
static const char fmt[] = "|bbBhHiIlknfds#LKc";
test_structmembers *ob;
const char *s = NULL;
Ty_ssize_t string_len = 0;
ob = PyObject_New(test_structmembers, type);
if (ob == NULL) {
return NULL;
}
memset(&ob->structmembers, 0, sizeof(all_structmembers));
if (!TyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
&ob->structmembers.bool_member,
&ob->structmembers.byte_member,
&ob->structmembers.ubyte_member,
&ob->structmembers.short_member,
&ob->structmembers.ushort_member,
&ob->structmembers.int_member,
&ob->structmembers.uint_member,
&ob->structmembers.long_member,
&ob->structmembers.ulong_member,
&ob->structmembers.pyssizet_member,
&ob->structmembers.float_member,
&ob->structmembers.double_member,
&s, &string_len,
&ob->structmembers.longlong_member,
&ob->structmembers.ulonglong_member,
&ob->structmembers.char_member))
{
Ty_DECREF(ob);
return NULL;
}
if (s != NULL) {
if (string_len > 5) {
Ty_DECREF(ob);
TyErr_SetString(TyExc_ValueError, "string too long");
return NULL;
}
strcpy(ob->structmembers.inplace_member, s);
}
else {
strcpy(ob->structmembers.inplace_member, "");
}
return (TyObject *)ob;
}
static TyType_Slot test_structmembers_slots[] = {
{Ty_tp_new, test_structmembers_new},
{Ty_tp_members, test_members_newapi},
{0},
};
static TyType_Spec test_structmembers_spec = {
.name = "_testcapi._test_structmembersType_NewAPI",
.flags = Ty_TPFLAGS_DEFAULT,
.basicsize = sizeof(test_structmembers),
.slots = test_structmembers_slots,
};
#include <structmember.h>
static struct TyMemberDef test_members[] = {
{"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
{"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
{"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
{"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
{"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
{"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
{"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
{"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
{"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
{"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
{"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
{"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
{"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
{"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
{"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
{"T_CHAR", T_CHAR, offsetof(test_structmembers, structmembers.char_member), 0, NULL},
{NULL}
};
static void
test_structmembers_free(TyObject *ob)
{
PyObject_Free(ob);
}
/* Designated initializers would work too, but this does test the *old* API */
static TyTypeObject test_structmembersType_OldAPI= {
PyVarObject_HEAD_INIT(NULL, 0)
"test_structmembersType_OldAPI",
sizeof(test_structmembers), /* tp_basicsize */
0, /* tp_itemsize */
test_structmembers_free, /* destructor tp_dealloc */
0, /* tp_vectorcall_offset */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_as_async */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
PyObject_GenericSetAttr, /* tp_setattro */
0, /* tp_as_buffer */
0, /* tp_flags */
"Type containing all structmember types",
0, /* traverseproc tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
0, /* tp_methods */
test_members, /* tp_members */
0,
0,
0,
0,
0,
0,
0,
0,
test_structmembers_new, /* tp_new */
};
int
_PyTestCapi_Init_Structmember(TyObject *m)
{
int res;
res = TyType_Ready(&test_structmembersType_OldAPI);
if (res < 0) {
return -1;
}
res = TyModule_AddObjectRef(
m,
"_test_structmembersType_OldAPI",
(TyObject *)&test_structmembersType_OldAPI);
if (res < 0) {
return -1;
}
TyObject *test_structmembersType_NewAPI = TyType_FromModuleAndSpec(
m, &test_structmembers_spec, NULL);
if (!test_structmembersType_NewAPI) {
return -1;
}
res = TyModule_AddType(m, (TyTypeObject*)test_structmembersType_NewAPI);
Ty_DECREF(test_structmembersType_NewAPI);
if (res < 0) {
return -1;
}
return 0;
}