blob: d66cb44f69bdfef20e362b8ec8c8e892ca00bc65 [file] [log] [blame]
Jeremy Hylton5e7cb242001-02-02 18:24:26 +00001#include "Python.h"
2
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003#include "code.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004#include "Python-ast.h"
Jeremy Hylton5e7cb242001-02-02 18:24:26 +00005#include "symtable.h"
6
Serhiy Storchaka5106ad12017-02-04 12:13:20 +02007#include "clinic/symtablemodule.c.h"
8/*[clinic input]
9module _symtable
10[clinic start generated code]*/
11/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f4685845a7100605]*/
12
13
14/*[clinic input]
15_symtable.symtable
16
Dino Viehland41540692019-05-28 16:21:17 -070017 source: object
Serhiy Storchaka5106ad12017-02-04 12:13:20 +020018 filename: object(converter='PyUnicode_FSDecoder')
19 startstr: str
20 /
21
22Return symbol and scope dictionaries used internally by compiler.
23[clinic start generated code]*/
24
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000025static PyObject *
Dino Viehland41540692019-05-28 16:21:17 -070026_symtable_symtable_impl(PyObject *module, PyObject *source,
Serhiy Storchaka5106ad12017-02-04 12:13:20 +020027 PyObject *filename, const char *startstr)
Dino Viehland41540692019-05-28 16:21:17 -070028/*[clinic end generated code: output=59eb0d5fc7285ac4 input=9dd8a50c0c36a4d7]*/
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 struct symtable *st;
31 PyObject *t;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000032 int start;
Dino Viehland41540692019-05-28 16:21:17 -070033 PyCompilerFlags cf;
34 PyObject *source_copy = NULL;
35
36 cf.cf_flags = PyCF_SOURCE_IS_UTF8;
37 cf.cf_feature_version = PY_MINOR_VERSION;
38
39 const char *str = _Py_SourceAsString(source, "symtable", "string or bytes", &cf, &source_copy);
40 if (str == NULL) {
41 return NULL;
42 }
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 if (strcmp(startstr, "exec") == 0)
45 start = Py_file_input;
46 else if (strcmp(startstr, "eval") == 0)
47 start = Py_eval_input;
48 else if (strcmp(startstr, "single") == 0)
49 start = Py_single_input;
50 else {
51 PyErr_SetString(PyExc_ValueError,
52 "symtable() arg 3 must be 'exec' or 'eval' or 'single'");
Victor Stinner14e461d2013-08-26 22:28:21 +020053 Py_DECREF(filename);
Dino Viehland41540692019-05-28 16:21:17 -070054 Py_XDECREF(source_copy);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055 return NULL;
56 }
Dino Viehland41540692019-05-28 16:21:17 -070057 st = _Py_SymtableStringObjectFlags(str, filename, start, &cf);
Victor Stinner14e461d2013-08-26 22:28:21 +020058 Py_DECREF(filename);
Dino Viehland41540692019-05-28 16:21:17 -070059 Py_XDECREF(source_copy);
60 if (st == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 return NULL;
Dino Viehland41540692019-05-28 16:21:17 -070062 }
Benjamin Peterson89d8cd92013-10-26 13:13:51 -040063 t = (PyObject *)st->st_top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 Py_INCREF(t);
65 PyMem_Free((void *)st->st_future);
66 PySymtable_Free(st);
67 return t;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000068}
69
70static PyMethodDef symtable_methods[] = {
Serhiy Storchaka5106ad12017-02-04 12:13:20 +020071 _SYMTABLE_SYMTABLE_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 {NULL, NULL} /* sentinel */
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000073};
74
Martin v. Löwis1a214512008-06-11 05:26:20 +000075static struct PyModuleDef symtablemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000076 PyModuleDef_HEAD_INIT,
77 "_symtable",
78 NULL,
79 -1,
80 symtable_methods,
81 NULL,
82 NULL,
83 NULL,
84 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +000085};
86
Mark Hammondfe51c6d2002-08-02 02:27:13 +000087PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +000088PyInit__symtable(void)
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 PyObject *m;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000091
Benjamin Petersonc4311282012-10-30 23:21:10 -040092 if (PyType_Ready(&PySTEntry_Type) < 0)
93 return NULL;
94
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000095 m = PyModule_Create(&symtablemodule);
96 if (m == NULL)
97 return NULL;
Charles-Francois Natali74ca8862013-05-20 19:13:19 +020098 PyModule_AddIntMacro(m, USE);
99 PyModule_AddIntMacro(m, DEF_GLOBAL);
Pablo Galindod5b4f1b2018-10-20 01:46:00 +0100100 PyModule_AddIntMacro(m, DEF_NONLOCAL);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200101 PyModule_AddIntMacro(m, DEF_LOCAL);
102 PyModule_AddIntMacro(m, DEF_PARAM);
103 PyModule_AddIntMacro(m, DEF_FREE);
104 PyModule_AddIntMacro(m, DEF_FREE_CLASS);
105 PyModule_AddIntMacro(m, DEF_IMPORT);
106 PyModule_AddIntMacro(m, DEF_BOUND);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700107 PyModule_AddIntMacro(m, DEF_ANNOT);
Jeremy Hylton5e7cb242001-02-02 18:24:26 +0000108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock);
110 PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock);
111 PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock);
Jeremy Hylton5e7cb242001-02-02 18:24:26 +0000112
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200113 PyModule_AddIntMacro(m, LOCAL);
114 PyModule_AddIntMacro(m, GLOBAL_EXPLICIT);
115 PyModule_AddIntMacro(m, GLOBAL_IMPLICIT);
116 PyModule_AddIntMacro(m, FREE);
117 PyModule_AddIntMacro(m, CELL);
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000119 PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200120 PyModule_AddIntMacro(m, SCOPE_MASK);
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 if (PyErr_Occurred()) {
123 Py_DECREF(m);
124 m = 0;
125 }
126 return m;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +0000127}