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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }