Mercurial > cpython-lru_cache-weakref
annotate Modules/_opcode.c @ 87470:78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
for some builtins.
| author | Larry Hastings <larry@hastings.org> |
|---|---|
| date | Sat, 23 Nov 2013 15:37:55 -0800 |
| parents | 5fe72b9ed48e |
| children |
| rev | line source |
|---|---|
|
87465
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
1 #include "Python.h" |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
2 #include "opcode.h" |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
3 |
|
87470
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
87465
diff
changeset
|
4 /*[clinic] |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
87465
diff
changeset
|
5 module _opcode |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
87465
diff
changeset
|
6 [clinic]*/ |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
87465
diff
changeset
|
7 /*[clinic checksum: da39a3ee5e6b4b0d3255bfef95601890afd80709]*/ |
|
87465
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
8 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
9 /*[clinic] |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
10 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
11 _opcode.stack_effect -> int |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
12 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
13 opcode: int |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
14 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
15 [ |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
16 oparg: int |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
17 ] |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
18 / |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
19 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
20 Compute the stack effect of the opcode. |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
21 [clinic]*/ |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
22 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
23 PyDoc_STRVAR(_opcode_stack_effect__doc__, |
|
87470
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
87465
diff
changeset
|
24 "stack_effect(opcode, [oparg])\n" |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
87465
diff
changeset
|
25 "Compute the stack effect of the opcode."); |
|
87465
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
26 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
27 #define _OPCODE_STACK_EFFECT_METHODDEF \ |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
28 {"stack_effect", (PyCFunction)_opcode_stack_effect, METH_VARARGS, _opcode_stack_effect__doc__}, |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
29 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
30 static int |
|
87470
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
87465
diff
changeset
|
31 _opcode_stack_effect_impl(PyModuleDef *module, int opcode, int group_right_1, int oparg); |
|
87465
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
32 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
33 static PyObject * |
|
87470
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
87465
diff
changeset
|
34 _opcode_stack_effect(PyModuleDef *module, PyObject *args) |
|
87465
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
35 { |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
36 PyObject *return_value = NULL; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
37 int opcode; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
38 int group_right_1 = 0; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
39 int oparg = 0; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
40 int _return_value; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
41 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
42 switch (PyTuple_Size(args)) { |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
43 case 1: |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
44 if (!PyArg_ParseTuple(args, "i:stack_effect", &opcode)) |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
45 return NULL; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
46 break; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
47 case 2: |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
48 if (!PyArg_ParseTuple(args, "ii:stack_effect", &opcode, &oparg)) |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
49 return NULL; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
50 group_right_1 = 1; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
51 break; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
52 default: |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
53 PyErr_SetString(PyExc_TypeError, "_opcode.stack_effect requires 1 to 2 arguments"); |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
54 return NULL; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
55 } |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
56 _return_value = _opcode_stack_effect_impl(module, opcode, group_right_1, oparg); |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
57 if ((_return_value == -1) && PyErr_Occurred()) |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
58 goto exit; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
59 return_value = PyLong_FromLong((long)_return_value); |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
60 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
61 exit: |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
62 return return_value; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
63 } |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
64 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
65 static int |
|
87470
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
87465
diff
changeset
|
66 _opcode_stack_effect_impl(PyModuleDef *module, int opcode, int group_right_1, int oparg) |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
87465
diff
changeset
|
67 /*[clinic checksum: e880e62dc7b0de73403026eaf4f8074aa106358b]*/ |
|
87465
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
68 { |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
69 int effect; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
70 if (HAS_ARG(opcode)) { |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
71 if (!group_right_1) { |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
72 PyErr_SetString(PyExc_ValueError, |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
73 "stack_effect: opcode requires oparg but oparg was not specified"); |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
74 return -1; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
75 } |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
76 } |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
77 else if (group_right_1) { |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
78 PyErr_SetString(PyExc_ValueError, |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
79 "stack_effect: opcode does not permit oparg but oparg was specified"); |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
80 return -1; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
81 } |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
82 effect = PyCompile_OpcodeStackEffect(opcode, oparg); |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
83 if (effect == PY_INVALID_STACK_EFFECT) { |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
84 PyErr_SetString(PyExc_ValueError, |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
85 "invalid opcode or oparg"); |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
86 return -1; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
87 } |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
88 return effect; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
89 } |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
90 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
91 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
92 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
93 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
94 static PyMethodDef |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
95 opcode_functions[] = { |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
96 _OPCODE_STACK_EFFECT_METHODDEF |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
97 {NULL, NULL, 0, NULL} |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
98 }; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
99 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
100 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
101 static struct PyModuleDef opcodemodule = { |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
102 PyModuleDef_HEAD_INIT, |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
103 "_opcode", |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
104 "Opcode support module.", |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
105 -1, |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
106 opcode_functions, |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
107 NULL, |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
108 NULL, |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
109 NULL, |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
110 NULL |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
111 }; |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
112 |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
113 PyMODINIT_FUNC |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
114 PyInit__opcode(void) |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
115 { |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
116 return PyModule_Create(&opcodemodule); |
|
5fe72b9ed48e
Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents:
diff
changeset
|
117 } |
