Mercurial > cpython-lru_cache-weakref
annotate Modules/symtablemodule.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 | f5c729dbe9fb |
| children |
| rev | line source |
|---|---|
|
16422
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
1 #include "Python.h" |
|
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
2 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
30683
diff
changeset
|
3 #include "code.h" |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
30683
diff
changeset
|
4 #include "Python-ast.h" |
|
16422
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
5 #include "symtable.h" |
|
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
6 |
|
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
7 static PyObject * |
|
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
8 symtable_symtable(PyObject *self, PyObject *args) |
|
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
9 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
10 struct symtable *st; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
11 PyObject *t; |
|
16422
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
12 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
13 char *str; |
|
85417
df2fdd42b375
Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents:
83867
diff
changeset
|
14 PyObject *filename; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
15 char *startstr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
16 int start; |
|
16422
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
17 |
|
85417
df2fdd42b375
Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents:
83867
diff
changeset
|
18 if (!PyArg_ParseTuple(args, "sO&s:symtable", |
|
df2fdd42b375
Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents:
83867
diff
changeset
|
19 &str, PyUnicode_FSDecoder, &filename, &startstr)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
20 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
21 if (strcmp(startstr, "exec") == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
22 start = Py_file_input; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
23 else if (strcmp(startstr, "eval") == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
24 start = Py_eval_input; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
25 else if (strcmp(startstr, "single") == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
26 start = Py_single_input; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
27 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
28 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
29 "symtable() arg 3 must be 'exec' or 'eval' or 'single'"); |
|
85417
df2fdd42b375
Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents:
83867
diff
changeset
|
30 Py_DECREF(filename); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
31 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
32 } |
|
85417
df2fdd42b375
Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents:
83867
diff
changeset
|
33 st = Py_SymtableStringObject(str, filename, start); |
|
df2fdd42b375
Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents:
83867
diff
changeset
|
34 Py_DECREF(filename); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
35 if (st == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
36 return NULL; |
|
86660
bc259b221cb8
just return toplevel symbol table rather than all blocks (closes #19393)
Benjamin Peterson <benjamin@python.org>
parents:
80072
diff
changeset
|
37 t = (PyObject *)st->st_top; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
38 Py_INCREF(t); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
39 PyMem_Free((void *)st->st_future); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
40 PySymtable_Free(st); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
41 return t; |
|
16422
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
42 } |
|
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
43 |
|
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
44 static PyMethodDef symtable_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
45 {"symtable", symtable_symtable, METH_VARARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
46 PyDoc_STR("Return symbol and scope dictionaries" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
47 " used internally by compiler.")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
48 {NULL, NULL} /* sentinel */ |
|
16422
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
49 }; |
|
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
50 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
41464
diff
changeset
|
51 static struct PyModuleDef symtablemodule = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
52 PyModuleDef_HEAD_INIT, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
53 "_symtable", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
54 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
55 -1, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
56 symtable_methods, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
57 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
58 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
59 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
60 NULL |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
41464
diff
changeset
|
61 }; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
41464
diff
changeset
|
62 |
|
24471
f66b3a3509c7
Excise DL_EXPORT/DL_IMPORT from Modules/*. Required adding a prototype
Mark Hammond <mhammond@skippinet.com.au>
parents:
21253
diff
changeset
|
63 PyMODINIT_FUNC |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
41464
diff
changeset
|
64 PyInit__symtable(void) |
|
16422
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
65 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
66 PyObject *m; |
|
16422
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
67 |
|
80072
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
68 if (PyType_Ready(&PySTEntry_Type) < 0) |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
69 return NULL; |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
68257
diff
changeset
|
70 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
71 m = PyModule_Create(&symtablemodule); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
72 if (m == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
73 return NULL; |
|
83867
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
74 PyModule_AddIntMacro(m, USE); |
|
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
75 PyModule_AddIntMacro(m, DEF_GLOBAL); |
|
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
76 PyModule_AddIntMacro(m, DEF_LOCAL); |
|
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
77 PyModule_AddIntMacro(m, DEF_PARAM); |
|
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
78 PyModule_AddIntMacro(m, DEF_FREE); |
|
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
79 PyModule_AddIntMacro(m, DEF_FREE_CLASS); |
|
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
80 PyModule_AddIntMacro(m, DEF_IMPORT); |
|
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
81 PyModule_AddIntMacro(m, DEF_BOUND); |
|
16422
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
82 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
83 PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
84 PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
85 PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock); |
|
16422
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
86 |
|
83867
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
87 PyModule_AddIntMacro(m, OPT_IMPORT_STAR); |
|
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
88 PyModule_AddIntMacro(m, OPT_TOPLEVEL); |
|
17551
cbc9f8865595
Export three optimization (fast locals) flags
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17159
diff
changeset
|
89 |
|
83867
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
90 PyModule_AddIntMacro(m, LOCAL); |
|
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
91 PyModule_AddIntMacro(m, GLOBAL_EXPLICIT); |
|
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
92 PyModule_AddIntMacro(m, GLOBAL_IMPLICIT); |
|
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
93 PyModule_AddIntMacro(m, FREE); |
|
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
94 PyModule_AddIntMacro(m, CELL); |
|
48725
40c07a61e1c2
Merged revisions 65715,65724,65726,65732,65736-65739,65775 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47580
diff
changeset
|
95 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
96 PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET); |
|
83867
12cbb5183d98
Issue #17917: Use PyModule_AddIntMacro() instead of PyModule_AddIntConstant()
Charles-Francois Natali <cf.natali@gmail.com>
parents:
80072
diff
changeset
|
97 PyModule_AddIntMacro(m, SCOPE_MASK); |
|
48725
40c07a61e1c2
Merged revisions 65715,65724,65726,65732,65736-65739,65775 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47580
diff
changeset
|
98 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
99 if (PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
100 Py_DECREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
101 m = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
102 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48725
diff
changeset
|
103 return m; |
|
16422
8b318b8d78c9
Add minimal interface to symtable: _symtable module.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
104 } |
