blob: f6201e5bb0015d4f8bc128d2d031b3f3364a8676 [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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 m = PyModule_Create(&symtablemodule);
67 if (m == NULL)
68 return NULL;
69 PyModule_AddIntConstant(m, "USE", USE);
70 PyModule_AddIntConstant(m, "DEF_GLOBAL", DEF_GLOBAL);
71 PyModule_AddIntConstant(m, "DEF_LOCAL", DEF_LOCAL);
72 PyModule_AddIntConstant(m, "DEF_PARAM", DEF_PARAM);
73 PyModule_AddIntConstant(m, "DEF_FREE", DEF_FREE);
74 PyModule_AddIntConstant(m, "DEF_FREE_CLASS", DEF_FREE_CLASS);
75 PyModule_AddIntConstant(m, "DEF_IMPORT", DEF_IMPORT);
76 PyModule_AddIntConstant(m, "DEF_BOUND", DEF_BOUND);
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000078 PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock);
79 PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock);
80 PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock);
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 PyModule_AddIntConstant(m, "OPT_IMPORT_STAR", OPT_IMPORT_STAR);
83 PyModule_AddIntConstant(m, "OPT_TOPLEVEL", OPT_TOPLEVEL);
Jeremy Hylton43454762001-04-16 18:42:13 +000084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000085 PyModule_AddIntConstant(m, "LOCAL", LOCAL);
86 PyModule_AddIntConstant(m, "GLOBAL_EXPLICIT", GLOBAL_EXPLICIT);
87 PyModule_AddIntConstant(m, "GLOBAL_IMPLICIT", GLOBAL_IMPLICIT);
88 PyModule_AddIntConstant(m, "FREE", FREE);
89 PyModule_AddIntConstant(m, "CELL", CELL);
Benjamin Peterson55e00f22008-08-17 18:02:44 +000090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET);
92 PyModule_AddIntConstant(m, "SCOPE_MASK", SCOPE_MASK);
Benjamin Peterson55e00f22008-08-17 18:02:44 +000093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 if (PyErr_Occurred()) {
95 Py_DECREF(m);
96 m = 0;
97 }
98 return m;
Jeremy Hylton5e7cb242001-02-02 18:24:26 +000099}