diff --git a/src/if_python.c b/src/if_python.c
index 9f9c257..7b22070 100644
--- a/src/if_python.c
+++ b/src/if_python.c
@@ -21,16 +21,15 @@
 
 #include <limits.h>
 
-/* uncomment this if used with the debug version of python.
- * Checked on 2.7.4. */
-/* #define Py_DEBUG */
-/* Note: most of time you can add -DPy_DEBUG to CFLAGS in place of uncommenting
- */
-/* uncomment this if used with the debug version of python, but without its
- * allocator */
-/* #define Py_DEBUG_NO_PYMALLOC */
+// uncomment this if used with the debug version of python.
+// Checked on 2.7.4.
+// #define Py_DEBUG
+// Note: most of time you can add -DPy_DEBUG to CFLAGS in place of uncommenting
+// uncomment this if used with the debug version of python, but without its
+// allocator
+// #define Py_DEBUG_NO_PYMALLOC
 
-/* Python.h defines _POSIX_THREADS itself (if needed) */
+// Python.h defines _POSIX_THREADS itself (if needed)
 #ifdef _POSIX_THREADS
 # undef _POSIX_THREADS
 #endif
@@ -53,13 +52,13 @@
 # undef HAVE_PUTENV
 #endif
 #ifdef HAVE_STDARG_H
-# undef HAVE_STDARG_H	/* Python's config.h defines it as well. */
+# undef HAVE_STDARG_H	// Python's config.h defines it as well.
 #endif
 #ifdef _POSIX_C_SOURCE
-# undef _POSIX_C_SOURCE	/* pyconfig.h defines it as well. */
+# undef _POSIX_C_SOURCE	// pyconfig.h defines it as well.
 #endif
 #ifdef _XOPEN_SOURCE
-# undef _XOPEN_SOURCE	/* pyconfig.h defines it as well. */
+# undef _XOPEN_SOURCE	// pyconfig.h defines it as well.
 #endif
 
 #define PY_SSIZE_T_CLEAN
@@ -70,8 +69,8 @@
 # undef PY_SSIZE_T_CLEAN
 #endif
 
-#undef main /* Defined in python.h - aargh */
-#undef HAVE_FCNTL_H /* Clash with os_win32.h */
+#undef main // Defined in python.h - aargh
+#undef HAVE_FCNTL_H // Clash with os_win32.h
 
 // Perhaps leave this out for Python 2.6, which supports bytes?
 #define PyBytes_FromString      PyString_FromString
@@ -80,7 +79,7 @@
 #define PyBytes_FromStringAndSize   PyString_FromStringAndSize
 
 #if !defined(FEAT_PYTHON) && defined(PROTO)
-/* Use this to be able to generate prototypes without python being used. */
+// Use this to be able to generate prototypes without python being used.
 # define PyObject Py_ssize_t
 # define PyThreadState Py_ssize_t
 # define PyTypeObject Py_ssize_t
@@ -112,19 +111,19 @@
 #endif
 #define Py_bytes_fmt "s"
 
-/* Parser flags */
+// Parser flags
 #define single_input	256
 #define file_input	257
 #define eval_input	258
 
 #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x020300F0
-  /* Python 2.3: can invoke ":python" recursively. */
+  // Python 2.3: can invoke ":python" recursively.
 # define PY_CAN_RECURSE
 #endif
 
 #if defined(DYNAMIC_PYTHON) || defined(PROTO)
 # ifndef DYNAMIC_PYTHON
-#  define HINSTANCE long_u		/* for generating prototypes */
+#  define HINSTANCE long_u		// for generating prototypes
 # endif
 
 # ifndef MSWIN
@@ -144,8 +143,8 @@
 #  define symbol_from_dll GetProcAddress
 # endif
 
-/* This makes if_python.c compile without warnings against Python 2.5
- * on Win32 and Win64. */
+// This makes if_python.c compile without warnings against Python 2.5
+// on Win32 and Win64.
 # undef PyRun_SimpleString
 # undef PyRun_String
 # undef PyArg_Parse
@@ -456,9 +455,9 @@
 static int* dll_Py_NoSiteFlag;
 # endif
 
-static HINSTANCE hinstPython = 0; /* Instance of python.dll */
+static HINSTANCE hinstPython = 0; // Instance of python.dll
 
-/* Imported exception objects */
+// Imported exception objects
 static PyObject *imp_PyExc_AttributeError;
 static PyObject *imp_PyExc_IndexError;
 static PyObject *imp_PyExc_KeyError;
@@ -681,9 +680,9 @@
 				   (PYTHON_PROC*)&py_PyUnicode_AsEncodedString;
 
 # if !(defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)) && defined(UNIX) && defined(FEAT_PYTHON3)
-    /* Can't have Python and Python3 loaded at the same time.
-     * It cause a crash, because RTLD_GLOBAL is needed for
-     * standard C extension libraries of one or both python versions. */
+    // Can't have Python and Python3 loaded at the same time.
+    // It cause a crash, because RTLD_GLOBAL is needed for
+    // standard C extension libraries of one or both python versions.
     if (python3_loaded())
     {
 	if (verbose)
@@ -715,8 +714,8 @@
 	}
     }
 
-    /* Load unicode functions separately as only the ucs2 or the ucs4 functions
-     * will be present in the library. */
+    // Load unicode functions separately as only the ucs2 or the ucs4 functions
+    // will be present in the library.
     *ucs_as_encoded_string = symbol_from_dll(hinstPython,
 					     "PyUnicodeUCS2_AsEncodedString");
     if (*ucs_as_encoded_string == NULL)
@@ -775,7 +774,7 @@
     Py_XINCREF(imp_PyExc_OverflowError);
     Py_XDECREF(exmod);
 }
-#endif /* DYNAMIC_PYTHON */
+#endif // DYNAMIC_PYTHON
 
 static int initialised = 0;
 #define PYINITIALISED initialised
@@ -830,18 +829,16 @@
 #include "if_py_both.h"
 
 
-/******************************************************
- * Internal function prototypes.
- */
+///////////////////////////////////////////////////////
+// Internal function prototypes.
 
 static int PythonMod_Init(void);
 
 
-/******************************************************
- * 1. Python interpreter main program.
- */
+///////////////////////////////////////////////////////
+// 1. Python interpreter main program.
 
-#if PYTHON_API_VERSION < 1007 /* Python 1.4 */
+#if PYTHON_API_VERSION < 1007 // Python 1.4
 typedef PyObject PyThreadState;
 #endif
 
@@ -875,7 +872,7 @@
 {
     static int recurse = 0;
 
-    /* If a crash occurs while doing this, don't try again. */
+    // If a crash occurs while doing this, don't try again.
     if (recurse != 0)
 	return;
 
@@ -888,7 +885,7 @@
 # ifdef PY_CAN_RECURSE
 	PyGILState_Ensure();
 # else
-	Python_RestoreThread();	    /* enter python */
+	Python_RestoreThread();	    // enter python
 # endif
 	Py_Finalize();
     }
@@ -899,7 +896,7 @@
 # ifdef PY_CAN_RECURSE
 	PyGILState_Ensure();
 # else
-	Python_RestoreThread();	    /* enter python */
+	Python_RestoreThread();	    // enter python
 # endif
 	Py_Finalize();
     }
@@ -937,7 +934,7 @@
 
 	if (*p_pyhome != NUL)
 	{
-	    /* The string must not change later, make a copy in static memory. */
+	    // The string must not change later, make a copy in static memory.
 	    py_home_buf = (char *)vim_strsave(p_pyhome);
 	    if (py_home_buf != NULL)
 		Py_SetPythonHome(py_home_buf);
@@ -950,15 +947,15 @@
 	init_structs();
 
 #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000
-	/* Disable implicit 'import site', because it may cause Vim to exit
-	 * when it can't be found. */
+	// Disable implicit 'import site', because it may cause Vim to exit
+	// when it can't be found.
 	Py_NoSiteFlag++;
 #endif
 
 	Py_Initialize();
 
 #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000
-	/* 'import site' explicitly. */
+	// 'import site' explicitly.
 	site = PyImport_ImportModule("site");
 	if (site == NULL)
 	{
@@ -968,10 +965,10 @@
 	Py_DECREF(site);
 #endif
 
-	/* Initialise threads, and below save the state using
-	 * PyEval_SaveThread.  Without the call to PyEval_SaveThread, thread
-	 * specific state (such as the system trace hook), will be lost
-	 * between invocations of Python code. */
+	// Initialise threads, and below save the state using
+	// PyEval_SaveThread.  Without the call to PyEval_SaveThread, thread
+	// specific state (such as the system trace hook), will be lost
+	// between invocations of Python code.
 	PyEval_InitThreads();
 #ifdef DYNAMIC_PYTHON
 	get_exceptions();
@@ -985,19 +982,18 @@
 
 	globals = PyModule_GetDict(PyImport_AddModule("__main__"));
 
-	/* Remove the element from sys.path that was added because of our
-	 * argv[0] value in PythonMod_Init().  Previously we used an empty
-	 * string, but depending on the OS we then get an empty entry or
-	 * the current directory in sys.path. */
+	// Remove the element from sys.path that was added because of our
+	// argv[0] value in PythonMod_Init().  Previously we used an empty
+	// string, but depending on the OS we then get an empty entry or
+	// the current directory in sys.path.
 	PyRun_SimpleString("import sys; sys.path = filter(lambda x: x != '/must>not&exist', sys.path)");
 
-	/* lock is created and acquired in PyEval_InitThreads() and thread
-	 * state is created in Py_Initialize()
-	 * there _PyGILState_NoteThreadState() also sets gilcounter to 1
-	 * (python must have threads enabled!)
-	 * so the following does both: unlock GIL and save thread state in TLS
-	 * without deleting thread state
-	 */
+	// lock is created and acquired in PyEval_InitThreads() and thread
+	// state is created in Py_Initialize()
+	// there _PyGILState_NoteThreadState() also sets gilcounter to 1
+	// (python must have threads enabled!)
+	// so the following does both: unlock GIL and save thread state in TLS
+	// without deleting thread state
 #ifndef PY_CAN_RECURSE
 	saved_python_thread =
 #endif
@@ -1009,11 +1005,10 @@
     return 0;
 
 fail:
-    /* We call PythonIO_Flush() here to print any Python errors.
-     * This is OK, as it is possible to call this function even
-     * if PythonIO_Init_io() has not completed successfully (it will
-     * not do anything in this case).
-     */
+    // We call PythonIO_Flush() here to print any Python errors.
+    // This is OK, as it is possible to call this function even
+    // if PythonIO_Init_io() has not completed successfully (it will
+    // not do anything in this case).
     PythonIO_Flush();
     return -1;
 }
@@ -1050,16 +1045,16 @@
 
     init_range(arg);
 
-    Python_Release_Vim();	    /* leave vim */
+    Python_Release_Vim();	    // leave Vim
 
 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
-    /* Python only works properly when the LC_NUMERIC locale is "C". */
+    // Python only works properly when the LC_NUMERIC locale is "C".
     saved_locale = setlocale(LC_NUMERIC, NULL);
     if (saved_locale == NULL || STRCMP(saved_locale, "C") == 0)
 	saved_locale = NULL;
     else
     {
-	/* Need to make a copy, value may change when setting new locale. */
+	// Need to make a copy, value may change when setting new locale.
 	saved_locale = (char *) PY_STRSAVE(saved_locale);
 	(void)setlocale(LC_NUMERIC, "C");
     }
@@ -1068,7 +1063,7 @@
 #ifdef PY_CAN_RECURSE
     pygilstate = PyGILState_Ensure();
 #else
-    Python_RestoreThread();	    /* enter python */
+    Python_RestoreThread();	    // enter python
 #endif
 
     run((char *) cmd, arg
@@ -1080,7 +1075,7 @@
 #ifdef PY_CAN_RECURSE
     PyGILState_Release(pygilstate);
 #else
-    Python_SaveThread();	    /* leave python */
+    Python_SaveThread();	    // leave python
 #endif
 
 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
@@ -1091,7 +1086,7 @@
     }
 #endif
 
-    Python_Lock_Vim();		    /* enter vim */
+    Python_Lock_Vim();		    // enter vim
     PythonIO_Flush();
 
 theend:
@@ -1138,17 +1133,16 @@
     if (p_pyx == 0)
 	p_pyx = 2;
 
-    /* Have to do it like this. PyRun_SimpleFile requires you to pass a
-     * stdio file pointer, but Vim and the Python DLL are compiled with
-     * different options under Windows, meaning that stdio pointers aren't
-     * compatible between the two. Yuk.
-     *
-     * Put the string "execfile('file')" into buffer. But, we need to
-     * escape any backslashes or single quotes in the file name, so that
-     * Python won't mangle the file name.
-     */
+    // Have to do it like this. PyRun_SimpleFile requires you to pass a
+    // stdio file pointer, but Vim and the Python DLL are compiled with
+    // different options under Windows, meaning that stdio pointers aren't
+    // compatible between the two. Yuk.
+    //
+    // Put the string "execfile('file')" into buffer. But, we need to
+    // escape any backslashes or single quotes in the file name, so that
+    // Python won't mangle the file name.
     strcpy(buffer, "execfile('");
-    p = buffer + 10; /* size of "execfile('" */
+    p = buffer + 10; // size of "execfile('"
 
     while (*file && p < buffer + (BUFFER_SIZE - 3))
     {
@@ -1157,16 +1151,16 @@
 	*p++ = *file++;
     }
 
-    /* If we didn't finish the file name, we hit a buffer overflow */
+    // If we didn't finish the file name, we hit a buffer overflow
     if (*file != '\0')
 	return;
 
-    /* Put in the terminating "')" and a null */
+    // Put in the terminating "')" and a null
     *p++ = '\'';
     *p++ = ')';
     *p++ = '\0';
 
-    /* Execute the file */
+    // Execute the file
     DoPyCommand(buffer,
 	    (rangeinitializer) init_range_cmd,
 	    (runner) run_cmd,
@@ -1185,12 +1179,10 @@
 	    (void *)eap);
 }
 
-/******************************************************
- * 2. Python output stream: writes output via [e]msg().
- */
+///////////////////////////////////////////////////////
+// 2. Python output stream: writes output via [e]msg().
 
-/* Implementation functions
- */
+// Implementation functions
 
     static PyObject *
 OutputGetattr(PyObject *self, char *name)
@@ -1206,53 +1198,47 @@
     return Py_FindMethod(OutputMethods, self, name);
 }
 
-/******************************************************
- * 3. Implementation of the Vim module for Python
- */
+///////////////////////////////////////////////////////
+// 3. Implementation of the Vim module for Python
 
-/* Window type - Implementation functions
- * --------------------------------------
- */
+// Window type - Implementation functions
+// --------------------------------------
 
 #define WindowType_Check(obj) ((obj)->ob_type == &WindowType)
 
-/* Buffer type - Implementation functions
- * --------------------------------------
- */
+// Buffer type - Implementation functions
+// --------------------------------------
 
 #define BufferType_Check(obj) ((obj)->ob_type == &BufferType)
 
 static PyInt BufferAssItem(PyObject *, PyInt, PyObject *);
 static PyInt BufferAssSlice(PyObject *, PyInt, PyInt, PyObject *);
 
-/* Line range type - Implementation functions
- * --------------------------------------
- */
+// Line range type - Implementation functions
+// --------------------------------------
 
 #define RangeType_Check(obj) ((obj)->ob_type == &RangeType)
 
 static PyInt RangeAssItem(PyObject *, PyInt, PyObject *);
 static PyInt RangeAssSlice(PyObject *, PyInt, PyInt, PyObject *);
 
-/* Current objects type - Implementation functions
- * -----------------------------------------------
- */
+// Current objects type - Implementation functions
+// -----------------------------------------------
 
 static PySequenceMethods BufferAsSeq = {
-    (PyInquiry)		BufferLength,	    /* sq_length,    len(x)   */
-    (binaryfunc)	0,		    /* BufferConcat, sq_concat, x+y */
-    (PyIntArgFunc)	0,		    /* BufferRepeat, sq_repeat, x*n */
-    (PyIntArgFunc)	BufferItem,	    /* sq_item,      x[i]     */
-    (PyIntIntArgFunc)	BufferSlice,	    /* sq_slice,     x[i:j]   */
-    (PyIntObjArgProc)	BufferAssItem,	    /* sq_ass_item,  x[i]=v   */
-    (PyIntIntObjArgProc) BufferAssSlice,    /* sq_ass_slice, x[i:j]=v */
+    (PyInquiry)		BufferLength,	    // sq_length,    len(x)
+    (binaryfunc)	0,		    // BufferConcat, sq_concat, x+y
+    (PyIntArgFunc)	0,		    // BufferRepeat, sq_repeat, x*n
+    (PyIntArgFunc)	BufferItem,	    // sq_item,      x[i]
+    (PyIntIntArgFunc)	BufferSlice,	    // sq_slice,     x[i:j]
+    (PyIntObjArgProc)	BufferAssItem,	    // sq_ass_item,  x[i]=v
+    (PyIntIntObjArgProc) BufferAssSlice,    // sq_ass_slice, x[i:j]=v
     (objobjproc)	0,
     (binaryfunc)	0,
     0,
 };
 
-/* Buffer object - Implementation
- */
+// Buffer object - Implementation
 
     static PyObject *
 BufferGetattr(PyObject *self, char *name)
@@ -1272,7 +1258,7 @@
 	return Py_FindMethod(BufferMethods, self, name);
 }
 
-/******************/
+//////////////////
 
     static PyInt
 BufferAssItem(PyObject *self, PyInt n, PyObject *val)
@@ -1287,13 +1273,13 @@
 }
 
 static PySequenceMethods RangeAsSeq = {
-    (PyInquiry)		RangeLength,	      /* sq_length,    len(x)   */
-    (binaryfunc)	0, /* RangeConcat, */ /* sq_concat,    x+y      */
-    (PyIntArgFunc)	0, /* RangeRepeat, */ /* sq_repeat,    x*n      */
-    (PyIntArgFunc)	RangeItem,	      /* sq_item,      x[i]     */
-    (PyIntIntArgFunc)	RangeSlice,	      /* sq_slice,     x[i:j]   */
-    (PyIntObjArgProc)	RangeAssItem,	      /* sq_ass_item,  x[i]=v   */
-    (PyIntIntObjArgProc) RangeAssSlice,	      /* sq_ass_slice, x[i:j]=v */
+    (PyInquiry)		RangeLength,	      // sq_length,    len(x)
+    (binaryfunc)	0, /* RangeConcat, */ // sq_concat,    x+y
+    (PyIntArgFunc)	0, /* RangeRepeat, */ // sq_repeat,    x*n
+    (PyIntArgFunc)	RangeItem,	      // sq_item,      x[i]
+    (PyIntIntArgFunc)	RangeSlice,	      // sq_slice,     x[i:j]
+    (PyIntObjArgProc)	RangeAssItem,	      // sq_ass_item,  x[i]=v
+    (PyIntIntObjArgProc) RangeAssSlice,	      // sq_ass_slice, x[i:j]=v
     (objobjproc)	0,
 #if PY_MAJOR_VERSION >= 2
     (binaryfunc)	0,
@@ -1301,8 +1287,7 @@
 #endif
 };
 
-/* Line range object - Implementation
- */
+// Line range object - Implementation
 
     static PyObject *
 RangeGetattr(PyObject *self, char *name)
@@ -1317,7 +1302,7 @@
 	return Py_FindMethod(RangeMethods, self, name);
 }
 
-/****************/
+////////////////
 
     static PyInt
 RangeAssItem(PyObject *self, PyInt n, PyObject *val)
@@ -1337,8 +1322,7 @@
 		      &((RangeObject *)(self))->end);
 }
 
-/* TabPage object - Implementation
- */
+// TabPage object - Implementation
 
     static PyObject *
 TabPageGetattr(PyObject *self, char *name)
@@ -1358,8 +1342,7 @@
 	return Py_FindMethod(TabPageMethods, self, name);
 }
 
-/* Window object - Implementation
- */
+// Window object - Implementation
 
     static PyObject *
 WindowGetattr(PyObject *self, char *name)
@@ -1379,17 +1362,16 @@
 	return Py_FindMethod(WindowMethods, self, name);
 }
 
-/* Tab page list object - Definitions
- */
+// Tab page list object - Definitions
 
 static PySequenceMethods TabListAsSeq = {
-    (PyInquiry)		TabListLength,	    /* sq_length,    len(x)   */
-    (binaryfunc)	0,		    /* sq_concat,    x+y      */
-    (PyIntArgFunc)	0,		    /* sq_repeat,    x*n      */
-    (PyIntArgFunc)	TabListItem,	    /* sq_item,      x[i]     */
-    (PyIntIntArgFunc)	0,		    /* sq_slice,     x[i:j]   */
-    (PyIntObjArgProc)	0,		    /* sq_ass_item,  x[i]=v   */
-    (PyIntIntObjArgProc) 0,		    /* sq_ass_slice, x[i:j]=v */
+    (PyInquiry)		TabListLength,	    // sq_length,    len(x)
+    (binaryfunc)	0,		    // sq_concat,    x+y
+    (PyIntArgFunc)	0,		    // sq_repeat,    x*n
+    (PyIntArgFunc)	TabListItem,	    // sq_item,      x[i]
+    (PyIntIntArgFunc)	0,		    // sq_slice,     x[i:j]
+    (PyIntObjArgProc)	0,		    // sq_ass_item,  x[i]=v
+    (PyIntIntObjArgProc) 0,		    // sq_ass_slice, x[i:j]=v
     (objobjproc)	0,
 #if PY_MAJOR_VERSION >= 2
     (binaryfunc)	0,
@@ -1397,17 +1379,16 @@
 #endif
 };
 
-/* Window list object - Definitions
- */
+// Window list object - Definitions
 
 static PySequenceMethods WinListAsSeq = {
-    (PyInquiry)		WinListLength,	    /* sq_length,    len(x)   */
-    (binaryfunc)	0,		    /* sq_concat,    x+y      */
-    (PyIntArgFunc)	0,		    /* sq_repeat,    x*n      */
-    (PyIntArgFunc)	WinListItem,	    /* sq_item,      x[i]     */
-    (PyIntIntArgFunc)	0,		    /* sq_slice,     x[i:j]   */
-    (PyIntObjArgProc)	0,		    /* sq_ass_item,  x[i]=v   */
-    (PyIntIntObjArgProc) 0,		    /* sq_ass_slice, x[i:j]=v */
+    (PyInquiry)		WinListLength,	    // sq_length,    len(x)
+    (binaryfunc)	0,		    // sq_concat,    x+y
+    (PyIntArgFunc)	0,		    // sq_repeat,    x*n
+    (PyIntArgFunc)	WinListItem,	    // sq_item,      x[i]
+    (PyIntIntArgFunc)	0,		    // sq_slice,     x[i:j]
+    (PyIntObjArgProc)	0,		    // sq_ass_item,  x[i]=v
+    (PyIntIntObjArgProc) 0,		    // sq_ass_slice, x[i:j]=v
     (objobjproc)	0,
 #if PY_MAJOR_VERSION >= 2
     (binaryfunc)	0,
@@ -1415,8 +1396,7 @@
 #endif
 };
 
-/* External interface
- */
+// External interface
 
     void
 python_buffer_free(buf_T *buf)
@@ -1454,13 +1434,13 @@
     static int
 PythonMod_Init(void)
 {
-    /* The special value is removed from sys.path in Python_Init(). */
+    // The special value is removed from sys.path in Python_Init().
     static char	*(argv[2]) = {"/must>not&exist/foo", NULL};
 
     if (init_types())
 	return -1;
 
-    /* Set sys.argv[] to avoid a crash in warn(). */
+    // Set sys.argv[] to avoid a crash in warn().
     PySys_SetArgv(1, argv);
 
     vim_module = Py_InitModule4("vim", VimMethods, (char *)NULL,
@@ -1475,15 +1455,13 @@
     return 0;
 }
 
-/*************************************************************************
- * 4. Utility functions for handling the interface between Vim and Python.
- */
+//////////////////////////////////////////////////////////////////////////
+// 4. Utility functions for handling the interface between Vim and Python.
 
-/* Convert a Vim line into a Python string.
- * All internal newlines are replaced by null characters.
- *
- * On errors, the Python exception data is set, and NULL is returned.
- */
+// Convert a Vim line into a Python string.
+// All internal newlines are replaced by null characters.
+//
+// On errors, the Python exception data is set, and NULL is returned.
     static PyObject *
 LineToString(const char *str)
 {
@@ -1491,10 +1469,9 @@
     PyInt len = strlen(str);
     char *p;
 
-    /* Allocate an Python string object, with uninitialised contents. We
-     * must do it this way, so that we can modify the string in place
-     * later. See the Python source, Objects/stringobject.c for details.
-     */
+    // Allocate an Python string object, with uninitialised contents. We
+    // must do it this way, so that we can modify the string in place
+    // later. See the Python source, Objects/stringobject.c for details.
     result = PyString_FromStringAndSize(NULL, len);
     if (result == NULL)
 	return NULL;
@@ -1568,8 +1545,8 @@
     }
 }
 
-/* Don't generate a prototype for the next function, it generates an error on
- * newer Python versions. */
+// Don't generate a prototype for the next function, it generates an error on
+// newer Python versions.
 #if PYTHON_API_VERSION < 1007 /* Python 1.4 */ && !defined(PROTO)
 
     char *
@@ -1577,7 +1554,7 @@
 {
     return "vim";
 }
-#endif /* Python 1.4 */
+#endif // Python 1.4
 
     int
 set_ref_in_python(int copyID)
