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 |