From 5e7cb240afa0d28f19c92ea84a85113cc6eba5bb Mon Sep 17 00:00:00 2001 From: Jeremy Hylton Date: Fri, 2 Feb 2001 18:24:26 +0000 Subject: Add minimal interface to symtable: _symtable module. --- Lib/test/output/test_symtable | 1 + Lib/test/test_symtable.py | 8 +++++ Modules/symtablemodule.c | 72 +++++++++++++++++++++++++++++++++++++++++++ setup.py | 1 + 4 files changed, 82 insertions(+) create mode 100644 Lib/test/output/test_symtable create mode 100644 Lib/test/test_symtable.py create mode 100644 Modules/symtablemodule.c diff --git a/Lib/test/output/test_symtable b/Lib/test/output/test_symtable new file mode 100644 index 0000000..24b9cda --- /dev/null +++ b/Lib/test/output/test_symtable @@ -0,0 +1 @@ +test_symtable diff --git a/Lib/test/test_symtable.py b/Lib/test/test_symtable.py new file mode 100644 index 0000000..c521439 --- /dev/null +++ b/Lib/test/test_symtable.py @@ -0,0 +1,8 @@ +from test_support import verify + +import _symtable + +symbols, scopes = _symtable.symtable("def f(x): return x", "?", "exec") + +verify(symbols.has_key(0)) +verify(scopes.has_key(0)) diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c new file mode 100644 index 0000000..ccf4aba --- /dev/null +++ b/Modules/symtablemodule.c @@ -0,0 +1,72 @@ +#include "Python.h" + +#include "compile.h" +#include "symtable.h" + +static PyObject * +symtable_symtable(PyObject *self, PyObject *args) +{ + struct symtable *st; + PyObject *t; + + char *str; + char *filename; + char *startstr; + int start; + + if (!PyArg_ParseTuple(args, "sss:symtable", &str, &filename, + &startstr)) + return NULL; + if (strcmp(startstr, "exec") == 0) + start = Py_file_input; + else if (strcmp(startstr, "eval") == 0) + start = Py_eval_input; + else if (strcmp(startstr, "single") == 0) + start = Py_single_input; + else { + PyErr_SetString(PyExc_ValueError, + "symtable() arg 3 must be 'exec' or 'eval' or 'single'"); + return NULL; + } + st = Py_SymtableString(str, filename, start); + if (st == NULL) + return NULL; + t = Py_BuildValue("OO", st->st_symbols, st->st_scopes); + PySymtable_Free(st); + return t; +} + +static PyMethodDef symtable_methods[] = { + {"symtable", symtable_symtable, METH_VARARGS, + "Return symbol and scope dictionaries used internally by compiler."}, + {NULL, NULL} /* sentinel */ +}; + +DL_EXPORT(void) +init_symtable(void) +{ + PyObject *m; + + m = Py_InitModule("_symtable", symtable_methods); + PyModule_AddIntConstant(m, "USE", USE); + PyModule_AddIntConstant(m, "DEF_GLOBAL", DEF_GLOBAL); + PyModule_AddIntConstant(m, "DEF_LOCAL", DEF_LOCAL); + PyModule_AddIntConstant(m, "DEF_PARAM", DEF_PARAM); + PyModule_AddIntConstant(m, "DEF_STAR", DEF_STAR); + PyModule_AddIntConstant(m, "DEF_DOUBLESTAR", DEF_DOUBLESTAR); + PyModule_AddIntConstant(m, "DEF_INTUPLE", DEF_INTUPLE); + PyModule_AddIntConstant(m, "DEF_FREE", DEF_FREE); + PyModule_AddIntConstant(m, "DEF_FREE_GLOBAL", DEF_FREE_GLOBAL); + PyModule_AddIntConstant(m, "DEF_FREE_CLASS", DEF_FREE_CLASS); + PyModule_AddIntConstant(m, "DEF_IMPORT", DEF_IMPORT); + + PyModule_AddIntConstant(m, "TYPE_FUNCTION", TYPE_FUNCTION); + PyModule_AddIntConstant(m, "TYPE_CLASS", TYPE_CLASS); + PyModule_AddIntConstant(m, "TYPE_MODULE", TYPE_MODULE); + + PyModule_AddIntConstant(m, "LOCAL", LOCAL); + PyModule_AddIntConstant(m, "GLOBAL_EXPLICIT", GLOBAL_EXPLICIT); + PyModule_AddIntConstant(m, "GLOBAL_IMPLICIT", GLOBAL_IMPLICIT); + PyModule_AddIntConstant(m, "FREE", FREE); + PyModule_AddIntConstant(m, "CELL", CELL); +} diff --git a/setup.py b/setup.py index 1c1ec13..bd74ab4 100644 --- a/setup.py +++ b/setup.py @@ -154,6 +154,7 @@ class PyBuildExt(build_ext): exts.append( Extension('pcre', ['pcremodule.c', 'pypcre.c']) ) exts.append( Extension('_weakref', ['_weakref.c']) ) + exts.append( Extension('_symtable', ['symtablemodule.c']) ) exts.append( Extension('xreadlines', ['xreadlinesmodule.c']) ) # array objects -- cgit v0.12