Index: third_party/mojo/src/mojo/public/python/mojo_bindings/serialization.py |
diff --git a/third_party/mojo/src/mojo/public/python/mojo_bindings/serialization.py b/third_party/mojo/src/mojo/public/python/mojo_bindings/serialization.py |
index b1a35ec16bbae473e0be35c1b6fbec8f43090f66..32f60f066dbad9a320b08fb40b81d59532f60433 100644 |
--- a/third_party/mojo/src/mojo/public/python/mojo_bindings/serialization.py |
+++ b/third_party/mojo/src/mojo/public/python/mojo_bindings/serialization.py |
@@ -7,11 +7,8 @@ |
import struct |
-# Format of a header for a struct, array or union. |
+# Format of a header for a struct or an array. |
HEADER_STRUCT = struct.Struct("<II") |
- |
-# Format for a pointer. |
-POINTER_STRUCT = struct.Struct("<Q") |
def Flatten(value): |
@@ -221,89 +218,3 @@ |
if alignment_needed: |
codes.append('x' * alignment_needed) |
return struct.Struct(''.join(codes)) |
- |
- |
-class UnionSerializer(object): |
- """ |
- Helper class to serialize/deserialize a union. |
- """ |
- def __init__(self, fields): |
- self._fields = {field.index: field for field in fields} |
- |
- def SerializeInline(self, union, handle_offset): |
- data = bytearray() |
- field = self._fields[union.tag] |
- |
- # If the union value is a simple type or a nested union, it is returned as |
- # entry. |
- # Otherwise, the serialized value is appended to data and the value of entry |
- # is -1. The caller will need to set entry to the location where the |
- # caller will append data. |
- (entry, handles) = field.field_type.Serialize( |
- union.data, -1, data, handle_offset) |
- |
- # If the value contained in the union is itself a union, we append its |
- # serialized value to data and set entry to -1. The caller will need to set |
- # entry to the location where the caller will append data. |
- if field.field_type.IsUnion(): |
- nested_union = bytearray(16) |
- HEADER_STRUCT.pack_into(nested_union, 0, entry[0], entry[1]) |
- POINTER_STRUCT.pack_into(nested_union, 8, entry[2]) |
- |
- data = nested_union + data |
- |
- # Since we do not know where the caller will append the nested union, |
- # we set entry to an invalid value and let the caller figure out the right |
- # value. |
- entry = -1 |
- |
- return (16, union.tag, entry, data), handles |
- |
- def Serialize(self, union, handle_offset): |
- (size, tag, entry, extra_data), handles = self.SerializeInline( |
- union, handle_offset) |
- data = bytearray(16) |
- if extra_data: |
- entry = 8 |
- data.extend(extra_data) |
- |
- field = self._fields[union.tag] |
- |
- HEADER_STRUCT.pack_into(data, 0, size, tag) |
- typecode = field.GetTypeCode() |
- |
- # If the value is a nested union, we store a 64 bits pointer to it. |
- if field.field_type.IsUnion(): |
- typecode = 'Q' |
- |
- struct.pack_into('<%s' % typecode, data, 8, entry) |
- return data, handles |
- |
- def Deserialize(self, context, union_class): |
- if len(context.data) < HEADER_STRUCT.size: |
- raise DeserializationException( |
- 'Available data too short to contain header.') |
- (size, tag) = HEADER_STRUCT.unpack_from(context.data) |
- |
- if size == 0: |
- return None |
- |
- if size != 16: |
- raise DeserializationException('Invalid union size %s' % size) |
- |
- union = union_class.__new__(union_class) |
- if tag not in self._fields: |
- union.SetInternals(None, None) |
- return union |
- |
- field = self._fields[tag] |
- if field.field_type.IsUnion(): |
- ptr = POINTER_STRUCT.unpack_from(context.data, 8)[0] |
- value = field.field_type.Deserialize(ptr, context.GetSubContext(ptr+8)) |
- else: |
- raw_value = struct.unpack_from( |
- field.GetTypeCode(), context.data, 8)[0] |
- value = field.field_type.Deserialize(raw_value, context.GetSubContext(8)) |
- |
- union.SetInternals(field, value) |
- return union |