diff --git a/py/execnet/serializer.py b/py/execnet/serializer.py index 902c33c37..710597139 100755 --- a/py/execnet/serializer.py +++ b/py/execnet/serializer.py @@ -34,6 +34,7 @@ else: FOUR_BYTE_INT_MAX = 2147483647 _int4_format = struct.Struct("!i") +_float_format = struct.Struct("!d") # Protocol constants VERSION_NUMBER = 1 @@ -47,6 +48,7 @@ BUILDTUPLE = b('T') SETITEM = b('m') NEWDICT = b('d') INT = b('i') +FLOAT = b('f') STOP = b('S') class CrossVersionOptions(object): @@ -108,6 +110,11 @@ class Serializer(object): self._write_int4(i) dispatch[int] = save_int + def save_float(self, flt): + self.stream.write(FLOAT) + self.stream.write(_float_format.pack(flt)) + dispatch[float] = save_float + def _write_int4(self, i, error="int must be less than %i" % (FOUR_BYTE_INT_MAX,)): if i > FOUR_BYTE_INT_MAX: @@ -196,6 +203,11 @@ class Unserializer(object): self.stack.append(i) opcodes[INT] = load_int + def load_float(self): + binary = self.stream.read(_float_format.size) + self.stack.append(_float_format.unpack(binary)[0]) + opcodes[FLOAT] = load_float + def _read_int4(self): return _int4_format.unpack(self.stream.read(4))[0] diff --git a/testing/execnet/test_serializer.py b/testing/execnet/test_serializer.py index 650bc43ef..4b94ef225 100755 --- a/testing/execnet/test_serializer.py +++ b/testing/execnet/test_serializer.py @@ -94,6 +94,14 @@ class TestSerializer: serializer.Serializer(py.io.BytesIO()).save, 123456678900) + def test_float(self, py2, py3): + for dump in py2.dump, py3.dump: + p = dump(3.25) + for load in py2.load, py3.load: + tp, v = load(p) + assert tp == "float" + assert v == "3.25" + def test_bytes(self, py2, py3): p = py3.dump("b'hi'") tp, v = py2.load(p)