diff options
author | Tim Peters <tim.peters@gmail.com> | 2003-02-02 02:57:53 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2003-02-02 02:57:53 (GMT) |
commit | ee1a53cbb1302971a65ce6eba9b5e538a3595df0 (patch) | |
tree | 33b4f983e6893274567c1cc9d18de0dc7beda6be /Objects/longobject.c | |
parent | 5bd2a79b2229fb1cb9eeffd8906a9c46cc11f05c (diff) | |
download | cpython-ee1a53cbb1302971a65ce6eba9b5e538a3595df0.zip cpython-ee1a53cbb1302971a65ce6eba9b5e538a3595df0.tar.gz cpython-ee1a53cbb1302971a65ce6eba9b5e538a3595df0.tar.bz2 |
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).
Diffstat (limited to 'Objects/longobject.c')
-rw-r--r-- | Objects/longobject.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c index 7835784..9d7243f 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -264,13 +264,13 @@ int _PyLong_Sign(PyObject *vv) { PyLongObject *v = (PyLongObject *)vv; - const int ndigits = v->ob_size; + const int ndigits = ABS(v->ob_size); assert(v != NULL); assert(PyLong_Check(v)); assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0); - return ndigits == 0 ? 0 : (ndigits < 0 ? -1 : 1); + return v->ob_size == 0 ? 0 : (v->ob_size < 0 ? -1 : 1); } size_t |