def write_message(g, msg, resulttype=None): if resulttype is None: if sys.version_info < (2, 4): marshal.dump(msg, g) else: marshal.dump(msg, g, 0) elif resulttype is RESULTTYPE_STATRESULT: # Hand-coded marshal for stat results that mimics what rmarshal expects. # marshal.dump(tuple(msg)) would have been too easy. rmarshal insists # on 64-bit ints at places, even when the value fits in 32 bits. import struct st = tuple(msg) fmt = "iIIiiiIfff" buf = [] buf.append(struct.pack("<ci", '(', len(st))) for c, v in zip(fmt, st): if c == 'i': buf.append(struct.pack("<ci", c, v)) elif c == 'I': buf.append(struct.pack("<cq", c, v)) elif c == 'f': fstr = "%g" % v buf.append(struct.pack("<cB", c, len(fstr))) buf.append(fstr) g.write(''.join(buf)) elif resulttype is RESULTTYPE_LONGLONG: import struct g.write(struct.pack("<cq", 'I', msg)) else: raise Exception("Can't marshal: %r (%r)" % (msg, resulttype))
def write_message(g, msg, resulttype=None): if resulttype is None: if sys.version_info < (2, 4): marshal.dump(msg, g) else: marshal.dump(msg, g, 0) elif resulttype is RESULTTYPE_STATRESULT: # Hand-coded marshal for stat results that mimics what rmarshal expects. # marshal.dump(tuple(msg)) would have been too easy. rmarshal insists # on 64-bit ints at places, even when the value fits in 32 bits. st = tuple(msg) st = st[:-3] + (float(st[-3]), float(st[-2]), float(st[-1])) marshal.dump(st, g, 0) elif resulttype is RESULTTYPE_LONGLONG: import struct g.write(struct.pack("<cq", 'I', msg)) else: raise Exception("Can't marshal: %r (%r)" % (msg, resulttype))