blob: 9180f185e1e8772f9d70702b5b792ec510398c5d [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;
Miss Islington (bot)92e836c2019-06-12 17:36:03 -070033 PyCompilerFlags cf = _PyCompilerFlags_INIT;
Dino Viehland41540692019-05-28 16:21:17 -070034 PyObject *source_copy = NULL;
35
36 cf.cf_flags = PyCF_SOURCE_IS_UTF8;
Dino Viehland41540692019-05-28 16:21:17 -070037
38 const char *str = _Py_SourceAsString(source, "symtable", "string or bytes", &cf, &source_copy);
39 if (str == NULL) {
40 return NULL;
41 }
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 if (strcmp(startstr, "exec") == 0)
44 start = Py_file_input;
45 else if (strcmp(startstr, "eval") == 0)
46 start = Py_eval_input;
47 else if (strcmp(startstr, "single") == 0)
48 start = Py_single_input;
49 else {
50 PyErr_SetString(PyExc_ValueError,
51 "symtable() arg 3 must be 'exec' or 'eval' or 'single'");
Victor Stinner14e461d2013-08-26 22:28:21 +020052 Py_DECREF(filename);
Dino Viehland41540692019-05-28 16:21:17 -070053 Py_XDECREF(source_copy);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 return NULL;
55 }
Dino Viehland41540692019-05-28 16:21:17 -070056 st = _Py_SymtableStringObjectFlags(str, filename, start, &cf);
Victor Stinner14e461d2013-08-26 22:28:21 +020057 Py_DECREF(filename);
Dino Viehland41540692019-05-28 16:21:17 -070058 Py_XDECREF(source_copy);
59 if (st == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 return NULL;
Dino Viehland41540692019-05-28 16:21:17 -070061 }
Benjamin Peterson89d8cd92013-10-26 13:13:51 -040062 t = (PyObject *)st->st_top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 Py_INCREF(t);
64 PyMem_Free((void *)st->st_future);
65 PySymtable_Free(st);
66 return t;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000067}
68
69static PyMethodDef symtable_methods[] = {
Serhiy Storchaka5106ad12017-02-04 12:13:20 +020070 _SYMTABLE_SYMTABLE_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 {NULL, NULL} /* sentinel */
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000072};
73
Martin v. Löwis1a214512008-06-11 05:26:20 +000074static struct PyModuleDef symtablemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 PyModuleDef_HEAD_INIT,
76 "_symtable",
77 NULL,
78 -1,
79 symtable_methods,
80 NULL,
81 NULL,
82 NULL,
83 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +000084};
85
Mark Hammondfe51c6d2002-08-02 02:27:13 +000086PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +000087PyInit__symtable(void)
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000088{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 PyObject *m;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000090
Benjamin Petersonc4311282012-10-30 23:21:10 -040091 if (PyType_Ready(&PySTEntry_Type) < 0)
92 return NULL;
93
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 m = PyModule_Create(&symtablemodule);
95 if (m == NULL)
96 return NULL;
Charles-Francois Natali74ca8862013-05-20 19:13:19 +020097 PyModule_AddIntMacro(m, USE);
98 PyModule_AddIntMacro(m, DEF_GLOBAL);
Pablo Galindod5b4f1b2018-10-20 01:46:00 +010099 PyModule_AddIntMacro(m, DEF_NONLOCAL);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200100 PyModule_AddIntMacro(m, DEF_LOCAL);
101 PyModule_AddIntMacro(m, DEF_PARAM);
102 PyModule_AddIntMacro(m, DEF_FREE);
103 PyModule_AddIntMacro(m, DEF_FREE_CLASS);
104 PyModule_AddIntMacro(m, DEF_IMPORT);
105 PyModule_AddIntMacro(m, DEF_BOUND);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700106 PyModule_AddIntMacro(m, DEF_ANNOT);
Jeremy Hylton5e7cb242001-02-02 18:24:26 +0000107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock);
109 PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock);
110 PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock);
Jeremy Hylton5e7cb242001-02-02 18:24:26 +0000111
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200112 PyModule_AddIntMacro(m, LOCAL);
113 PyModule_AddIntMacro(m, GLOBAL_EXPLICIT);
114 PyModule_AddIntMacro(m, GLOBAL_IMPLICIT);
115 PyModule_AddIntMacro(m, FREE);
116 PyModule_AddIntMacro(m, CELL);
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200119 PyModule_AddIntMacro(m, SCOPE_MASK);
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 if (PyErr_Occurred()) {
122 Py_DECREF(m);
123 m = 0;
124 }
125 return m;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +0000126}