mirror of
https://github.com/python/cpython.git
synced 2024-11-25 09:39:56 +01:00
581ee3618c
annotate text signatures in docstrings, resulting in fewer false positives. "self" parameters are also explicitly marked, allowing inspect.Signature() to authoritatively detect (and skip) said parameters. Issue #20326: Argument Clinic now generates separate checksums for the input and output sections of the block, allowing external tools to verify that the input has not changed (and thus the output is not out-of-date).
118 lines
2.8 KiB
C
118 lines
2.8 KiB
C
#include "Python.h"
|
|
#include "opcode.h"
|
|
|
|
/*[clinic input]
|
|
module _opcode
|
|
[clinic start generated code]*/
|
|
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=117442e66eb376e6]*/
|
|
|
|
/*[clinic input]
|
|
|
|
_opcode.stack_effect -> int
|
|
|
|
opcode: int
|
|
|
|
[
|
|
oparg: int
|
|
]
|
|
/
|
|
|
|
Compute the stack effect of the opcode.
|
|
[clinic start generated code]*/
|
|
|
|
PyDoc_STRVAR(_opcode_stack_effect__doc__,
|
|
"stack_effect(module, opcode, [oparg])\n"
|
|
"Compute the stack effect of the opcode.");
|
|
|
|
#define _OPCODE_STACK_EFFECT_METHODDEF \
|
|
{"stack_effect", (PyCFunction)_opcode_stack_effect, METH_VARARGS, _opcode_stack_effect__doc__},
|
|
|
|
static int
|
|
_opcode_stack_effect_impl(PyModuleDef *module, int opcode, int group_right_1, int oparg);
|
|
|
|
static PyObject *
|
|
_opcode_stack_effect(PyModuleDef *module, PyObject *args)
|
|
{
|
|
PyObject *return_value = NULL;
|
|
int opcode;
|
|
int group_right_1 = 0;
|
|
int oparg = 0;
|
|
int _return_value;
|
|
|
|
switch (PyTuple_GET_SIZE(args)) {
|
|
case 1:
|
|
if (!PyArg_ParseTuple(args, "i:stack_effect", &opcode))
|
|
goto exit;
|
|
break;
|
|
case 2:
|
|
if (!PyArg_ParseTuple(args, "ii:stack_effect", &opcode, &oparg))
|
|
goto exit;
|
|
group_right_1 = 1;
|
|
break;
|
|
default:
|
|
PyErr_SetString(PyExc_TypeError, "_opcode.stack_effect requires 1 to 2 arguments");
|
|
goto exit;
|
|
}
|
|
_return_value = _opcode_stack_effect_impl(module, opcode, group_right_1, oparg);
|
|
if ((_return_value == -1) && PyErr_Occurred())
|
|
goto exit;
|
|
return_value = PyLong_FromLong((long)_return_value);
|
|
|
|
exit:
|
|
return return_value;
|
|
}
|
|
|
|
static int
|
|
_opcode_stack_effect_impl(PyModuleDef *module, int opcode, int group_right_1, int oparg)
|
|
/*[clinic end generated code: output=4689140ffda2494a input=056816407c3d4284]*/
|
|
{
|
|
int effect;
|
|
if (HAS_ARG(opcode)) {
|
|
if (!group_right_1) {
|
|
PyErr_SetString(PyExc_ValueError,
|
|
"stack_effect: opcode requires oparg but oparg was not specified");
|
|
return -1;
|
|
}
|
|
}
|
|
else if (group_right_1) {
|
|
PyErr_SetString(PyExc_ValueError,
|
|
"stack_effect: opcode does not permit oparg but oparg was specified");
|
|
return -1;
|
|
}
|
|
effect = PyCompile_OpcodeStackEffect(opcode, oparg);
|
|
if (effect == PY_INVALID_STACK_EFFECT) {
|
|
PyErr_SetString(PyExc_ValueError,
|
|
"invalid opcode or oparg");
|
|
return -1;
|
|
}
|
|
return effect;
|
|
}
|
|
|
|
|
|
|
|
|
|
static PyMethodDef
|
|
opcode_functions[] = {
|
|
_OPCODE_STACK_EFFECT_METHODDEF
|
|
{NULL, NULL, 0, NULL}
|
|
};
|
|
|
|
|
|
static struct PyModuleDef opcodemodule = {
|
|
PyModuleDef_HEAD_INIT,
|
|
"_opcode",
|
|
"Opcode support module.",
|
|
-1,
|
|
opcode_functions,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL
|
|
};
|
|
|
|
PyMODINIT_FUNC
|
|
PyInit__opcode(void)
|
|
{
|
|
return PyModule_Create(&opcodemodule);
|
|
}
|