blob: 34a6fc56f9f8f388931c46f357ebf588077ea40c [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
7static PyObject *
8symtable_symtable(PyObject *self, PyObject *args)
9{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000010 struct symtable *st;
11 PyObject *t;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000013 char *str;
Victor Stinner14e461d2013-08-26 22:28:21 +020014 PyObject *filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000015 char *startstr;
16 int start;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000017
Victor Stinner14e461d2013-08-26 22:28:21 +020018 if (!PyArg_ParseTuple(args, "sO&s:symtable",
19 &str, PyUnicode_FSDecoder, &filename, &startstr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 return NULL;
21 if (strcmp(startstr, "exec") == 0)
22 start = Py_file_input;
23 else if (strcmp(startstr, "eval") == 0)
24 start = Py_eval_input;
25 else if (strcmp(startstr, "single") == 0)
26 start = Py_single_input;
27 else {
28 PyErr_SetString(PyExc_ValueError,
29 "symtable() arg 3 must be 'exec' or 'eval' or 'single'");
Victor Stinner14e461d2013-08-26 22:28:21 +020030 Py_DECREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000031 return NULL;
32 }
Victor Stinner14e461d2013-08-26 22:28:21 +020033 st = Py_SymtableStringObject(str, filename, start);
34 Py_DECREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 if (st == NULL)
36 return NULL;
Benjamin Peterson89d8cd92013-10-26 13:13:51 -040037 t = (PyObject *)st->st_top;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000038 Py_INCREF(t);
39 PyMem_Free((void *)st->st_future);
40 PySymtable_Free(st);
41 return t;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000042}
43
44static PyMethodDef symtable_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 {"symtable", symtable_symtable, METH_VARARGS,
46 PyDoc_STR("Return symbol and scope dictionaries"
47 " used internally by compiler.")},
48 {NULL, NULL} /* sentinel */
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000049};
50
Martin v. Löwis1a214512008-06-11 05:26:20 +000051static struct PyModuleDef symtablemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 PyModuleDef_HEAD_INIT,
53 "_symtable",
54 NULL,
55 -1,
56 symtable_methods,
57 NULL,
58 NULL,
59 NULL,
60 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +000061};
62
Mark Hammondfe51c6d2002-08-02 02:27:13 +000063PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +000064PyInit__symtable(void)
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000065{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 PyObject *m;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000067
Benjamin Petersonc4311282012-10-30 23:21:10 -040068 if (PyType_Ready(&PySTEntry_Type) < 0)
69 return NULL;
70
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 m = PyModule_Create(&symtablemodule);
72 if (m == NULL)
73 return NULL;
Charles-Francois Natali74ca8862013-05-20 19:13:19 +020074 PyModule_AddIntMacro(m, USE);
75 PyModule_AddIntMacro(m, DEF_GLOBAL);
76 PyModule_AddIntMacro(m, DEF_LOCAL);
77 PyModule_AddIntMacro(m, DEF_PARAM);
78 PyModule_AddIntMacro(m, DEF_FREE);
79 PyModule_AddIntMacro(m, DEF_FREE_CLASS);
80 PyModule_AddIntMacro(m, DEF_IMPORT);
81 PyModule_AddIntMacro(m, DEF_BOUND);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -070082 PyModule_AddIntMacro(m, DEF_ANNOT);
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock);
85 PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock);
86 PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock);
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000087
Charles-Francois Natali74ca8862013-05-20 19:13:19 +020088 PyModule_AddIntMacro(m, LOCAL);
89 PyModule_AddIntMacro(m, GLOBAL_EXPLICIT);
90 PyModule_AddIntMacro(m, GLOBAL_IMPLICIT);
91 PyModule_AddIntMacro(m, FREE);
92 PyModule_AddIntMacro(m, CELL);
Benjamin Peterson55e00f22008-08-17 18:02:44 +000093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +020095 PyModule_AddIntMacro(m, SCOPE_MASK);
Benjamin Peterson55e00f22008-08-17 18:02:44 +000096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000097 if (PyErr_Occurred()) {
98 Py_DECREF(m);
99 m = 0;
100 }
101 return m;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +0000102}