[Python-checkins] python/dist/src/Objects longobject.c,1.150,1.151

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
Sat, 01 Feb 2003 18:57:55 -0800


Update of /cvsroot/python/python/dist/src/Objects
In directory sc8-pr-cvs1:/tmp/cvs-serv8448/Objects

Modified Files:
	longobject.c 
Log Message:
cPickle.c:  Full support for the new LONG1 and LONG4.  Added comments.
Assorted code cleanups; e.g., sizeof(char) is 1 by definition, so there's
no need to do things like multiply by sizeof(char) in hairy malloc
arguments.  Fixed an undetected-overflow bug in readline_file().

longobject.c:  Fixed a really stupid bug in the new _PyLong_NumBits.

pickle.py:  Fixed stupid bug in save_long():  When proto is 2, it
wrote LONG1 or LONG4, but forgot to return then -- it went on to
append the proto 1 LONG opcode too.
Fixed equally stupid cancelling bugs in load_long1() and
load_long4():  they *returned* the unpickled long instead of pushing
it on the stack.  The return values were ignored.  Tests passed
before only because save_long() pickled the long twice.

Fixed bugs in encode_long().

Noted that decode_long() is quadratic-time despite our hopes,
because long(string, 16) is still quadratic-time in len(string).
It's hex() that's linear-time.  I don't know a way to make decode_long()
linear-time in Python, short of maybe transforming the 256's-complement
bytes into marshal's funky internal format, and letting marshal decode
that.  It would be more valuable to make long(string, 16) linear time.

pickletester.py:  Added a global "protocols" vector so tests can try
all the protocols in a sane way.  Changed test_ints() and test_unicode()
to do so.  Added a new test_long(), but the tail end of it is disabled
because it "takes forever" under pickle.py (but runs very quickly under
cPickle:  cPickle proto 2 for longs is linear-time).


Index: longobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/longobject.c,v
retrieving revision 1.150
retrieving revision 1.151
diff -C2 -d -r1.150 -r1.151
*** longobject.c	31 Jan 2003 21:45:13 -0000	1.150
--- longobject.c	2 Feb 2003 02:57:53 -0000	1.151
***************
*** 265,269 ****
  {
  	PyLongObject *v = (PyLongObject *)vv;
! 	const int ndigits = v->ob_size;
  
  	assert(v != NULL);
--- 265,269 ----
  {
  	PyLongObject *v = (PyLongObject *)vv;
! 	const int ndigits = ABS(v->ob_size);
  
  	assert(v != NULL);
***************
*** 271,275 ****
  	assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
  
! 	return ndigits == 0 ? 0 : (ndigits < 0 ? -1 : 1);
  }
  
--- 271,275 ----
  	assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
  
! 	return v->ob_size == 0 ? 0 : (v->ob_size < 0 ? -1 : 1);
  }