blob: fbc1ff6922012862be5bf1957b1b53d7135c8d01 [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;
14 char *filename;
15 char *startstr;
16 int start;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000018 if (!PyArg_ParseTuple(args, "sss:symtable", &str, &filename,
19 &startstr))
20 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'");
30 return NULL;
31 }
32 st = Py_SymtableString(str, filename, start);
33 if (st == NULL)
34 return NULL;
35 t = st->st_blocks;
36 Py_INCREF(t);
37 PyMem_Free((void *)st->st_future);
38 PySymtable_Free(st);
39 return t;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000040}
41
42static PyMethodDef symtable_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 {"symtable", symtable_symtable, METH_VARARGS,
44 PyDoc_STR("Return symbol and scope dictionaries"
45 " used internally by compiler.")},
46 {NULL, NULL} /* sentinel */
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000047};
48
Martin v. Löwis1a214512008-06-11 05:26:20 +000049static struct PyModuleDef symtablemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 PyModuleDef_HEAD_INIT,
51 "_symtable",
52 NULL,
53 -1,
54 symtable_methods,
55 NULL,
56 NULL,
57 NULL,
58 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +000059};
60
Mark Hammondfe51c6d2002-08-02 02:27:13 +000061PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +000062PyInit__symtable(void)
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000063{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 PyObject *m;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000065
Benjamin Petersonc4311282012-10-30 23:21:10 -040066 if (PyType_Ready(&PySTEntry_Type) < 0)
67 return NULL;
68
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 m = PyModule_Create(&symtablemodule);
70 if (m == NULL)
71 return NULL;
Charles-Francois Natali74ca8862013-05-20 19:13:19 +020072 PyModule_AddIntMacro(m, USE);
73 PyModule_AddIntMacro(m, DEF_GLOBAL);
74 PyModule_AddIntMacro(m, DEF_LOCAL);
75 PyModule_AddIntMacro(m, DEF_PARAM);
76 PyModule_AddIntMacro(m, DEF_FREE);
77 PyModule_AddIntMacro(m, DEF_FREE_CLASS);
78 PyModule_AddIntMacro(m, DEF_IMPORT);
79 PyModule_AddIntMacro(m, DEF_BOUND);
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081 PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock);
82 PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock);
83 PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock);
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000084
Charles-Francois Natali74ca8862013-05-20 19:13:19 +020085 PyModule_AddIntMacro(m, OPT_IMPORT_STAR);
86 PyModule_AddIntMacro(m, OPT_TOPLEVEL);
Jeremy Hylton43454762001-04-16 18:42:13 +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}