[Python-Dev] Re: marshal (original) (raw)
[Python-Dev] Re: marshal / unmarshal
Michael Hudson mwh at python.net
Tue Apr 12 09:39:08 CEST 2005
- Previous message: [Python-Dev] Re: marshal / unmarshal
- Next message: [Python-Dev] Re: marshal / unmarshal
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
My mail is experincing random delays of up to a few hours at the moment. I wrote this before I saw your comments on my patch.
Tim Peters <tim.peters at gmail.com> writes:
[Michael Hudson]
I've just submitted http://python.org/sf/1180995 which adds format codes for binary marshalling of floats if version > 1, but it doesn't quite have the effect I expected (see below):
>>> inf = 1e308*1e308 >>> nan = inf/inf >>> marshal.dumps(nan, 2) Traceback (most recent call last): File "", line 1, in ? ValueError: unmarshallable object I don't understand. Does "binary marshalling" not mean just copying the bytes on a 754 platform?
No, it means using _PyFloat_Pack8/Unpack8, like the patch description says. Making those functions just fiddle bytes when they can I regard as a separate project (watch a patch manager near you, though).
If so, that won't work.
I can tell!
Right. Assuming source and destination boxes both use 754 format, and the implementation adjusts endianess if necessary. Well, I was assuming marshal would do floats little-endian-wise, as it does for integers. Then on a big-endian 754 system, loads() will have to reverse the bytes in the little-endian marshal bytestring, and dumps() likewise.
Really? Even I had worked this out...
Heh. I have a vague half-memory of some box that stored the two 4-byte "words" in an IEEE double in one order, but the bytes within each word in the opposite order. It's always something ... I recall stories of machines that stored the bytes of long in some crazy order like that. I think Python would already be broken on such a system, but, also, don't care. Python does very little that depends on internal native byte order, and C hides it in the absence of casting abuse.
This surely does:
PyObject * PyLong_FromLongLong(PY_LONG_LONG ival) { PY_LONG_LONG bytes = ival; int one = 1; return _PyLong_FromByteArray( (unsigned char *)&bytes, SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1); }
It occurs that in the IEEE case, special values can be detected with reliablity -- by picking the exponent field out by force -- and a warning emitted or exception raised. Good idea? Hard to say, to me.
Cheers, mwh
Oh, by the way: http://python.org/sf/1181301
-- It is time-consuming to produce high-quality software. However, that should not alone be a reason to give up the high standards of Python development. -- Martin von Loewis, python-dev
- Previous message: [Python-Dev] Re: marshal / unmarshal
- Next message: [Python-Dev] Re: marshal / unmarshal
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]