aboutsummaryrefslogtreecommitdiff
path: root/generator/google/protobuf/internal/encoder.py
diff options
context:
space:
mode:
Diffstat (limited to 'generator/google/protobuf/internal/encoder.py')
-rw-r--r--generator/google/protobuf/internal/encoder.py92
1 files changed, 19 insertions, 73 deletions
diff --git a/generator/google/protobuf/internal/encoder.py b/generator/google/protobuf/internal/encoder.py
index 48ef2df..777975e 100644
--- a/generator/google/protobuf/internal/encoder.py
+++ b/generator/google/protobuf/internal/encoder.py
@@ -1,6 +1,6 @@
# Protocol Buffers - Google's data interchange format
# Copyright 2008 Google Inc. All rights reserved.
-# https://developers.google.com/protocol-buffers/
+# 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
@@ -41,7 +41,7 @@ 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 BytesIO.
+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:
@@ -67,9 +67,6 @@ sizer rather than when calling them. In particular:
__author__ = 'kenton@google.com (Kenton Varda)'
import struct
-
-import six
-
from google.protobuf.internal import wire_format
@@ -311,7 +308,7 @@ def MessageSizer(field_number, is_repeated, is_packed):
# --------------------------------------------------------------------
-# MessageSet is special: it needs custom logic to compute its size properly.
+# MessageSet is special.
def MessageSetItemSizer(field_number):
@@ -336,32 +333,6 @@ def MessageSetItemSizer(field_number):
return FieldSize
-# --------------------------------------------------------------------
-# Map is special: it needs custom logic to compute its size properly.
-
-
-def MapSizer(field_descriptor):
- """Returns a sizer for a map field."""
-
- # Can't look at field_descriptor.message_type._concrete_class because it may
- # not have been initialized yet.
- message_type = field_descriptor.message_type
- message_sizer = MessageSizer(field_descriptor.number, False, False)
-
- def FieldSize(map_value):
- total = 0
- for key in map_value:
- value = map_value[key]
- # It's wasteful to create the messages and throw them away one second
- # later since we'll do the same for the actual encode. But there's not an
- # obvious way to avoid this within the current design without tons of code
- # duplication.
- entry_msg = message_type._concrete_class(key=key, value=value)
- total += message_sizer(entry_msg)
- return total
-
- return FieldSize
-
# ====================================================================
# Encoders!
@@ -369,14 +340,15 @@ def MapSizer(field_descriptor):
def _VarintEncoder():
"""Return an encoder for a basic varint value (does not include tag)."""
+ local_chr = chr
def EncodeVarint(write, value):
bits = value & 0x7f
value >>= 7
while value:
- write(six.int2byte(0x80|bits))
+ write(local_chr(0x80|bits))
bits = value & 0x7f
value >>= 7
- return write(six.int2byte(bits))
+ return write(local_chr(bits))
return EncodeVarint
@@ -385,16 +357,17 @@ def _SignedVarintEncoder():
"""Return an encoder for a basic signed varint value (does not include
tag)."""
+ local_chr = chr
def EncodeSignedVarint(write, value):
if value < 0:
value += (1 << 64)
bits = value & 0x7f
value >>= 7
while value:
- write(six.int2byte(0x80|bits))
+ write(local_chr(0x80|bits))
bits = value & 0x7f
value >>= 7
- return write(six.int2byte(bits))
+ return write(local_chr(bits))
return EncodeSignedVarint
@@ -409,7 +382,7 @@ def _VarintBytes(value):
pieces = []
_EncodeVarint(pieces.append, value)
- return b"".join(pieces)
+ return "".join(pieces)
def TagBytes(field_number, wire_type):
@@ -552,21 +525,21 @@ def _FloatingPointEncoder(wire_type, format):
def EncodeNonFiniteOrRaise(write, value):
# Remember that the serialized form uses little-endian byte order.
if value == _POS_INF:
- write(b'\x00\x00\x80\x7F')
+ write('\x00\x00\x80\x7F')
elif value == _NEG_INF:
- write(b'\x00\x00\x80\xFF')
+ write('\x00\x00\x80\xFF')
elif value != value: # NaN
- write(b'\x00\x00\xC0\x7F')
+ write('\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')
+ write('\x00\x00\x00\x00\x00\x00\xF0\x7F')
elif value == _NEG_INF:
- write(b'\x00\x00\x00\x00\x00\x00\xF0\xFF')
+ write('\x00\x00\x00\x00\x00\x00\xF0\xFF')
elif value != value: # NaN
- write(b'\x00\x00\x00\x00\x00\x00\xF8\x7F')
+ write('\x00\x00\x00\x00\x00\x00\xF8\x7F')
else:
raise
else:
@@ -642,8 +615,8 @@ DoubleEncoder = _FloatingPointEncoder(wire_format.WIRETYPE_FIXED64, '<d')
def BoolEncoder(field_number, is_repeated, is_packed):
"""Returns an encoder for a boolean field."""
- false_byte = b'\x00'
- true_byte = b'\x01'
+ false_byte = chr(0)
+ true_byte = chr(1)
if is_packed:
tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
local_EncodeVarint = _EncodeVarint
@@ -779,7 +752,7 @@ def MessageSetItemEncoder(field_number):
}
}
"""
- start_bytes = b"".join([
+ start_bytes = "".join([
TagBytes(1, wire_format.WIRETYPE_START_GROUP),
TagBytes(2, wire_format.WIRETYPE_VARINT),
_VarintBytes(field_number),
@@ -794,30 +767,3 @@ def MessageSetItemEncoder(field_number):
return write(end_bytes)
return EncodeField
-
-
-# --------------------------------------------------------------------
-# As before, Map is special.
-
-
-def MapEncoder(field_descriptor):
- """Encoder for extensions of MessageSet.
-
- Maps always have a wire format like this:
- message MapEntry {
- key_type key = 1;
- value_type value = 2;
- }
- repeated MapEntry map = N;
- """
- # Can't look at field_descriptor.message_type._concrete_class because it may
- # not have been initialized yet.
- message_type = field_descriptor.message_type
- encode_message = MessageEncoder(field_descriptor.number, False, False)
-
- def EncodeField(write, value):
- for key in value:
- entry_msg = message_type._concrete_class(key=key, value=value[key])
- encode_message(write, entry_msg)
-
- return EncodeField