diff Modules/mmapmodule.c @ 35999:9541369b0dca legacy-trunk

Add const to several API functions that take char *. In C++, it's an error to pass a string literal to a char* function without a const_cast(). Rather than require every C++ extension module to put a cast around string literals, fix the API to state the const-ness. I focused on parts of the API where people usually pass literals: PyArg_ParseTuple() and friends, Py_BuildValue(), PyMethodDef, the type slots, etc. Predictably, there were a large set of functions that needed to be fixed as a result of these changes. The most pervasive change was to make the keyword args list passed to PyArg_ParseTupleAndKewords() to be a const char *kwlist[]. One cast was required as a result of the changes: A type object mallocs the memory for its tp_doc slot and later frees it. PyTypeObject says that tp_doc is const char *; but if the type was created by type_new(), we know it is safe to cast to char *.
author Jeremy Hylton <jeremy@alum.mit.edu>
date Sat, 10 Dec 2005 18:50:16 +0000
parents b652f535201d
children 15b58e45f1a1
line wrap: on
line diff
--- a/Modules/mmapmodule.c	Sat Dec 10 17:44:27 2005 +0000
+++ b/Modules/mmapmodule.c	Sat Dec 10 18:50:16 2005 +0000
@@ -864,12 +864,13 @@
 	int map_size;
 	int fd, flags = MAP_SHARED, prot = PROT_WRITE | PROT_READ;
 	access_mode access = ACCESS_DEFAULT;
-	char *keywords[] = {"fileno", "length", 
-			    "flags", "prot", 
-			    "access", NULL};
+	static const char *keywords[] = {"fileno", "length", 
+                                         "flags", "prot", 
+                                         "access", NULL};
 
 	if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iO|iii", keywords, 
-					 &fd, &map_size_obj, &flags, &prot, &access))
+					 &fd, &map_size_obj, &flags, &prot,
+                                         &access))
 		return NULL;
 	map_size = _GetMapSize(map_size_obj);
 	if (map_size < 0)
@@ -952,9 +953,9 @@
 	HANDLE fh = 0;
 	access_mode   access = ACCESS_DEFAULT;
 	DWORD flProtect, dwDesiredAccess;
-	char *keywords[] = { "fileno", "length", 
-			     "tagname", 
-			     "access", NULL };
+	static const char *keywords[] = { "fileno", "length", 
+                                          "tagname", 
+                                          "access", NULL };
 
 	if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iO|zi", keywords,
 					 &fileno, &map_size_obj,