[Python-Dev] Nested scopes core dump

Michael Hudson mwh21@cam.ac.uk
20 Mar 2001 13:44:50 +0000


Michael Hudson <mwh21@cam.ac.uk> writes:

> Guido van Rossum <guido@digicool.com> writes:
> 
> > Checking for a dup key in PyDict_SetItem() before calling dictresize()
> > slows things down.  Checking in insertdict() is wrong because
> > dictresize() uses that!
> 
> Maybe you could do the check for resize *after* the call to
> insertdict?  I think that would work, but I wouldn't like to go
> messing with such a performance critical bit of code without some
> careful thinking.

Indeed; this tiny little patch:

Index: Objects/dictobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/dictobject.c,v
retrieving revision 2.73
diff -c -r2.73 dictobject.c
*** Objects/dictobject.c	2001/01/18 00:39:02	2.73
--- Objects/dictobject.c	2001/03/20 13:38:04
***************
*** 496,501 ****
--- 496,508 ----
  	Py_INCREF(value);
  	Py_INCREF(key);
  	insertdict(mp, key, hash, value);
+ 	/* if fill >= 2/3 size, double in size */
+ 	if (mp->ma_fill*3 >= mp->ma_size*2) {
+ 		if (dictresize(mp, mp->ma_used*2) != 0) {
+ 			if (mp->ma_fill+1 > mp->ma_size)
+ 				return -1;
+ 		}
+ 	}
  	return 0;
  }
  
fixes Ping's reported crash.  You can't naively (as I did at first)
*only* check after the insertdict, 'cause dicts are created with 0
size.

Currently building from scratch to do some performance testing.

Cheers,
M.

-- 
  It's a measure of how much I love Python that I moved to VA, where
  if things don't work out Guido will buy a plantation and put us to
  work harvesting peanuts instead.     -- Tim Peters, comp.lang.python