PyObject *module;
} typealiasobject;
+#define typevarobject_CAST(op) ((typevarobject *)(op))
+#define typevartupleobject_CAST(op) ((typevartupleobject *)(op))
+#define paramspecobject_CAST(op) ((paramspecobject *)(op))
+#define typealiasobject_CAST(op) ((typealiasobject *)(op))
+
#include "clinic/typevarobject.c.h"
/* NoDefault is a marker object to indicate that a parameter has no default. */
PyObject *value;
} constevaluatorobject;
+#define constevaluatorobject_CAST(op) ((constevaluatorobject *)(op))
+
static void
constevaluator_dealloc(PyObject *self)
{
PyTypeObject *tp = Py_TYPE(self);
- constevaluatorobject *ce = (constevaluatorobject *)self;
+ constevaluatorobject *ce = constevaluatorobject_CAST(self);
_PyObject_GC_UNTRACK(self);
static int
constevaluator_traverse(PyObject *self, visitproc visit, void *arg)
{
- constevaluatorobject *ce = (constevaluatorobject *)self;
+ constevaluatorobject *ce = constevaluatorobject_CAST(self);
Py_VISIT(ce->value);
return 0;
}
static int
constevaluator_clear(PyObject *self)
{
- Py_CLEAR(((constevaluatorobject *)self)->value);
+ constevaluatorobject *ce = constevaluatorobject_CAST(self);
+ Py_CLEAR(ce->value);
return 0;
}
static PyObject *
constevaluator_repr(PyObject *self)
{
- PyObject *value = ((constevaluatorobject *)self)->value;
- return PyUnicode_FromFormat("<constevaluator %R>", value);
+ constevaluatorobject *ce = constevaluatorobject_CAST(self);
+ return PyUnicode_FromFormat("<constevaluator %R>", ce->value);
}
static PyObject *
constevaluator_call(PyObject *self, PyObject *args, PyObject *kwargs)
{
+ constevaluatorobject *ce = constevaluatorobject_CAST(self);
if (!_PyArg_NoKeywords("constevaluator.__call__", kwargs)) {
return NULL;
}
if (!PyArg_ParseTuple(args, "i:constevaluator.__call__", &format)) {
return NULL;
}
- PyObject *value = ((constevaluatorobject *)self)->value;
+ PyObject *value = ce->value;
if (format == _Py_ANNOTATE_FORMAT_STRING) {
PyUnicodeWriter *writer = PyUnicodeWriter_Create(5); // cannot be <5
if (writer == NULL) {
typevar_dealloc(PyObject *self)
{
PyTypeObject *tp = Py_TYPE(self);
- typevarobject *tv = (typevarobject *)self;
+ typevarobject *tv = typevarobject_CAST(self);
_PyObject_GC_UNTRACK(self);
typevar_traverse(PyObject *self, visitproc visit, void *arg)
{
Py_VISIT(Py_TYPE(self));
- typevarobject *tv = (typevarobject *)self;
+ typevarobject *tv = typevarobject_CAST(self);
Py_VISIT(tv->bound);
Py_VISIT(tv->evaluate_bound);
Py_VISIT(tv->constraints);
}
static int
-typevar_clear(typevarobject *self)
+typevar_clear(PyObject *op)
{
+ typevarobject *self = typevarobject_CAST(op);
Py_CLEAR(self->bound);
Py_CLEAR(self->evaluate_bound);
Py_CLEAR(self->constraints);
Py_CLEAR(self->evaluate_constraints);
Py_CLEAR(self->default_value);
Py_CLEAR(self->evaluate_default);
- PyObject_ClearManagedDict((PyObject *)self);
+ PyObject_ClearManagedDict(op);
return 0;
}
static PyObject *
typevar_repr(PyObject *self)
{
- typevarobject *tv = (typevarobject *)self;
+ typevarobject *tv = typevarobject_CAST(self);
if (tv->infer_variance) {
return Py_NewRef(tv->name);
};
static PyObject *
-typevar_bound(typevarobject *self, void *Py_UNUSED(ignored))
+typevar_bound(PyObject *op, void *Py_UNUSED(closure))
{
+ typevarobject *self = typevarobject_CAST(op);
if (self->bound != NULL) {
return Py_NewRef(self->bound);
}
}
static PyObject *
-typevar_default(typevarobject *self, void *unused)
+typevar_default(PyObject *op, void *Py_UNUSED(closure))
{
+ typevarobject *self = typevarobject_CAST(op);
if (self->default_value != NULL) {
return Py_NewRef(self->default_value);
}
}
static PyObject *
-typevar_constraints(typevarobject *self, void *Py_UNUSED(ignored))
+typevar_constraints(PyObject *op, void *Py_UNUSED(closure))
{
+ typevarobject *self = typevarobject_CAST(op);
if (self->constraints != NULL) {
return Py_NewRef(self->constraints);
}
}
static PyObject *
-typevar_evaluate_bound(typevarobject *self, void *Py_UNUSED(ignored))
+typevar_evaluate_bound(PyObject *op, void *Py_UNUSED(closure))
{
+ typevarobject *self = typevarobject_CAST(op);
if (self->evaluate_bound != NULL) {
return Py_NewRef(self->evaluate_bound);
}
}
static PyObject *
-typevar_evaluate_constraints(typevarobject *self, void *Py_UNUSED(ignored))
+typevar_evaluate_constraints(PyObject *op, void *Py_UNUSED(closure))
{
+ typevarobject *self = typevarobject_CAST(op);
if (self->evaluate_constraints != NULL) {
return Py_NewRef(self->evaluate_constraints);
}
}
static PyObject *
-typevar_evaluate_default(typevarobject *self, void *Py_UNUSED(ignored))
+typevar_evaluate_default(PyObject *op, void *Py_UNUSED(closure))
{
+ typevarobject *self = typevarobject_CAST(op);
if (self->evaluate_default != NULL) {
return Py_NewRef(self->evaluate_default);
}
}
static PyGetSetDef typevar_getset[] = {
- {"__bound__", (getter)typevar_bound, NULL, NULL, NULL},
- {"__constraints__", (getter)typevar_constraints, NULL, NULL, NULL},
- {"__default__", (getter)typevar_default, NULL, NULL, NULL},
- {"evaluate_bound", (getter)typevar_evaluate_bound, NULL, NULL, NULL},
- {"evaluate_constraints", (getter)typevar_evaluate_constraints, NULL, NULL, NULL},
- {"evaluate_default", (getter)typevar_evaluate_default, NULL, NULL, NULL},
+ {"__bound__", typevar_bound, NULL, NULL, NULL},
+ {"__constraints__", typevar_constraints, NULL, NULL, NULL},
+ {"__default__", typevar_default, NULL, NULL, NULL},
+ {"evaluate_bound", typevar_evaluate_bound, NULL, NULL, NULL},
+ {"evaluate_constraints", typevar_evaluate_constraints, NULL, NULL, NULL},
+ {"evaluate_default", typevar_evaluate_default, NULL, NULL, NULL},
{0}
};
}
else if (i == args_len) {
// If the TypeVar has a default, use it.
- PyObject *dflt = typevar_default(self, NULL);
+ PyObject *dflt = typevar_default((PyObject *)self, NULL);
if (dflt == NULL) {
Py_DECREF(params);
return NULL;
PyObject *__origin__;
} paramspecattrobject;
+#define paramspecattrobject_CAST(op) ((paramspecattrobject *)(op))
+
static void
paramspecattr_dealloc(PyObject *self)
{
PyTypeObject *tp = Py_TYPE(self);
- paramspecattrobject *psa = (paramspecattrobject *)self;
+ paramspecattrobject *psa = paramspecattrobject_CAST(self);
_PyObject_GC_UNTRACK(self);
static int
paramspecattr_traverse(PyObject *self, visitproc visit, void *arg)
{
- paramspecattrobject *psa = (paramspecattrobject *)self;
+ paramspecattrobject *psa = paramspecattrobject_CAST(self);
Py_VISIT(psa->__origin__);
return 0;
}
static int
-paramspecattr_clear(paramspecattrobject *self)
+paramspecattr_clear(PyObject *op)
{
+ paramspecattrobject *self = paramspecattrobject_CAST(op);
Py_CLEAR(self->__origin__);
return 0;
}
if (op != Py_EQ && op != Py_NE) {
Py_RETURN_NOTIMPLEMENTED;
}
- return PyObject_RichCompare(
- ((paramspecattrobject *)a)->__origin__,
- ((paramspecattrobject *)b)->__origin__,
- op
- );
+ paramspecattrobject *lhs = paramspecattrobject_CAST(a); // may be unsafe
+ paramspecattrobject *rhs = (paramspecattrobject *)b; // safe fast cast
+ return PyObject_RichCompare(lhs->__origin__, rhs->__origin__, op);
}
static PyMemberDef paramspecattr_members[] = {
static PyObject *
paramspecargs_repr(PyObject *self)
{
- paramspecattrobject *psa = (paramspecattrobject *)self;
-
+ paramspecattrobject *psa = paramspecattrobject_CAST(self);
PyTypeObject *tp = _PyInterpreterState_GET()->cached_objects.paramspec_type;
if (Py_IS_TYPE(psa->__origin__, tp)) {
return PyUnicode_FromFormat("%U.args",
{Py_tp_alloc, PyType_GenericAlloc},
{Py_tp_free, PyObject_GC_Del},
{Py_tp_traverse, paramspecattr_traverse},
- {Py_tp_clear, (inquiry)paramspecattr_clear},
+ {Py_tp_clear, paramspecattr_clear},
{Py_tp_repr, paramspecargs_repr},
{Py_tp_members, paramspecattr_members},
{Py_tp_richcompare, paramspecattr_richcompare},
static PyObject *
paramspeckwargs_repr(PyObject *self)
{
- paramspecattrobject *psk = (paramspecattrobject *)self;
+ paramspecattrobject *psk = paramspecattrobject_CAST(self);
PyTypeObject *tp = _PyInterpreterState_GET()->cached_objects.paramspec_type;
if (Py_IS_TYPE(psk->__origin__, tp)) {
{Py_tp_alloc, PyType_GenericAlloc},
{Py_tp_free, PyObject_GC_Del},
{Py_tp_traverse, paramspecattr_traverse},
- {Py_tp_clear, (inquiry)paramspecattr_clear},
+ {Py_tp_clear, paramspecattr_clear},
{Py_tp_repr, paramspeckwargs_repr},
{Py_tp_members, paramspecattr_members},
{Py_tp_richcompare, paramspecattr_richcompare},
paramspec_dealloc(PyObject *self)
{
PyTypeObject *tp = Py_TYPE(self);
- paramspecobject *ps = (paramspecobject *)self;
+ paramspecobject *ps = paramspecobject_CAST(self);
_PyObject_GC_UNTRACK(self);
paramspec_traverse(PyObject *self, visitproc visit, void *arg)
{
Py_VISIT(Py_TYPE(self));
- paramspecobject *ps = (paramspecobject *)self;
+ paramspecobject *ps = paramspecobject_CAST(self);
Py_VISIT(ps->bound);
Py_VISIT(ps->default_value);
Py_VISIT(ps->evaluate_default);
}
static int
-paramspec_clear(paramspecobject *self)
+paramspec_clear(PyObject *op)
{
+ paramspecobject *self = paramspecobject_CAST(op);
Py_CLEAR(self->bound);
Py_CLEAR(self->default_value);
Py_CLEAR(self->evaluate_default);
- PyObject_ClearManagedDict((PyObject *)self);
+ PyObject_ClearManagedDict(op);
return 0;
}
static PyObject *
paramspec_repr(PyObject *self)
{
- paramspecobject *ps = (paramspecobject *)self;
+ paramspecobject *ps = paramspecobject_CAST(self);
if (ps->infer_variance) {
return Py_NewRef(ps->name);
};
static PyObject *
-paramspec_args(PyObject *self, void *unused)
+paramspec_args(PyObject *self, void *Py_UNUSED(closure))
{
PyTypeObject *tp = _PyInterpreterState_GET()->cached_objects.paramspecargs_type;
return (PyObject *)paramspecattr_new(tp, self);
}
static PyObject *
-paramspec_kwargs(PyObject *self, void *unused)
+paramspec_kwargs(PyObject *self, void *Py_UNUSED(closure))
{
PyTypeObject *tp = _PyInterpreterState_GET()->cached_objects.paramspeckwargs_type;
return (PyObject *)paramspecattr_new(tp, self);
}
static PyObject *
-paramspec_default(paramspecobject *self, void *unused)
+paramspec_default(PyObject *op, void *Py_UNUSED(closure))
{
+ paramspecobject *self = paramspecobject_CAST(op);
if (self->default_value != NULL) {
return Py_NewRef(self->default_value);
}
}
static PyObject *
-paramspec_evaluate_default(paramspecobject *self, void *unused)
+paramspec_evaluate_default(PyObject *op, void *Py_UNUSED(closure))
{
+ paramspecobject *self = paramspecobject_CAST(op);
if (self->evaluate_default != NULL) {
return Py_NewRef(self->evaluate_default);
}
}
static PyGetSetDef paramspec_getset[] = {
- {"args", (getter)paramspec_args, NULL, PyDoc_STR("Represents positional arguments."), NULL},
- {"kwargs", (getter)paramspec_kwargs, NULL, PyDoc_STR("Represents keyword arguments."), NULL},
- {"__default__", (getter)paramspec_default, NULL, "The default value for this ParamSpec.", NULL},
- {"evaluate_default", (getter)paramspec_evaluate_default, NULL, NULL, NULL},
+ {"args", paramspec_args, NULL, PyDoc_STR("Represents positional arguments."), NULL},
+ {"kwargs", paramspec_kwargs, NULL, PyDoc_STR("Represents keyword arguments."), NULL},
+ {"__default__", paramspec_default, NULL, "The default value for this ParamSpec.", NULL},
+ {"evaluate_default", paramspec_evaluate_default, NULL, NULL, NULL},
{0},
};
{
PyTypeObject *tp = Py_TYPE(self);
_PyObject_GC_UNTRACK(self);
- typevartupleobject *tvt = (typevartupleobject *)self;
+ typevartupleobject *tvt = typevartupleobject_CAST(self);
Py_DECREF(tvt->name);
Py_XDECREF(tvt->default_value);
static PyObject *
typevartuple_repr(PyObject *self)
{
- typevartupleobject *tvt = (typevartupleobject *)self;
-
+ typevartupleobject *tvt = typevartupleobject_CAST(self);
return Py_NewRef(tvt->name);
}
typevartuple_traverse(PyObject *self, visitproc visit, void *arg)
{
Py_VISIT(Py_TYPE(self));
- Py_VISIT(((typevartupleobject *)self)->default_value);
- Py_VISIT(((typevartupleobject *)self)->evaluate_default);
+ typevartupleobject *tvt = typevartupleobject_CAST(self);
+ Py_VISIT(tvt->default_value);
+ Py_VISIT(tvt->evaluate_default);
PyObject_VisitManagedDict(self, visit, arg);
return 0;
}
static int
typevartuple_clear(PyObject *self)
{
- Py_CLEAR(((typevartupleobject *)self)->default_value);
- Py_CLEAR(((typevartupleobject *)self)->evaluate_default);
+ typevartupleobject *tvt = typevartupleobject_CAST(self);
+ Py_CLEAR(tvt->default_value);
+ Py_CLEAR(tvt->evaluate_default);
PyObject_ClearManagedDict(self);
return 0;
}
static PyObject *
-typevartuple_default(typevartupleobject *self, void *unused)
+typevartuple_default(PyObject *op, void *Py_UNUSED(closure))
{
+ typevartupleobject *self = typevartupleobject_CAST(op);
if (self->default_value != NULL) {
return Py_NewRef(self->default_value);
}
}
static PyObject *
-typevartuple_evaluate_default(typevartupleobject *self, void *unused)
+typevartuple_evaluate_default(PyObject *op, void *Py_UNUSED(closure))
{
+ typevartupleobject *self = typevartupleobject_CAST(op);
if (self->evaluate_default != NULL) {
return Py_NewRef(self->evaluate_default);
}
}
static PyGetSetDef typevartuple_getset[] = {
- {"__default__", (getter)typevartuple_default, NULL, "The default value for this TypeVarTuple.", NULL},
- {"evaluate_default", (getter)typevartuple_evaluate_default, NULL, NULL, NULL},
+ {"__default__", typevartuple_default, NULL, "The default value for this TypeVarTuple.", NULL},
+ {"evaluate_default", typevartuple_evaluate_default, NULL, NULL, NULL},
{0},
};
get_type_param_default(PyThreadState *ts, PyObject *typeparam) {
// Does not modify refcount of existing objects.
if (Py_IS_TYPE(typeparam, ts->interp->cached_objects.typevar_type)) {
- return typevar_default((typevarobject *)typeparam, NULL);
+ return typevar_default(typeparam, NULL);
}
else if (Py_IS_TYPE(typeparam, ts->interp->cached_objects.paramspec_type)) {
- return paramspec_default((paramspecobject *)typeparam, NULL);
+ return paramspec_default(typeparam, NULL);
}
else if (Py_IS_TYPE(typeparam, ts->interp->cached_objects.typevartuple_type)) {
- return typevartuple_default((typevartupleobject *)typeparam, NULL);
+ return typevartuple_default(typeparam, NULL);
}
else {
PyErr_Format(PyExc_TypeError, "Expected a type param, got %R", typeparam);
{
PyTypeObject *tp = Py_TYPE(self);
_PyObject_GC_UNTRACK(self);
- typealiasobject *ta = (typealiasobject *)self;
+ typealiasobject *ta = typealiasobject_CAST(self);
Py_DECREF(ta->name);
Py_XDECREF(ta->type_params);
Py_XDECREF(ta->compute_value);
};
static PyObject *
-typealias_value(PyObject *self, void *unused)
+typealias_value(PyObject *self, void *Py_UNUSED(closure))
{
- typealiasobject *ta = (typealiasobject *)self;
+ typealiasobject *ta = typealiasobject_CAST(self);
return typealias_get_value(ta);
}
static PyObject *
-typealias_evaluate_value(PyObject *self, void *unused)
+typealias_evaluate_value(PyObject *self, void *Py_UNUSED(closure))
{
- typealiasobject *ta = (typealiasobject *)self;
+ typealiasobject *ta = typealiasobject_CAST(self);
if (ta->compute_value != NULL) {
return Py_NewRef(ta->compute_value);
}
}
static PyObject *
-typealias_parameters(PyObject *self, void *unused)
+typealias_parameters(PyObject *self, void *Py_UNUSED(closure))
{
- typealiasobject *ta = (typealiasobject *)self;
+ typealiasobject *ta = typealiasobject_CAST(self);
if (ta->type_params == NULL) {
return PyTuple_New(0);
}
}
static PyObject *
-typealias_type_params(PyObject *self, void *unused)
+typealias_type_params(PyObject *self, void *Py_UNUSED(closure))
{
- typealiasobject *ta = (typealiasobject *)self;
+ typealiasobject *ta = typealiasobject_CAST(self);
if (ta->type_params == NULL) {
return PyTuple_New(0);
}
}
static PyObject *
-typealias_module(PyObject *self, void *unused)
+typealias_module(PyObject *self, void *Py_UNUSED(closure))
{
- typealiasobject *ta = (typealiasobject *)self;
+ typealiasobject *ta = typealiasobject_CAST(self);
if (ta->module != NULL) {
return Py_NewRef(ta->module);
}
}
static PyGetSetDef typealias_getset[] = {
- {"__parameters__", typealias_parameters, (setter)NULL, NULL, NULL},
- {"__type_params__", typealias_type_params, (setter)NULL, NULL, NULL},
- {"__value__", typealias_value, (setter)NULL, NULL, NULL},
- {"evaluate_value", typealias_evaluate_value, (setter)NULL, NULL, NULL},
- {"__module__", typealias_module, (setter)NULL, NULL, NULL},
+ {"__parameters__", typealias_parameters, NULL, NULL, NULL},
+ {"__type_params__", typealias_type_params, NULL, NULL, NULL},
+ {"__value__", typealias_value, NULL, NULL, NULL},
+ {"evaluate_value", typealias_evaluate_value, NULL, NULL, NULL},
+ {"__module__", typealias_module, NULL, NULL, NULL},
{0}
};
}
static int
-typealias_traverse(typealiasobject *self, visitproc visit, void *arg)
+typealias_traverse(PyObject *op, visitproc visit, void *arg)
{
+ typealiasobject *self = typealiasobject_CAST(op);
Py_VISIT(self->type_params);
Py_VISIT(self->compute_value);
Py_VISIT(self->value);
}
static int
-typealias_clear(typealiasobject *self)
+typealias_clear(PyObject *op)
{
+ typealiasobject *self = typealiasobject_CAST(op);
Py_CLEAR(self->type_params);
Py_CLEAR(self->compute_value);
Py_CLEAR(self->value);
}
static PyObject *
-typealias_subscript(PyObject *self, PyObject *args)
+typealias_subscript(PyObject *op, PyObject *args)
{
- if (((typealiasobject *)self)->type_params == NULL) {
+ typealiasobject *self = typealiasobject_CAST(op);
+ if (self->type_params == NULL) {
PyErr_SetString(PyExc_TypeError,
"Only generic type aliases are subscriptable");
return NULL;
}
- return Py_GenericAlias(self, args);
+ return Py_GenericAlias(op, args);
}
static PyMethodDef typealias_methods[] = {
.tp_dealloc = typealias_dealloc,
.tp_new = typealias_new,
.tp_free = PyObject_GC_Del,
- .tp_traverse = (traverseproc)typealias_traverse,
- .tp_clear = (inquiry)typealias_clear,
+ .tp_traverse = typealias_traverse,
+ .tp_clear = typealias_clear,
.tp_repr = typealias_repr,
.tp_as_number = &typealias_as_number,
.tp_as_mapping = &typealias_as_mapping,
}
static PyMethodDef generic_methods[] = {
- {"__class_getitem__", (PyCFunction)(void (*)(void))generic_class_getitem,
+ {"__class_getitem__", _PyCFunction_CAST(generic_class_getitem),
METH_VARARGS | METH_KEYWORDS | METH_CLASS,
generic_class_getitem_doc},
- {"__init_subclass__", (PyCFunction)(void (*)(void))generic_init_subclass,
+ {"__init_subclass__", _PyCFunction_CAST(generic_init_subclass),
METH_VARARGS | METH_KEYWORDS | METH_CLASS,
PyDoc_STR("Function to initialize subclasses.")},
{NULL} /* Sentinel */