Hi,
Attached patch adds support for Python 3.3.
Some function names are changed because Unicode string representation
is changed in Python 3.3.
Additionally, initialization sequence is changed. According to the Python
document, PyImport_AppendInittab() should be called before Py_Initialize().
http://docs.python.org/py3k/c-api/import.html?highlight=pyimport_appendinittab#PyImport_AppendInittab
Without this change, "import vim" causes an error.
I checked this patch on Win32 + Python 3.3.
Best regards,
Ken Takata
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
# HG changeset patch
# Parent 6867414144771a0b2b65c8a04ad84e54cb8f79f3
diff --git a/src/if_python3.c b/src/if_python3.c
--- a/src/if_python3.c
+++ b/src/if_python3.c
@@ -174,7 +174,12 @@
# define _PyObject_NextNotImplemented (*py3__PyObject_NextNotImplemented)
# define PyModule_AddObject py3_PyModule_AddObject
# define PyImport_AppendInittab py3_PyImport_AppendInittab
-# define _PyUnicode_AsString py3__PyUnicode_AsString
+# if PY_VERSION_HEX >= 0x030300f0
+# undef _PyUnicode_AsString
+# define _PyUnicode_AsString py3_PyUnicode_AsUTF8String
+# else
+# define _PyUnicode_AsString py3__PyUnicode_AsString
+# endif
# undef PyUnicode_AsEncodedString
# define PyUnicode_AsEncodedString py3_PyUnicode_AsEncodedString
# undef PyBytes_AsString
@@ -281,7 +286,11 @@
static PyObject* py3__Py_TrueStruct;
static int (*py3_PyModule_AddObject)(PyObject *m, const char *name, PyObject *o);
static int (*py3_PyImport_AppendInittab)(const char *name, PyObject* (*initfunc)(void));
+#if PY_VERSION_HEX >= 0x030300f0
+static char* (*py3_PyUnicode_AsUTF8String)(PyObject *unicode);
+#else
static char* (*py3__PyUnicode_AsString)(PyObject *unicode);
+#endif
static PyObject* (*py3_PyUnicode_AsEncodedString)(PyObject *unicode, const char* encoding, const char* errors);
static char* (*py3_PyBytes_AsString)(PyObject *bytes);
static int (*py3_PyBytes_AsStringAndSize)(PyObject *bytes, char **buffer, int *length);
@@ -397,7 +406,11 @@
{"PyObject_Init", (PYTHON_PROC*)&py3__PyObject_Init},
{"PyModule_AddObject", (PYTHON_PROC*)&py3_PyModule_AddObject},
{"PyImport_AppendInittab", (PYTHON_PROC*)&py3_PyImport_AppendInittab},
+#if PY_VERSION_HEX >= 0x030300f0
+ {"PyUnicode_AsUTF8String", (PYTHON_PROC*)&py3_PyUnicode_AsUTF8String},
+#else
{"_PyUnicode_AsString", (PYTHON_PROC*)&py3__PyUnicode_AsString},
+#endif
{"PyBytes_AsString", (PYTHON_PROC*)&py3_PyBytes_AsString},
{"PyBytes_AsStringAndSize", (PYTHON_PROC*)&py3_PyBytes_AsStringAndSize},
{"PyBytes_FromString", (PYTHON_PROC*)&py3_PyBytes_FromString},
@@ -490,6 +503,12 @@
/* Load unicode functions separately as only the ucs2 or the ucs4 functions
* will be present in the library. */
+#if PY_VERSION_HEX >= 0x030300f0
+ ucs_from_string = symbol_from_dll(hinstPy3, "PyUnicode_FromString");
+ ucs_decode = symbol_from_dll(hinstPy3, "PyUnicode_Decode");
+ ucs_as_encoded_string = symbol_from_dll(hinstPy3,
+ "PyUnicode_AsEncodedString");
+#else
ucs_from_string = symbol_from_dll(hinstPy3, "PyUnicodeUCS2_FromString");
ucs_decode = symbol_from_dll(hinstPy3,
"PyUnicodeUCS2_Decode");
@@ -504,6 +523,7 @@
ucs_as_encoded_string = symbol_from_dll(hinstPy3,
"PyUnicodeUCS4_AsEncodedString");
}
+#endif
if (ucs_from_string && ucs_decode && ucs_as_encoded_string)
{
py3_PyUnicode_FromString = ucs_from_string;
@@ -704,6 +724,8 @@
Py_SetPythonHome(PYTHON3_HOME);
#endif
+ PyImport_AppendInittab("vim", Py3Init_vim);
+
#if !defined(MACOS) || defined(MACOS_X_UNIX)
Py_Initialize();
#else
@@ -719,8 +741,6 @@
if (PythonIO_Init())
goto fail;
- PyImport_AppendInittab("vim", Py3Init_vim);
-
globals = PyModule_GetDict(PyImport_AddModule("__main__"));
/* Remove the element from sys.path that was added because of our