]> granicus.if.org Git - python/commitdiff
Merged revisions 80325 via svnmerge from
authorAntoine Pitrou <solipsis@pitrou.net>
Wed, 21 Apr 2010 22:56:22 +0000 (22:56 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Wed, 21 Apr 2010 22:56:22 +0000 (22:56 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r80325 | antoine.pitrou | 2010-04-22 00:53:29 +0200 (jeu., 22 avril 2010) | 6 lines

  Issue #7332: Remove the 16KB stack-based buffer in
  PyMarshal_ReadLastObjectFromFile, which doesn't bring any noticeable
  benefit compared to the dynamic memory allocation fallback.  Patch by
  Charles-François Natali.
........

Misc/ACKS
Misc/NEWS
Python/marshal.c

index 276a7af71065d816c9da07f5ec448f8a701b5677..33e879fcec986dd35a4397d418ac336f660213c0 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -540,6 +540,7 @@ Piotr Meyer
 John Nagle
 Takahiro Nakayama
 Travers Naran
+Charles-François Natali
 Fredrik Nehr
 Trent Nelson
 Tony Nelson
index 414f15c676c62016ab8b1532ccb1da2cdf13b153..83d057408c539f293339f2bedec951cc50cfd998 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,11 @@ What's New in Python 3.2 Alpha 1?
 Core and Builtins
 -----------------
 
+- Issue #7332: Remove the 16KB stack-based buffer in
+  PyMarshal_ReadLastObjectFromFile, which doesn't bring any noticeable
+  benefit compared to the dynamic memory allocation fallback.  Patch by
+  Charles-François Natali.
+
 - Issue #8417: Raise an OverflowError when an integer larger than sys.maxsize is
   passed to bytes or bytearray.
 
index 3391085ccb077b82ed43416447dfc2476ddecdc0..90cd306a9274b5bce5df6c1a548ea14bc471f9a1 100644 (file)
@@ -1078,23 +1078,13 @@ getfilesize(FILE *fp)
 PyObject *
 PyMarshal_ReadLastObjectFromFile(FILE *fp)
 {
-/* 75% of 2.1's .pyc files can exploit SMALL_FILE_LIMIT.
- * REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc.
- */
-#define SMALL_FILE_LIMIT (1L << 14)
+/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
 #define REASONABLE_FILE_LIMIT (1L << 18)
 #ifdef HAVE_FSTAT
        off_t filesize;
-#endif
-#ifdef HAVE_FSTAT
        filesize = getfilesize(fp);
-       if (filesize > 0) {
-               char buf[SMALL_FILE_LIMIT];
-               char* pBuf = NULL;
-               if (filesize <= SMALL_FILE_LIMIT)
-                       pBuf = buf;
-               else if (filesize <= REASONABLE_FILE_LIMIT)
-                       pBuf = (char *)PyMem_MALLOC(filesize);
+       if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
+               char* pBuf = (char *)PyMem_MALLOC(filesize);
                if (pBuf != NULL) {
                        PyObject* v;
                        size_t n;
@@ -1102,8 +1092,7 @@ PyMarshal_ReadLastObjectFromFile(FILE *fp)
                           is smaller than REASONABLE_FILE_LIMIT */
                        n = fread(pBuf, 1, (int)filesize, fp);
                        v = PyMarshal_ReadObjectFromString(pBuf, n);
-                       if (pBuf != buf)
-                               PyMem_FREE(pBuf);
+                       PyMem_FREE(pBuf);
                        return v;
                }
 
@@ -1114,7 +1103,6 @@ PyMarshal_ReadLastObjectFromFile(FILE *fp)
         */
        return PyMarshal_ReadObjectFromFile(fp);
 
-#undef SMALL_FILE_LIMIT
 #undef REASONABLE_FILE_LIMIT
 }