Index: third_party/protobuf/python/google/protobuf/reflection.py |
diff --git a/third_party/protobuf/python/google/protobuf/reflection.py b/third_party/protobuf/python/google/protobuf/reflection.py |
index 82fca6619820307ef2abd0ab1e285809d5c111d0..9570fd50883f35b2bbfc30f6846fcd165fab08e2 100755 |
--- a/third_party/protobuf/python/google/protobuf/reflection.py |
+++ b/third_party/protobuf/python/google/protobuf/reflection.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 |
@@ -56,12 +56,18 @@ _FieldDescriptor = descriptor_mod.FieldDescriptor |
if api_implementation.Type() == 'cpp': |
- from google.protobuf.pyext import cpp_message as message_impl |
+ if api_implementation.Version() == 2: |
+ from google.protobuf.internal.cpp import cpp_message |
+ _NewMessage = cpp_message.NewMessage |
+ _InitMessage = cpp_message.InitMessage |
+ else: |
+ from google.protobuf.internal import cpp_message |
+ _NewMessage = cpp_message.NewMessage |
+ _InitMessage = cpp_message.InitMessage |
else: |
- from google.protobuf.internal import python_message as message_impl |
- |
-_NewMessage = message_impl.NewMessage |
-_InitMessage = message_impl.InitMessage |
+ from google.protobuf.internal import python_message |
+ _NewMessage = python_message.NewMessage |
+ _InitMessage = python_message.InitMessage |
class GeneratedProtocolMessageType(type): |
@@ -85,10 +91,6 @@ class GeneratedProtocolMessageType(type): |
myproto_instance = MyProtoClass() |
myproto.foo_field = 23 |
... |
- |
- The above example will not work for nested types. If you wish to include them, |
- use reflection.MakeClass() instead of manually instantiating the class in |
- order to create the appropriate class structure. |
""" |
# Must be consistent with the protocol-compiler code in |
@@ -121,6 +123,7 @@ class GeneratedProtocolMessageType(type): |
superclass = super(GeneratedProtocolMessageType, cls) |
new_class = superclass.__new__(cls, name, bases, dictionary) |
+ setattr(descriptor, '_concrete_class', new_class) |
return new_class |
def __init__(cls, name, bases, dictionary): |
@@ -156,43 +159,11 @@ def ParseMessage(descriptor, byte_str): |
Returns: |
Newly created protobuf Message object. |
""" |
- result_class = MakeClass(descriptor) |
- new_msg = result_class() |
- new_msg.ParseFromString(byte_str) |
- return new_msg |
- |
-def MakeClass(descriptor): |
- """Construct a class object for a protobuf described by descriptor. |
- |
- Composite descriptors are handled by defining the new class as a member of the |
- parent class, recursing as deep as necessary. |
- This is the dynamic equivalent to: |
- |
- class Parent(message.Message): |
+ class _ResultClass(message.Message): |
__metaclass__ = GeneratedProtocolMessageType |
DESCRIPTOR = descriptor |
- class Child(message.Message): |
- __metaclass__ = GeneratedProtocolMessageType |
- DESCRIPTOR = descriptor.nested_types[0] |
- |
- Sample usage: |
- file_descriptor = descriptor_pb2.FileDescriptorProto() |
- file_descriptor.ParseFromString(proto2_string) |
- msg_descriptor = descriptor.MakeDescriptor(file_descriptor.message_type[0]) |
- msg_class = reflection.MakeClass(msg_descriptor) |
- msg = msg_class() |
- Args: |
- descriptor: A descriptor.Descriptor object describing the protobuf. |
- Returns: |
- The Message class object described by the descriptor. |
- """ |
- attributes = {} |
- for name, nested_type in descriptor.nested_types_by_name.items(): |
- attributes[name] = MakeClass(nested_type) |
- |
- attributes[GeneratedProtocolMessageType._DESCRIPTOR_KEY] = descriptor |
- |
- return GeneratedProtocolMessageType(str(descriptor.name), (message.Message,), |
- attributes) |
+ new_msg = _ResultClass() |
+ new_msg.ParseFromString(byte_str) |
+ return new_msg |