Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(392)

Unified Diff: mojo/public/tools/bindings/pylib/mojom/generate/pack.py

Issue 814543006: Move //mojo/{public, edk} underneath //third_party (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/public/tools/bindings/pylib/mojom/generate/pack.py
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 8f7bb3ba7b4fd45579267b81332f2564291fdec3..0000000000000000000000000000000000000000
--- 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

Powered by Google App Engine
This is Rietveld 408576698