diff options
Diffstat (limited to 'mojo/public/tools/bindings/pylib/mojom/generate/pack.py')
-rw-r--r-- | mojo/public/tools/bindings/pylib/mojom/generate/pack.py | 163 |
1 files changed, 0 insertions, 163 deletions
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/pack.py b/mojo/public/tools/bindings/pylib/mojom/generate/pack.py deleted file mode 100644 index 8f7bb3b..0000000 --- a/mojo/public/tools/bindings/pylib/mojom/generate/pack.py +++ /dev/null @@ -1,163 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import module as mojom - -# This module provides a mechanism for determining the packed order and offsets -# of a mojom.Struct. -# -# ps = pack.PackedStruct(struct) -# ps.packed_fields will access a list of PackedField objects, each of which -# will have an offset, a size and a bit (for mojom.BOOLs). - -class PackedField(object): - kind_to_size = { - mojom.BOOL: 1, - mojom.INT8: 1, - mojom.UINT8: 1, - mojom.INT16: 2, - mojom.UINT16: 2, - mojom.INT32: 4, - mojom.UINT32: 4, - mojom.FLOAT: 4, - mojom.HANDLE: 4, - mojom.MSGPIPE: 4, - mojom.SHAREDBUFFER: 4, - mojom.DCPIPE: 4, - mojom.DPPIPE: 4, - mojom.NULLABLE_HANDLE: 4, - mojom.NULLABLE_MSGPIPE: 4, - mojom.NULLABLE_SHAREDBUFFER: 4, - mojom.NULLABLE_DCPIPE: 4, - mojom.NULLABLE_DPPIPE: 4, - mojom.INT64: 8, - mojom.UINT64: 8, - mojom.DOUBLE: 8, - mojom.STRING: 8, - mojom.NULLABLE_STRING: 8 - } - - @classmethod - def GetSizeForKind(cls, kind): - if isinstance(kind, (mojom.Array, mojom.Map, mojom.Struct)): - return 8 - if isinstance(kind, mojom.Interface) or \ - isinstance(kind, mojom.InterfaceRequest): - kind = mojom.MSGPIPE - if isinstance(kind, mojom.Enum): - # TODO(mpcomplete): what about big enums? - return cls.kind_to_size[mojom.INT32] - if not kind in cls.kind_to_size: - raise Exception("Invalid kind: %s" % kind.spec) - return cls.kind_to_size[kind] - - def __init__(self, field, index, ordinal): - """ - Args: - field: the original field. - index: the position of the original field in the struct. - ordinal: the ordinal of the field for serialization. - """ - self.field = field - self.index = index - self.ordinal = ordinal - self.size = self.GetSizeForKind(field.kind) - self.offset = None - self.bit = None - - -# Returns the pad necessary to reserve space for alignment of |size|. -def GetPad(offset, size): - return (size - (offset % size)) % size - - -# Returns a 2-tuple of the field offset and bit (for BOOLs) -def GetFieldOffset(field, last_field): - if field.field.kind == mojom.BOOL and \ - last_field.field.kind == mojom.BOOL and \ - last_field.bit < 7: - return (last_field.offset, last_field.bit + 1) - - offset = last_field.offset + last_field.size - pad = GetPad(offset, field.size) - return (offset + pad, 0) - - -class PackedStruct(object): - def __init__(self, struct): - self.struct = struct - self.packed_fields = [] - - # No fields. - if (len(struct.fields) == 0): - return - - # Start by sorting by ordinal. - src_fields = [] - ordinal = 0 - for index, field in enumerate(struct.fields): - if field.ordinal is not None: - ordinal = field.ordinal - src_fields.append(PackedField(field, index, ordinal)) - ordinal += 1 - src_fields.sort(key=lambda field: field.ordinal) - - src_field = src_fields[0] - src_field.offset = 0 - src_field.bit = 0 - # dst_fields will contain each of the fields, in increasing offset order. - dst_fields = self.packed_fields - dst_fields.append(src_field) - - # Then find first slot that each field will fit. - for src_field in src_fields[1:]: - last_field = dst_fields[0] - for i in xrange(1, len(dst_fields)): - next_field = dst_fields[i] - offset, bit = GetFieldOffset(src_field, last_field) - if offset + src_field.size <= next_field.offset: - # Found hole. - src_field.offset = offset - src_field.bit = bit - dst_fields.insert(i, src_field) - break - last_field = next_field - if src_field.offset is None: - # Add to end - src_field.offset, src_field.bit = GetFieldOffset(src_field, last_field) - dst_fields.append(src_field) - - def GetTotalSize(self): - if not self.packed_fields: - return 0 - last_field = self.packed_fields[-1] - offset = last_field.offset + last_field.size - pad = GetPad(offset, 8) - return offset + pad - - -class ByteInfo(object): - def __init__(self): - self.is_padding = False - self.packed_fields = [] - - -def GetByteLayout(packed_struct): - bytes = [ByteInfo() for i in xrange(packed_struct.GetTotalSize())] - - limit_of_previous_field = 0 - for packed_field in packed_struct.packed_fields: - for i in xrange(limit_of_previous_field, packed_field.offset): - bytes[i].is_padding = True - bytes[packed_field.offset].packed_fields.append(packed_field) - limit_of_previous_field = packed_field.offset + packed_field.size - - for i in xrange(limit_of_previous_field, len(bytes)): - bytes[i].is_padding = True - - for byte in bytes: - # A given byte cannot both be padding and have a fields packed into it. - assert not (byte.is_padding and byte.packed_fields) - - return bytes |