Is it right place for posting patches?

diff -r adbef02d669f Cython/Compiler/Builtin.py
--- a/Cython/Compiler/Builtin.py        Sat Aug 08 20:58:14 2009 +0200
+++ b/Cython/Compiler/Builtin.py        Tue Aug 18 18:19:08 2009 +0800
@@ -182,27 +182,34 @@
         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 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 (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 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);
+    }

     Py_XDECREF(s);
     return result;

-- 
Andrey Plotnikov
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to