blob: 810f88da488e4210ea5269347db3e7e898a7c754 [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
17 str: str
18 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 *
Serhiy Storchaka5106ad12017-02-04 12:13:20 +020026_symtable_symtable_impl(PyObject *module, const char *str,
27 PyObject *filename, const char *startstr)
28/*[clinic end generated code: output=914b369c9b785956 input=6c615e84d5f408e3]*/
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;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000034 if (strcmp(startstr, "exec") == 0)
35 start = Py_file_input;
36 else if (strcmp(startstr, "eval") == 0)
37 start = Py_eval_input;
38 else if (strcmp(startstr, "single") == 0)
39 start = Py_single_input;
40 else {
41 PyErr_SetString(PyExc_ValueError,
42 "symtable() arg 3 must be 'exec' or 'eval' or 'single'");
Victor Stinner14e461d2013-08-26 22:28:21 +020043 Py_DECREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 return NULL;
45 }
Victor Stinner14e461d2013-08-26 22:28:21 +020046 st = Py_SymtableStringObject(str, filename, start);
47 Py_DECREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 if (st == NULL)
49 return NULL;
Benjamin Peterson89d8cd92013-10-26 13:13:51 -040050 t = (PyObject *)st->st_top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 Py_INCREF(t);
52 PyMem_Free((void *)st->st_future);
53 PySymtable_Free(st);
54 return t;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000055}
56
57static PyMethodDef symtable_methods[] = {
Serhiy Storchaka5106ad12017-02-04 12:13:20 +020058 _SYMTABLE_SYMTABLE_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 {NULL, NULL} /* sentinel */
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000060};
61
Martin v. Löwis1a214512008-06-11 05:26:20 +000062static struct PyModuleDef symtablemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 PyModuleDef_HEAD_INIT,
64 "_symtable",
65 NULL,
66 -1,
67 symtable_methods,
68 NULL,
69 NULL,
70 NULL,
71 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +000072};
73
Mark Hammondfe51c6d2002-08-02 02:27:13 +000074PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +000075PyInit__symtable(void)
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 PyObject *m;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000078
Benjamin Petersonc4311282012-10-30 23:21:10 -040079 if (PyType_Ready(&PySTEntry_Type) < 0)
80 return NULL;
81
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 m = PyModule_Create(&symtablemodule);
83 if (m == NULL)
84 return NULL;
Charles-Francois Natali74ca8862013-05-20 19:13:19 +020085 PyModule_AddIntMacro(m, USE);
86 PyModule_AddIntMacro(m, DEF_GLOBAL);
87 PyModule_AddIntMacro(m, DEF_LOCAL);
88 PyModule_AddIntMacro(m, DEF_PARAM);
89 PyModule_AddIntMacro(m, DEF_FREE);
90 PyModule_AddIntMacro(m, DEF_FREE_CLASS);
91 PyModule_AddIntMacro(m, DEF_IMPORT);
92 PyModule_AddIntMacro(m, DEF_BOUND);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -070093 PyModule_AddIntMacro(m, DEF_ANNOT);
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000095 PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock);
96 PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock);
97 PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock);
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000098
Charles-Francois Natali74ca8862013-05-20 19:13:19 +020099 PyModule_AddIntMacro(m, LOCAL);
100 PyModule_AddIntMacro(m, GLOBAL_EXPLICIT);
101 PyModule_AddIntMacro(m, GLOBAL_IMPLICIT);
102 PyModule_AddIntMacro(m, FREE);
103 PyModule_AddIntMacro(m, CELL);
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200106 PyModule_AddIntMacro(m, SCOPE_MASK);
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 if (PyErr_Occurred()) {
109 Py_DECREF(m);
110 m = 0;
111 }
112 return m;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +0000113}