globals = locals;
}
- if (PyUnicode_Check(o)) {
- s = PyUnicode_AsUTF8String(o);
- if (!s) goto bad;
- o = s;
- #if PY_MAJOR_VERSION >= 3
- } else if (!PyBytes_Check(o)) {
- #else
- } else if (!PyString_Check(o)) {
- #endif
- /* FIXME: support file objects and code objects */
- PyErr_SetString(PyExc_TypeError,
- "exec currently requires a string as code input.");
- goto bad;
+ if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
+ PyDict_SetItemString(globals, "__builtins__", PyEval_GetBuiltins());
+ }
+
+ if (PyCode_Check(o)) {
+ result = PyEval_EvalCode((PyCodeObject *)o, globals, locals);
+ }
+ else {
+ if (PyUnicode_Check(o)) {
+ s = PyUnicode_AsUTF8String(o);
+ if (!s) goto bad;
+ o = s;
+ #if PY_MAJOR_VERSION >= 3
+ } else if (!PyBytes_Check(o)) {
+ #else
+ } else if (!PyString_Check(o)) {
+ #endif
+ PyErr_SetString(PyExc_TypeError,
+ "exec: arg 1 must be string, bytes or code object");
+ goto bad;
+ }
+ #if PY_MAJOR_VERSION >= 3
+ code = PyBytes_AS_STRING(o);
+ #else
+ code = PyString_AS_STRING(o);
+ #endif
+ result = PyRun_String(code, Py_file_input, globals, locals);
}
-
- #if PY_MAJOR_VERSION >= 3
- code = PyBytes_AS_STRING(o);
- #else
- code = PyString_AS_STRING(o);
- #endif
- result = PyRun_String(code, Py_file_input, globals, locals);
Py_XDECREF(s);
return result;