Line data Source code
1 : #include "Python.h"
2 :
3 : #include "code.h"
4 : #include "Python-ast.h"
5 : #include "symtable.h"
6 :
7 : static PyObject *
8 0 : symtable_symtable(PyObject *self, PyObject *args)
9 : {
10 : struct symtable *st;
11 : PyObject *t;
12 :
13 : char *str;
14 : char *filename;
15 : char *startstr;
16 : int start;
17 :
18 0 : if (!PyArg_ParseTuple(args, "sss:symtable", &str, &filename,
19 : &startstr))
20 0 : return NULL;
21 0 : if (strcmp(startstr, "exec") == 0)
22 0 : start = Py_file_input;
23 0 : else if (strcmp(startstr, "eval") == 0)
24 0 : start = Py_eval_input;
25 0 : else if (strcmp(startstr, "single") == 0)
26 0 : start = Py_single_input;
27 : else {
28 0 : PyErr_SetString(PyExc_ValueError,
29 : "symtable() arg 3 must be 'exec' or 'eval' or 'single'");
30 0 : return NULL;
31 : }
32 0 : st = Py_SymtableString(str, filename, start);
33 0 : if (st == NULL)
34 0 : return NULL;
35 0 : t = st->st_blocks;
36 0 : Py_INCREF(t);
37 0 : PyMem_Free((void *)st->st_future);
38 0 : PySymtable_Free(st);
39 0 : return t;
40 : }
41 :
42 : static PyMethodDef symtable_methods[] = {
43 : {"symtable", symtable_symtable, METH_VARARGS,
44 : PyDoc_STR("Return symbol and scope dictionaries"
45 : " used internally by compiler.")},
46 : {NULL, NULL} /* sentinel */
47 : };
48 :
49 : static struct PyModuleDef symtablemodule = {
50 : PyModuleDef_HEAD_INIT,
51 : "_symtable",
52 : NULL,
53 : -1,
54 : symtable_methods,
55 : NULL,
56 : NULL,
57 : NULL,
58 : NULL
59 : };
60 :
61 : PyMODINIT_FUNC
62 0 : PyInit__symtable(void)
63 : {
64 : PyObject *m;
65 :
66 0 : m = PyModule_Create(&symtablemodule);
67 0 : if (m == NULL)
68 0 : return NULL;
69 0 : PyModule_AddIntConstant(m, "USE", USE);
70 0 : PyModule_AddIntConstant(m, "DEF_GLOBAL", DEF_GLOBAL);
71 0 : PyModule_AddIntConstant(m, "DEF_LOCAL", DEF_LOCAL);
72 0 : PyModule_AddIntConstant(m, "DEF_PARAM", DEF_PARAM);
73 0 : PyModule_AddIntConstant(m, "DEF_FREE", DEF_FREE);
74 0 : PyModule_AddIntConstant(m, "DEF_FREE_CLASS", DEF_FREE_CLASS);
75 0 : PyModule_AddIntConstant(m, "DEF_IMPORT", DEF_IMPORT);
76 0 : PyModule_AddIntConstant(m, "DEF_BOUND", DEF_BOUND);
77 :
78 0 : PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock);
79 0 : PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock);
80 0 : PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock);
81 :
82 0 : PyModule_AddIntConstant(m, "OPT_IMPORT_STAR", OPT_IMPORT_STAR);
83 0 : PyModule_AddIntConstant(m, "OPT_TOPLEVEL", OPT_TOPLEVEL);
84 :
85 0 : PyModule_AddIntConstant(m, "LOCAL", LOCAL);
86 0 : PyModule_AddIntConstant(m, "GLOBAL_EXPLICIT", GLOBAL_EXPLICIT);
87 0 : PyModule_AddIntConstant(m, "GLOBAL_IMPLICIT", GLOBAL_IMPLICIT);
88 0 : PyModule_AddIntConstant(m, "FREE", FREE);
89 0 : PyModule_AddIntConstant(m, "CELL", CELL);
90 :
91 0 : PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET);
92 0 : PyModule_AddIntConstant(m, "SCOPE_MASK", SCOPE_MASK);
93 :
94 0 : if (PyErr_Occurred()) {
95 0 : Py_DECREF(m);
96 0 : m = 0;
97 : }
98 0 : return m;
99 : }
|