summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorDino Viehland <dinoviehland@gmail.com>2019-05-28 23:21:17 (GMT)
committerGitHub <noreply@github.com>2019-05-28 23:21:17 (GMT)
commit415406999d7c09af9f3dcacfb4578b9e97b2ce77 (patch)
tree99aba9596d3532bb75913ac7c1c8dda8aebd9f91 /Modules
parentab0716ed1ea2957396054730afbb80c1825f9786 (diff)
downloadcpython-415406999d7c09af9f3dcacfb4578b9e97b2ce77.zip
cpython-415406999d7c09af9f3dcacfb4578b9e97b2ce77.tar.gz
cpython-415406999d7c09af9f3dcacfb4578b9e97b2ce77.tar.bz2
bpo-37001: Makes symtable.symtable have parity with compile for input (#13483)
* Makes symtable.symtable have parity for accepted datatypes for source code as compile() * Add NEWS blurb
Diffstat (limited to 'Modules')
-rw-r--r--Modules/clinic/symtablemodule.c.h24
-rw-r--r--Modules/symtablemodule.c23
2 files changed, 24 insertions, 23 deletions
diff --git a/Modules/clinic/symtablemodule.c.h b/Modules/clinic/symtablemodule.c.h
index 73e340b..7d8b0ad 100644
--- a/Modules/clinic/symtablemodule.c.h
+++ b/Modules/clinic/symtablemodule.c.h
@@ -3,7 +3,7 @@ preserve
[clinic start generated code]*/
PyDoc_STRVAR(_symtable_symtable__doc__,
-"symtable($module, str, filename, startstr, /)\n"
+"symtable($module, source, filename, startstr, /)\n"
"--\n"
"\n"
"Return symbol and scope dictionaries used internally by compiler.");
@@ -12,33 +12,21 @@ PyDoc_STRVAR(_symtable_symtable__doc__,
{"symtable", (PyCFunction)(void(*)(void))_symtable_symtable, METH_FASTCALL, _symtable_symtable__doc__},
static PyObject *
-_symtable_symtable_impl(PyObject *module, const char *str,
+_symtable_symtable_impl(PyObject *module, PyObject *source,
PyObject *filename, const char *startstr);
static PyObject *
_symtable_symtable(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
- const char *str;
+ PyObject *source;
PyObject *filename;
const char *startstr;
if (!_PyArg_CheckPositional("symtable", nargs, 3, 3)) {
goto exit;
}
- if (!PyUnicode_Check(args[0])) {
- _PyArg_BadArgument("symtable", 1, "str", args[0]);
- goto exit;
- }
- Py_ssize_t str_length;
- str = PyUnicode_AsUTF8AndSize(args[0], &str_length);
- if (str == NULL) {
- goto exit;
- }
- if (strlen(str) != (size_t)str_length) {
- PyErr_SetString(PyExc_ValueError, "embedded null character");
- goto exit;
- }
+ source = args[0];
if (!PyUnicode_FSDecoder(args[1], &filename)) {
goto exit;
}
@@ -55,9 +43,9 @@ _symtable_symtable(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
PyErr_SetString(PyExc_ValueError, "embedded null character");
goto exit;
}
- return_value = _symtable_symtable_impl(module, str, filename, startstr);
+ return_value = _symtable_symtable_impl(module, source, filename, startstr);
exit:
return return_value;
}
-/*[clinic end generated code: output=be1cca59de019984 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=de655625eee705f4 input=a9049054013a1b77]*/
diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c
index e8d2f5b..d66cb44 100644
--- a/Modules/symtablemodule.c
+++ b/Modules/symtablemodule.c
@@ -14,7 +14,7 @@ module _symtable
/*[clinic input]
_symtable.symtable
- str: str
+ source: object
filename: object(converter='PyUnicode_FSDecoder')
startstr: str
/
@@ -23,13 +23,23 @@ Return symbol and scope dictionaries used internally by compiler.
[clinic start generated code]*/
static PyObject *
-_symtable_symtable_impl(PyObject *module, const char *str,
+_symtable_symtable_impl(PyObject *module, PyObject *source,
PyObject *filename, const char *startstr)
-/*[clinic end generated code: output=914b369c9b785956 input=6c615e84d5f408e3]*/
+/*[clinic end generated code: output=59eb0d5fc7285ac4 input=9dd8a50c0c36a4d7]*/
{
struct symtable *st;
PyObject *t;
int start;
+ PyCompilerFlags cf;
+ PyObject *source_copy = NULL;
+
+ cf.cf_flags = PyCF_SOURCE_IS_UTF8;
+ cf.cf_feature_version = PY_MINOR_VERSION;
+
+ const char *str = _Py_SourceAsString(source, "symtable", "string or bytes", &cf, &source_copy);
+ if (str == NULL) {
+ return NULL;
+ }
if (strcmp(startstr, "exec") == 0)
start = Py_file_input;
@@ -41,12 +51,15 @@ _symtable_symtable_impl(PyObject *module, const char *str,
PyErr_SetString(PyExc_ValueError,
"symtable() arg 3 must be 'exec' or 'eval' or 'single'");
Py_DECREF(filename);
+ Py_XDECREF(source_copy);
return NULL;
}
- st = Py_SymtableStringObject(str, filename, start);
+ st = _Py_SymtableStringObjectFlags(str, filename, start, &cf);
Py_DECREF(filename);
- if (st == NULL)
+ Py_XDECREF(source_copy);
+ if (st == NULL) {
return NULL;
+ }
t = (PyObject *)st->st_top;
Py_INCREF(t);
PyMem_Free((void *)st->st_future);