| Index: third_party/protobuf/python/google/protobuf/internal/containers.py
|
| diff --git a/third_party/protobuf/python/google/protobuf/internal/containers.py b/third_party/protobuf/python/google/protobuf/internal/containers.py
|
| index 97cdd848e34d8da4083abb512b7403686ddec91f..de13018eefaa8ddd0bf447c10ad06b6b132ccec5 100755
|
| --- a/third_party/protobuf/python/google/protobuf/internal/containers.py
|
| +++ b/third_party/protobuf/python/google/protobuf/internal/containers.py
|
| @@ -436,9 +436,11 @@ class ScalarMap(MutableMapping):
|
| """Simple, type-checked, dict-like container for holding repeated scalars."""
|
|
|
| # Disallows assignment to other attributes.
|
| - __slots__ = ['_key_checker', '_value_checker', '_values', '_message_listener']
|
| + __slots__ = ['_key_checker', '_value_checker', '_values', '_message_listener',
|
| + '_entry_descriptor']
|
|
|
| - def __init__(self, message_listener, key_checker, value_checker):
|
| + def __init__(self, message_listener, key_checker, value_checker,
|
| + entry_descriptor):
|
| """
|
| Args:
|
| message_listener: A MessageListener implementation.
|
| @@ -448,10 +450,12 @@ class ScalarMap(MutableMapping):
|
| inserted into this container.
|
| value_checker: A type_checkers.ValueChecker instance to run on values
|
| inserted into this container.
|
| + entry_descriptor: The MessageDescriptor of a map entry: key and value.
|
| """
|
| self._message_listener = message_listener
|
| self._key_checker = key_checker
|
| self._value_checker = value_checker
|
| + self._entry_descriptor = entry_descriptor
|
| self._values = {}
|
|
|
| def __getitem__(self, key):
|
| @@ -513,6 +517,9 @@ class ScalarMap(MutableMapping):
|
| self._values.clear()
|
| self._message_listener.Modified()
|
|
|
| + def GetEntryClass(self):
|
| + return self._entry_descriptor._concrete_class
|
| +
|
|
|
| class MessageMap(MutableMapping):
|
|
|
| @@ -520,9 +527,10 @@ class MessageMap(MutableMapping):
|
|
|
| # Disallows assignment to other attributes.
|
| __slots__ = ['_key_checker', '_values', '_message_listener',
|
| - '_message_descriptor']
|
| + '_message_descriptor', '_entry_descriptor']
|
|
|
| - def __init__(self, message_listener, message_descriptor, key_checker):
|
| + def __init__(self, message_listener, message_descriptor, key_checker,
|
| + entry_descriptor):
|
| """
|
| Args:
|
| message_listener: A MessageListener implementation.
|
| @@ -532,10 +540,12 @@ class MessageMap(MutableMapping):
|
| inserted into this container.
|
| value_checker: A type_checkers.ValueChecker instance to run on values
|
| inserted into this container.
|
| + entry_descriptor: The MessageDescriptor of a map entry: key and value.
|
| """
|
| self._message_listener = message_listener
|
| self._message_descriptor = message_descriptor
|
| self._key_checker = key_checker
|
| + self._entry_descriptor = entry_descriptor
|
| self._values = {}
|
|
|
| def __getitem__(self, key):
|
| @@ -594,7 +604,11 @@ class MessageMap(MutableMapping):
|
|
|
| def MergeFrom(self, other):
|
| for key in other:
|
| - self[key].MergeFrom(other[key])
|
| + # According to documentation: "When parsing from the wire or when merging,
|
| + # if there are duplicate map keys the last key seen is used".
|
| + if key in self:
|
| + del self[key]
|
| + self[key].CopyFrom(other[key])
|
| # self._message_listener.Modified() not required here, because
|
| # mutations to submessages already propagate.
|
|
|
| @@ -609,3 +623,6 @@ class MessageMap(MutableMapping):
|
| def clear(self):
|
| self._values.clear()
|
| self._message_listener.Modified()
|
| +
|
| + def GetEntryClass(self):
|
| + return self._entry_descriptor._concrete_class
|
|
|