protoc 2.6.1.1 → 2.6.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/protoc/Makefile.in +10 -13
- data/ext/protoc/extconf.rb +0 -1
- data/ext/protoc/protobuf/CHANGES.txt +593 -0
- data/ext/protoc/protobuf/CONTRIBUTORS.txt +93 -0
- data/ext/protoc/protobuf/INSTALL.txt +237 -0
- data/ext/protoc/protobuf/LICENSE +33 -0
- data/ext/protoc/protobuf/Makefile.am +267 -0
- data/ext/protoc/protobuf/README.md +167 -0
- data/ext/protoc/protobuf/autogen.sh +41 -0
- data/ext/protoc/protobuf/benchmarks/ProtoBench.java +203 -0
- data/ext/protoc/protobuf/benchmarks/google_message1.dat +0 -0
- data/ext/protoc/protobuf/benchmarks/google_message2.dat +0 -0
- data/ext/protoc/protobuf/benchmarks/google_size.proto +136 -0
- data/ext/protoc/protobuf/benchmarks/google_speed.proto +136 -0
- data/ext/protoc/protobuf/benchmarks/readme.txt +50 -0
- data/ext/protoc/protobuf/configure.ac +159 -0
- data/ext/protoc/protobuf/editors/README.txt +5 -0
- data/ext/protoc/protobuf/editors/proto.vim +105 -0
- data/ext/protoc/protobuf/editors/protobuf-mode.el +220 -0
- data/ext/protoc/protobuf/examples/AddPerson.java +95 -0
- data/ext/protoc/protobuf/examples/ListPeople.java +50 -0
- data/ext/protoc/protobuf/examples/Makefile +58 -0
- data/ext/protoc/protobuf/examples/README.txt +29 -0
- data/ext/protoc/protobuf/examples/add_person.cc +95 -0
- data/ext/protoc/protobuf/examples/add_person.py +58 -0
- data/ext/protoc/protobuf/examples/addressbook.proto +30 -0
- data/ext/protoc/protobuf/examples/list_people.cc +68 -0
- data/ext/protoc/protobuf/examples/list_people.py +38 -0
- data/ext/protoc/protobuf/generate_descriptor_proto.sh +33 -0
- data/ext/protoc/protobuf/java/README.txt +96 -0
- data/ext/protoc/protobuf/java/pom.xml +217 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java +466 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java +355 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractParser.java +253 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java +51 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java +64 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BoundedByteString.java +163 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ByteString.java +1022 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java +1311 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java +1297 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java +2238 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java +622 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Extension.java +96 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java +392 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java +185 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java +907 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java +2213 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java +949 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Internal.java +391 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java +122 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyField.java +154 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyFieldLite.java +176 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java +367 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java +163 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LiteralByteString.java +362 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Message.java +244 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java +320 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java +60 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java +143 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageReflection.java +931 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Parser.java +261 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java +58 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ProtocolStringList.java +48 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java +696 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RopeByteString.java +957 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java +47 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java +71 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcController.java +118 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java +134 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Service.java +117 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java +52 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java +241 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java +618 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java +1984 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java +99 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java +995 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java +205 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Utf8.java +349 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java +163 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java +527 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/BoundedByteStringTest.java +68 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ByteStringTest.java +759 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CheckUtf8Test.java +141 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java +769 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java +401 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java +80 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java +735 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java +326 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java +48 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java +1515 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8Test.java +180 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java +421 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyFieldLiteTest.java +134 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyFieldTest.java +121 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyMessageLiteTest.java +319 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java +174 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java +143 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java +85 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java +148 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteralByteStringTest.java +396 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java +353 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java +185 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ParserTest.java +381 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java +190 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringSubstringTest.java +97 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringTest.java +115 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java +320 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java +155 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java +420 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java +96 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java +4124 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java +994 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java +653 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java +227 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java +606 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/lazy_fields_lite.proto +61 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/lite_equals_and_hash.proto +55 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto +77 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto +53 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto +46 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto +48 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto +49 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto +50 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test.proto +38 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test2.proto +42 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test3.proto +43 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto +157 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_check_utf8.proto +50 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_check_utf8_size.proto +51 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_custom_options.proto +43 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_extra_interfaces.proto +60 -0
- data/ext/protoc/protobuf/m4/ac_system_extensions.m4 +37 -0
- data/ext/protoc/protobuf/m4/acx_check_suncc.m4 +75 -0
- data/ext/protoc/protobuf/m4/acx_pthread.m4 +397 -0
- data/ext/protoc/protobuf/m4/stl_hash.m4 +72 -0
- data/ext/protoc/protobuf/more_tests/Makefile +41 -0
- data/ext/protoc/protobuf/post_process_dist.sh +60 -0
- data/ext/protoc/protobuf/protobuf-lite.pc.in +13 -0
- data/ext/protoc/protobuf/protobuf.pc.in +14 -0
- data/ext/protoc/protobuf/python/README.txt +105 -0
- data/ext/protoc/protobuf/python/ez_setup.py +284 -0
- data/ext/protoc/protobuf/python/google/__init__.py +1 -0
- data/ext/protoc/protobuf/python/google/protobuf/__init__.py +0 -0
- data/ext/protoc/protobuf/python/google/protobuf/descriptor.py +849 -0
- data/ext/protoc/protobuf/python/google/protobuf/descriptor_database.py +137 -0
- data/ext/protoc/protobuf/python/google/protobuf/descriptor_pool.py +643 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/__init__.py +0 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation.cc +139 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation.py +89 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation_default_test.py +63 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/containers.py +269 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/cpp_message.py +663 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/decoder.py +831 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_database_test.py +63 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test.py +564 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test1.proto +94 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test2.proto +70 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_python_test.py +54 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_test.py +669 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/encoder.py +788 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/enum_type_wrapper.py +89 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/factory_test1.proto +57 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/factory_test2.proto +92 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/generator_test.py +343 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_factory_python_test.py +54 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_factory_test.py +131 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_listener.py +78 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_python_test.py +54 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_test.py +681 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/missing_enum_values.proto +50 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/more_extensions.proto +58 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/more_extensions_dynamic.proto +49 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/more_messages.proto +51 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/python_message.py +1251 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/reflection_test.py +2934 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/service_reflection_test.py +136 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/symbol_database_test.py +120 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/test_bad_identifiers.proto +52 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/test_util.py +662 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/text_encoding_test.py +68 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/text_format_test.py +743 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/type_checkers.py +328 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/unknown_fields_test.py +231 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/wire_format.py +268 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/wire_format_test.py +253 -0
- data/ext/protoc/protobuf/python/google/protobuf/message.py +284 -0
- data/ext/protoc/protobuf/python/google/protobuf/message_factory.py +155 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/README +6 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/__init__.py +0 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/cpp_message.py +61 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor.cc +357 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor.h +96 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor_cpp2_test.py +58 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/extension_dict.cc +338 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/extension_dict.h +123 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/message.cc +2561 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/message.h +305 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/message_factory_cpp2_test.py +56 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/proto2_api_test.proto +38 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/python.proto +66 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/python_protobuf.h +57 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/reflection_cpp2_generated_test.py +94 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_composite_container.cc +763 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_composite_container.h +172 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_scalar_container.cc +825 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_scalar_container.h +112 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/scoped_pyobject_ptr.h +95 -0
- data/ext/protoc/protobuf/python/google/protobuf/reflection.py +205 -0
- data/ext/protoc/protobuf/python/google/protobuf/service.py +226 -0
- data/ext/protoc/protobuf/python/google/protobuf/service_reflection.py +284 -0
- data/ext/protoc/protobuf/python/google/protobuf/symbol_database.py +185 -0
- data/ext/protoc/protobuf/python/google/protobuf/text_encoding.py +110 -0
- data/ext/protoc/protobuf/python/google/protobuf/text_format.py +873 -0
- data/ext/protoc/protobuf/python/mox.py +1401 -0
- data/ext/protoc/protobuf/python/setup.py +201 -0
- data/ext/protoc/protobuf/python/stubout.py +140 -0
- data/ext/protoc/protobuf/src/Makefile.am +418 -0
- data/ext/protoc/protobuf/src/google/protobuf/SEBS +240 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/code_generator.cc +84 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/code_generator.h +145 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface.cc +1603 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface.h +378 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc +1654 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc +158 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc +288 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h +103 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc +431 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h +122 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc +210 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h +86 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc +166 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h +185 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc +665 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h +99 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc +125 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc +494 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h +206 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc +2645 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h +175 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc +375 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h +121 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_options.h +58 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc +123 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc +451 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +123 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc +334 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc +642 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h +127 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto +132 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc +2074 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.h +51 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/importer.cc +480 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/importer.h +317 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/importer_unittest.cc +617 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_context.cc +195 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_context.h +95 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment.cc +233 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment.h +69 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment_unittest.cc +67 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum.cc +333 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum.h +99 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc +778 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum_field.h +158 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_extension.cc +207 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_extension.h +109 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_field.cc +213 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_field.h +162 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_file.cc +534 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_file.h +115 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator.cc +158 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator.h +72 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator_factory.cc +77 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator_factory.h +101 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_helpers.cc +737 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_helpers.h +322 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.cc +826 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.h +121 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message.cc +1666 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message.h +140 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message_field.cc +1343 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message_field.h +173 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_name_resolver.cc +266 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_name_resolver.h +124 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc +124 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc +877 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h +160 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_service.cc +473 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_service.h +135 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.cc +201 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.h +90 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_string_field.cc +1056 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_string_field.h +160 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/main.cc +61 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/mock_code_generator.cc +240 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/mock_code_generator.h +117 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/package_info.h +64 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/parser.cc +1750 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/parser.h +522 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/parser_unittest.cc +2612 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.cc +163 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.h +72 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.pb.cc +1148 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.pb.h +897 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.proto +147 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_generator.cc +1262 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_generator.h +166 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc +118 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/subprocess.cc +463 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/subprocess.h +108 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/test_plugin.cc +51 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh +91 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_writer.cc +218 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_writer.h +93 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.cc +5420 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.h +1691 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.pb.cc +9135 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.pb.h +6761 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.proto +687 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_database.cc +543 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_database.h +369 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_database_unittest.cc +748 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_pb2_test.py +54 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_unittest.cc +5501 -0
- data/ext/protoc/protobuf/src/google/protobuf/dynamic_message.cc +764 -0
- data/ext/protoc/protobuf/src/google/protobuf/dynamic_message.h +148 -0
- data/ext/protoc/protobuf/src/google/protobuf/dynamic_message_unittest.cc +230 -0
- data/ext/protoc/protobuf/src/google/protobuf/extension_set.cc +1663 -0
- data/ext/protoc/protobuf/src/google/protobuf/extension_set.h +1234 -0
- data/ext/protoc/protobuf/src/google/protobuf/extension_set_heavy.cc +734 -0
- data/ext/protoc/protobuf/src/google/protobuf/extension_set_unittest.cc +1095 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_enum_reflection.h +91 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection.cc +1683 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection.h +504 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc +795 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_util.cc +65 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_util.h +113 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream.cc +914 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream.h +1220 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream_inl.h +69 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream_unittest.cc +1378 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream.cc +326 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream.h +209 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh +44 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/package_info.h +54 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/printer.cc +198 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/printer.h +136 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/printer_unittest.cc +285 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/strtod.cc +113 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/strtod.h +50 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer.cc +1127 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer.h +402 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer_unittest.cc +999 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream.cc +57 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream.h +248 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc +473 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h +358 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc +405 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h +354 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc +965 -0
- data/ext/protoc/protobuf/src/google/protobuf/lite_unittest.cc +350 -0
- data/ext/protoc/protobuf/src/google/protobuf/message.cc +358 -0
- data/ext/protoc/protobuf/src/google/protobuf/message.h +866 -0
- data/ext/protoc/protobuf/src/google/protobuf/message_lite.cc +335 -0
- data/ext/protoc/protobuf/src/google/protobuf/message_lite.h +247 -0
- data/ext/protoc/protobuf/src/google/protobuf/message_unittest.cc +427 -0
- data/ext/protoc/protobuf/src/google/protobuf/package_info.h +64 -0
- data/ext/protoc/protobuf/src/google/protobuf/reflection_ops.cc +269 -0
- data/ext/protoc/protobuf/src/google/protobuf/reflection_ops.h +81 -0
- data/ext/protoc/protobuf/src/google/protobuf/reflection_ops_unittest.cc +475 -0
- data/ext/protoc/protobuf/src/google/protobuf/repeated_field.cc +87 -0
- data/ext/protoc/protobuf/src/google/protobuf/repeated_field.h +1603 -0
- data/ext/protoc/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc +195 -0
- data/ext/protoc/protobuf/src/google/protobuf/repeated_field_unittest.cc +1442 -0
- data/ext/protoc/protobuf/src/google/protobuf/service.cc +46 -0
- data/ext/protoc/protobuf/src/google/protobuf/service.h +291 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops.h +227 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h +325 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h +151 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h +146 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h +122 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h +137 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h +225 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h +313 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h +73 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_solaris.h +188 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h +219 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc +137 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h +293 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc +112 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h +150 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/common.cc +395 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/common.h +1226 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/common_unittest.cc +357 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/hash.h +232 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/map_util.h +771 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/once.cc +99 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/once.h +166 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/once_unittest.cc +253 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/platform_macros.h +103 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/shared_ptr.h +470 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/stl_util.h +121 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf.cc +175 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf.h +76 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf_unittest.cc +152 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/structurally_valid.cc +536 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc +40 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil.cc +1279 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil.h +562 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil_unittest.cc +73 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/substitute.cc +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/substitute.h +170 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/template_util.h +138 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/template_util_unittest.cc +130 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/type_traits.h +336 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc +628 -0
- data/ext/protoc/protobuf/src/google/protobuf/test_util.cc +3345 -0
- data/ext/protoc/protobuf/src/google/protobuf/test_util.h +215 -0
- data/ext/protoc/protobuf/src/google/protobuf/test_util_lite.cc +1585 -0
- data/ext/protoc/protobuf/src/google/protobuf/test_util_lite.h +101 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/bad_utf8_string +1 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_message +0 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_message_oneof_implemented +0 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_packed_fields_message +0 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_oneof_implemented.txt +129 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy.txt +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy_oneof.txt +129 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data_pointy.txt +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/file.cc +194 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/file.h +97 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/googletest.cc +255 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/googletest.h +102 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/zcgunzip.cc +73 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/zcgzip.cc +79 -0
- data/ext/protoc/protobuf/src/google/protobuf/text_format.cc +1746 -0
- data/ext/protoc/protobuf/src/google/protobuf/text_format.h +473 -0
- data/ext/protoc/protobuf/src/google/protobuf/text_format_unittest.cc +1479 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest.proto +861 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_custom_options.proto +393 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto +50 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_empty.proto +37 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto +1046 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_import.proto +64 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_import_lite.proto +51 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_import_public.proto +40 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_import_public_lite.proto +42 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_lite.proto +384 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto +43 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_mset.proto +83 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_no_generic_services.proto +53 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_optimize_for.proto +66 -0
- data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set.cc +265 -0
- data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set.h +318 -0
- data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set_unittest.cc +599 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format.cc +1101 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format.h +336 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite.cc +471 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite.h +661 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite_inl.h +860 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format_unittest.cc +1120 -0
- data/ext/protoc/protobuf/src/solaris/libstdc++.la +51 -0
- data/ext/protoc/protobuf/vsprojects/config.h +29 -0
- data/ext/protoc/protobuf/vsprojects/convert2008to2005.sh +20 -0
- data/ext/protoc/protobuf/vsprojects/extract_includes.bat +50 -0
- data/ext/protoc/protobuf/vsprojects/libprotobuf-lite.vcproj +302 -0
- data/ext/protoc/protobuf/vsprojects/libprotobuf.vcproj +470 -0
- data/ext/protoc/protobuf/vsprojects/libprotoc.vcproj +466 -0
- data/ext/protoc/protobuf/vsprojects/lite-test.vcproj +305 -0
- data/ext/protoc/protobuf/vsprojects/protobuf.sln +92 -0
- data/ext/protoc/protobuf/vsprojects/protoc.vcproj +192 -0
- data/ext/protoc/protobuf/vsprojects/readme.txt +114 -0
- data/ext/protoc/protobuf/vsprojects/test_plugin.vcproj +209 -0
- data/ext/protoc/protobuf/vsprojects/tests.vcproj +681 -0
- data/lib/protoc/version.rb +1 -1
- metadata +480 -3
|
@@ -0,0 +1,764 @@
|
|
|
1
|
+
// Protocol Buffers - Google's data interchange format
|
|
2
|
+
// Copyright 2008 Google Inc. All rights reserved.
|
|
3
|
+
// https://developers.google.com/protocol-buffers/
|
|
4
|
+
//
|
|
5
|
+
// Redistribution and use in source and binary forms, with or without
|
|
6
|
+
// modification, are permitted provided that the following conditions are
|
|
7
|
+
// met:
|
|
8
|
+
//
|
|
9
|
+
// * Redistributions of source code must retain the above copyright
|
|
10
|
+
// notice, this list of conditions and the following disclaimer.
|
|
11
|
+
// * Redistributions in binary form must reproduce the above
|
|
12
|
+
// copyright notice, this list of conditions and the following disclaimer
|
|
13
|
+
// in the documentation and/or other materials provided with the
|
|
14
|
+
// distribution.
|
|
15
|
+
// * Neither the name of Google Inc. nor the names of its
|
|
16
|
+
// contributors may be used to endorse or promote products derived from
|
|
17
|
+
// this software without specific prior written permission.
|
|
18
|
+
//
|
|
19
|
+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
20
|
+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
21
|
+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
22
|
+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
23
|
+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
24
|
+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
25
|
+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
26
|
+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
27
|
+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
28
|
+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
30
|
+
|
|
31
|
+
// Author: kenton@google.com (Kenton Varda)
|
|
32
|
+
// Based on original Protocol Buffers design by
|
|
33
|
+
// Sanjay Ghemawat, Jeff Dean, and others.
|
|
34
|
+
//
|
|
35
|
+
// DynamicMessage is implemented by constructing a data structure which
|
|
36
|
+
// has roughly the same memory layout as a generated message would have.
|
|
37
|
+
// Then, we use GeneratedMessageReflection to implement our reflection
|
|
38
|
+
// interface. All the other operations we need to implement (e.g.
|
|
39
|
+
// parsing, copying, etc.) are already implemented in terms of
|
|
40
|
+
// Reflection, so the rest is easy.
|
|
41
|
+
//
|
|
42
|
+
// The up side of this strategy is that it's very efficient. We don't
|
|
43
|
+
// need to use hash_maps or generic representations of fields. The
|
|
44
|
+
// down side is that this is a low-level memory management hack which
|
|
45
|
+
// can be tricky to get right.
|
|
46
|
+
//
|
|
47
|
+
// As mentioned in the header, we only expose a DynamicMessageFactory
|
|
48
|
+
// publicly, not the DynamicMessage class itself. This is because
|
|
49
|
+
// GenericMessageReflection wants to have a pointer to a "default"
|
|
50
|
+
// copy of the class, with all fields initialized to their default
|
|
51
|
+
// values. We only want to construct one of these per message type,
|
|
52
|
+
// so DynamicMessageFactory stores a cache of default messages for
|
|
53
|
+
// each type it sees (each unique Descriptor pointer). The code
|
|
54
|
+
// refers to the "default" copy of the class as the "prototype".
|
|
55
|
+
//
|
|
56
|
+
// Note on memory allocation: This module often calls "operator new()"
|
|
57
|
+
// to allocate untyped memory, rather than calling something like
|
|
58
|
+
// "new uint8[]". This is because "operator new()" means "Give me some
|
|
59
|
+
// space which I can use as I please." while "new uint8[]" means "Give
|
|
60
|
+
// me an array of 8-bit integers.". In practice, the later may return
|
|
61
|
+
// a pointer that is not aligned correctly for general use. I believe
|
|
62
|
+
// Item 8 of "More Effective C++" discusses this in more detail, though
|
|
63
|
+
// I don't have the book on me right now so I'm not sure.
|
|
64
|
+
|
|
65
|
+
#include <algorithm>
|
|
66
|
+
#include <google/protobuf/stubs/hash.h>
|
|
67
|
+
|
|
68
|
+
#include <google/protobuf/stubs/common.h>
|
|
69
|
+
|
|
70
|
+
#include <google/protobuf/dynamic_message.h>
|
|
71
|
+
#include <google/protobuf/descriptor.h>
|
|
72
|
+
#include <google/protobuf/descriptor.pb.h>
|
|
73
|
+
#include <google/protobuf/generated_message_util.h>
|
|
74
|
+
#include <google/protobuf/generated_message_reflection.h>
|
|
75
|
+
#include <google/protobuf/reflection_ops.h>
|
|
76
|
+
#include <google/protobuf/repeated_field.h>
|
|
77
|
+
#include <google/protobuf/extension_set.h>
|
|
78
|
+
#include <google/protobuf/wire_format.h>
|
|
79
|
+
|
|
80
|
+
namespace google {
|
|
81
|
+
namespace protobuf {
|
|
82
|
+
|
|
83
|
+
using internal::WireFormat;
|
|
84
|
+
using internal::ExtensionSet;
|
|
85
|
+
using internal::GeneratedMessageReflection;
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
// ===================================================================
|
|
89
|
+
// Some helper tables and functions...
|
|
90
|
+
|
|
91
|
+
namespace {
|
|
92
|
+
|
|
93
|
+
// Compute the byte size of the in-memory representation of the field.
|
|
94
|
+
int FieldSpaceUsed(const FieldDescriptor* field) {
|
|
95
|
+
typedef FieldDescriptor FD; // avoid line wrapping
|
|
96
|
+
if (field->label() == FD::LABEL_REPEATED) {
|
|
97
|
+
switch (field->cpp_type()) {
|
|
98
|
+
case FD::CPPTYPE_INT32 : return sizeof(RepeatedField<int32 >);
|
|
99
|
+
case FD::CPPTYPE_INT64 : return sizeof(RepeatedField<int64 >);
|
|
100
|
+
case FD::CPPTYPE_UINT32 : return sizeof(RepeatedField<uint32 >);
|
|
101
|
+
case FD::CPPTYPE_UINT64 : return sizeof(RepeatedField<uint64 >);
|
|
102
|
+
case FD::CPPTYPE_DOUBLE : return sizeof(RepeatedField<double >);
|
|
103
|
+
case FD::CPPTYPE_FLOAT : return sizeof(RepeatedField<float >);
|
|
104
|
+
case FD::CPPTYPE_BOOL : return sizeof(RepeatedField<bool >);
|
|
105
|
+
case FD::CPPTYPE_ENUM : return sizeof(RepeatedField<int >);
|
|
106
|
+
case FD::CPPTYPE_MESSAGE: return sizeof(RepeatedPtrField<Message>);
|
|
107
|
+
|
|
108
|
+
case FD::CPPTYPE_STRING:
|
|
109
|
+
switch (field->options().ctype()) {
|
|
110
|
+
default: // TODO(kenton): Support other string reps.
|
|
111
|
+
case FieldOptions::STRING:
|
|
112
|
+
return sizeof(RepeatedPtrField<string>);
|
|
113
|
+
}
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
} else {
|
|
117
|
+
switch (field->cpp_type()) {
|
|
118
|
+
case FD::CPPTYPE_INT32 : return sizeof(int32 );
|
|
119
|
+
case FD::CPPTYPE_INT64 : return sizeof(int64 );
|
|
120
|
+
case FD::CPPTYPE_UINT32 : return sizeof(uint32 );
|
|
121
|
+
case FD::CPPTYPE_UINT64 : return sizeof(uint64 );
|
|
122
|
+
case FD::CPPTYPE_DOUBLE : return sizeof(double );
|
|
123
|
+
case FD::CPPTYPE_FLOAT : return sizeof(float );
|
|
124
|
+
case FD::CPPTYPE_BOOL : return sizeof(bool );
|
|
125
|
+
case FD::CPPTYPE_ENUM : return sizeof(int );
|
|
126
|
+
|
|
127
|
+
case FD::CPPTYPE_MESSAGE:
|
|
128
|
+
return sizeof(Message*);
|
|
129
|
+
|
|
130
|
+
case FD::CPPTYPE_STRING:
|
|
131
|
+
switch (field->options().ctype()) {
|
|
132
|
+
default: // TODO(kenton): Support other string reps.
|
|
133
|
+
case FieldOptions::STRING:
|
|
134
|
+
return sizeof(string*);
|
|
135
|
+
}
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
GOOGLE_LOG(DFATAL) << "Can't get here.";
|
|
141
|
+
return 0;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Compute the byte size of in-memory representation of the oneof fields
|
|
145
|
+
// in default oneof instance.
|
|
146
|
+
int OneofFieldSpaceUsed(const FieldDescriptor* field) {
|
|
147
|
+
typedef FieldDescriptor FD; // avoid line wrapping
|
|
148
|
+
switch (field->cpp_type()) {
|
|
149
|
+
case FD::CPPTYPE_INT32 : return sizeof(int32 );
|
|
150
|
+
case FD::CPPTYPE_INT64 : return sizeof(int64 );
|
|
151
|
+
case FD::CPPTYPE_UINT32 : return sizeof(uint32 );
|
|
152
|
+
case FD::CPPTYPE_UINT64 : return sizeof(uint64 );
|
|
153
|
+
case FD::CPPTYPE_DOUBLE : return sizeof(double );
|
|
154
|
+
case FD::CPPTYPE_FLOAT : return sizeof(float );
|
|
155
|
+
case FD::CPPTYPE_BOOL : return sizeof(bool );
|
|
156
|
+
case FD::CPPTYPE_ENUM : return sizeof(int );
|
|
157
|
+
|
|
158
|
+
case FD::CPPTYPE_MESSAGE:
|
|
159
|
+
return sizeof(Message*);
|
|
160
|
+
|
|
161
|
+
case FD::CPPTYPE_STRING:
|
|
162
|
+
switch (field->options().ctype()) {
|
|
163
|
+
default:
|
|
164
|
+
case FieldOptions::STRING:
|
|
165
|
+
return sizeof(string*);
|
|
166
|
+
}
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
GOOGLE_LOG(DFATAL) << "Can't get here.";
|
|
171
|
+
return 0;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
inline int DivideRoundingUp(int i, int j) {
|
|
175
|
+
return (i + (j - 1)) / j;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
static const int kSafeAlignment = sizeof(uint64);
|
|
179
|
+
static const int kMaxOneofUnionSize = sizeof(uint64);
|
|
180
|
+
|
|
181
|
+
inline int AlignTo(int offset, int alignment) {
|
|
182
|
+
return DivideRoundingUp(offset, alignment) * alignment;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Rounds the given byte offset up to the next offset aligned such that any
|
|
186
|
+
// type may be stored at it.
|
|
187
|
+
inline int AlignOffset(int offset) {
|
|
188
|
+
return AlignTo(offset, kSafeAlignment);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
#define bitsizeof(T) (sizeof(T) * 8)
|
|
192
|
+
|
|
193
|
+
} // namespace
|
|
194
|
+
|
|
195
|
+
// ===================================================================
|
|
196
|
+
|
|
197
|
+
class DynamicMessage : public Message {
|
|
198
|
+
public:
|
|
199
|
+
struct TypeInfo {
|
|
200
|
+
int size;
|
|
201
|
+
int has_bits_offset;
|
|
202
|
+
int oneof_case_offset;
|
|
203
|
+
int unknown_fields_offset;
|
|
204
|
+
int extensions_offset;
|
|
205
|
+
|
|
206
|
+
// Not owned by the TypeInfo.
|
|
207
|
+
DynamicMessageFactory* factory; // The factory that created this object.
|
|
208
|
+
const DescriptorPool* pool; // The factory's DescriptorPool.
|
|
209
|
+
const Descriptor* type; // Type of this DynamicMessage.
|
|
210
|
+
|
|
211
|
+
// Warning: The order in which the following pointers are defined is
|
|
212
|
+
// important (the prototype must be deleted *before* the offsets).
|
|
213
|
+
scoped_array<int> offsets;
|
|
214
|
+
scoped_ptr<const GeneratedMessageReflection> reflection;
|
|
215
|
+
// Don't use a scoped_ptr to hold the prototype: the destructor for
|
|
216
|
+
// DynamicMessage needs to know whether it is the prototype, and does so by
|
|
217
|
+
// looking back at this field. This would assume details about the
|
|
218
|
+
// implementation of scoped_ptr.
|
|
219
|
+
const DynamicMessage* prototype;
|
|
220
|
+
void* default_oneof_instance;
|
|
221
|
+
|
|
222
|
+
TypeInfo() : prototype(NULL), default_oneof_instance(NULL) {}
|
|
223
|
+
|
|
224
|
+
~TypeInfo() {
|
|
225
|
+
delete prototype;
|
|
226
|
+
operator delete(default_oneof_instance);
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
DynamicMessage(const TypeInfo* type_info);
|
|
231
|
+
~DynamicMessage();
|
|
232
|
+
|
|
233
|
+
// Called on the prototype after construction to initialize message fields.
|
|
234
|
+
void CrossLinkPrototypes();
|
|
235
|
+
|
|
236
|
+
// implements Message ----------------------------------------------
|
|
237
|
+
|
|
238
|
+
Message* New() const;
|
|
239
|
+
|
|
240
|
+
int GetCachedSize() const;
|
|
241
|
+
void SetCachedSize(int size) const;
|
|
242
|
+
|
|
243
|
+
Metadata GetMetadata() const;
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
private:
|
|
247
|
+
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessage);
|
|
248
|
+
|
|
249
|
+
inline bool is_prototype() const {
|
|
250
|
+
return type_info_->prototype == this ||
|
|
251
|
+
// If type_info_->prototype is NULL, then we must be constructing
|
|
252
|
+
// the prototype now, which means we must be the prototype.
|
|
253
|
+
type_info_->prototype == NULL;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
inline void* OffsetToPointer(int offset) {
|
|
257
|
+
return reinterpret_cast<uint8*>(this) + offset;
|
|
258
|
+
}
|
|
259
|
+
inline const void* OffsetToPointer(int offset) const {
|
|
260
|
+
return reinterpret_cast<const uint8*>(this) + offset;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const TypeInfo* type_info_;
|
|
264
|
+
|
|
265
|
+
// TODO(kenton): Make this an atomic<int> when C++ supports it.
|
|
266
|
+
mutable int cached_byte_size_;
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
DynamicMessage::DynamicMessage(const TypeInfo* type_info)
|
|
270
|
+
: type_info_(type_info),
|
|
271
|
+
cached_byte_size_(0) {
|
|
272
|
+
// We need to call constructors for various fields manually and set
|
|
273
|
+
// default values where appropriate. We use placement new to call
|
|
274
|
+
// constructors. If you haven't heard of placement new, I suggest Googling
|
|
275
|
+
// it now. We use placement new even for primitive types that don't have
|
|
276
|
+
// constructors for consistency. (In theory, placement new should be used
|
|
277
|
+
// any time you are trying to convert untyped memory to typed memory, though
|
|
278
|
+
// in practice that's not strictly necessary for types that don't have a
|
|
279
|
+
// constructor.)
|
|
280
|
+
|
|
281
|
+
const Descriptor* descriptor = type_info_->type;
|
|
282
|
+
|
|
283
|
+
// Initialize oneof cases.
|
|
284
|
+
for (int i = 0 ; i < descriptor->oneof_decl_count(); ++i) {
|
|
285
|
+
new(OffsetToPointer(type_info_->oneof_case_offset + sizeof(uint32) * i))
|
|
286
|
+
uint32(0);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
new(OffsetToPointer(type_info_->unknown_fields_offset)) UnknownFieldSet;
|
|
290
|
+
|
|
291
|
+
if (type_info_->extensions_offset != -1) {
|
|
292
|
+
new(OffsetToPointer(type_info_->extensions_offset)) ExtensionSet;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
for (int i = 0; i < descriptor->field_count(); i++) {
|
|
296
|
+
const FieldDescriptor* field = descriptor->field(i);
|
|
297
|
+
void* field_ptr = OffsetToPointer(type_info_->offsets[i]);
|
|
298
|
+
if (field->containing_oneof()) {
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
switch (field->cpp_type()) {
|
|
302
|
+
#define HANDLE_TYPE(CPPTYPE, TYPE) \
|
|
303
|
+
case FieldDescriptor::CPPTYPE_##CPPTYPE: \
|
|
304
|
+
if (!field->is_repeated()) { \
|
|
305
|
+
new(field_ptr) TYPE(field->default_value_##TYPE()); \
|
|
306
|
+
} else { \
|
|
307
|
+
new(field_ptr) RepeatedField<TYPE>(); \
|
|
308
|
+
} \
|
|
309
|
+
break;
|
|
310
|
+
|
|
311
|
+
HANDLE_TYPE(INT32 , int32 );
|
|
312
|
+
HANDLE_TYPE(INT64 , int64 );
|
|
313
|
+
HANDLE_TYPE(UINT32, uint32);
|
|
314
|
+
HANDLE_TYPE(UINT64, uint64);
|
|
315
|
+
HANDLE_TYPE(DOUBLE, double);
|
|
316
|
+
HANDLE_TYPE(FLOAT , float );
|
|
317
|
+
HANDLE_TYPE(BOOL , bool );
|
|
318
|
+
#undef HANDLE_TYPE
|
|
319
|
+
|
|
320
|
+
case FieldDescriptor::CPPTYPE_ENUM:
|
|
321
|
+
if (!field->is_repeated()) {
|
|
322
|
+
new(field_ptr) int(field->default_value_enum()->number());
|
|
323
|
+
} else {
|
|
324
|
+
new(field_ptr) RepeatedField<int>();
|
|
325
|
+
}
|
|
326
|
+
break;
|
|
327
|
+
|
|
328
|
+
case FieldDescriptor::CPPTYPE_STRING:
|
|
329
|
+
switch (field->options().ctype()) {
|
|
330
|
+
default: // TODO(kenton): Support other string reps.
|
|
331
|
+
case FieldOptions::STRING:
|
|
332
|
+
if (!field->is_repeated()) {
|
|
333
|
+
if (is_prototype()) {
|
|
334
|
+
new(field_ptr) const string*(&field->default_value_string());
|
|
335
|
+
} else {
|
|
336
|
+
string* default_value =
|
|
337
|
+
*reinterpret_cast<string* const*>(
|
|
338
|
+
type_info_->prototype->OffsetToPointer(
|
|
339
|
+
type_info_->offsets[i]));
|
|
340
|
+
new(field_ptr) string*(default_value);
|
|
341
|
+
}
|
|
342
|
+
} else {
|
|
343
|
+
new(field_ptr) RepeatedPtrField<string>();
|
|
344
|
+
}
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
break;
|
|
348
|
+
|
|
349
|
+
case FieldDescriptor::CPPTYPE_MESSAGE: {
|
|
350
|
+
if (!field->is_repeated()) {
|
|
351
|
+
new(field_ptr) Message*(NULL);
|
|
352
|
+
} else {
|
|
353
|
+
new(field_ptr) RepeatedPtrField<Message>();
|
|
354
|
+
}
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
DynamicMessage::~DynamicMessage() {
|
|
362
|
+
const Descriptor* descriptor = type_info_->type;
|
|
363
|
+
|
|
364
|
+
reinterpret_cast<UnknownFieldSet*>(
|
|
365
|
+
OffsetToPointer(type_info_->unknown_fields_offset))->~UnknownFieldSet();
|
|
366
|
+
|
|
367
|
+
if (type_info_->extensions_offset != -1) {
|
|
368
|
+
reinterpret_cast<ExtensionSet*>(
|
|
369
|
+
OffsetToPointer(type_info_->extensions_offset))->~ExtensionSet();
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// We need to manually run the destructors for repeated fields and strings,
|
|
373
|
+
// just as we ran their constructors in the the DynamicMessage constructor.
|
|
374
|
+
// We also need to manually delete oneof fields if it is set and is string
|
|
375
|
+
// or message.
|
|
376
|
+
// Additionally, if any singular embedded messages have been allocated, we
|
|
377
|
+
// need to delete them, UNLESS we are the prototype message of this type,
|
|
378
|
+
// in which case any embedded messages are other prototypes and shouldn't
|
|
379
|
+
// be touched.
|
|
380
|
+
for (int i = 0; i < descriptor->field_count(); i++) {
|
|
381
|
+
const FieldDescriptor* field = descriptor->field(i);
|
|
382
|
+
if (field->containing_oneof()) {
|
|
383
|
+
void* field_ptr = OffsetToPointer(
|
|
384
|
+
type_info_->oneof_case_offset
|
|
385
|
+
+ sizeof(uint32) * field->containing_oneof()->index());
|
|
386
|
+
if (*(reinterpret_cast<const uint32*>(field_ptr)) ==
|
|
387
|
+
field->number()) {
|
|
388
|
+
field_ptr = OffsetToPointer(type_info_->offsets[
|
|
389
|
+
descriptor->field_count() + field->containing_oneof()->index()]);
|
|
390
|
+
if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) {
|
|
391
|
+
switch (field->options().ctype()) {
|
|
392
|
+
default:
|
|
393
|
+
case FieldOptions::STRING:
|
|
394
|
+
delete *reinterpret_cast<string**>(field_ptr);
|
|
395
|
+
break;
|
|
396
|
+
}
|
|
397
|
+
} else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
|
|
398
|
+
delete *reinterpret_cast<Message**>(field_ptr);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
continue;
|
|
402
|
+
}
|
|
403
|
+
void* field_ptr = OffsetToPointer(type_info_->offsets[i]);
|
|
404
|
+
|
|
405
|
+
if (field->is_repeated()) {
|
|
406
|
+
switch (field->cpp_type()) {
|
|
407
|
+
#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
|
|
408
|
+
case FieldDescriptor::CPPTYPE_##UPPERCASE : \
|
|
409
|
+
reinterpret_cast<RepeatedField<LOWERCASE>*>(field_ptr) \
|
|
410
|
+
->~RepeatedField<LOWERCASE>(); \
|
|
411
|
+
break
|
|
412
|
+
|
|
413
|
+
HANDLE_TYPE( INT32, int32);
|
|
414
|
+
HANDLE_TYPE( INT64, int64);
|
|
415
|
+
HANDLE_TYPE(UINT32, uint32);
|
|
416
|
+
HANDLE_TYPE(UINT64, uint64);
|
|
417
|
+
HANDLE_TYPE(DOUBLE, double);
|
|
418
|
+
HANDLE_TYPE( FLOAT, float);
|
|
419
|
+
HANDLE_TYPE( BOOL, bool);
|
|
420
|
+
HANDLE_TYPE( ENUM, int);
|
|
421
|
+
#undef HANDLE_TYPE
|
|
422
|
+
|
|
423
|
+
case FieldDescriptor::CPPTYPE_STRING:
|
|
424
|
+
switch (field->options().ctype()) {
|
|
425
|
+
default: // TODO(kenton): Support other string reps.
|
|
426
|
+
case FieldOptions::STRING:
|
|
427
|
+
reinterpret_cast<RepeatedPtrField<string>*>(field_ptr)
|
|
428
|
+
->~RepeatedPtrField<string>();
|
|
429
|
+
break;
|
|
430
|
+
}
|
|
431
|
+
break;
|
|
432
|
+
|
|
433
|
+
case FieldDescriptor::CPPTYPE_MESSAGE:
|
|
434
|
+
reinterpret_cast<RepeatedPtrField<Message>*>(field_ptr)
|
|
435
|
+
->~RepeatedPtrField<Message>();
|
|
436
|
+
break;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
} else if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) {
|
|
440
|
+
switch (field->options().ctype()) {
|
|
441
|
+
default: // TODO(kenton): Support other string reps.
|
|
442
|
+
case FieldOptions::STRING: {
|
|
443
|
+
string* ptr = *reinterpret_cast<string**>(field_ptr);
|
|
444
|
+
if (ptr != &field->default_value_string()) {
|
|
445
|
+
delete ptr;
|
|
446
|
+
}
|
|
447
|
+
break;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
} else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
|
|
451
|
+
if (!is_prototype()) {
|
|
452
|
+
Message* message = *reinterpret_cast<Message**>(field_ptr);
|
|
453
|
+
if (message != NULL) {
|
|
454
|
+
delete message;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
void DynamicMessage::CrossLinkPrototypes() {
|
|
462
|
+
// This should only be called on the prototype message.
|
|
463
|
+
GOOGLE_CHECK(is_prototype());
|
|
464
|
+
|
|
465
|
+
DynamicMessageFactory* factory = type_info_->factory;
|
|
466
|
+
const Descriptor* descriptor = type_info_->type;
|
|
467
|
+
|
|
468
|
+
// Cross-link default messages.
|
|
469
|
+
for (int i = 0; i < descriptor->field_count(); i++) {
|
|
470
|
+
const FieldDescriptor* field = descriptor->field(i);
|
|
471
|
+
void* field_ptr = OffsetToPointer(type_info_->offsets[i]);
|
|
472
|
+
if (field->containing_oneof()) {
|
|
473
|
+
field_ptr = reinterpret_cast<uint8*>(
|
|
474
|
+
type_info_->default_oneof_instance) + type_info_->offsets[i];
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
|
|
478
|
+
!field->is_repeated()) {
|
|
479
|
+
// For fields with message types, we need to cross-link with the
|
|
480
|
+
// prototype for the field's type.
|
|
481
|
+
// For singular fields, the field is just a pointer which should
|
|
482
|
+
// point to the prototype.
|
|
483
|
+
*reinterpret_cast<const Message**>(field_ptr) =
|
|
484
|
+
factory->GetPrototypeNoLock(field->message_type());
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
Message* DynamicMessage::New() const {
|
|
490
|
+
void* new_base = operator new(type_info_->size);
|
|
491
|
+
memset(new_base, 0, type_info_->size);
|
|
492
|
+
return new(new_base) DynamicMessage(type_info_);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
int DynamicMessage::GetCachedSize() const {
|
|
496
|
+
return cached_byte_size_;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
void DynamicMessage::SetCachedSize(int size) const {
|
|
500
|
+
// This is theoretically not thread-compatible, but in practice it works
|
|
501
|
+
// because if multiple threads write this simultaneously, they will be
|
|
502
|
+
// writing the exact same value.
|
|
503
|
+
GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
|
|
504
|
+
cached_byte_size_ = size;
|
|
505
|
+
GOOGLE_SAFE_CONCURRENT_WRITES_END();
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
Metadata DynamicMessage::GetMetadata() const {
|
|
509
|
+
Metadata metadata;
|
|
510
|
+
metadata.descriptor = type_info_->type;
|
|
511
|
+
metadata.reflection = type_info_->reflection.get();
|
|
512
|
+
return metadata;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// ===================================================================
|
|
516
|
+
|
|
517
|
+
struct DynamicMessageFactory::PrototypeMap {
|
|
518
|
+
typedef hash_map<const Descriptor*, const DynamicMessage::TypeInfo*> Map;
|
|
519
|
+
Map map_;
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
DynamicMessageFactory::DynamicMessageFactory()
|
|
523
|
+
: pool_(NULL), delegate_to_generated_factory_(false),
|
|
524
|
+
prototypes_(new PrototypeMap) {
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
DynamicMessageFactory::DynamicMessageFactory(const DescriptorPool* pool)
|
|
528
|
+
: pool_(pool), delegate_to_generated_factory_(false),
|
|
529
|
+
prototypes_(new PrototypeMap) {
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
DynamicMessageFactory::~DynamicMessageFactory() {
|
|
533
|
+
for (PrototypeMap::Map::iterator iter = prototypes_->map_.begin();
|
|
534
|
+
iter != prototypes_->map_.end(); ++iter) {
|
|
535
|
+
DeleteDefaultOneofInstance(iter->second->type,
|
|
536
|
+
iter->second->offsets.get(),
|
|
537
|
+
iter->second->default_oneof_instance);
|
|
538
|
+
delete iter->second;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
const Message* DynamicMessageFactory::GetPrototype(const Descriptor* type) {
|
|
543
|
+
MutexLock lock(&prototypes_mutex_);
|
|
544
|
+
return GetPrototypeNoLock(type);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
const Message* DynamicMessageFactory::GetPrototypeNoLock(
|
|
548
|
+
const Descriptor* type) {
|
|
549
|
+
if (delegate_to_generated_factory_ &&
|
|
550
|
+
type->file()->pool() == DescriptorPool::generated_pool()) {
|
|
551
|
+
return MessageFactory::generated_factory()->GetPrototype(type);
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
const DynamicMessage::TypeInfo** target = &prototypes_->map_[type];
|
|
555
|
+
if (*target != NULL) {
|
|
556
|
+
// Already exists.
|
|
557
|
+
return (*target)->prototype;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
DynamicMessage::TypeInfo* type_info = new DynamicMessage::TypeInfo;
|
|
561
|
+
*target = type_info;
|
|
562
|
+
|
|
563
|
+
type_info->type = type;
|
|
564
|
+
type_info->pool = (pool_ == NULL) ? type->file()->pool() : pool_;
|
|
565
|
+
type_info->factory = this;
|
|
566
|
+
|
|
567
|
+
// We need to construct all the structures passed to
|
|
568
|
+
// GeneratedMessageReflection's constructor. This includes:
|
|
569
|
+
// - A block of memory that contains space for all the message's fields.
|
|
570
|
+
// - An array of integers indicating the byte offset of each field within
|
|
571
|
+
// this block.
|
|
572
|
+
// - A big bitfield containing a bit for each field indicating whether
|
|
573
|
+
// or not that field is set.
|
|
574
|
+
|
|
575
|
+
// Compute size and offsets.
|
|
576
|
+
int* offsets = new int[type->field_count() + type->oneof_decl_count()];
|
|
577
|
+
type_info->offsets.reset(offsets);
|
|
578
|
+
|
|
579
|
+
// Decide all field offsets by packing in order.
|
|
580
|
+
// We place the DynamicMessage object itself at the beginning of the allocated
|
|
581
|
+
// space.
|
|
582
|
+
int size = sizeof(DynamicMessage);
|
|
583
|
+
size = AlignOffset(size);
|
|
584
|
+
|
|
585
|
+
// Next the has_bits, which is an array of uint32s.
|
|
586
|
+
type_info->has_bits_offset = size;
|
|
587
|
+
int has_bits_array_size =
|
|
588
|
+
DivideRoundingUp(type->field_count(), bitsizeof(uint32));
|
|
589
|
+
size += has_bits_array_size * sizeof(uint32);
|
|
590
|
+
size = AlignOffset(size);
|
|
591
|
+
|
|
592
|
+
// The oneof_case, if any. It is an array of uint32s.
|
|
593
|
+
if (type->oneof_decl_count() > 0) {
|
|
594
|
+
type_info->oneof_case_offset = size;
|
|
595
|
+
size += type->oneof_decl_count() * sizeof(uint32);
|
|
596
|
+
size = AlignOffset(size);
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
// The ExtensionSet, if any.
|
|
600
|
+
if (type->extension_range_count() > 0) {
|
|
601
|
+
type_info->extensions_offset = size;
|
|
602
|
+
size += sizeof(ExtensionSet);
|
|
603
|
+
size = AlignOffset(size);
|
|
604
|
+
} else {
|
|
605
|
+
// No extensions.
|
|
606
|
+
type_info->extensions_offset = -1;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// All the fields.
|
|
610
|
+
for (int i = 0; i < type->field_count(); i++) {
|
|
611
|
+
// Make sure field is aligned to avoid bus errors.
|
|
612
|
+
// Oneof fields do not use any space.
|
|
613
|
+
if (!type->field(i)->containing_oneof()) {
|
|
614
|
+
int field_size = FieldSpaceUsed(type->field(i));
|
|
615
|
+
size = AlignTo(size, min(kSafeAlignment, field_size));
|
|
616
|
+
offsets[i] = size;
|
|
617
|
+
size += field_size;
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// The oneofs.
|
|
622
|
+
for (int i = 0; i < type->oneof_decl_count(); i++) {
|
|
623
|
+
size = AlignTo(size, kSafeAlignment);
|
|
624
|
+
offsets[type->field_count() + i] = size;
|
|
625
|
+
size += kMaxOneofUnionSize;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
// Add the UnknownFieldSet to the end.
|
|
629
|
+
size = AlignOffset(size);
|
|
630
|
+
type_info->unknown_fields_offset = size;
|
|
631
|
+
size += sizeof(UnknownFieldSet);
|
|
632
|
+
|
|
633
|
+
// Align the final size to make sure no clever allocators think that
|
|
634
|
+
// alignment is not necessary.
|
|
635
|
+
size = AlignOffset(size);
|
|
636
|
+
type_info->size = size;
|
|
637
|
+
|
|
638
|
+
// Allocate the prototype.
|
|
639
|
+
void* base = operator new(size);
|
|
640
|
+
memset(base, 0, size);
|
|
641
|
+
DynamicMessage* prototype = new(base) DynamicMessage(type_info);
|
|
642
|
+
type_info->prototype = prototype;
|
|
643
|
+
|
|
644
|
+
// Construct the reflection object.
|
|
645
|
+
if (type->oneof_decl_count() > 0) {
|
|
646
|
+
// Compute the size of default oneof instance and offsets of default
|
|
647
|
+
// oneof fields.
|
|
648
|
+
int oneof_size = 0;
|
|
649
|
+
for (int i = 0; i < type->oneof_decl_count(); i++) {
|
|
650
|
+
for (int j = 0; j < type->oneof_decl(i)->field_count(); j++) {
|
|
651
|
+
const FieldDescriptor* field = type->oneof_decl(i)->field(j);
|
|
652
|
+
int field_size = OneofFieldSpaceUsed(field);
|
|
653
|
+
oneof_size = AlignTo(oneof_size, min(kSafeAlignment, field_size));
|
|
654
|
+
offsets[field->index()] = oneof_size;
|
|
655
|
+
oneof_size += field_size;
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
// Construct default oneof instance.
|
|
659
|
+
type_info->default_oneof_instance = ::operator new(oneof_size);
|
|
660
|
+
ConstructDefaultOneofInstance(type_info->type,
|
|
661
|
+
type_info->offsets.get(),
|
|
662
|
+
type_info->default_oneof_instance);
|
|
663
|
+
type_info->reflection.reset(
|
|
664
|
+
new GeneratedMessageReflection(
|
|
665
|
+
type_info->type,
|
|
666
|
+
type_info->prototype,
|
|
667
|
+
type_info->offsets.get(),
|
|
668
|
+
type_info->has_bits_offset,
|
|
669
|
+
type_info->unknown_fields_offset,
|
|
670
|
+
type_info->extensions_offset,
|
|
671
|
+
type_info->default_oneof_instance,
|
|
672
|
+
type_info->oneof_case_offset,
|
|
673
|
+
type_info->pool,
|
|
674
|
+
this,
|
|
675
|
+
type_info->size));
|
|
676
|
+
} else {
|
|
677
|
+
type_info->reflection.reset(
|
|
678
|
+
new GeneratedMessageReflection(
|
|
679
|
+
type_info->type,
|
|
680
|
+
type_info->prototype,
|
|
681
|
+
type_info->offsets.get(),
|
|
682
|
+
type_info->has_bits_offset,
|
|
683
|
+
type_info->unknown_fields_offset,
|
|
684
|
+
type_info->extensions_offset,
|
|
685
|
+
type_info->pool,
|
|
686
|
+
this,
|
|
687
|
+
type_info->size));
|
|
688
|
+
}
|
|
689
|
+
// Cross link prototypes.
|
|
690
|
+
prototype->CrossLinkPrototypes();
|
|
691
|
+
|
|
692
|
+
return prototype;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
void DynamicMessageFactory::ConstructDefaultOneofInstance(
|
|
696
|
+
const Descriptor* type,
|
|
697
|
+
const int offsets[],
|
|
698
|
+
void* default_oneof_instance) {
|
|
699
|
+
for (int i = 0; i < type->oneof_decl_count(); i++) {
|
|
700
|
+
for (int j = 0; j < type->oneof_decl(i)->field_count(); j++) {
|
|
701
|
+
const FieldDescriptor* field = type->oneof_decl(i)->field(j);
|
|
702
|
+
void* field_ptr = reinterpret_cast<uint8*>(
|
|
703
|
+
default_oneof_instance) + offsets[field->index()];
|
|
704
|
+
switch (field->cpp_type()) {
|
|
705
|
+
#define HANDLE_TYPE(CPPTYPE, TYPE) \
|
|
706
|
+
case FieldDescriptor::CPPTYPE_##CPPTYPE: \
|
|
707
|
+
new(field_ptr) TYPE(field->default_value_##TYPE()); \
|
|
708
|
+
break;
|
|
709
|
+
|
|
710
|
+
HANDLE_TYPE(INT32 , int32 );
|
|
711
|
+
HANDLE_TYPE(INT64 , int64 );
|
|
712
|
+
HANDLE_TYPE(UINT32, uint32);
|
|
713
|
+
HANDLE_TYPE(UINT64, uint64);
|
|
714
|
+
HANDLE_TYPE(DOUBLE, double);
|
|
715
|
+
HANDLE_TYPE(FLOAT , float );
|
|
716
|
+
HANDLE_TYPE(BOOL , bool );
|
|
717
|
+
#undef HANDLE_TYPE
|
|
718
|
+
|
|
719
|
+
case FieldDescriptor::CPPTYPE_ENUM:
|
|
720
|
+
new(field_ptr) int(field->default_value_enum()->number());
|
|
721
|
+
break;
|
|
722
|
+
case FieldDescriptor::CPPTYPE_STRING:
|
|
723
|
+
switch (field->options().ctype()) {
|
|
724
|
+
default:
|
|
725
|
+
case FieldOptions::STRING:
|
|
726
|
+
if (field->has_default_value()) {
|
|
727
|
+
new(field_ptr) const string*(&field->default_value_string());
|
|
728
|
+
} else {
|
|
729
|
+
new(field_ptr) string*(
|
|
730
|
+
const_cast<string*>(&internal::GetEmptyString()));
|
|
731
|
+
}
|
|
732
|
+
break;
|
|
733
|
+
}
|
|
734
|
+
break;
|
|
735
|
+
|
|
736
|
+
case FieldDescriptor::CPPTYPE_MESSAGE: {
|
|
737
|
+
new(field_ptr) Message*(NULL);
|
|
738
|
+
break;
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
void DynamicMessageFactory::DeleteDefaultOneofInstance(
|
|
746
|
+
const Descriptor* type,
|
|
747
|
+
const int offsets[],
|
|
748
|
+
void* default_oneof_instance) {
|
|
749
|
+
for (int i = 0; i < type->oneof_decl_count(); i++) {
|
|
750
|
+
for (int j = 0; j < type->oneof_decl(i)->field_count(); j++) {
|
|
751
|
+
const FieldDescriptor* field = type->oneof_decl(i)->field(j);
|
|
752
|
+
if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) {
|
|
753
|
+
switch (field->options().ctype()) {
|
|
754
|
+
default:
|
|
755
|
+
case FieldOptions::STRING:
|
|
756
|
+
break;
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
} // namespace protobuf
|
|
764
|
+
} // namespace google
|