blob: 02a81f11dc3d5b095dbafa2f72192609d53d2089 [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;
72 PyModule_AddIntConstant(m, "USE", USE);
73 PyModule_AddIntConstant(m, "DEF_GLOBAL", DEF_GLOBAL);
74 PyModule_AddIntConstant(m, "DEF_LOCAL", DEF_LOCAL);
75 PyModule_AddIntConstant(m, "DEF_PARAM", DEF_PARAM);
76 PyModule_AddIntConstant(m, "DEF_FREE", DEF_FREE);
77 PyModule_AddIntConstant(m, "DEF_FREE_CLASS", DEF_FREE_CLASS);
78 PyModule_AddIntConstant(m, "DEF_IMPORT", DEF_IMPORT);
79 PyModule_AddIntConstant(m, "DEF_BOUND", 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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000085 PyModule_AddIntConstant(m, "OPT_IMPORT_STAR", OPT_IMPORT_STAR);
86 PyModule_AddIntConstant(m, "OPT_TOPLEVEL", OPT_TOPLEVEL);
Jeremy Hylton43454762001-04-16 18:42:13 +000087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000088 PyModule_AddIntConstant(m, "LOCAL", LOCAL);
89 PyModule_AddIntConstant(m, "GLOBAL_EXPLICIT", GLOBAL_EXPLICIT);
90 PyModule_AddIntConstant(m, "GLOBAL_IMPLICIT", GLOBAL_IMPLICIT);
91 PyModule_AddIntConstant(m, "FREE", FREE);
92 PyModule_AddIntConstant(m, "CELL", CELL);
Benjamin Peterson55e00f22008-08-17 18:02:44 +000093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET);
95 PyModule_AddIntConstant(m, "SCOPE_MASK", 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}