Mercurial > cpython-lru_cache-weakref
annotate Modules/_opcode.c @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | 78ec18f5cb45 |
| 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 } |
