| Index: third_party/google/protobuf/internal/encoder.py
|
| diff --git a/third_party/google/protobuf/internal/encoder.py b/third_party/google/protobuf/internal/encoder.py
|
| deleted file mode 100644
|
| index 0a7c04179f1b34c64fdf527f58c62b4c61b7075c..0000000000000000000000000000000000000000
|
| --- a/third_party/google/protobuf/internal/encoder.py
|
| +++ /dev/null
|
| @@ -1,788 +0,0 @@
|
| -# Protocol Buffers - Google's data interchange format
|
| -# Copyright 2008 Google Inc. All rights reserved.
|
| -# http://code.google.com/p/protobuf/
|
| -#
|
| -# Redistribution and use in source and binary forms, with or without
|
| -# modification, are permitted provided that the following conditions are
|
| -# met:
|
| -#
|
| -# * Redistributions of source code must retain the above copyright
|
| -# notice, this list of conditions and the following disclaimer.
|
| -# * Redistributions in binary form must reproduce the above
|
| -# copyright notice, this list of conditions and the following disclaimer
|
| -# in the documentation and/or other materials provided with the
|
| -# distribution.
|
| -# * Neither the name of Google Inc. nor the names of its
|
| -# contributors may be used to endorse or promote products derived from
|
| -# this software without specific prior written permission.
|
| -#
|
| -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -
|
| -#PY25 compatible for GAE.
|
| -#
|
| -# Copyright 2009 Google Inc. All Rights Reserved.
|
| -
|
| -"""Code for encoding protocol message primitives.
|
| -
|
| -Contains the logic for encoding every logical protocol field type
|
| -into one of the 5 physical wire types.
|
| -
|
| -This code is designed to push the Python interpreter's performance to the
|
| -limits.
|
| -
|
| -The basic idea is that at startup time, for every field (i.e. every
|
| -FieldDescriptor) we construct two functions: a "sizer" and an "encoder". The
|
| -sizer takes a value of this field's type and computes its byte size. The
|
| -encoder takes a writer function and a value. It encodes the value into byte
|
| -strings and invokes the writer function to write those strings. Typically the
|
| -writer function is the write() method of a cStringIO.
|
| -
|
| -We try to do as much work as possible when constructing the writer and the
|
| -sizer rather than when calling them. In particular:
|
| -* We copy any needed global functions to local variables, so that we do not need
|
| - to do costly global table lookups at runtime.
|
| -* Similarly, we try to do any attribute lookups at startup time if possible.
|
| -* Every field's tag is encoded to bytes at startup, since it can't change at
|
| - runtime.
|
| -* Whatever component of the field size we can compute at startup, we do.
|
| -* We *avoid* sharing code if doing so would make the code slower and not sharing
|
| - does not burden us too much. For example, encoders for repeated fields do
|
| - not just call the encoders for singular fields in a loop because this would
|
| - add an extra function call overhead for every loop iteration; instead, we
|
| - manually inline the single-value encoder into the loop.
|
| -* If a Python function lacks a return statement, Python actually generates
|
| - instructions to pop the result of the last statement off the stack, push
|
| - None onto the stack, and then return that. If we really don't care what
|
| - value is returned, then we can save two instructions by returning the
|
| - result of the last statement. It looks funny but it helps.
|
| -* We assume that type and bounds checking has happened at a higher level.
|
| -"""
|
| -
|
| -__author__ = 'kenton@google.com (Kenton Varda)'
|
| -
|
| -import struct
|
| -import sys ##PY25
|
| -_PY2 = sys.version_info[0] < 3 ##PY25
|
| -from google.protobuf.internal import wire_format
|
| -
|
| -
|
| -# This will overflow and thus become IEEE-754 "infinity". We would use
|
| -# "float('inf')" but it doesn't work on Windows pre-Python-2.6.
|
| -_POS_INF = 1e10000
|
| -_NEG_INF = -_POS_INF
|
| -
|
| -
|
| -def _VarintSize(value):
|
| - """Compute the size of a varint value."""
|
| - if value <= 0x7f: return 1
|
| - if value <= 0x3fff: return 2
|
| - if value <= 0x1fffff: return 3
|
| - if value <= 0xfffffff: return 4
|
| - if value <= 0x7ffffffff: return 5
|
| - if value <= 0x3ffffffffff: return 6
|
| - if value <= 0x1ffffffffffff: return 7
|
| - if value <= 0xffffffffffffff: return 8
|
| - if value <= 0x7fffffffffffffff: return 9
|
| - return 10
|
| -
|
| -
|
| -def _SignedVarintSize(value):
|
| - """Compute the size of a signed varint value."""
|
| - if value < 0: return 10
|
| - if value <= 0x7f: return 1
|
| - if value <= 0x3fff: return 2
|
| - if value <= 0x1fffff: return 3
|
| - if value <= 0xfffffff: return 4
|
| - if value <= 0x7ffffffff: return 5
|
| - if value <= 0x3ffffffffff: return 6
|
| - if value <= 0x1ffffffffffff: return 7
|
| - if value <= 0xffffffffffffff: return 8
|
| - if value <= 0x7fffffffffffffff: return 9
|
| - return 10
|
| -
|
| -
|
| -def _TagSize(field_number):
|
| - """Returns the number of bytes required to serialize a tag with this field
|
| - number."""
|
| - # Just pass in type 0, since the type won't affect the tag+type size.
|
| - return _VarintSize(wire_format.PackTag(field_number, 0))
|
| -
|
| -
|
| -# --------------------------------------------------------------------
|
| -# In this section we define some generic sizers. Each of these functions
|
| -# takes parameters specific to a particular field type, e.g. int32 or fixed64.
|
| -# It returns another function which in turn takes parameters specific to a
|
| -# particular field, e.g. the field number and whether it is repeated or packed.
|
| -# Look at the next section to see how these are used.
|
| -
|
| -
|
| -def _SimpleSizer(compute_value_size):
|
| - """A sizer which uses the function compute_value_size to compute the size of
|
| - each value. Typically compute_value_size is _VarintSize."""
|
| -
|
| - def SpecificSizer(field_number, is_repeated, is_packed):
|
| - tag_size = _TagSize(field_number)
|
| - if is_packed:
|
| - local_VarintSize = _VarintSize
|
| - def PackedFieldSize(value):
|
| - result = 0
|
| - for element in value:
|
| - result += compute_value_size(element)
|
| - return result + local_VarintSize(result) + tag_size
|
| - return PackedFieldSize
|
| - elif is_repeated:
|
| - def RepeatedFieldSize(value):
|
| - result = tag_size * len(value)
|
| - for element in value:
|
| - result += compute_value_size(element)
|
| - return result
|
| - return RepeatedFieldSize
|
| - else:
|
| - def FieldSize(value):
|
| - return tag_size + compute_value_size(value)
|
| - return FieldSize
|
| -
|
| - return SpecificSizer
|
| -
|
| -
|
| -def _ModifiedSizer(compute_value_size, modify_value):
|
| - """Like SimpleSizer, but modify_value is invoked on each value before it is
|
| - passed to compute_value_size. modify_value is typically ZigZagEncode."""
|
| -
|
| - def SpecificSizer(field_number, is_repeated, is_packed):
|
| - tag_size = _TagSize(field_number)
|
| - if is_packed:
|
| - local_VarintSize = _VarintSize
|
| - def PackedFieldSize(value):
|
| - result = 0
|
| - for element in value:
|
| - result += compute_value_size(modify_value(element))
|
| - return result + local_VarintSize(result) + tag_size
|
| - return PackedFieldSize
|
| - elif is_repeated:
|
| - def RepeatedFieldSize(value):
|
| - result = tag_size * len(value)
|
| - for element in value:
|
| - result += compute_value_size(modify_value(element))
|
| - return result
|
| - return RepeatedFieldSize
|
| - else:
|
| - def FieldSize(value):
|
| - return tag_size + compute_value_size(modify_value(value))
|
| - return FieldSize
|
| -
|
| - return SpecificSizer
|
| -
|
| -
|
| -def _FixedSizer(value_size):
|
| - """Like _SimpleSizer except for a fixed-size field. The input is the size
|
| - of one value."""
|
| -
|
| - def SpecificSizer(field_number, is_repeated, is_packed):
|
| - tag_size = _TagSize(field_number)
|
| - if is_packed:
|
| - local_VarintSize = _VarintSize
|
| - def PackedFieldSize(value):
|
| - result = len(value) * value_size
|
| - return result + local_VarintSize(result) + tag_size
|
| - return PackedFieldSize
|
| - elif is_repeated:
|
| - element_size = value_size + tag_size
|
| - def RepeatedFieldSize(value):
|
| - return len(value) * element_size
|
| - return RepeatedFieldSize
|
| - else:
|
| - field_size = value_size + tag_size
|
| - def FieldSize(value):
|
| - return field_size
|
| - return FieldSize
|
| -
|
| - return SpecificSizer
|
| -
|
| -
|
| -# ====================================================================
|
| -# Here we declare a sizer constructor for each field type. Each "sizer
|
| -# constructor" is a function that takes (field_number, is_repeated, is_packed)
|
| -# as parameters and returns a sizer, which in turn takes a field value as
|
| -# a parameter and returns its encoded size.
|
| -
|
| -
|
| -Int32Sizer = Int64Sizer = EnumSizer = _SimpleSizer(_SignedVarintSize)
|
| -
|
| -UInt32Sizer = UInt64Sizer = _SimpleSizer(_VarintSize)
|
| -
|
| -SInt32Sizer = SInt64Sizer = _ModifiedSizer(
|
| - _SignedVarintSize, wire_format.ZigZagEncode)
|
| -
|
| -Fixed32Sizer = SFixed32Sizer = FloatSizer = _FixedSizer(4)
|
| -Fixed64Sizer = SFixed64Sizer = DoubleSizer = _FixedSizer(8)
|
| -
|
| -BoolSizer = _FixedSizer(1)
|
| -
|
| -
|
| -def StringSizer(field_number, is_repeated, is_packed):
|
| - """Returns a sizer for a string field."""
|
| -
|
| - tag_size = _TagSize(field_number)
|
| - local_VarintSize = _VarintSize
|
| - local_len = len
|
| - assert not is_packed
|
| - if is_repeated:
|
| - def RepeatedFieldSize(value):
|
| - result = tag_size * len(value)
|
| - for element in value:
|
| - l = local_len(element.encode('utf-8'))
|
| - result += local_VarintSize(l) + l
|
| - return result
|
| - return RepeatedFieldSize
|
| - else:
|
| - def FieldSize(value):
|
| - l = local_len(value.encode('utf-8'))
|
| - return tag_size + local_VarintSize(l) + l
|
| - return FieldSize
|
| -
|
| -
|
| -def BytesSizer(field_number, is_repeated, is_packed):
|
| - """Returns a sizer for a bytes field."""
|
| -
|
| - tag_size = _TagSize(field_number)
|
| - local_VarintSize = _VarintSize
|
| - local_len = len
|
| - assert not is_packed
|
| - if is_repeated:
|
| - def RepeatedFieldSize(value):
|
| - result = tag_size * len(value)
|
| - for element in value:
|
| - l = local_len(element)
|
| - result += local_VarintSize(l) + l
|
| - return result
|
| - return RepeatedFieldSize
|
| - else:
|
| - def FieldSize(value):
|
| - l = local_len(value)
|
| - return tag_size + local_VarintSize(l) + l
|
| - return FieldSize
|
| -
|
| -
|
| -def GroupSizer(field_number, is_repeated, is_packed):
|
| - """Returns a sizer for a group field."""
|
| -
|
| - tag_size = _TagSize(field_number) * 2
|
| - assert not is_packed
|
| - if is_repeated:
|
| - def RepeatedFieldSize(value):
|
| - result = tag_size * len(value)
|
| - for element in value:
|
| - result += element.ByteSize()
|
| - return result
|
| - return RepeatedFieldSize
|
| - else:
|
| - def FieldSize(value):
|
| - return tag_size + value.ByteSize()
|
| - return FieldSize
|
| -
|
| -
|
| -def MessageSizer(field_number, is_repeated, is_packed):
|
| - """Returns a sizer for a message field."""
|
| -
|
| - tag_size = _TagSize(field_number)
|
| - local_VarintSize = _VarintSize
|
| - assert not is_packed
|
| - if is_repeated:
|
| - def RepeatedFieldSize(value):
|
| - result = tag_size * len(value)
|
| - for element in value:
|
| - l = element.ByteSize()
|
| - result += local_VarintSize(l) + l
|
| - return result
|
| - return RepeatedFieldSize
|
| - else:
|
| - def FieldSize(value):
|
| - l = value.ByteSize()
|
| - return tag_size + local_VarintSize(l) + l
|
| - return FieldSize
|
| -
|
| -
|
| -# --------------------------------------------------------------------
|
| -# MessageSet is special.
|
| -
|
| -
|
| -def MessageSetItemSizer(field_number):
|
| - """Returns a sizer for extensions of MessageSet.
|
| -
|
| - The message set message looks like this:
|
| - message MessageSet {
|
| - repeated group Item = 1 {
|
| - required int32 type_id = 2;
|
| - required string message = 3;
|
| - }
|
| - }
|
| - """
|
| - static_size = (_TagSize(1) * 2 + _TagSize(2) + _VarintSize(field_number) +
|
| - _TagSize(3))
|
| - local_VarintSize = _VarintSize
|
| -
|
| - def FieldSize(value):
|
| - l = value.ByteSize()
|
| - return static_size + local_VarintSize(l) + l
|
| -
|
| - return FieldSize
|
| -
|
| -
|
| -# ====================================================================
|
| -# Encoders!
|
| -
|
| -
|
| -def _VarintEncoder():
|
| - """Return an encoder for a basic varint value (does not include tag)."""
|
| -
|
| - local_chr = _PY2 and chr or (lambda x: bytes((x,))) ##PY25
|
| -##!PY25 local_chr = chr if bytes is str else lambda x: bytes((x,))
|
| - def EncodeVarint(write, value):
|
| - bits = value & 0x7f
|
| - value >>= 7
|
| - while value:
|
| - write(local_chr(0x80|bits))
|
| - bits = value & 0x7f
|
| - value >>= 7
|
| - return write(local_chr(bits))
|
| -
|
| - return EncodeVarint
|
| -
|
| -
|
| -def _SignedVarintEncoder():
|
| - """Return an encoder for a basic signed varint value (does not include
|
| - tag)."""
|
| -
|
| - local_chr = _PY2 and chr or (lambda x: bytes((x,))) ##PY25
|
| -##!PY25 local_chr = chr if bytes is str else lambda x: bytes((x,))
|
| - def EncodeSignedVarint(write, value):
|
| - if value < 0:
|
| - value += (1 << 64)
|
| - bits = value & 0x7f
|
| - value >>= 7
|
| - while value:
|
| - write(local_chr(0x80|bits))
|
| - bits = value & 0x7f
|
| - value >>= 7
|
| - return write(local_chr(bits))
|
| -
|
| - return EncodeSignedVarint
|
| -
|
| -
|
| -_EncodeVarint = _VarintEncoder()
|
| -_EncodeSignedVarint = _SignedVarintEncoder()
|
| -
|
| -
|
| -def _VarintBytes(value):
|
| - """Encode the given integer as a varint and return the bytes. This is only
|
| - called at startup time so it doesn't need to be fast."""
|
| -
|
| - pieces = []
|
| - _EncodeVarint(pieces.append, value)
|
| - return "".encode("latin1").join(pieces) ##PY25
|
| -##!PY25 return b"".join(pieces)
|
| -
|
| -
|
| -def TagBytes(field_number, wire_type):
|
| - """Encode the given tag and return the bytes. Only called at startup."""
|
| -
|
| - return _VarintBytes(wire_format.PackTag(field_number, wire_type))
|
| -
|
| -# --------------------------------------------------------------------
|
| -# As with sizers (see above), we have a number of common encoder
|
| -# implementations.
|
| -
|
| -
|
| -def _SimpleEncoder(wire_type, encode_value, compute_value_size):
|
| - """Return a constructor for an encoder for fields of a particular type.
|
| -
|
| - Args:
|
| - wire_type: The field's wire type, for encoding tags.
|
| - encode_value: A function which encodes an individual value, e.g.
|
| - _EncodeVarint().
|
| - compute_value_size: A function which computes the size of an individual
|
| - value, e.g. _VarintSize().
|
| - """
|
| -
|
| - def SpecificEncoder(field_number, is_repeated, is_packed):
|
| - if is_packed:
|
| - tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
|
| - local_EncodeVarint = _EncodeVarint
|
| - def EncodePackedField(write, value):
|
| - write(tag_bytes)
|
| - size = 0
|
| - for element in value:
|
| - size += compute_value_size(element)
|
| - local_EncodeVarint(write, size)
|
| - for element in value:
|
| - encode_value(write, element)
|
| - return EncodePackedField
|
| - elif is_repeated:
|
| - tag_bytes = TagBytes(field_number, wire_type)
|
| - def EncodeRepeatedField(write, value):
|
| - for element in value:
|
| - write(tag_bytes)
|
| - encode_value(write, element)
|
| - return EncodeRepeatedField
|
| - else:
|
| - tag_bytes = TagBytes(field_number, wire_type)
|
| - def EncodeField(write, value):
|
| - write(tag_bytes)
|
| - return encode_value(write, value)
|
| - return EncodeField
|
| -
|
| - return SpecificEncoder
|
| -
|
| -
|
| -def _ModifiedEncoder(wire_type, encode_value, compute_value_size, modify_value):
|
| - """Like SimpleEncoder but additionally invokes modify_value on every value
|
| - before passing it to encode_value. Usually modify_value is ZigZagEncode."""
|
| -
|
| - def SpecificEncoder(field_number, is_repeated, is_packed):
|
| - if is_packed:
|
| - tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
|
| - local_EncodeVarint = _EncodeVarint
|
| - def EncodePackedField(write, value):
|
| - write(tag_bytes)
|
| - size = 0
|
| - for element in value:
|
| - size += compute_value_size(modify_value(element))
|
| - local_EncodeVarint(write, size)
|
| - for element in value:
|
| - encode_value(write, modify_value(element))
|
| - return EncodePackedField
|
| - elif is_repeated:
|
| - tag_bytes = TagBytes(field_number, wire_type)
|
| - def EncodeRepeatedField(write, value):
|
| - for element in value:
|
| - write(tag_bytes)
|
| - encode_value(write, modify_value(element))
|
| - return EncodeRepeatedField
|
| - else:
|
| - tag_bytes = TagBytes(field_number, wire_type)
|
| - def EncodeField(write, value):
|
| - write(tag_bytes)
|
| - return encode_value(write, modify_value(value))
|
| - return EncodeField
|
| -
|
| - return SpecificEncoder
|
| -
|
| -
|
| -def _StructPackEncoder(wire_type, format):
|
| - """Return a constructor for an encoder for a fixed-width field.
|
| -
|
| - Args:
|
| - wire_type: The field's wire type, for encoding tags.
|
| - format: The format string to pass to struct.pack().
|
| - """
|
| -
|
| - value_size = struct.calcsize(format)
|
| -
|
| - def SpecificEncoder(field_number, is_repeated, is_packed):
|
| - local_struct_pack = struct.pack
|
| - if is_packed:
|
| - tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
|
| - local_EncodeVarint = _EncodeVarint
|
| - def EncodePackedField(write, value):
|
| - write(tag_bytes)
|
| - local_EncodeVarint(write, len(value) * value_size)
|
| - for element in value:
|
| - write(local_struct_pack(format, element))
|
| - return EncodePackedField
|
| - elif is_repeated:
|
| - tag_bytes = TagBytes(field_number, wire_type)
|
| - def EncodeRepeatedField(write, value):
|
| - for element in value:
|
| - write(tag_bytes)
|
| - write(local_struct_pack(format, element))
|
| - return EncodeRepeatedField
|
| - else:
|
| - tag_bytes = TagBytes(field_number, wire_type)
|
| - def EncodeField(write, value):
|
| - write(tag_bytes)
|
| - return write(local_struct_pack(format, value))
|
| - return EncodeField
|
| -
|
| - return SpecificEncoder
|
| -
|
| -
|
| -def _FloatingPointEncoder(wire_type, format):
|
| - """Return a constructor for an encoder for float fields.
|
| -
|
| - This is like StructPackEncoder, but catches errors that may be due to
|
| - passing non-finite floating-point values to struct.pack, and makes a
|
| - second attempt to encode those values.
|
| -
|
| - Args:
|
| - wire_type: The field's wire type, for encoding tags.
|
| - format: The format string to pass to struct.pack().
|
| - """
|
| -
|
| - b = _PY2 and (lambda x:x) or (lambda x:x.encode('latin1')) ##PY25
|
| - value_size = struct.calcsize(format)
|
| - if value_size == 4:
|
| - def EncodeNonFiniteOrRaise(write, value):
|
| - # Remember that the serialized form uses little-endian byte order.
|
| - if value == _POS_INF:
|
| - write(b('\x00\x00\x80\x7F')) ##PY25
|
| -##!PY25 write(b'\x00\x00\x80\x7F')
|
| - elif value == _NEG_INF:
|
| - write(b('\x00\x00\x80\xFF')) ##PY25
|
| -##!PY25 write(b'\x00\x00\x80\xFF')
|
| - elif value != value: # NaN
|
| - write(b('\x00\x00\xC0\x7F')) ##PY25
|
| -##!PY25 write(b'\x00\x00\xC0\x7F')
|
| - else:
|
| - raise
|
| - elif value_size == 8:
|
| - def EncodeNonFiniteOrRaise(write, value):
|
| - if value == _POS_INF:
|
| - write(b('\x00\x00\x00\x00\x00\x00\xF0\x7F')) ##PY25
|
| -##!PY25 write(b'\x00\x00\x00\x00\x00\x00\xF0\x7F')
|
| - elif value == _NEG_INF:
|
| - write(b('\x00\x00\x00\x00\x00\x00\xF0\xFF')) ##PY25
|
| -##!PY25 write(b'\x00\x00\x00\x00\x00\x00\xF0\xFF')
|
| - elif value != value: # NaN
|
| - write(b('\x00\x00\x00\x00\x00\x00\xF8\x7F')) ##PY25
|
| -##!PY25 write(b'\x00\x00\x00\x00\x00\x00\xF8\x7F')
|
| - else:
|
| - raise
|
| - else:
|
| - raise ValueError('Can\'t encode floating-point values that are '
|
| - '%d bytes long (only 4 or 8)' % value_size)
|
| -
|
| - def SpecificEncoder(field_number, is_repeated, is_packed):
|
| - local_struct_pack = struct.pack
|
| - if is_packed:
|
| - tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
|
| - local_EncodeVarint = _EncodeVarint
|
| - def EncodePackedField(write, value):
|
| - write(tag_bytes)
|
| - local_EncodeVarint(write, len(value) * value_size)
|
| - for element in value:
|
| - # This try/except block is going to be faster than any code that
|
| - # we could write to check whether element is finite.
|
| - try:
|
| - write(local_struct_pack(format, element))
|
| - except SystemError:
|
| - EncodeNonFiniteOrRaise(write, element)
|
| - return EncodePackedField
|
| - elif is_repeated:
|
| - tag_bytes = TagBytes(field_number, wire_type)
|
| - def EncodeRepeatedField(write, value):
|
| - for element in value:
|
| - write(tag_bytes)
|
| - try:
|
| - write(local_struct_pack(format, element))
|
| - except SystemError:
|
| - EncodeNonFiniteOrRaise(write, element)
|
| - return EncodeRepeatedField
|
| - else:
|
| - tag_bytes = TagBytes(field_number, wire_type)
|
| - def EncodeField(write, value):
|
| - write(tag_bytes)
|
| - try:
|
| - write(local_struct_pack(format, value))
|
| - except SystemError:
|
| - EncodeNonFiniteOrRaise(write, value)
|
| - return EncodeField
|
| -
|
| - return SpecificEncoder
|
| -
|
| -
|
| -# ====================================================================
|
| -# Here we declare an encoder constructor for each field type. These work
|
| -# very similarly to sizer constructors, described earlier.
|
| -
|
| -
|
| -Int32Encoder = Int64Encoder = EnumEncoder = _SimpleEncoder(
|
| - wire_format.WIRETYPE_VARINT, _EncodeSignedVarint, _SignedVarintSize)
|
| -
|
| -UInt32Encoder = UInt64Encoder = _SimpleEncoder(
|
| - wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize)
|
| -
|
| -SInt32Encoder = SInt64Encoder = _ModifiedEncoder(
|
| - wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize,
|
| - wire_format.ZigZagEncode)
|
| -
|
| -# Note that Python conveniently guarantees that when using the '<' prefix on
|
| -# formats, they will also have the same size across all platforms (as opposed
|
| -# to without the prefix, where their sizes depend on the C compiler's basic
|
| -# type sizes).
|
| -Fixed32Encoder = _StructPackEncoder(wire_format.WIRETYPE_FIXED32, '<I')
|
| -Fixed64Encoder = _StructPackEncoder(wire_format.WIRETYPE_FIXED64, '<Q')
|
| -SFixed32Encoder = _StructPackEncoder(wire_format.WIRETYPE_FIXED32, '<i')
|
| -SFixed64Encoder = _StructPackEncoder(wire_format.WIRETYPE_FIXED64, '<q')
|
| -FloatEncoder = _FloatingPointEncoder(wire_format.WIRETYPE_FIXED32, '<f')
|
| -DoubleEncoder = _FloatingPointEncoder(wire_format.WIRETYPE_FIXED64, '<d')
|
| -
|
| -
|
| -def BoolEncoder(field_number, is_repeated, is_packed):
|
| - """Returns an encoder for a boolean field."""
|
| -
|
| -##!PY25 false_byte = b'\x00'
|
| -##!PY25 true_byte = b'\x01'
|
| - false_byte = '\x00'.encode('latin1') ##PY25
|
| - true_byte = '\x01'.encode('latin1') ##PY25
|
| - if is_packed:
|
| - tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
|
| - local_EncodeVarint = _EncodeVarint
|
| - def EncodePackedField(write, value):
|
| - write(tag_bytes)
|
| - local_EncodeVarint(write, len(value))
|
| - for element in value:
|
| - if element:
|
| - write(true_byte)
|
| - else:
|
| - write(false_byte)
|
| - return EncodePackedField
|
| - elif is_repeated:
|
| - tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_VARINT)
|
| - def EncodeRepeatedField(write, value):
|
| - for element in value:
|
| - write(tag_bytes)
|
| - if element:
|
| - write(true_byte)
|
| - else:
|
| - write(false_byte)
|
| - return EncodeRepeatedField
|
| - else:
|
| - tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_VARINT)
|
| - def EncodeField(write, value):
|
| - write(tag_bytes)
|
| - if value:
|
| - return write(true_byte)
|
| - return write(false_byte)
|
| - return EncodeField
|
| -
|
| -
|
| -def StringEncoder(field_number, is_repeated, is_packed):
|
| - """Returns an encoder for a string field."""
|
| -
|
| - tag = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
|
| - local_EncodeVarint = _EncodeVarint
|
| - local_len = len
|
| - assert not is_packed
|
| - if is_repeated:
|
| - def EncodeRepeatedField(write, value):
|
| - for element in value:
|
| - encoded = element.encode('utf-8')
|
| - write(tag)
|
| - local_EncodeVarint(write, local_len(encoded))
|
| - write(encoded)
|
| - return EncodeRepeatedField
|
| - else:
|
| - def EncodeField(write, value):
|
| - encoded = value.encode('utf-8')
|
| - write(tag)
|
| - local_EncodeVarint(write, local_len(encoded))
|
| - return write(encoded)
|
| - return EncodeField
|
| -
|
| -
|
| -def BytesEncoder(field_number, is_repeated, is_packed):
|
| - """Returns an encoder for a bytes field."""
|
| -
|
| - tag = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
|
| - local_EncodeVarint = _EncodeVarint
|
| - local_len = len
|
| - assert not is_packed
|
| - if is_repeated:
|
| - def EncodeRepeatedField(write, value):
|
| - for element in value:
|
| - write(tag)
|
| - local_EncodeVarint(write, local_len(element))
|
| - write(element)
|
| - return EncodeRepeatedField
|
| - else:
|
| - def EncodeField(write, value):
|
| - write(tag)
|
| - local_EncodeVarint(write, local_len(value))
|
| - return write(value)
|
| - return EncodeField
|
| -
|
| -
|
| -def GroupEncoder(field_number, is_repeated, is_packed):
|
| - """Returns an encoder for a group field."""
|
| -
|
| - start_tag = TagBytes(field_number, wire_format.WIRETYPE_START_GROUP)
|
| - end_tag = TagBytes(field_number, wire_format.WIRETYPE_END_GROUP)
|
| - assert not is_packed
|
| - if is_repeated:
|
| - def EncodeRepeatedField(write, value):
|
| - for element in value:
|
| - write(start_tag)
|
| - element._InternalSerialize(write)
|
| - write(end_tag)
|
| - return EncodeRepeatedField
|
| - else:
|
| - def EncodeField(write, value):
|
| - write(start_tag)
|
| - value._InternalSerialize(write)
|
| - return write(end_tag)
|
| - return EncodeField
|
| -
|
| -
|
| -def MessageEncoder(field_number, is_repeated, is_packed):
|
| - """Returns an encoder for a message field."""
|
| -
|
| - tag = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
|
| - local_EncodeVarint = _EncodeVarint
|
| - assert not is_packed
|
| - if is_repeated:
|
| - def EncodeRepeatedField(write, value):
|
| - for element in value:
|
| - write(tag)
|
| - local_EncodeVarint(write, element.ByteSize())
|
| - element._InternalSerialize(write)
|
| - return EncodeRepeatedField
|
| - else:
|
| - def EncodeField(write, value):
|
| - write(tag)
|
| - local_EncodeVarint(write, value.ByteSize())
|
| - return value._InternalSerialize(write)
|
| - return EncodeField
|
| -
|
| -
|
| -# --------------------------------------------------------------------
|
| -# As before, MessageSet is special.
|
| -
|
| -
|
| -def MessageSetItemEncoder(field_number):
|
| - """Encoder for extensions of MessageSet.
|
| -
|
| - The message set message looks like this:
|
| - message MessageSet {
|
| - repeated group Item = 1 {
|
| - required int32 type_id = 2;
|
| - required string message = 3;
|
| - }
|
| - }
|
| - """
|
| - start_bytes = "".encode("latin1").join([ ##PY25
|
| -##!PY25 start_bytes = b"".join([
|
| - TagBytes(1, wire_format.WIRETYPE_START_GROUP),
|
| - TagBytes(2, wire_format.WIRETYPE_VARINT),
|
| - _VarintBytes(field_number),
|
| - TagBytes(3, wire_format.WIRETYPE_LENGTH_DELIMITED)])
|
| - end_bytes = TagBytes(1, wire_format.WIRETYPE_END_GROUP)
|
| - local_EncodeVarint = _EncodeVarint
|
| -
|
| - def EncodeField(write, value):
|
| - write(start_bytes)
|
| - local_EncodeVarint(write, value.ByteSize())
|
| - value._InternalSerialize(write)
|
| - return write(end_bytes)
|
| -
|
| - return EncodeField
|
|
|