Skip to content

Commit f841099

Browse files
authored
[3.12] gh-107526: Revert "gh-100357: Convert several functions in bltinsmodule to AC" (GH-107542) (#130371)
1 parent 2592402 commit f841099

File tree

3 files changed

+101
-303
lines changed

3 files changed

+101
-303
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Revert converting ``vars``, ``dir``, ``next``, ``getattr``, and ``iter`` to
2+
argument clinic.

Python/bltinmodule.c

Lines changed: 98 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -840,33 +840,31 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename,
840840
return result;
841841
}
842842

843-
/*[clinic input]
844-
dir as builtin_dir
845-
846-
arg: object = NULL
847-
/
848-
849-
Show attributes of an object.
850-
851-
If called without an argument, return the names in the current scope.
852-
Else, return an alphabetized list of names comprising (some of) the attributes
853-
of the given object, and of attributes reachable from it.
854-
If the object supplies a method named __dir__, it will be used; otherwise
855-
the default dir() logic is used and returns:
856-
for a module object: the module's attributes.
857-
for a class object: its attributes, and recursively the attributes
858-
of its bases.
859-
for any other object: its attributes, its class's attributes, and
860-
recursively the attributes of its class's base classes.
861-
[clinic start generated code]*/
862-
843+
/* AC: cannot convert yet, as needs PEP 457 group support in inspect */
863844
static PyObject *
864-
builtin_dir_impl(PyObject *module, PyObject *arg)
865-
/*[clinic end generated code: output=24f2c7a52c1e3b08 input=ed6d6ccb13d52251]*/
845+
builtin_dir(PyObject *self, PyObject *args)
866846
{
847+
PyObject *arg = NULL;
848+
849+
if (!PyArg_UnpackTuple(args, "dir", 0, 1, &arg))
850+
return NULL;
867851
return PyObject_Dir(arg);
868852
}
869853

854+
PyDoc_STRVAR(dir_doc,
855+
"dir([object]) -> list of strings\n"
856+
"\n"
857+
"If called without an argument, return the names in the current scope.\n"
858+
"Else, return an alphabetized list of names comprising (some of) the attributes\n"
859+
"of the given object, and of attributes reachable from it.\n"
860+
"If the object supplies a method named __dir__, it will be used; otherwise\n"
861+
"the default dir() logic is used and returns:\n"
862+
" for a module object: the module's attributes.\n"
863+
" for a class object: its attributes, and recursively the attributes\n"
864+
" of its bases.\n"
865+
" for any other object: its attributes, its class's attributes, and\n"
866+
" recursively the attributes of its class's base classes.");
867+
870868
/*[clinic input]
871869
divmod as builtin_divmod
872870
@@ -1136,39 +1134,36 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals,
11361134
}
11371135

11381136

1139-
/*[clinic input]
1140-
getattr as builtin_getattr
1141-
1142-
object: object
1143-
name: object
1144-
default: object = NULL
1145-
/
1146-
1147-
Get a named attribute from an object.
1148-
1149-
getattr(x, 'y') is equivalent to x.y
1150-
When a default argument is given, it is returned when the attribute doesn't
1151-
exist; without it, an exception is raised in that case.
1152-
[clinic start generated code]*/
1153-
1137+
/* AC: cannot convert yet, as needs PEP 457 group support in inspect */
11541138
static PyObject *
1155-
builtin_getattr_impl(PyObject *module, PyObject *object, PyObject *name,
1156-
PyObject *default_value)
1157-
/*[clinic end generated code: output=74ad0e225e3f701c input=d7562cd4c3556171]*/
1139+
builtin_getattr(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
11581140
{
1159-
PyObject *result;
1141+
PyObject *v, *name, *result;
1142+
1143+
if (!_PyArg_CheckPositional("getattr", nargs, 2, 3))
1144+
return NULL;
11601145

1161-
if (default_value != NULL) {
1162-
if (_PyObject_LookupAttr(object, name, &result) == 0) {
1163-
return Py_NewRef(default_value);
1146+
v = args[0];
1147+
name = args[1];
1148+
if (nargs > 2) {
1149+
if (_PyObject_LookupAttr(v, name, &result) == 0) {
1150+
PyObject *dflt = args[2];
1151+
return Py_NewRef(dflt);
11641152
}
11651153
}
11661154
else {
1167-
result = PyObject_GetAttr(object, name);
1155+
result = PyObject_GetAttr(v, name);
11681156
}
11691157
return result;
11701158
}
11711159

1160+
PyDoc_STRVAR(getattr_doc,
1161+
"getattr(object, name[, default]) -> value\n\
1162+
\n\
1163+
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
1164+
When a default argument is given, it is returned when the attribute doesn't\n\
1165+
exist; without it, an exception is raised in that case.");
1166+
11721167

11731168
/*[clinic input]
11741169
globals as builtin_globals
@@ -1480,43 +1475,34 @@ PyTypeObject PyMap_Type = {
14801475
};
14811476

14821477

1483-
/*[clinic input]
1484-
next as builtin_next
1485-
1486-
iterator: object
1487-
default: object = NULL
1488-
/
1489-
1490-
Return the next item from the iterator.
1491-
1492-
If default is given and the iterator is exhausted,
1493-
it is returned instead of raising StopIteration.
1494-
[clinic start generated code]*/
1495-
1478+
/* AC: cannot convert yet, as needs PEP 457 group support in inspect */
14961479
static PyObject *
1497-
builtin_next_impl(PyObject *module, PyObject *iterator,
1498-
PyObject *default_value)
1499-
/*[clinic end generated code: output=a38a94eeb447fef9 input=180f9984f182020f]*/
1480+
builtin_next(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
15001481
{
1501-
PyObject *res;
1482+
PyObject *it, *res;
1483+
1484+
if (!_PyArg_CheckPositional("next", nargs, 1, 2))
1485+
return NULL;
15021486

1503-
if (!PyIter_Check(iterator)) {
1487+
it = args[0];
1488+
if (!PyIter_Check(it)) {
15041489
PyErr_Format(PyExc_TypeError,
15051490
"'%.200s' object is not an iterator",
1506-
Py_TYPE(iterator)->tp_name);
1491+
Py_TYPE(it)->tp_name);
15071492
return NULL;
15081493
}
15091494

1510-
res = (*Py_TYPE(iterator)->tp_iternext)(iterator);
1495+
res = (*Py_TYPE(it)->tp_iternext)(it);
15111496
if (res != NULL) {
15121497
return res;
1513-
} else if (default_value != NULL) {
1498+
} else if (nargs > 1) {
1499+
PyObject *def = args[1];
15141500
if (PyErr_Occurred()) {
15151501
if(!PyErr_ExceptionMatches(PyExc_StopIteration))
15161502
return NULL;
15171503
PyErr_Clear();
15181504
}
1519-
return Py_NewRef(default_value);
1505+
return Py_NewRef(def);
15201506
} else if (PyErr_Occurred()) {
15211507
return NULL;
15221508
} else {
@@ -1525,6 +1511,12 @@ builtin_next_impl(PyObject *module, PyObject *iterator,
15251511
}
15261512
}
15271513

1514+
PyDoc_STRVAR(next_doc,
1515+
"next(iterator[, default])\n\
1516+
\n\
1517+
Return the next item from the iterator. If default is given and the iterator\n\
1518+
is exhausted, it is returned instead of raising StopIteration.");
1519+
15281520

15291521
/*[clinic input]
15301522
setattr as builtin_setattr
@@ -1617,33 +1609,34 @@ builtin_hex(PyObject *module, PyObject *number)
16171609
}
16181610

16191611

1620-
/*[clinic input]
1621-
iter as builtin_iter
1622-
1623-
object: object
1624-
sentinel: object = NULL
1625-
/
1626-
1627-
Get an iterator from an object.
1628-
1629-
In the first form, the argument must supply its own iterator, or be a sequence.
1630-
In the second form, the callable is called until it returns the sentinel.
1631-
[clinic start generated code]*/
1632-
1612+
/* AC: cannot convert yet, as needs PEP 457 group support in inspect */
16331613
static PyObject *
1634-
builtin_iter_impl(PyObject *module, PyObject *object, PyObject *sentinel)
1635-
/*[clinic end generated code: output=12cf64203c195a94 input=a5d64d9d81880ba6]*/
1614+
builtin_iter(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
16361615
{
1637-
if (sentinel == NULL)
1638-
return PyObject_GetIter(object);
1639-
if (!PyCallable_Check(object)) {
1616+
PyObject *v;
1617+
1618+
if (!_PyArg_CheckPositional("iter", nargs, 1, 2))
1619+
return NULL;
1620+
v = args[0];
1621+
if (nargs == 1)
1622+
return PyObject_GetIter(v);
1623+
if (!PyCallable_Check(v)) {
16401624
PyErr_SetString(PyExc_TypeError,
1641-
"iter(object, sentinel): object must be callable");
1625+
"iter(v, w): v must be callable");
16421626
return NULL;
16431627
}
1644-
return PyCallIter_New(object, sentinel);
1628+
PyObject *sentinel = args[1];
1629+
return PyCallIter_New(v, sentinel);
16451630
}
16461631

1632+
PyDoc_STRVAR(iter_doc,
1633+
"iter(iterable) -> iterator\n\
1634+
iter(callable, sentinel) -> iterator\n\
1635+
\n\
1636+
Get an iterator from an object. In the first form, the argument must\n\
1637+
supply its own iterator, or be a sequence.\n\
1638+
In the second form, the callable is called until it returns the sentinel.");
1639+
16471640

16481641
/*[clinic input]
16491642
aiter as builtin_aiter
@@ -2443,36 +2436,33 @@ builtin_sorted(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject
24432436
}
24442437

24452438

2446-
/*[clinic input]
2447-
vars as builtin_vars
2448-
2449-
object: object = NULL
2450-
/
2451-
2452-
Show vars.
2453-
2454-
Without arguments, equivalent to locals().
2455-
With an argument, equivalent to object.__dict__.
2456-
[clinic start generated code]*/
2457-
2439+
/* AC: cannot convert yet, as needs PEP 457 group support in inspect */
24582440
static PyObject *
2459-
builtin_vars_impl(PyObject *module, PyObject *object)
2460-
/*[clinic end generated code: output=840a7f64007a3e0a input=80cbdef9182c4ba3]*/
2441+
builtin_vars(PyObject *self, PyObject *args)
24612442
{
2443+
PyObject *v = NULL;
24622444
PyObject *d;
24632445

2464-
if (object == NULL) {
2446+
if (!PyArg_UnpackTuple(args, "vars", 0, 1, &v))
2447+
return NULL;
2448+
if (v == NULL) {
24652449
d = _PyEval_GetFrameLocals();
24662450
}
24672451
else {
2468-
if (_PyObject_LookupAttr(object, &_Py_ID(__dict__), &d) == 0) {
2452+
if (_PyObject_LookupAttr(v, &_Py_ID(__dict__), &d) == 0) {
24692453
PyErr_SetString(PyExc_TypeError,
24702454
"vars() argument must have __dict__ attribute");
24712455
}
24722456
}
24732457
return d;
24742458
}
24752459

2460+
PyDoc_STRVAR(vars_doc,
2461+
"vars([object]) -> dictionary\n\
2462+
\n\
2463+
Without arguments, equivalent to locals().\n\
2464+
With an argument, equivalent to object.__dict__.");
2465+
24762466

24772467
/*[clinic input]
24782468
sum as builtin_sum
@@ -3024,12 +3014,12 @@ static PyMethodDef builtin_methods[] = {
30243014
BUILTIN_CHR_METHODDEF
30253015
BUILTIN_COMPILE_METHODDEF
30263016
BUILTIN_DELATTR_METHODDEF
3027-
BUILTIN_DIR_METHODDEF
3017+
{"dir", builtin_dir, METH_VARARGS, dir_doc},
30283018
BUILTIN_DIVMOD_METHODDEF
30293019
BUILTIN_EVAL_METHODDEF
30303020
BUILTIN_EXEC_METHODDEF
30313021
BUILTIN_FORMAT_METHODDEF
3032-
BUILTIN_GETATTR_METHODDEF
3022+
{"getattr", _PyCFunction_CAST(builtin_getattr), METH_FASTCALL, getattr_doc},
30333023
BUILTIN_GLOBALS_METHODDEF
30343024
BUILTIN_HASATTR_METHODDEF
30353025
BUILTIN_HASH_METHODDEF
@@ -3038,13 +3028,13 @@ static PyMethodDef builtin_methods[] = {
30383028
BUILTIN_INPUT_METHODDEF
30393029
BUILTIN_ISINSTANCE_METHODDEF
30403030
BUILTIN_ISSUBCLASS_METHODDEF
3041-
BUILTIN_ITER_METHODDEF
3031+
{"iter", _PyCFunction_CAST(builtin_iter), METH_FASTCALL, iter_doc},
30423032
BUILTIN_AITER_METHODDEF
30433033
BUILTIN_LEN_METHODDEF
30443034
BUILTIN_LOCALS_METHODDEF
30453035
{"max", _PyCFunction_CAST(builtin_max), METH_VARARGS | METH_KEYWORDS, max_doc},
30463036
{"min", _PyCFunction_CAST(builtin_min), METH_VARARGS | METH_KEYWORDS, min_doc},
3047-
BUILTIN_NEXT_METHODDEF
3037+
{"next", _PyCFunction_CAST(builtin_next), METH_FASTCALL, next_doc},
30483038
BUILTIN_ANEXT_METHODDEF
30493039
BUILTIN_OCT_METHODDEF
30503040
BUILTIN_ORD_METHODDEF
@@ -3055,7 +3045,7 @@ static PyMethodDef builtin_methods[] = {
30553045
BUILTIN_SETATTR_METHODDEF
30563046
BUILTIN_SORTED_METHODDEF
30573047
BUILTIN_SUM_METHODDEF
3058-
BUILTIN_VARS_METHODDEF
3048+
{"vars", builtin_vars, METH_VARARGS, vars_doc},
30593049
{NULL, NULL},
30603050
};
30613051

0 commit comments

Comments
 (0)