diff options
author | Just van Rossum <just@letterror.com> | 2003-02-10 08:21:10 (GMT) |
---|---|---|
committer | Just van Rossum <just@letterror.com> | 2003-02-10 08:21:10 (GMT) |
commit | 3aaf42c6139ed211a59b200130d1d205982b9818 (patch) | |
tree | f8bd6b0fd7101701a3eb8f5bc783cea962e59725 /Python/bltinmodule.c | |
parent | 4adc9abc32a26f5ce5e2dada33d019f31170b5be (diff) | |
download | cpython-3aaf42c6139ed211a59b200130d1d205982b9818.zip cpython-3aaf42c6139ed211a59b200130d1d205982b9818.tar.gz cpython-3aaf42c6139ed211a59b200130d1d205982b9818.tar.bz2 |
patch #683515: "Add unicode support to compile(), eval() and exec"
Incorporated nnorwitz's comment re. Py__USING_UNICODE.
Diffstat (limited to 'Python/bltinmodule.c')
-rw-r--r-- | Python/bltinmodule.c | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index b74e09c..9b1bf55 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -340,11 +340,32 @@ builtin_compile(PyObject *self, PyObject *args) int dont_inherit = 0; int supplied_flags = 0; PyCompilerFlags cf; + PyObject *result, *cmd, *tmp = NULL; - if (!PyArg_ParseTuple(args, "sss|ii:compile", &str, &filename, + if (!PyArg_ParseTuple(args, "Oss|ii:compile", &cmd, &filename, &startstr, &supplied_flags, &dont_inherit)) return NULL; + cf.cf_flags = supplied_flags; + +#ifdef Py_USING_UNICODE + if (PyUnicode_Check(cmd)) { + tmp = PyUnicode_AsUTF8String(cmd); + if (tmp == NULL) + return NULL; + cmd = tmp; + cf.cf_flags |= PyCF_SOURCE_IS_UTF8; + } +#endif + if (!PyString_Check(cmd)) { + PyErr_SetString(PyExc_TypeError, + "compile() arg 1 must be a string"); + return NULL; + } + + if (PyString_AsStringAndSize(cmd, &str, NULL)) + return NULL; + if (strcmp(startstr, "exec") == 0) start = Py_file_input; else if (strcmp(startstr, "eval") == 0) @@ -364,11 +385,12 @@ builtin_compile(PyObject *self, PyObject *args) } /* XXX Warn if (supplied_flags & PyCF_MASK_OBSOLETE) != 0? */ - cf.cf_flags = supplied_flags; if (!dont_inherit) { PyEval_MergeCompilerFlags(&cf); } - return Py_CompileStringFlags(str, filename, start, &cf); + result = Py_CompileStringFlags(str, filename, start, &cf); + Py_XDECREF(tmp); + return result; } PyDoc_STRVAR(compile_doc, @@ -428,7 +450,7 @@ Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x."); static PyObject * builtin_eval(PyObject *self, PyObject *args) { - PyObject *cmd; + PyObject *cmd, *result, *tmp = NULL; PyObject *globals = Py_None, *locals = Py_None; char *str; PyCompilerFlags cf; @@ -467,14 +489,26 @@ builtin_eval(PyObject *self, PyObject *args) "eval() arg 1 must be a string or code object"); return NULL; } + cf.cf_flags = 0; + +#ifdef Py_USING_UNICODE + if (PyUnicode_Check(cmd)) { + tmp = PyUnicode_AsUTF8String(cmd); + if (tmp == NULL) + return NULL; + cmd = tmp; + cf.cf_flags |= PyCF_SOURCE_IS_UTF8; + } +#endif if (PyString_AsStringAndSize(cmd, &str, NULL)) return NULL; while (*str == ' ' || *str == '\t') str++; - cf.cf_flags = 0; (void)PyEval_MergeCompilerFlags(&cf); - return PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf); + result = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf); + Py_XDECREF(tmp); + return result; } PyDoc_STRVAR(eval_doc, |