diff --git a/BUILD b/BUILD index 07e8317d6f..f887912765 100644 --- a/BUILD +++ b/BUILD @@ -190,7 +190,6 @@ cc_library( "src/google/protobuf/service.cc", "src/google/protobuf/source_context.pb.cc", "src/google/protobuf/struct.pb.cc", - "src/google/protobuf/stubs/mathlimits.cc", "src/google/protobuf/stubs/substitute.cc", "src/google/protobuf/text_format.cc", "src/google/protobuf/timestamp.pb.cc", diff --git a/cmake/libprotobuf.cmake b/cmake/libprotobuf.cmake index 710b34c6da..0c12596c23 100644 --- a/cmake/libprotobuf.cmake +++ b/cmake/libprotobuf.cmake @@ -23,7 +23,6 @@ set(libprotobuf_files ${protobuf_source_dir}/src/google/protobuf/service.cc ${protobuf_source_dir}/src/google/protobuf/source_context.pb.cc ${protobuf_source_dir}/src/google/protobuf/struct.pb.cc - ${protobuf_source_dir}/src/google/protobuf/stubs/mathlimits.cc ${protobuf_source_dir}/src/google/protobuf/stubs/substitute.cc ${protobuf_source_dir}/src/google/protobuf/text_format.cc ${protobuf_source_dir}/src/google/protobuf/timestamp.pb.cc @@ -77,7 +76,6 @@ set(libprotobuf_includes ${protobuf_source_dir}/src/google/protobuf/service.h ${protobuf_source_dir}/src/google/protobuf/source_context.pb.h ${protobuf_source_dir}/src/google/protobuf/struct.pb.h - ${protobuf_source_dir}/src/google/protobuf/stubs/mathlimits.h ${protobuf_source_dir}/src/google/protobuf/stubs/substitute.h ${protobuf_source_dir}/src/google/protobuf/text_format.h ${protobuf_source_dir}/src/google/protobuf/timestamp.pb.h diff --git a/conformance/ConformanceJava.java b/conformance/ConformanceJava.java index c5b3f4e163..fa4dfb774d 100644 --- a/conformance/ConformanceJava.java +++ b/conformance/ConformanceJava.java @@ -1,3 +1,33 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + import com.google.protobuf.AbstractMessage; import com.google.protobuf.ByteString; import com.google.protobuf.CodedInputStream; diff --git a/conformance/ConformanceJavaLite.java b/conformance/ConformanceJavaLite.java index 016f79326f..147738dcbe 100644 --- a/conformance/ConformanceJavaLite.java +++ b/conformance/ConformanceJavaLite.java @@ -1,3 +1,32 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import com.google.protobuf.conformance.Conformance; import com.google.protobuf.InvalidProtocolBufferException; diff --git a/conformance/binary_json_conformance_suite.cc b/conformance/binary_json_conformance_suite.cc index c1747bdb53..d297ae362f 100644 --- a/conformance/binary_json_conformance_suite.cc +++ b/conformance/binary_json_conformance_suite.cc @@ -29,18 +29,18 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "binary_json_conformance_suite.h" -#include "conformance_test.h" -#include "third_party/jsoncpp/json.h" - -#include -#include -#include -#include #include +#include #include #include -#include +#include "third_party/jsoncpp/json.h" +#include "conformance_test.h" +#include +#include +#include + +namespace proto2_messages = protobuf_test_messages::proto2; using conformance::ConformanceRequest; using conformance::ConformanceResponse; @@ -48,11 +48,11 @@ using conformance::WireFormat; using google::protobuf::Descriptor; using google::protobuf::FieldDescriptor; using google::protobuf::Message; -using google::protobuf::internal::WireFormatLite; using google::protobuf::TextFormat; +using google::protobuf::internal::WireFormatLite; using google::protobuf::util::NewTypeResolverForDescriptorPool; +using proto2_messages::TestAllTypesProto2; using protobuf_test_messages::proto3::TestAllTypesProto3; -using protobuf_test_messages::proto2::TestAllTypesProto2; using std::string; namespace { @@ -249,10 +249,9 @@ const FieldDescriptor* GetFieldForType(FieldDescriptor::Type type, if (packed == Packed::FALSE) { packed_string = "Unpacked "; } - GOOGLE_LOG(FATAL) << "Couldn't find field with type: " - << repeated_string.c_str() << packed_string.c_str() - << FieldDescriptor::TypeName(type) << " for " - << proto_string.c_str(); + GOOGLE_LOG(FATAL) << "Couldn't find field with type: " << repeated_string.c_str() + << packed_string.c_str() << FieldDescriptor::TypeName(type) + << " for " << proto_string.c_str(); return nullptr; } @@ -275,9 +274,9 @@ const FieldDescriptor* GetFieldForMapType(FieldDescriptor::Type key_type, const string proto_string = is_proto3 ? "Proto3" : "Proto2"; GOOGLE_LOG(FATAL) << "Couldn't find map field with type: " - << FieldDescriptor::TypeName(key_type) << " and " - << FieldDescriptor::TypeName(key_type) << " for " - << proto_string.c_str(); + << FieldDescriptor::TypeName(key_type) << " and " + << FieldDescriptor::TypeName(key_type) << " for " + << proto_string.c_str(); return nullptr; } @@ -295,8 +294,8 @@ const FieldDescriptor* GetFieldForOneofType(FieldDescriptor::Type type, const string proto_string = is_proto3 ? "Proto3" : "Proto2"; GOOGLE_LOG(FATAL) << "Couldn't find oneof field with type: " - << FieldDescriptor::TypeName(type) << " for " - << proto_string.c_str(); + << FieldDescriptor::TypeName(type) << " for " + << proto_string.c_str(); return nullptr; } @@ -364,9 +363,8 @@ bool BinaryAndJsonConformanceSuite::ParseJsonResponse( } if (!test_message->ParseFromString(binary_protobuf)) { - GOOGLE_LOG(FATAL) - << "INTERNAL ERROR: internal JSON->protobuf transcode " - << "yielded unparseable proto."; + GOOGLE_LOG(FATAL) << "INTERNAL ERROR: internal JSON->protobuf transcode " + << "yielded unparseable proto."; return false; } @@ -385,10 +383,11 @@ bool BinaryAndJsonConformanceSuite::ParseResponse( switch (response.result_case()) { case ConformanceResponse::kProtobufPayload: { if (requested_output != conformance::PROTOBUF) { - ReportFailure( - test_name, level, request, response, - StrCat("Test was asked for ", WireFormatToString(requested_output), - " output but provided PROTOBUF instead.").c_str()); + ReportFailure(test_name, level, request, response, + StrCat("Test was asked for ", + WireFormatToString(requested_output), + " output but provided PROTOBUF instead.") + .c_str()); return false; } @@ -403,10 +402,11 @@ bool BinaryAndJsonConformanceSuite::ParseResponse( case ConformanceResponse::kJsonPayload: { if (requested_output != conformance::JSON) { - ReportFailure( - test_name, level, request, response, - StrCat("Test was asked for ", WireFormatToString(requested_output), - " output but provided JSON instead.").c_str()); + ReportFailure(test_name, level, request, response, + StrCat("Test was asked for ", + WireFormatToString(requested_output), + " output but provided JSON instead.") + .c_str()); return false; } @@ -420,8 +420,8 @@ bool BinaryAndJsonConformanceSuite::ParseResponse( } default: - GOOGLE_LOG(FATAL) << test_name << ": unknown payload type: " - << response.result_case(); + GOOGLE_LOG(FATAL) << test_name + << ": unknown payload type: " << response.result_case(); } return true; @@ -440,10 +440,9 @@ void BinaryAndJsonConformanceSuite::ExpectParseFailureForProtoWithProtoVersion ( const ConformanceRequest& request = setting.GetRequest(); ConformanceResponse response; - string effective_test_name = - StrCat(setting.ConformanceLevelToString(level), - (is_proto3 ? ".Proto3" : ".Proto2"), - ".ProtobufInput.", test_name); + string effective_test_name = StrCat( + setting.ConformanceLevelToString(level), + (is_proto3 ? ".Proto3" : ".Proto2"), ".ProtobufInput.", test_name); RunTest(effective_test_name, request, &response); if (response.result_case() == ConformanceResponse::kParseError) { @@ -574,8 +573,7 @@ void BinaryAndJsonConformanceSuite::RunValidJsonTestWithValidator( ConformanceResponse response; string effective_test_name = StrCat(setting.ConformanceLevelToString(level), - ".Proto3.JsonInput.", - test_name, ".Validator"); + ".Proto3.JsonInput.", test_name, ".Validator"); RunTest(effective_test_name, request, &response); @@ -617,9 +615,8 @@ void BinaryAndJsonConformanceSuite::ExpectParseFailureForJson( prototype, test_name, input_json); const ConformanceRequest& request = setting.GetRequest(); ConformanceResponse response; - string effective_test_name = - StrCat(setting.ConformanceLevelToString(level), - ".Proto3.JsonInput.", test_name); + string effective_test_name = StrCat( + setting.ConformanceLevelToString(level), ".Proto3.JsonInput.", test_name); RunTest(effective_test_name, request, &response); if (response.result_case() == ConformanceResponse::kParseError) { @@ -635,9 +632,8 @@ void BinaryAndJsonConformanceSuite::ExpectParseFailureForJson( void BinaryAndJsonConformanceSuite::ExpectSerializeFailureForJson( const string& test_name, ConformanceLevel level, const string& text_format) { TestAllTypesProto3 payload_message; - GOOGLE_CHECK( - TextFormat::ParseFromString(text_format, &payload_message)) - << "Failed to parse: " << text_format; + GOOGLE_CHECK(TextFormat::ParseFromString(text_format, &payload_message)) + << "Failed to parse: " << text_format; TestAllTypesProto3 prototype; ConformanceRequestSetting setting( @@ -646,9 +642,8 @@ void BinaryAndJsonConformanceSuite::ExpectSerializeFailureForJson( prototype, test_name, payload_message.SerializeAsString()); const ConformanceRequest& request = setting.GetRequest(); ConformanceResponse response; - string effective_test_name = - StrCat(setting.ConformanceLevelToString(level), - ".", test_name, ".JsonOutput"); + string effective_test_name = StrCat( + setting.ConformanceLevelToString(level), ".", test_name, ".JsonOutput"); RunTest(effective_test_name, request, &response); if (response.result_case() == ConformanceResponse::kSerializeError) { @@ -772,11 +767,12 @@ void BinaryAndJsonConformanceSuite::TestValidDataForType( test_message->MergeFromString(expected_proto); string text = test_message->DebugString(); - RunValidProtobufTest(StrCat("ValidDataScalar", type_name, "[", i, "]"), - REQUIRED, proto, text, is_proto3); + RunValidProtobufTest( + StrCat("ValidDataScalar", type_name, "[", i, "]"), REQUIRED, + proto, text, is_proto3); RunValidBinaryProtobufTest( - StrCat("ValidDataScalarBinary", type_name, "[", i, "]"), RECOMMENDED, - proto, expected_proto, is_proto3); + StrCat("ValidDataScalarBinary", type_name, "[", i, "]"), + RECOMMENDED, proto, expected_proto, is_proto3); } // Test repeated data for singular fields. @@ -856,11 +852,11 @@ void BinaryAndJsonConformanceSuite::TestValidDataForType( // Ensures both packed and unpacked data can be parsed. RunValidProtobufTest( - StrCat("ValidDataRepeated", type_name, ".UnpackedInput"), REQUIRED, - default_proto_unpacked, text, is_proto3); + StrCat("ValidDataRepeated", type_name, ".UnpackedInput"), + REQUIRED, default_proto_unpacked, text, is_proto3); RunValidProtobufTest( - StrCat("ValidDataRepeated", type_name, ".PackedInput"), REQUIRED, - default_proto_packed, text, is_proto3); + StrCat("ValidDataRepeated", type_name, ".PackedInput"), + REQUIRED, default_proto_packed, text, is_proto3); // proto2 should encode as unpacked by default and proto3 should encode as // packed by default. @@ -868,26 +864,29 @@ void BinaryAndJsonConformanceSuite::TestValidDataForType( ? default_proto_packed_expected : default_proto_unpacked_expected; RunValidBinaryProtobufTest(StrCat("ValidDataRepeated", type_name, - ".UnpackedInput.DefaultOutput"), + ".UnpackedInput.DefaultOutput"), RECOMMENDED, default_proto_unpacked, expected_proto, is_proto3); - RunValidBinaryProtobufTest( - StrCat("ValidDataRepeated", type_name, ".PackedInput.DefaultOutput"), - RECOMMENDED, default_proto_packed, expected_proto, is_proto3); - RunValidBinaryProtobufTest( - StrCat("ValidDataRepeated", type_name, ".UnpackedInput.PackedOutput"), - RECOMMENDED, packed_proto_unpacked, packed_proto_expected, is_proto3); - RunValidBinaryProtobufTest( - StrCat("ValidDataRepeated", type_name, ".PackedInput.PackedOutput"), - RECOMMENDED, packed_proto_packed, packed_proto_expected, is_proto3); RunValidBinaryProtobufTest(StrCat("ValidDataRepeated", type_name, - ".UnpackedInput.UnpackedOutput"), + ".PackedInput.DefaultOutput"), + RECOMMENDED, default_proto_packed, + expected_proto, is_proto3); + RunValidBinaryProtobufTest(StrCat("ValidDataRepeated", type_name, + ".UnpackedInput.PackedOutput"), + RECOMMENDED, packed_proto_unpacked, + packed_proto_expected, is_proto3); + RunValidBinaryProtobufTest(StrCat("ValidDataRepeated", type_name, + ".PackedInput.PackedOutput"), + RECOMMENDED, packed_proto_packed, + packed_proto_expected, is_proto3); + RunValidBinaryProtobufTest(StrCat("ValidDataRepeated", type_name, + ".UnpackedInput.UnpackedOutput"), RECOMMENDED, unpacked_proto_unpacked, unpacked_proto_expected, is_proto3); - RunValidBinaryProtobufTest( - StrCat("ValidDataRepeated", type_name, ".PackedInput.UnpackedOutput"), - RECOMMENDED, unpacked_proto_packed, unpacked_proto_expected, - is_proto3); + RunValidBinaryProtobufTest(StrCat("ValidDataRepeated", type_name, + ".PackedInput.UnpackedOutput"), + RECOMMENDED, unpacked_proto_packed, + unpacked_proto_expected, is_proto3); } else { string proto; string expected_proto; @@ -900,8 +899,8 @@ void BinaryAndJsonConformanceSuite::TestValidDataForType( test_message->MergeFromString(expected_proto); string text = test_message->DebugString(); - RunValidProtobufTest(StrCat("ValidDataRepeated", type_name), REQUIRED, - proto, text, is_proto3); + RunValidProtobufTest(StrCat("ValidDataRepeated", type_name), + REQUIRED, proto, text, is_proto3); } } } @@ -976,9 +975,9 @@ void BinaryAndJsonConformanceSuite::TestValidDataForMapType( std::unique_ptr test_message = NewTestMessage(is_proto3); test_message->MergeFromString(proto); string text = test_message->DebugString(); - RunValidProtobufTest( - StrCat("ValidDataMap", key_type_name, value_type_name, ".Default"), - REQUIRED, proto, text, is_proto3); + RunValidProtobufTest(StrCat("ValidDataMap", key_type_name, + value_type_name, ".Default"), + REQUIRED, proto, text, is_proto3); } { @@ -990,7 +989,7 @@ void BinaryAndJsonConformanceSuite::TestValidDataForMapType( test_message->MergeFromString(proto); string text = test_message->DebugString(); RunValidProtobufTest(StrCat("ValidDataMap", key_type_name, - value_type_name, ".MissingDefault"), + value_type_name, ".MissingDefault"), REQUIRED, proto, text, is_proto3); } @@ -1002,9 +1001,9 @@ void BinaryAndJsonConformanceSuite::TestValidDataForMapType( std::unique_ptr test_message = NewTestMessage(is_proto3); test_message->MergeFromString(proto); string text = test_message->DebugString(); - RunValidProtobufTest( - StrCat("ValidDataMap", key_type_name, value_type_name, ".NonDefault"), - REQUIRED, proto, text, is_proto3); + RunValidProtobufTest(StrCat("ValidDataMap", key_type_name, + value_type_name, ".NonDefault"), + REQUIRED, proto, text, is_proto3); } { @@ -1015,9 +1014,9 @@ void BinaryAndJsonConformanceSuite::TestValidDataForMapType( std::unique_ptr test_message = NewTestMessage(is_proto3); test_message->MergeFromString(proto); string text = test_message->DebugString(); - RunValidProtobufTest( - StrCat("ValidDataMap", key_type_name, value_type_name, ".Unordered"), - REQUIRED, proto, text, is_proto3); + RunValidProtobufTest(StrCat("ValidDataMap", key_type_name, + value_type_name, ".Unordered"), + REQUIRED, proto, text, is_proto3); } { @@ -1033,7 +1032,7 @@ void BinaryAndJsonConformanceSuite::TestValidDataForMapType( test_message->MergeFromString(proto2); string text = test_message->DebugString(); RunValidProtobufTest(StrCat("ValidDataMap", key_type_name, - value_type_name, ".DuplicateKey"), + value_type_name, ".DuplicateKey"), REQUIRED, proto, text, is_proto3); } @@ -1045,9 +1044,10 @@ void BinaryAndJsonConformanceSuite::TestValidDataForMapType( std::unique_ptr test_message = NewTestMessage(is_proto3); test_message->MergeFromString(proto); string text = test_message->DebugString(); - RunValidProtobufTest(StrCat("ValidDataMap", key_type_name, - value_type_name, ".DuplicateKeyInMapEntry"), - REQUIRED, proto, text, is_proto3); + RunValidProtobufTest( + StrCat("ValidDataMap", key_type_name, value_type_name, + ".DuplicateKeyInMapEntry"), + REQUIRED, proto, text, is_proto3); } { @@ -1058,9 +1058,10 @@ void BinaryAndJsonConformanceSuite::TestValidDataForMapType( std::unique_ptr test_message = NewTestMessage(is_proto3); test_message->MergeFromString(proto); string text = test_message->DebugString(); - RunValidProtobufTest(StrCat("ValidDataMap", key_type_name, - value_type_name, ".DuplicateValueInMapEntry"), - REQUIRED, proto, text, is_proto3); + RunValidProtobufTest( + StrCat("ValidDataMap", key_type_name, value_type_name, + ".DuplicateValueInMapEntry"), + REQUIRED, proto, text, is_proto3); } } } @@ -1123,8 +1124,9 @@ void BinaryAndJsonConformanceSuite::TestValidDataForOneofType( test_message->MergeFromString(proto); string text = test_message->DebugString(); - RunValidProtobufTest(StrCat("ValidDataOneof", type_name, ".DefaultValue"), - REQUIRED, proto, text, is_proto3); + RunValidProtobufTest( + StrCat("ValidDataOneof", type_name, ".DefaultValue"), REQUIRED, + proto, text, is_proto3); RunValidBinaryProtobufTest( StrCat("ValidDataOneofBinary", type_name, ".DefaultValue"), RECOMMENDED, proto, proto, is_proto3); @@ -1138,8 +1140,8 @@ void BinaryAndJsonConformanceSuite::TestValidDataForOneofType( string text = test_message->DebugString(); RunValidProtobufTest( - StrCat("ValidDataOneof", type_name, ".NonDefaultValue"), REQUIRED, - proto, text, is_proto3); + StrCat("ValidDataOneof", type_name, ".NonDefaultValue"), + REQUIRED, proto, text, is_proto3); RunValidBinaryProtobufTest( StrCat("ValidDataOneofBinary", type_name, ".NonDefaultValue"), RECOMMENDED, proto, proto, is_proto3); @@ -1153,11 +1155,11 @@ void BinaryAndJsonConformanceSuite::TestValidDataForOneofType( test_message->MergeFromString(expected_proto); string text = test_message->DebugString(); - RunValidProtobufTest( - StrCat("ValidDataOneof", type_name, ".MultipleValuesForSameField"), - REQUIRED, proto, text, is_proto3); - RunValidBinaryProtobufTest(StrCat("ValidDataOneofBinary", type_name, + RunValidProtobufTest(StrCat("ValidDataOneof", type_name, ".MultipleValuesForSameField"), + REQUIRED, proto, text, is_proto3); + RunValidBinaryProtobufTest(StrCat("ValidDataOneofBinary", type_name, + ".MultipleValuesForSameField"), RECOMMENDED, proto, expected_proto, is_proto3); } @@ -1180,11 +1182,12 @@ void BinaryAndJsonConformanceSuite::TestValidDataForOneofType( string text = test_message->DebugString(); RunValidProtobufTest(StrCat("ValidDataOneof", type_name, - ".MultipleValuesForDifferentField"), - REQUIRED, proto, text, is_proto3); - RunValidBinaryProtobufTest(StrCat("ValidDataOneofBinary", type_name, ".MultipleValuesForDifferentField"), - RECOMMENDED, proto, expected_proto, is_proto3); + REQUIRED, proto, text, is_proto3); + RunValidBinaryProtobufTest( + StrCat("ValidDataOneofBinary", type_name, + ".MultipleValuesForDifferentField"), + RECOMMENDED, proto, expected_proto, is_proto3); } } } @@ -1292,7 +1295,7 @@ void BinaryAndJsonConformanceSuite::TestUnknownMessage( void BinaryAndJsonConformanceSuite::RunSuiteImpl() { // Hack to get the list of test failures based on whether - // GOOGLE3_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER is enabled or not. + // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER is enabled or not. conformance::FailureSet failure_set; ConformanceRequest req; ConformanceResponse res; @@ -1363,6 +1366,8 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { {varint(kInt32Min), varint(kInt32Min)}, {varint(1LL << 33), varint(0)}, {varint((1LL << 33) - 1), varint(-1)}, + {varint(kInt64Max), varint(-1)}, + {varint(kInt64Min + 1), varint(1)}, }); TestValidDataForType( FieldDescriptor::TYPE_UINT32, @@ -1373,7 +1378,10 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { {longvarint(12345, 7), varint(12345)}, {varint(kUint32Max), varint(kUint32Max)}, // UINT32_MAX {varint(1LL << 33), varint(0)}, + {varint((1LL << 33) + 1), varint(1)}, {varint((1LL << 33) - 1), varint((1LL << 32) - 1)}, + {varint(kInt64Max), varint((1LL << 32) - 1)}, + {varint(kInt64Min + 1), varint(1)}, }); TestValidDataForType(FieldDescriptor::TYPE_FIXED64, { @@ -1407,7 +1415,11 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { { {varint(0), varint(0)}, {varint(1), varint(1)}, + {varint(-1), varint(1)}, {varint(12345678), varint(1)}, + {varint(1LL << 33), varint(1)}, + {varint(kInt64Max), varint(1)}, + {varint(kInt64Min), varint(1)}, }); TestValidDataForType(FieldDescriptor::TYPE_SINT32, { @@ -1415,6 +1427,7 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { {zz32(12345), zz32(12345)}, {zz32(kInt32Max), zz32(kInt32Max)}, {zz32(kInt32Min), zz32(kInt32Min)}, + {zz64(kInt32Max + 2LL), zz32(1)}, }); TestValidDataForType(FieldDescriptor::TYPE_SINT64, { @@ -1438,15 +1451,19 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { TestValidDataForType(FieldDescriptor::TYPE_BYTES, { {delim(""), delim("")}, + {delim("Hello world!"), delim("Hello world!")}, {delim("\x01\x02"), delim("\x01\x02")}, {delim("\xfb"), delim("\xfb")}, }); - TestValidDataForType(FieldDescriptor::TYPE_ENUM, { - {varint(0), varint(0)}, - {varint(1), varint(1)}, - {varint(2), varint(2)}, - {varint(-1), varint(-1)}, - }); + TestValidDataForType(FieldDescriptor::TYPE_ENUM, + { + {varint(0), varint(0)}, + {varint(1), varint(1)}, + {varint(2), varint(2)}, + {varint(-1), varint(-1)}, + {varint(kInt64Max), varint(-1)}, + {varint(kInt64Min + 1), varint(1)}, + }); TestValidDataForRepeatedScalarMessage(); TestValidDataForType( FieldDescriptor::TYPE_MESSAGE, @@ -1508,13 +1525,74 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { // TODO(haberman): // TestValidDataForType(FieldDescriptor::TYPE_GROUP + // Unknown fields. + { + TestAllTypesProto3 messageProto3; + TestAllTypesProto2 messageProto2; + // TODO(yilunchong): update this behavior when unknown field's behavior + // changed in open source. Also delete + // Required.Proto3.ProtobufInput.UnknownVarint.ProtobufOutput + // from failure list of python_cpp python java + TestUnknownMessage(messageProto3, true); + TestUnknownMessage(messageProto2, false); + } + + RunJsonTests(); +} + +void BinaryAndJsonConformanceSuite::RunJsonTests() { RunValidJsonTest("HelloWorld", REQUIRED, "{\"optionalString\":\"Hello, World!\"}", "optional_string: 'Hello, World!'"); // NOTE: The spec for JSON support is still being sorted out, these may not // all be correct. - // Test field name conventions. + + RunJsonTestsForFieldNameConvention(); + RunJsonTestsForNonRepeatedTypes(); + RunJsonTestsForRepeatedTypes(); + RunJsonTestsForNullTypes(); + RunJsonTestsForWrapperTypes(); + RunJsonTestsForFieldMask(); + RunJsonTestsForStruct(); + RunJsonTestsForValue(); + RunJsonTestsForAny(); + + RunValidJsonIgnoreUnknownTest("IgnoreUnknownJsonNumber", REQUIRED, + R"({ + "unknown": 1 + })", + ""); + RunValidJsonIgnoreUnknownTest("IgnoreUnknownJsonString", REQUIRED, + R"({ + "unknown": "a" + })", + ""); + RunValidJsonIgnoreUnknownTest("IgnoreUnknownJsonTrue", REQUIRED, + R"({ + "unknown": true + })", + ""); + RunValidJsonIgnoreUnknownTest("IgnoreUnknownJsonFalse", REQUIRED, + R"({ + "unknown": false + })", + ""); + RunValidJsonIgnoreUnknownTest("IgnoreUnknownJsonNull", REQUIRED, + R"({ + "unknown": null + })", + ""); + RunValidJsonIgnoreUnknownTest("IgnoreUnknownJsonObject", REQUIRED, + R"({ + "unknown": {"a": 1} + })", + ""); + + ExpectParseFailureForJson("RejectTopLevelNull", REQUIRED, "null"); +} + +void BinaryAndJsonConformanceSuite::RunJsonTestsForFieldNameConvention() { RunValidJsonTest( "FieldNameInSnakeCase", REQUIRED, R"({ @@ -1769,7 +1847,9 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { value.isMember("fieldName17") && value.isMember("FieldName18"); }); +} +void BinaryAndJsonConformanceSuite::RunJsonTestsForNonRepeatedTypes() { // Integer fields. RunValidJsonTest( "Int32FieldMaxValue", REQUIRED, @@ -2254,71 +2334,6 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { "OneofZeroEnum", RECOMMENDED, R"({"oneofEnum":"FOO"})", "oneof_enum: FOO"); - // Repeated fields. - RunValidJsonTest( - "PrimitiveRepeatedField", REQUIRED, - R"({"repeatedInt32": [1, 2, 3, 4]})", - "repeated_int32: [1, 2, 3, 4]"); - RunValidJsonTest( - "EnumRepeatedField", REQUIRED, - R"({"repeatedNestedEnum": ["FOO", "BAR", "BAZ"]})", - "repeated_nested_enum: [FOO, BAR, BAZ]"); - RunValidJsonTest( - "StringRepeatedField", REQUIRED, - R"({"repeatedString": ["Hello", "world"]})", - R"(repeated_string: ["Hello", "world"])"); - RunValidJsonTest( - "BytesRepeatedField", REQUIRED, - R"({"repeatedBytes": ["AAEC", "AQI="]})", - R"(repeated_bytes: ["\x00\x01\x02", "\x01\x02"])"); - RunValidJsonTest( - "MessageRepeatedField", REQUIRED, - R"({"repeatedNestedMessage": [{"a": 1234}, {"a": 5678}]})", - "repeated_nested_message: {a: 1234}" - "repeated_nested_message: {a: 5678}"); - - // Repeated field elements are of incorrect type. - ExpectParseFailureForJson( - "RepeatedFieldWrongElementTypeExpectingIntegersGotBool", REQUIRED, - R"({"repeatedInt32": [1, false, 3, 4]})"); - ExpectParseFailureForJson( - "RepeatedFieldWrongElementTypeExpectingIntegersGotString", REQUIRED, - R"({"repeatedInt32": [1, 2, "name", 4]})"); - ExpectParseFailureForJson( - "RepeatedFieldWrongElementTypeExpectingIntegersGotMessage", REQUIRED, - R"({"repeatedInt32": [1, 2, 3, {"a": 4}]})"); - ExpectParseFailureForJson( - "RepeatedFieldWrongElementTypeExpectingStringsGotInt", REQUIRED, - R"({"repeatedString": ["1", 2, "3", "4"]})"); - ExpectParseFailureForJson( - "RepeatedFieldWrongElementTypeExpectingStringsGotBool", REQUIRED, - R"({"repeatedString": ["1", "2", false, "4"]})"); - ExpectParseFailureForJson( - "RepeatedFieldWrongElementTypeExpectingStringsGotMessage", REQUIRED, - R"({"repeatedString": ["1", 2, "3", {"a": 4}]})"); - ExpectParseFailureForJson( - "RepeatedFieldWrongElementTypeExpectingMessagesGotInt", REQUIRED, - R"({"repeatedNestedMessage": [{"a": 1}, 2]})"); - ExpectParseFailureForJson( - "RepeatedFieldWrongElementTypeExpectingMessagesGotBool", REQUIRED, - R"({"repeatedNestedMessage": [{"a": 1}, false]})"); - ExpectParseFailureForJson( - "RepeatedFieldWrongElementTypeExpectingMessagesGotString", REQUIRED, - R"({"repeatedNestedMessage": [{"a": 1}, "2"]})"); - // Trailing comma in the repeated field is not allowed. - ExpectParseFailureForJson( - "RepeatedFieldTrailingComma", RECOMMENDED, - R"({"repeatedInt32": [1, 2, 3, 4,]})"); - ExpectParseFailureForJson( - "RepeatedFieldTrailingCommaWithSpace", RECOMMENDED, - "{\"repeatedInt32\": [1, 2, 3, 4 ,]}"); - ExpectParseFailureForJson( - "RepeatedFieldTrailingCommaWithSpaceCommaSpace", RECOMMENDED, - "{\"repeatedInt32\": [1, 2, 3, 4 , ]}"); - ExpectParseFailureForJson( - "RepeatedFieldTrailingCommaWithNewlines", RECOMMENDED, - "{\"repeatedInt32\": [\n 1,\n 2,\n 3,\n 4,\n]}"); - // Map fields. RunValidJsonTest( "Int32MapField", REQUIRED, @@ -2392,6 +2407,77 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { R"({"mapBoolBool": {"tr\u0075e": true}})", "map_bool_bool: {key: true value: true}"); + // http://www.rfc-editor.org/rfc/rfc7159.txt says strings have to use double + // quotes. + ExpectParseFailureForJson("StringFieldSingleQuoteKey", RECOMMENDED, + R"({'optionalString': "Hello world!"})"); + ExpectParseFailureForJson("StringFieldSingleQuoteValue", RECOMMENDED, + R"({"optionalString": 'Hello world!'})"); + ExpectParseFailureForJson("StringFieldSingleQuoteBoth", RECOMMENDED, + R"({'optionalString': 'Hello world!'})"); +} + +void BinaryAndJsonConformanceSuite::RunJsonTestsForRepeatedTypes() { + // Repeated fields. + RunValidJsonTest("PrimitiveRepeatedField", REQUIRED, + R"({"repeatedInt32": [1, 2, 3, 4]})", + "repeated_int32: [1, 2, 3, 4]"); + RunValidJsonTest("EnumRepeatedField", REQUIRED, + R"({"repeatedNestedEnum": ["FOO", "BAR", "BAZ"]})", + "repeated_nested_enum: [FOO, BAR, BAZ]"); + RunValidJsonTest("StringRepeatedField", REQUIRED, + R"({"repeatedString": ["Hello", "world"]})", + R"(repeated_string: ["Hello", "world"])"); + RunValidJsonTest("BytesRepeatedField", REQUIRED, + R"({"repeatedBytes": ["AAEC", "AQI="]})", + R"(repeated_bytes: ["\x00\x01\x02", "\x01\x02"])"); + RunValidJsonTest("MessageRepeatedField", REQUIRED, + R"({"repeatedNestedMessage": [{"a": 1234}, {"a": 5678}]})", + "repeated_nested_message: {a: 1234}" + "repeated_nested_message: {a: 5678}"); + + // Repeated field elements are of incorrect type. + ExpectParseFailureForJson( + "RepeatedFieldWrongElementTypeExpectingIntegersGotBool", REQUIRED, + R"({"repeatedInt32": [1, false, 3, 4]})"); + ExpectParseFailureForJson( + "RepeatedFieldWrongElementTypeExpectingIntegersGotString", REQUIRED, + R"({"repeatedInt32": [1, 2, "name", 4]})"); + ExpectParseFailureForJson( + "RepeatedFieldWrongElementTypeExpectingIntegersGotMessage", REQUIRED, + R"({"repeatedInt32": [1, 2, 3, {"a": 4}]})"); + ExpectParseFailureForJson( + "RepeatedFieldWrongElementTypeExpectingStringsGotInt", REQUIRED, + R"({"repeatedString": ["1", 2, "3", "4"]})"); + ExpectParseFailureForJson( + "RepeatedFieldWrongElementTypeExpectingStringsGotBool", REQUIRED, + R"({"repeatedString": ["1", "2", false, "4"]})"); + ExpectParseFailureForJson( + "RepeatedFieldWrongElementTypeExpectingStringsGotMessage", REQUIRED, + R"({"repeatedString": ["1", 2, "3", {"a": 4}]})"); + ExpectParseFailureForJson( + "RepeatedFieldWrongElementTypeExpectingMessagesGotInt", REQUIRED, + R"({"repeatedNestedMessage": [{"a": 1}, 2]})"); + ExpectParseFailureForJson( + "RepeatedFieldWrongElementTypeExpectingMessagesGotBool", REQUIRED, + R"({"repeatedNestedMessage": [{"a": 1}, false]})"); + ExpectParseFailureForJson( + "RepeatedFieldWrongElementTypeExpectingMessagesGotString", REQUIRED, + R"({"repeatedNestedMessage": [{"a": 1}, "2"]})"); + // Trailing comma in the repeated field is not allowed. + ExpectParseFailureForJson("RepeatedFieldTrailingComma", RECOMMENDED, + R"({"repeatedInt32": [1, 2, 3, 4,]})"); + ExpectParseFailureForJson("RepeatedFieldTrailingCommaWithSpace", RECOMMENDED, + "{\"repeatedInt32\": [1, 2, 3, 4 ,]}"); + ExpectParseFailureForJson("RepeatedFieldTrailingCommaWithSpaceCommaSpace", + RECOMMENDED, + "{\"repeatedInt32\": [1, 2, 3, 4 , ]}"); + ExpectParseFailureForJson( + "RepeatedFieldTrailingCommaWithNewlines", RECOMMENDED, + "{\"repeatedInt32\": [\n 1,\n 2,\n 3,\n 4,\n]}"); +} + +void BinaryAndJsonConformanceSuite::RunJsonTestsForNullTypes() { // "null" is accepted for all fields types. RunValidJsonTest( "AllFieldAcceptNull", REQUIRED, @@ -2451,36 +2537,12 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { ExpectParseFailureForJson( "MapFieldValueIsNull", RECOMMENDED, R"({"mapInt32Int32": {"0": null}})"); +} - // http://www.rfc-editor.org/rfc/rfc7159.txt says strings have to use double - // quotes. - ExpectParseFailureForJson( - "StringFieldSingleQuoteKey", RECOMMENDED, - R"({'optionalString': "Hello world!"})"); - ExpectParseFailureForJson( - "StringFieldSingleQuoteValue", RECOMMENDED, - R"({"optionalString": 'Hello world!'})"); - ExpectParseFailureForJson( - "StringFieldSingleQuoteBoth", RECOMMENDED, - R"({'optionalString': 'Hello world!'})"); - - // Unknown fields. - { - TestAllTypesProto3 messageProto3; - TestAllTypesProto2 messageProto2; - //TODO(yilunchong): update this behavior when unknown field's behavior - // changed in open source. Also delete - // Required.Proto3.ProtobufInput.UnknownVarint.ProtobufOutput - // from failure list of python_cpp python java - TestUnknownMessage(messageProto3, true); - TestUnknownMessage(messageProto2, false); - } - - // Wrapper types. - RunValidJsonTest( - "OptionalBoolWrapper", REQUIRED, - R"({"optionalBoolWrapper": false})", - "optional_bool_wrapper: {value: false}"); +void BinaryAndJsonConformanceSuite::RunJsonTestsForWrapperTypes() { + RunValidJsonTest("OptionalBoolWrapper", REQUIRED, + R"({"optionalBoolWrapper": false})", + "optional_bool_wrapper: {value: false}"); RunValidJsonTest( "OptionalInt32Wrapper", REQUIRED, R"({"optionalInt32Wrapper": 0})", @@ -2689,10 +2751,9 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { })", "repeated_timestamp: {seconds: -62135596800}" "repeated_timestamp: {seconds: 253402300799 nanos: 999999999}"); - RunValidJsonTest( - "TimestampLeap", REQUIRED, - R"({"optionalTimestamp": "1993-02-10T00:00:00.000Z"})", - "optional_timestamp: {seconds: 729302400}"); + RunValidJsonTest("TimestampLeap", REQUIRED, + R"({"optionalTimestamp": "1993-02-10T00:00:00.000Z"})", + "optional_timestamp: {seconds: 729302400}"); RunValidJsonTest("TimestampWithPositiveOffset", REQUIRED, R"({"optionalTimestamp": "1970-01-01T08:00:01+08:00"})", "optional_timestamp: {seconds: 1}"); @@ -2732,39 +2793,38 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { "TimestampZeroNormalized", RECOMMENDED, R"({"optionalTimestamp": "1969-12-31T16:00:00-08:00"})", [](const Json::Value& value) { - return value["optionalTimestamp"].asString() == - "1970-01-01T00:00:00Z"; + return value["optionalTimestamp"].asString() == "1970-01-01T00:00:00Z"; }); RunValidJsonTestWithValidator( "TimestampHasZeroFractionalDigit", RECOMMENDED, R"({"optionalTimestamp": "1970-01-01T00:00:00.000000000Z"})", [](const Json::Value& value) { - return value["optionalTimestamp"].asString() == - "1970-01-01T00:00:00Z"; + return value["optionalTimestamp"].asString() == "1970-01-01T00:00:00Z"; }); RunValidJsonTestWithValidator( "TimestampHas3FractionalDigits", RECOMMENDED, R"({"optionalTimestamp": "1970-01-01T00:00:00.010000000Z"})", [](const Json::Value& value) { return value["optionalTimestamp"].asString() == - "1970-01-01T00:00:00.010Z"; + "1970-01-01T00:00:00.010Z"; }); RunValidJsonTestWithValidator( "TimestampHas6FractionalDigits", RECOMMENDED, R"({"optionalTimestamp": "1970-01-01T00:00:00.000010000Z"})", [](const Json::Value& value) { return value["optionalTimestamp"].asString() == - "1970-01-01T00:00:00.000010Z"; + "1970-01-01T00:00:00.000010Z"; }); RunValidJsonTestWithValidator( "TimestampHas9FractionalDigits", RECOMMENDED, R"({"optionalTimestamp": "1970-01-01T00:00:00.000000010Z"})", [](const Json::Value& value) { return value["optionalTimestamp"].asString() == - "1970-01-01T00:00:00.000000010Z"; + "1970-01-01T00:00:00.000000010Z"; }); +} - // FieldMask +void BinaryAndJsonConformanceSuite::RunJsonTestsForFieldMask() { RunValidJsonTest( "FieldMask", REQUIRED, R"({"optionalFieldMask": "foo,barBaz"})", @@ -2785,8 +2845,9 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { ExpectSerializeFailureForJson( "FieldMaskTooManyUnderscore", RECOMMENDED, R"(optional_field_mask: {paths: "foo__bar"})"); +} - // Struct +void BinaryAndJsonConformanceSuite::RunJsonTestsForStruct() { RunValidJsonTest( "Struct", REQUIRED, R"({ @@ -2870,7 +2931,9 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { } } )"); - // Value +} + +void BinaryAndJsonConformanceSuite::RunJsonTestsForValue() { RunValidJsonTest( "ValueAcceptInteger", REQUIRED, R"({"optionalValue": 1})", @@ -2951,8 +3014,9 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { } ] )"); +} - // Any +void BinaryAndJsonConformanceSuite::RunJsonTestsForAny() { RunValidJsonTest( "Any", REQUIRED, R"({ @@ -3128,45 +3192,6 @@ void BinaryAndJsonConformanceSuite::RunSuiteImpl() { } } )"); - - RunValidJsonIgnoreUnknownTest( - "IgnoreUnknownJsonNumber", REQUIRED, - R"({ - "unknown": 1 - })", - ""); - RunValidJsonIgnoreUnknownTest( - "IgnoreUnknownJsonString", REQUIRED, - R"({ - "unknown": "a" - })", - ""); - RunValidJsonIgnoreUnknownTest( - "IgnoreUnknownJsonTrue", REQUIRED, - R"({ - "unknown": true - })", - ""); - RunValidJsonIgnoreUnknownTest( - "IgnoreUnknownJsonFalse", REQUIRED, - R"({ - "unknown": false - })", - ""); - RunValidJsonIgnoreUnknownTest( - "IgnoreUnknownJsonNull", REQUIRED, - R"({ - "unknown": null - })", - ""); - RunValidJsonIgnoreUnknownTest( - "IgnoreUnknownJsonObject", REQUIRED, - R"({ - "unknown": {"a": 1} - })", - ""); - - ExpectParseFailureForJson("RejectTopLevelNull", REQUIRED, "null"); } } // namespace protobuf diff --git a/conformance/binary_json_conformance_suite.h b/conformance/binary_json_conformance_suite.h index 08182b6f58..aaf8bb4d9e 100644 --- a/conformance/binary_json_conformance_suite.h +++ b/conformance/binary_json_conformance_suite.h @@ -31,8 +31,8 @@ #ifndef CONFORMANCE_BINARY_JSON_CONFORMANCE_SUITE_H #define CONFORMANCE_BINARY_JSON_CONFORMANCE_SUITE_H -#include "conformance_test.h" #include "third_party/jsoncpp/json.h" +#include "conformance_test.h" namespace google { namespace protobuf { @@ -43,6 +43,16 @@ class BinaryAndJsonConformanceSuite : public ConformanceTestSuite { private: void RunSuiteImpl(); + void RunJsonTests(); + void RunJsonTestsForFieldNameConvention(); + void RunJsonTestsForNonRepeatedTypes(); + void RunJsonTestsForRepeatedTypes(); + void RunJsonTestsForNullTypes(); + void RunJsonTestsForWrapperTypes(); + void RunJsonTestsForFieldMask(); + void RunJsonTestsForStruct(); + void RunJsonTestsForValue(); + void RunJsonTestsForAny(); void RunValidJsonTest(const string& test_name, ConformanceLevel level, const string& input_json, @@ -121,8 +131,7 @@ class BinaryAndJsonConformanceSuite : public ConformanceTestSuite { void TestMergeOneofMessage(); void TestOverwriteMessageValueMap(); - std::unique_ptr - type_resolver_; + std::unique_ptr type_resolver_; std::string type_url_; }; diff --git a/conformance/conformance.proto b/conformance/conformance.proto index 54da406c3c..1db4000778 100644 --- a/conformance/conformance.proto +++ b/conformance/conformance.proto @@ -95,7 +95,7 @@ message ConformanceRequest { // // TODO(haberman): if/when we expand the conformance tests to support proto2, // we will want to include a field that lets the payload/response be a - // protobuf_test_messages.proto2.TestAllTypes message instead. + // protobuf_test_messages.google.protobuf.TestAllTypes message instead. oneof payload { bytes protobuf_payload = 1; string json_payload = 2; @@ -109,7 +109,7 @@ message ConformanceRequest { // The full name for the test message to use; for the moment, either: // protobuf_test_messages.proto3.TestAllTypesProto3 or - // protobuf_test_messages.proto2.TestAllTypesProto2. + // protobuf_test_messages.google.protobuf.TestAllTypesProto2. string message_type = 4; // Each test is given a specific test category. Some category may need diff --git a/conformance/conformance_cpp.cc b/conformance/conformance_cpp.cc index c7f4b2d4b3..1cdfdae457 100644 --- a/conformance/conformance_cpp.cc +++ b/conformance/conformance_cpp.cc @@ -32,13 +32,14 @@ #include #include -#include "conformance.pb.h" -#include -#include #include #include #include #include +#include "conformance.pb.h" +#include +#include +#include using conformance::ConformanceRequest; using conformance::ConformanceResponse; @@ -51,9 +52,7 @@ using google::protobuf::util::BinaryToJsonString; using google::protobuf::util::JsonParseOptions; using google::protobuf::util::JsonToBinaryString; using google::protobuf::util::NewTypeResolverForDescriptorPool; -using google::protobuf::util::Status; using google::protobuf::util::TypeResolver; -using protobuf_test_messages::proto2::TestAllTypesProto2; using protobuf_test_messages::proto3::TestAllTypesProto3; using std::string; @@ -71,6 +70,10 @@ bool verbose = false; TypeResolver* type_resolver; string* type_url; +namespace google { +namespace protobuf { + +using util::Status; bool CheckedRead(int fd, void *buf, size_t len) { size_t ofs = 0; @@ -80,7 +83,7 @@ bool CheckedRead(int fd, void *buf, size_t len) { if (bytes_read == 0) return false; if (bytes_read < 0) { - GOOGLE_LOG(FATAL) << "Error reading from test runner: " << strerror(errno); + GOOGLE_LOG(FATAL) << "Error reading from test runner: " << strerror(errno); } len -= bytes_read; @@ -127,7 +130,7 @@ void DoTest(const ConformanceRequest& request, ConformanceResponse* response) { options); if (!status.ok()) { response->set_parse_error(string("Parse error: ") + - status.error_message().as_string()); + std::string(status.error_message())); return; } @@ -152,8 +155,7 @@ void DoTest(const ConformanceRequest& request, ConformanceResponse* response) { break; default: - GOOGLE_LOG(FATAL) << "unknown payload type: " - << request.payload_case(); + GOOGLE_LOG(FATAL) << "unknown payload type: " << request.payload_case(); break; } @@ -169,7 +171,8 @@ void DoTest(const ConformanceRequest& request, ConformanceResponse* response) { break; case conformance::PROTOBUF: { - GOOGLE_CHECK(test_message->SerializeToString(response->mutable_protobuf_payload())); + GOOGLE_CHECK(test_message->SerializeToString( + response->mutable_protobuf_payload())); break; } @@ -181,7 +184,7 @@ void DoTest(const ConformanceRequest& request, ConformanceResponse* response) { if (!status.ok()) { response->set_serialize_error( string("Failed to serialize JSON output: ") + - status.error_message().as_string()); + std::string(status.error_message())); return; } break; @@ -191,13 +194,13 @@ void DoTest(const ConformanceRequest& request, ConformanceResponse* response) { TextFormat::Printer printer; printer.SetHideUnknownFields(!request.print_unknown_fields()); GOOGLE_CHECK(printer.PrintToString(*test_message, - response->mutable_text_payload())); + response->mutable_text_payload())); break; } default: GOOGLE_LOG(FATAL) << "Unknown output format: " - << request.requested_output_format(); + << request.requested_output_format(); } } @@ -243,12 +246,15 @@ bool DoTestIo() { return true; } +} // namespace protobuf +} // namespace google + int main() { type_resolver = NewTypeResolverForDescriptorPool( kTypeUrlPrefix, DescriptorPool::generated_pool()); type_url = new string(GetTypeUrl(TestAllTypesProto3::descriptor())); while (1) { - if (!DoTestIo()) { + if (!google::protobuf::DoTestIo()) { fprintf(stderr, "conformance-cpp: received EOF from test runner " "after %d tests, exiting\n", test_count); return 0; diff --git a/conformance/conformance_python.py b/conformance/conformance_python.py index 88d9749389..37ee36e24c 100755 --- a/conformance/conformance_python.py +++ b/conformance/conformance_python.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# # Protocol Buffers - Google's data interchange format # Copyright 2008 Google Inc. All rights reserved. # https://developers.google.com/protocol-buffers/ @@ -38,8 +37,6 @@ See conformance.proto for more information. import struct import sys import os -from google.protobuf import descriptor -from google.protobuf import descriptor_pool from google.protobuf import json_format from google.protobuf import message from google.protobuf import test_messages_proto3_pb2 diff --git a/conformance/conformance_test.cc b/conformance/conformance_test.cc index 0743b5e361..07b4150670 100644 --- a/conformance/conformance_test.cc +++ b/conformance/conformance_test.cc @@ -28,30 +28,28 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#include +#include "conformance_test.h" + #include -#include -#include -#include "conformance.pb.h" -#include "conformance_test.h" +#include +#include +#include #include -#include #include #include #include #include #include +#include "conformance.pb.h" using conformance::ConformanceRequest; using conformance::ConformanceResponse; using conformance::WireFormat; using google::protobuf::TextFormat; using google::protobuf::util::DefaultFieldComparator; -using google::protobuf::util::JsonToBinaryString; using google::protobuf::util::MessageDifferencer; -using google::protobuf::util::Status; using std::string; namespace { @@ -120,9 +118,9 @@ ConformanceTestSuite::ConformanceRequestSetting::ConformanceRequestSetting( request_.set_requested_output_format(output_format); } -Message* ConformanceTestSuite::ConformanceRequestSetting:: - GetTestMessage() const { - return prototype_message_for_compare_->New(); +std::unique_ptr +ConformanceTestSuite::ConformanceRequestSetting::NewTestMessage() const { + return std::unique_ptr(prototype_message_for_compare_->New()); } string ConformanceTestSuite::ConformanceRequestSetting:: @@ -131,11 +129,9 @@ string ConformanceTestSuite::ConformanceRequestSetting:: prototype_message_.GetDescriptor()->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 ? "Proto3" : "Proto2"; - return StrCat(ConformanceLevelToString(level_), ".", - rname, ".", - InputFormatString(input_format_), - ".", test_name_, ".", - OutputFormatString(output_format_)); + return StrCat(ConformanceLevelToString(level_), ".", rname, ".", + InputFormatString(input_format_), ".", test_name_, ".", + OutputFormatString(output_format_)); } string ConformanceTestSuite::ConformanceRequestSetting:: @@ -228,11 +224,11 @@ void ConformanceTestSuite::ReportSkip(const string& test_name, void ConformanceTestSuite::RunValidInputTest( const ConformanceRequestSetting& setting, const string& equivalent_text_format) { - Message* reference_message = setting.GetTestMessage(); - GOOGLE_CHECK( - TextFormat::ParseFromString(equivalent_text_format, reference_message)) - << "Failed to parse data for test case: " << setting.GetTestName() - << ", data: " << equivalent_text_format; + std::unique_ptr reference_message(setting.NewTestMessage()); + GOOGLE_CHECK(TextFormat::ParseFromString(equivalent_text_format, + reference_message.get())) + << "Failed to parse data for test case: " << setting.GetTestName() + << ", data: " << equivalent_text_format; const string equivalent_wire_format = reference_message->SerializeAsString(); RunValidBinaryInputTest(setting, equivalent_wire_format); } @@ -251,15 +247,14 @@ void ConformanceTestSuite::VerifyResponse( const ConformanceRequestSetting& setting, const string& equivalent_wire_format, const ConformanceResponse& response, bool need_report_success, bool require_same_wire_format) { - Message* test_message = setting.GetTestMessage(); + std::unique_ptr test_message(setting.NewTestMessage()); const ConformanceRequest& request = setting.GetRequest(); const string& test_name = setting.GetTestName(); ConformanceLevel level = setting.GetLevel(); - Message* reference_message = setting.GetTestMessage(); + std::unique_ptr reference_message = setting.NewTestMessage(); - GOOGLE_CHECK( - reference_message->ParseFromString(equivalent_wire_format)) - << "Failed to parse wire data for test case: " << test_name; + GOOGLE_CHECK(reference_message->ParseFromString(equivalent_wire_format)) + << "Failed to parse wire data for test case: " << test_name; switch (response.result_case()) { case ConformanceResponse::RESULT_NOT_SET: @@ -279,7 +274,7 @@ void ConformanceTestSuite::VerifyResponse( return; default: - if (!ParseResponse(response, setting, test_message)) return; + if (!ParseResponse(response, setting, test_message.get())) return; } MessageDifferencer differencer; @@ -292,12 +287,11 @@ void ConformanceTestSuite::VerifyResponse( bool check = false; if (require_same_wire_format) { - GOOGLE_DCHECK_EQ(response.result_case(), - ConformanceResponse::kProtobufPayload); + GOOGLE_DCHECK_EQ(response.result_case(), ConformanceResponse::kProtobufPayload); const string& protobuf_payload = response.protobuf_payload(); check = equivalent_wire_format == protobuf_payload; differences = StrCat("Expect: ", ToOctString(equivalent_wire_format), - ", but got: ", ToOctString(protobuf_payload)); + ", but got: ", ToOctString(protobuf_payload)); } else { check = differencer.Compare(*reference_message, *test_message); } @@ -386,8 +380,7 @@ string ConformanceTestSuite::WireFormatToString( case conformance::UNSPECIFIED: return "UNSPECIFIED"; default: - GOOGLE_LOG(FATAL) << "unknown wire type: " - << wire_format; + GOOGLE_LOG(FATAL) << "unknown wire type: " << wire_format; } return ""; } @@ -450,8 +443,8 @@ bool ConformanceTestSuite::RunSuite(ConformanceTestRunner* runner, } StringAppendF(&output_, - "CONFORMANCE SUITE %s: %d successes, %d skipped, " - "%d expected failures, %d unexpected failures.\n", + "CONFORMANCE SUITE %s: %d successes, %zu skipped, " + "%d expected failures, %zu unexpected failures.\n", ok ? "PASSED" : "FAILED", successes_, skipped_.size(), expected_failures_, unexpected_failing_tests_.size()); StringAppendF(&output_, "\n"); diff --git a/conformance/conformance_test.h b/conformance/conformance_test.h index 6a993de0ea..9f4ce37892 100644 --- a/conformance/conformance_test.h +++ b/conformance/conformance_test.h @@ -38,15 +38,13 @@ #ifndef CONFORMANCE_CONFORMANCE_TEST_H #define CONFORMANCE_CONFORMANCE_TEST_H -#include -#include -#include -#include - #include #include #include +#include +#include +#include #include "conformance.pb.h" namespace conformance { @@ -218,7 +216,7 @@ class ConformanceTestSuite { const string& test_name, const string& input); virtual ~ConformanceRequestSetting() {} - Message* GetTestMessage() const; + std::unique_ptr NewTestMessage() const; string GetTestName() const; diff --git a/conformance/conformance_test_runner.cc b/conformance/conformance_test_runner.cc index c68b2c7e95..9f893cb8e7 100644 --- a/conformance/conformance_test_runner.cc +++ b/conformance/conformance_test_runner.cc @@ -53,28 +53,27 @@ // 3. testee sends 4-byte length M (little endian) // 4. testee sends M bytes representing a ConformanceResponse proto -#include #include -#include #include #include #include + +#include +#include #include #include - #include "conformance.pb.h" #include "conformance_test.h" using conformance::ConformanceResponse; -using google::protobuf::StringAppendF; using google::protobuf::ConformanceTestSuite; using std::string; using std::vector; #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) -#define CHECK_SYSCALL(call) \ +#define GOOGLE_CHECK_SYSCALL(call) \ if (call < 0) { \ perror(#call " " __FILE__ ":" TOSTRING(__LINE__)); \ exit(1); \ @@ -275,22 +274,22 @@ void ForkPipeRunner::SpawnTestProgram() { if (pid) { // Parent. - CHECK_SYSCALL(close(toproc_pipe_fd[0])); - CHECK_SYSCALL(close(fromproc_pipe_fd[1])); + GOOGLE_CHECK_SYSCALL(close(toproc_pipe_fd[0])); + GOOGLE_CHECK_SYSCALL(close(fromproc_pipe_fd[1])); write_fd_ = toproc_pipe_fd[1]; read_fd_ = fromproc_pipe_fd[0]; child_pid_ = pid; } else { // Child. - CHECK_SYSCALL(close(STDIN_FILENO)); - CHECK_SYSCALL(close(STDOUT_FILENO)); - CHECK_SYSCALL(dup2(toproc_pipe_fd[0], STDIN_FILENO)); - CHECK_SYSCALL(dup2(fromproc_pipe_fd[1], STDOUT_FILENO)); + GOOGLE_CHECK_SYSCALL(close(STDIN_FILENO)); + GOOGLE_CHECK_SYSCALL(close(STDOUT_FILENO)); + GOOGLE_CHECK_SYSCALL(dup2(toproc_pipe_fd[0], STDIN_FILENO)); + GOOGLE_CHECK_SYSCALL(dup2(fromproc_pipe_fd[1], STDOUT_FILENO)); - CHECK_SYSCALL(close(toproc_pipe_fd[0])); - CHECK_SYSCALL(close(fromproc_pipe_fd[1])); - CHECK_SYSCALL(close(toproc_pipe_fd[1])); - CHECK_SYSCALL(close(fromproc_pipe_fd[0])); + GOOGLE_CHECK_SYSCALL(close(toproc_pipe_fd[0])); + GOOGLE_CHECK_SYSCALL(close(fromproc_pipe_fd[1])); + GOOGLE_CHECK_SYSCALL(close(toproc_pipe_fd[1])); + GOOGLE_CHECK_SYSCALL(close(fromproc_pipe_fd[0])); std::unique_ptr executable(new char[executable_.size() + 1]); memcpy(executable.get(), executable_.c_str(), executable_.size()); @@ -303,15 +302,14 @@ void ForkPipeRunner::SpawnTestProgram() { } argv.push_back(nullptr); // Never returns. - CHECK_SYSCALL(execv(executable.get(), const_cast(argv.data()))); + GOOGLE_CHECK_SYSCALL(execv(executable.get(), const_cast(argv.data()))); } } void ForkPipeRunner::CheckedWrite(int fd, const void *buf, size_t len) { if (write(fd, buf, len) != len) { GOOGLE_LOG(FATAL) << current_test_name_ - << ": error writing to test program: " - << strerror(errno); + << ": error writing to test program: " << strerror(errno); } } @@ -321,13 +319,11 @@ bool ForkPipeRunner::TryRead(int fd, void *buf, size_t len) { ssize_t bytes_read = read(fd, (char*)buf + ofs, len); if (bytes_read == 0) { - GOOGLE_LOG(ERROR) << current_test_name_ - << ": unexpected EOF from test program"; + GOOGLE_LOG(ERROR) << current_test_name_ << ": unexpected EOF from test program"; return false; } else if (bytes_read < 0) { GOOGLE_LOG(ERROR) << current_test_name_ - << ": error reading from test program: " - << strerror(errno); + << ": error reading from test program: " << strerror(errno); return false; } @@ -341,8 +337,7 @@ bool ForkPipeRunner::TryRead(int fd, void *buf, size_t len) { void ForkPipeRunner::CheckedRead(int fd, void *buf, size_t len) { if (!TryRead(fd, buf, len)) { GOOGLE_LOG(FATAL) << current_test_name_ - << ": error reading from test program: " - << strerror(errno); + << ": error reading from test program: " << strerror(errno); } } diff --git a/conformance/failure_list_js.txt b/conformance/failure_list_js.txt index 4cb0a052c5..ef9131a78e 100644 --- a/conformance/failure_list_js.txt +++ b/conformance/failure_list_js.txt @@ -1,3 +1,4 @@ + Recommended.Proto2.ProtobufInput.ValidDataRepeated.BOOL.PackedInput.DefaultOutput.ProtobufOutput Recommended.Proto2.ProtobufInput.ValidDataRepeated.BOOL.PackedInput.UnpackedOutput.ProtobufOutput Recommended.Proto2.ProtobufInput.ValidDataRepeated.BOOL.UnpackedInput.PackedOutput.ProtobufOutput diff --git a/conformance/text_format_conformance_suite.cc b/conformance/text_format_conformance_suite.cc index 97b7b90727..fc7b251523 100644 --- a/conformance/text_format_conformance_suite.cc +++ b/conformance/text_format_conformance_suite.cc @@ -30,20 +30,21 @@ #include "text_format_conformance_suite.h" -#include "conformance_test.h" - #include +#include +#include "conformance_test.h" #include #include -#include + +namespace proto2_messages = protobuf_test_messages::proto2; using conformance::ConformanceRequest; using conformance::ConformanceResponse; using conformance::WireFormat; using google::protobuf::Message; using google::protobuf::TextFormat; -using protobuf_test_messages::proto2::TestAllTypesProto2; -using protobuf_test_messages::proto2::UnknownToTestAllTypes; +using proto2_messages::TestAllTypesProto2; +using proto2_messages::UnknownToTestAllTypes; using protobuf_test_messages::proto3::TestAllTypesProto3; using std::string; @@ -64,8 +65,8 @@ bool TextFormatConformanceTestSuite::ParseTextFormatResponse( } if (!parser.ParseFromString(response.text_payload(), test_message)) { GOOGLE_LOG(ERROR) << "INTERNAL ERROR: internal text->protobuf transcode " - << "yielded unparseable proto. Text payload: " - << response.text_payload(); + << "yielded unparseable proto. Text payload: " + << response.text_payload(); return false; } @@ -83,11 +84,11 @@ bool TextFormatConformanceTestSuite::ParseResponse( switch (response.result_case()) { case ConformanceResponse::kProtobufPayload: { if (requested_output != conformance::PROTOBUF) { - ReportFailure( - test_name, level, request, response, - StrCat("Test was asked for ", WireFormatToString(requested_output), - " output but provided PROTOBUF instead.") - .c_str()); + ReportFailure(test_name, level, request, response, + StrCat("Test was asked for ", + WireFormatToString(requested_output), + " output but provided PROTOBUF instead.") + .c_str()); return false; } @@ -102,11 +103,11 @@ bool TextFormatConformanceTestSuite::ParseResponse( case ConformanceResponse::kTextPayload: { if (requested_output != conformance::TEXT_FORMAT) { - ReportFailure( - test_name, level, request, response, - StrCat("Test was asked for ", WireFormatToString(requested_output), - " output but provided TEXT_FORMAT instead.") - .c_str()); + ReportFailure(test_name, level, request, response, + StrCat("Test was asked for ", + WireFormatToString(requested_output), + " output but provided TEXT_FORMAT instead.") + .c_str()); return false; } @@ -122,7 +123,7 @@ bool TextFormatConformanceTestSuite::ParseResponse( default: GOOGLE_LOG(FATAL) << test_name - << ": unknown payload type: " << response.result_case(); + << ": unknown payload type: " << response.result_case(); } return true; @@ -139,8 +140,9 @@ void TextFormatConformanceTestSuite::ExpectParseFailure(const string& test_name, conformance::TEXT_FORMAT_TEST, prototype, test_name, input); const ConformanceRequest& request = setting.GetRequest(); ConformanceResponse response; - string effective_test_name = StrCat(setting.ConformanceLevelToString(level), - ".Proto3.TextFormatInput.", test_name); + string effective_test_name = + StrCat(setting.ConformanceLevelToString(level), + ".Proto3.TextFormatInput.", test_name); RunTest(effective_test_name, request, &response); if (response.result_case() == ConformanceResponse::kParseError) { diff --git a/csharp/src/Google.Protobuf.Conformance/Conformance.cs b/csharp/src/Google.Protobuf.Conformance/Conformance.cs index 65ba9b1265..849dc55e80 100644 --- a/csharp/src/Google.Protobuf.Conformance/Conformance.cs +++ b/csharp/src/Google.Protobuf.Conformance/Conformance.cs @@ -355,7 +355,7 @@ namespace Conformance { /// /// The full name for the test message to use; for the moment, either: /// protobuf_test_messages.proto3.TestAllTypesProto3 or - /// protobuf_test_messages.proto2.TestAllTypesProto2. + /// protobuf_test_messages.google.protobuf.TestAllTypesProto2. /// [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public string MessageType { diff --git a/csharp/src/Google.Protobuf.Test/testprotos.pb b/csharp/src/Google.Protobuf.Test/testprotos.pb index 4404d16258..818b227b37 100644 Binary files a/csharp/src/Google.Protobuf.Test/testprotos.pb and b/csharp/src/Google.Protobuf.Test/testprotos.pb differ diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs b/csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs index 0bbf313971..00e1e9faa4 100644 --- a/csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs +++ b/csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs @@ -238,7 +238,7 @@ namespace Google.Protobuf.WellKnownTypes { /// /// The implementation of any API method which has a FieldMask type field in the /// request should verify the included field paths, and return an - /// `INVALID_ARGUMENT` error if any path is duplicated or unmappable. + /// `INVALID_ARGUMENT` error if any path is unmappable. /// public sealed partial class FieldMask : pb::IMessage { private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new FieldMask()); diff --git a/java/core/src/main/java/com/google/protobuf/ByteString.java b/java/core/src/main/java/com/google/protobuf/ByteString.java index a13f1da08f..17b7c98c99 100644 --- a/java/core/src/main/java/com/google/protobuf/ByteString.java +++ b/java/core/src/main/java/com/google/protobuf/ByteString.java @@ -57,13 +57,17 @@ import java.util.Locale; import java.util.NoSuchElementException; /** - * Immutable sequence of bytes. Substring is supported by sharing the reference to the immutable - * underlying bytes. Concatenation is likewise supported without copying (long strings) by building - * a tree of pieces in {@link RopeByteString}. + * Immutable sequence of bytes. Provides conversions to and from {@code byte[]}, {@link + * java.lang.String}, {@link ByteBuffer}, {@link InputStream}, {@link OutputStream}. Also provides a + * conversion to {@link CodedInputStream}. * *

Like {@link String}, the contents of a {@link ByteString} can never be observed to change, not * even in the presence of a data race or incorrect API usage in the client code. * + *

Substring is supported by sharing the reference to the immutable underlying bytes. + * Concatenation is likewise supported without copying (long strings) by building a tree of pieces + * in {@link RopeByteString}. + * * @author crazybob@google.com Bob Lee * @author kenton@google.com Kenton Varda * @author carlanton@google.com Carl Haverl diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java index d46b1bac7b..1ee785de8e 100644 --- a/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java +++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java @@ -1023,7 +1023,7 @@ public abstract class GeneratedMessageLite< } /** Clear an extension. */ - public final BuilderType clearExtension(final ExtensionLite extension) { + public final BuilderType clearExtension(final ExtensionLite extension) { GeneratedExtension extensionLite = checkIsLite(extension); verifyExtensionContainingType(extensionLite); diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java index 4e00bb4728..5f7b387170 100644 --- a/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java +++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java @@ -1498,8 +1498,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage } /** Clear an extension. */ - public final BuilderType clearExtension( - final ExtensionLite extensionLite) { + public final BuilderType clearExtension(final ExtensionLite extensionLite) { Extension extension = checkNotLite(extensionLite); verifyExtensionContainingType(extension); diff --git a/java/core/src/main/java/com/google/protobuf/MessageLiteToString.java b/java/core/src/main/java/com/google/protobuf/MessageLiteToString.java index 8e2659359b..4aea9528ac 100644 --- a/java/core/src/main/java/com/google/protobuf/MessageLiteToString.java +++ b/java/core/src/main/java/com/google/protobuf/MessageLiteToString.java @@ -88,7 +88,7 @@ final class MessageLiteToString { } for (String getter : getters) { - String suffix = getter.replaceFirst("get", ""); + String suffix = getter.startsWith("get") ? getter.substring(3) : getter; if (suffix.endsWith(LIST_SUFFIX) && !suffix.endsWith(BUILDER_LIST_SUFFIX) // Sometimes people have fields named 'list' that aren't repeated. diff --git a/java/core/src/main/java/com/google/protobuf/MessageSchema.java b/java/core/src/main/java/com/google/protobuf/MessageSchema.java index 0c6cf99963..8f9ce7328e 100755 --- a/java/core/src/main/java/com/google/protobuf/MessageSchema.java +++ b/java/core/src/main/java/com/google/protobuf/MessageSchema.java @@ -1173,12 +1173,10 @@ final class MessageSchema implements Schema { mergeSingleField(message, other, i); } - if (!proto3) { - SchemaUtil.mergeUnknownFields(unknownFieldSchema, message, other); + SchemaUtil.mergeUnknownFields(unknownFieldSchema, message, other); - if (hasExtensions) { - SchemaUtil.mergeExtensions(extensionSchema, message, other); - } + if (hasExtensions) { + SchemaUtil.mergeExtensions(extensionSchema, message, other); } } diff --git a/java/core/src/main/java/com/google/protobuf/RopeByteString.java b/java/core/src/main/java/com/google/protobuf/RopeByteString.java index c2557ab85b..54d4180595 100644 --- a/java/core/src/main/java/com/google/protobuf/RopeByteString.java +++ b/java/core/src/main/java/com/google/protobuf/RopeByteString.java @@ -211,7 +211,7 @@ final class RopeByteString extends ByteString { // Fine, we'll add a node and increase the tree depth--unless we rebalance ;^) int newDepth = Math.max(left.getTreeDepth(), right.getTreeDepth()) + 1; - if (newLength >= minLengthByDepth[newDepth]) { + if (newLength >= minLength(newDepth)) { // The tree is shallow enough, so don't rebalance return new RopeByteString(left, right); } @@ -250,6 +250,22 @@ final class RopeByteString extends ByteString { return new RopeByteString(left, right); } + /** + * Returns the minimum length for which a tree of the given depth is considered balanced according + * to BAP95, which means the tree is flat-enough with respect to the bounds. Defaults to {@code + * Integer.MAX_VALUE} if {@code depth >= minLengthByDepth.length} in order to avoid an {@code + * ArrayIndexOutOfBoundsException}. + * + * @param depth tree depth + * @return minimum balanced length + */ + static int minLength(int depth) { + if (depth >= minLengthByDepth.length) { + return Integer.MAX_VALUE; + } + return minLengthByDepth[depth]; + } + /** * Gets the byte at the given index. Throws {@link ArrayIndexOutOfBoundsException} for * backwards-compatibility reasons although it would more properly be {@link @@ -328,7 +344,7 @@ final class RopeByteString extends ByteString { */ @Override protected boolean isBalanced() { - return totalLength >= minLengthByDepth[treeDepth]; + return totalLength >= minLength(treeDepth); } /** @@ -656,7 +672,7 @@ final class RopeByteString extends ByteString { */ private void insert(ByteString byteString) { int depthBin = getDepthBinForLength(byteString.size()); - int binEnd = minLengthByDepth[depthBin + 1]; + int binEnd = minLength(depthBin + 1); // BAP95: Concatenate all trees occupying bins representing the length of // our new piece or of shorter pieces, to the extent that is possible. @@ -665,7 +681,7 @@ final class RopeByteString extends ByteString { if (prefixesStack.isEmpty() || prefixesStack.peek().size() >= binEnd) { prefixesStack.push(byteString); } else { - int binStart = minLengthByDepth[depthBin]; + int binStart = minLength(depthBin); // Concatenate the subtrees of shorter length ByteString newTree = prefixesStack.pop(); @@ -680,7 +696,7 @@ final class RopeByteString extends ByteString { // Continue concatenating until we land in an empty bin while (!prefixesStack.isEmpty()) { depthBin = getDepthBinForLength(newTree.size()); - binEnd = minLengthByDepth[depthBin + 1]; + binEnd = minLength(depthBin + 1); if (prefixesStack.peek().size() < binEnd) { ByteString left = prefixesStack.pop(); newTree = new RopeByteString(left, newTree); @@ -816,7 +832,7 @@ final class RopeByteString extends ByteString { * *

Note that {@link InputStream#read(byte[], int, int)} and {@link * ByteArrayInputStream#read(byte[], int, int)} behave inconsistently when reading 0 bytes at - * EOF; the interface defines the return value to be 0 and the latter returns -1. We use the + * EOF; the interface defines the return value to be 0 and the latter returns -1. We use the * latter behavior so that all ByteString streams are consistent. * * @return -1 if at EOF, otherwise the actual number of bytes read. diff --git a/java/core/src/test/java/com/google/protobuf/RopeByteStringTest.java b/java/core/src/test/java/com/google/protobuf/RopeByteStringTest.java index 9299267212..46c2d8678a 100644 --- a/java/core/src/test/java/com/google/protobuf/RopeByteStringTest.java +++ b/java/core/src/test/java/com/google/protobuf/RopeByteStringTest.java @@ -62,18 +62,19 @@ public class RopeByteStringTest extends LiteralByteStringTest { expectedHashCode = -1214197238; } - public void testMinLengthByDepth() { - // minLengthByDepth should match the Fibonacci sequence + public void testMinLength() { + // minLength should match the Fibonacci sequence int a = 1; int b = 1; int i; for (i = 0; a > 0; i++) { - assertEquals(a, RopeByteString.minLengthByDepth[i]); + assertEquals(a, RopeByteString.minLength(i)); int c = a + b; a = b; b = c; } - assertEquals(Integer.MAX_VALUE, RopeByteString.minLengthByDepth[i]); + assertEquals(Integer.MAX_VALUE, RopeByteString.minLength(i)); + assertEquals(Integer.MAX_VALUE, RopeByteString.minLength(i + 1)); assertEquals(i + 1, RopeByteString.minLengthByDepth.length); } diff --git a/java/core/src/test/java/com/google/protobuf/UnknownFieldSetTest.java b/java/core/src/test/java/com/google/protobuf/UnknownFieldSetTest.java index 6316bd8532..c7eb57c63d 100644 --- a/java/core/src/test/java/com/google/protobuf/UnknownFieldSetTest.java +++ b/java/core/src/test/java/com/google/protobuf/UnknownFieldSetTest.java @@ -38,6 +38,7 @@ import protobuf_unittest.UnittestProto.TestEmptyMessage; import protobuf_unittest.UnittestProto.TestEmptyMessageWithExtensions; import protobuf_unittest.UnittestProto.TestPackedExtensions; import protobuf_unittest.UnittestProto.TestPackedTypes; +import proto3_unittest.UnittestProto3; import java.util.Arrays; import java.util.Map; import junit.framework.TestCase; @@ -379,4 +380,28 @@ public class UnknownFieldSetTest extends TestCase { } // ================================================================= + + public void testProto3RoundTrip() throws Exception { + ByteString data = getBizarroData(); + + UnittestProto3.TestEmptyMessage message = + UnittestProto3.TestEmptyMessage.parseFrom(data, ExtensionRegistryLite.getEmptyRegistry()); + assertEquals(data, message.toByteString()); + + message = UnittestProto3.TestEmptyMessage.newBuilder().mergeFrom(message).build(); + assertEquals(data, message.toByteString()); + + assertEquals( + data, + UnittestProto3.TestMessageWithDummy.parseFrom( + data, ExtensionRegistryLite.getEmptyRegistry()) + .toBuilder() + // force copy-on-write + .setDummy(true) + .build() + .toBuilder() + .clearDummy() + .build() + .toByteString()); + } } diff --git a/java/lite/proguard.pgcfg b/java/lite/proguard.pgcfg new file mode 100755 index 0000000000..4bb31e57b2 --- /dev/null +++ b/java/lite/proguard.pgcfg @@ -0,0 +1,3 @@ +-keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite { + ; +} diff --git a/js/binary/decoder.js b/js/binary/decoder.js index e0cd12e043..75d4ff7053 100644 --- a/js/binary/decoder.js +++ b/js/binary/decoder.js @@ -180,9 +180,9 @@ jspb.BinaryDecoder.prototype.getBuffer = function() { jspb.BinaryDecoder.prototype.setBlock = function(data, opt_start, opt_length) { this.bytes_ = jspb.utils.byteSourceToUint8Array(data); - this.start_ = goog.isDef(opt_start) ? opt_start : 0; - this.end_ = - goog.isDef(opt_length) ? this.start_ + opt_length : this.bytes_.length; + this.start_ = (opt_start !== undefined) ? opt_start : 0; + this.end_ = (opt_length !== undefined) ? this.start_ + opt_length : + this.bytes_.length; this.cursor_ = this.start_; }; diff --git a/js/binary/encoder.js b/js/binary/encoder.js index 0387f04395..726481b2c1 100644 --- a/js/binary/encoder.js +++ b/js/binary/encoder.js @@ -414,7 +414,7 @@ jspb.BinaryEncoder.prototype.writeDouble = function(value) { * @param {boolean|number} value The value to write. */ jspb.BinaryEncoder.prototype.writeBool = function(value) { - goog.asserts.assert(goog.isBoolean(value) || goog.isNumber(value)); + goog.asserts.assert(typeof value === 'boolean' || typeof value === 'number'); this.buffer_.push(value ? 1 : 0); }; diff --git a/js/binary/proto_test.js b/js/binary/proto_test.js index ae31c8d1ce..aee327a8ea 100644 --- a/js/binary/proto_test.js +++ b/js/binary/proto_test.js @@ -176,7 +176,7 @@ function fillAllFields(msg) { * @return {boolean} */ function bytesCompare(arr, expected) { - if (goog.isString(arr)) { + if (typeof arr === 'string') { arr = goog.crypt.base64.decodeStringToUint8Array(arr); } if (arr.length != expected.length) { @@ -481,8 +481,8 @@ describe('protoBinaryTest', function() { var msg = new proto.jspb.test.TestAllTypes(); function assertGetters() { - assertTrue(goog.isString(msg.getRepeatedBytesList_asB64()[0])); - assertTrue(goog.isString(msg.getRepeatedBytesList_asB64()[1])); + assertTrue(typeof msg.getRepeatedBytesList_asB64()[0] === 'string'); + assertTrue(typeof msg.getRepeatedBytesList_asB64()[1] === 'string'); assertTrue(msg.getRepeatedBytesList_asU8()[0] instanceof Uint8Array); assertTrue(msg.getRepeatedBytesList_asU8()[1] instanceof Uint8Array); diff --git a/js/binary/reader.js b/js/binary/reader.js index 9e193ac03e..2af1a4ac39 100644 --- a/js/binary/reader.js +++ b/js/binary/reader.js @@ -445,9 +445,9 @@ jspb.BinaryReader.prototype.skipField = function() { * @param {string} callbackName * @param {function(!jspb.BinaryReader):*} callback */ -jspb.BinaryReader.prototype.registerReadCallback = - function(callbackName, callback) { - if (goog.isNull(this.readCallbacks_)) { +jspb.BinaryReader.prototype.registerReadCallback = function( + callbackName, callback) { + if (this.readCallbacks_ === null) { this.readCallbacks_ = {}; } goog.asserts.assert(!this.readCallbacks_[callbackName]); @@ -461,7 +461,7 @@ jspb.BinaryReader.prototype.registerReadCallback = * @return {*} The value returned by the callback. */ jspb.BinaryReader.prototype.runReadCallback = function(callbackName) { - goog.asserts.assert(!goog.isNull(this.readCallbacks_)); + goog.asserts.assert(this.readCallbacks_ !== null); var callback = this.readCallbacks_[callbackName]; goog.asserts.assert(callback); return callback(this); diff --git a/js/binary/utils.js b/js/binary/utils.js index c2965c4cff..195247ecd2 100644 --- a/js/binary/utils.js +++ b/js/binary/utils.js @@ -1001,7 +1001,7 @@ jspb.utils.debugBytesToTextFormat = function(byteSource) { * @return {string} Stringified scalar for text format. */ jspb.utils.debugScalarToTextFormat = function(scalar) { - if (goog.isString(scalar)) { + if (typeof scalar === 'string') { return goog.string.quote(scalar); } else { return scalar.toString(); diff --git a/js/binary/utils_test.js b/js/binary/utils_test.js index 51a9deec21..e953ace9fc 100644 --- a/js/binary/utils_test.js +++ b/js/binary/utils_test.js @@ -356,7 +356,7 @@ describe('binaryUtilsTest', function() { */ function test(x, opt_bits) { jspb.utils.splitFloat32(x); - if (goog.isDef(opt_bits)) { + if (opt_bits !== undefined) { if (opt_bits != jspb.utils.split64Low) throw 'fail!'; } expect(truncate(x)) @@ -428,11 +428,11 @@ describe('binaryUtilsTest', function() { */ function test(x, opt_highBits, opt_lowBits) { jspb.utils.splitFloat64(x); - if (goog.isDef(opt_highBits)) { + if (opt_highBits !== undefined) { var split64High = jspb.utils.split64High; expect(opt_highBits.toString(16)).toEqual(split64High.toString(16)); } - if (goog.isDef(opt_lowBits)) { + if (opt_lowBits !== undefined) { var split64Low = jspb.utils.split64Low; expect(opt_lowBits.toString(16)).toEqual(split64Low.toString(16)); } diff --git a/js/binary/writer.js b/js/binary/writer.js index 8c5bff810e..ab9a815056 100644 --- a/js/binary/writer.js +++ b/js/binary/writer.js @@ -748,7 +748,7 @@ jspb.BinaryWriter.prototype.writeDouble = function(field, value) { */ jspb.BinaryWriter.prototype.writeBool = function(field, value) { if (value == null) return; - goog.asserts.assert(goog.isBoolean(value) || goog.isNumber(value)); + goog.asserts.assert(typeof value === 'boolean' || typeof value === 'number'); this.writeFieldHeader_(field, jspb.BinaryConstants.WireType.VARINT); this.encoder_.writeBool(value); }; diff --git a/js/map.js b/js/map.js index 589a2938d5..ab852e4a4d 100644 --- a/js/map.js +++ b/js/map.js @@ -208,14 +208,14 @@ jspb.Map.ArrayIteratorIterable_.prototype.next = function() { } }; + if (typeof(Symbol) != 'undefined') { - /** @override */ - jspb.Map.ArrayIteratorIterable_.prototype[Symbol.iterator] = function() { - return this; - }; +/** @override */ +jspb.Map.ArrayIteratorIterable_.prototype[Symbol.iterator] = function() { + return this; +}; } - /** * Returns the map's length (number of key/value pairs). * @return {number} diff --git a/js/message.js b/js/message.js index 52c541eb40..4bf0378de2 100644 --- a/js/message.js +++ b/js/message.js @@ -778,7 +778,7 @@ jspb.Message.getRepeatedBooleanField = function(msg, fieldNumber) { * @return {?string} The field's coerced value. */ jspb.Message.bytesAsB64 = function(value) { - if (value == null || goog.isString(value)) { + if (value == null || typeof value === 'string') { return value; } if (jspb.Message.SUPPORTS_UINT8ARRAY_ && value instanceof Uint8Array) { @@ -800,7 +800,7 @@ jspb.Message.bytesAsU8 = function(value) { if (value == null || value instanceof Uint8Array) { return value; } - if (goog.isString(value)) { + if (typeof value === 'string') { return goog.crypt.base64.decodeStringToUint8Array(value); } goog.asserts.fail('Cannot coerce to Uint8Array: ' + goog.typeOf(value)); @@ -816,7 +816,7 @@ jspb.Message.bytesAsU8 = function(value) { */ jspb.Message.bytesListAsB64 = function(value) { jspb.Message.assertConsistentTypes_(value); - if (!value.length || goog.isString(value[0])) { + if (!value.length || typeof value[0] === 'string') { return /** @type {!Array} */ (value); } return goog.array.map(value, jspb.Message.bytesAsB64); @@ -1654,8 +1654,8 @@ jspb.Message.compareFields = function(field1, field2) { if (!goog.isObject(field1) || !goog.isObject(field2)) { // NaN != NaN so we cover this case. - if ((goog.isNumber(field1) && isNaN(field1)) || - (goog.isNumber(field2) && isNaN(field2))) { + if ((typeof field1 === 'number' && isNaN(field1)) || + (typeof field2 === 'number' && isNaN(field2))) { // One of the fields might be a string 'NaN'. return String(field1) == String(field2); } diff --git a/js/message_test.js b/js/message_test.js index b2d0da1240..e038f65c51 100644 --- a/js/message_test.js +++ b/js/message_test.js @@ -855,7 +855,7 @@ describe('Message test suite', function() { var assertNan = function(x) { assertTrue( 'Expected ' + x + ' (' + goog.typeOf(x) + ') to be NaN.', - goog.isNumber(x) && isNaN(x)); + typeof x === 'number' && isNaN(x)); }; var message = new proto.jspb.test.FloatingPointFields([ diff --git a/js/proto3_test.js b/js/proto3_test.js index 7f9d71d3f6..79acc3c261 100644 --- a/js/proto3_test.js +++ b/js/proto3_test.js @@ -54,7 +54,7 @@ var BYTES_B64 = goog.crypt.base64.encodeByteArray(BYTES); * @return {boolean} */ function bytesCompare(arr, expected) { - if (goog.isString(arr)) { + if (typeof arr === 'string') { arr = goog.crypt.base64.decodeStringToUint8Array(arr); } if (arr.length != expected.length) { diff --git a/objectivec/google/protobuf/FieldMask.pbobjc.h b/objectivec/google/protobuf/FieldMask.pbobjc.h index 61fdd259fe..92d504229a 100644 --- a/objectivec/google/protobuf/FieldMask.pbobjc.h +++ b/objectivec/google/protobuf/FieldMask.pbobjc.h @@ -253,7 +253,7 @@ typedef GPB_ENUM(GPBFieldMask_FieldNumber) { * * The implementation of any API method which has a FieldMask type field in the * request should verify the included field paths, and return an - * `INVALID_ARGUMENT` error if any path is duplicated or unmappable. + * `INVALID_ARGUMENT` error if any path is unmappable. **/ @interface GPBFieldMask : GPBMessage diff --git a/python/google/protobuf/descriptor.py b/python/google/protobuf/descriptor.py index 2c2a0796b2..383cb66353 100755 --- a/python/google/protobuf/descriptor.py +++ b/python/google/protobuf/descriptor.py @@ -45,7 +45,7 @@ if api_implementation.Type() == 'cpp': import binascii import os from google.protobuf.pyext import _message - _USE_C_DESCRIPTORS = getattr(_message, '_USE_C_DESCRIPTORS', False) + _USE_C_DESCRIPTORS = True class Error(Exception): @@ -904,10 +904,6 @@ class FileDescriptor(DescriptorBase): self.dependencies = (dependencies or []) self.public_dependencies = (public_dependencies or []) - if (api_implementation.Type() == 'cpp' and - self.serialized_pb is not None): - _message.default_pool.AddSerializedFile(self.serialized_pb) - def CopyToProto(self, proto): """Copies this to a descriptor_pb2.FileDescriptorProto. diff --git a/python/google/protobuf/internal/enum_type_wrapper.py b/python/google/protobuf/internal/enum_type_wrapper.py index b4d30e2c94..eeb2dae90f 100644 --- a/python/google/protobuf/internal/enum_type_wrapper.py +++ b/python/google/protobuf/internal/enum_type_wrapper.py @@ -37,6 +37,8 @@ on proto classes. For usage, see: __author__ = 'rabsatt@google.com (Kevin Rabsatt)' +import six + class EnumTypeWrapper(object): """A utility for finding the names of enum values.""" @@ -52,8 +54,14 @@ class EnumTypeWrapper(object): """Returns a string containing the name of an enum value.""" if number in self._enum_type.values_by_number: return self._enum_type.values_by_number[number].name - raise ValueError('Enum %s has no name defined for value %d' % ( - self._enum_type.name, number)) + + if not isinstance(number, six.integer_types): + raise TypeError('Enum value for %s must be an int, but got %r.' % ( + self._enum_type.name, number)) + else: + # %r here to handle the odd case when you pass in a boolean. + raise ValueError('Enum %s has no name defined for value %r' % ( + self._enum_type.name, number)) def Value(self, name): """Returns the value corresponding to the given enum name.""" diff --git a/python/google/protobuf/internal/json_format_test.py b/python/google/protobuf/internal/json_format_test.py index 939d4961e7..e3992f99ba 100644 --- a/python/google/protobuf/internal/json_format_test.py +++ b/python/google/protobuf/internal/json_format_test.py @@ -818,6 +818,14 @@ class JsonFormatTest(JsonFormatBase): self.assertEqual(message.repeated_float_value[0], float('inf')) self.assertAlmostEqual(message.repeated_float_value[1], 1.4028235e-39) + def testFloatPrecision(self): + message = json_format_proto3_pb2.TestMessage() + message.float_value = 1.123456789 + # Set to 7 valid digits. + text = '{\n "floatValue": 1.123457\n}' + self.assertEqual( + json_format.MessageToJson(message, float_precision=7), text) + def testParseEmptyText(self): self.CheckError('', r'Failed to load JSON: (Expecting value)|(No JSON).') diff --git a/python/google/protobuf/internal/reflection_test.py b/python/google/protobuf/internal/reflection_test.py index 786a7ca7dd..dace15447c 100755 --- a/python/google/protobuf/internal/reflection_test.py +++ b/python/google/protobuf/internal/reflection_test.py @@ -49,6 +49,7 @@ except ImportError: from google.protobuf import unittest_import_pb2 from google.protobuf import unittest_mset_pb2 from google.protobuf import unittest_pb2 +from google.protobuf import unittest_proto3_arena_pb2 from google.protobuf import descriptor_pb2 from google.protobuf import descriptor from google.protobuf import message @@ -62,6 +63,7 @@ from google.protobuf.internal import wire_format from google.protobuf.internal import test_util from google.protobuf.internal import testing_refleaks from google.protobuf.internal import decoder +from google.protobuf.internal import _parameterized if six.PY3: @@ -113,6 +115,9 @@ class _MiniDecoder(object): return self._pos == len(self._bytes) +@_parameterized.named_parameters( + ('_proto2', unittest_pb2), + ('_proto3', unittest_proto3_arena_pb2)) @testing_refleaks.TestCase class ReflectionTest(unittest.TestCase): @@ -121,9 +126,9 @@ class ReflectionTest(unittest.TestCase): for i in range(len(values)): self.assertEqual(values[i], others[i]) - def testScalarConstructor(self): + def testScalarConstructor(self, message_module): # Constructor with only scalar types should succeed. - proto = unittest_pb2.TestAllTypes( + proto = message_module.TestAllTypes( optional_int32=24, optional_double=54.321, optional_string='optional_string', @@ -132,11 +137,12 @@ class ReflectionTest(unittest.TestCase): self.assertEqual(24, proto.optional_int32) self.assertEqual(54.321, proto.optional_double) self.assertEqual('optional_string', proto.optional_string) - self.assertFalse(proto.HasField("optional_float")) + if message_module is unittest_pb2: + self.assertFalse(proto.HasField("optional_float")) - def testRepeatedScalarConstructor(self): + def testRepeatedScalarConstructor(self, message_module): # Constructor with only repeated scalar types should succeed. - proto = unittest_pb2.TestAllTypes( + proto = message_module.TestAllTypes( repeated_int32=[1, 2, 3, 4], repeated_double=[1.23, 54.321], repeated_bool=[True, False, False], @@ -149,56 +155,22 @@ class ReflectionTest(unittest.TestCase): self.assertEqual(["optional_string"], list(proto.repeated_string)) self.assertEqual([], list(proto.repeated_float)) - def testRepeatedCompositeConstructor(self): - # Constructor with only repeated composite types should succeed. - proto = unittest_pb2.TestAllTypes( - repeated_nested_message=[ - unittest_pb2.TestAllTypes.NestedMessage( - bb=unittest_pb2.TestAllTypes.FOO), - unittest_pb2.TestAllTypes.NestedMessage( - bb=unittest_pb2.TestAllTypes.BAR)], - repeated_foreign_message=[ - unittest_pb2.ForeignMessage(c=-43), - unittest_pb2.ForeignMessage(c=45324), - unittest_pb2.ForeignMessage(c=12)], - repeatedgroup=[ - unittest_pb2.TestAllTypes.RepeatedGroup(), - unittest_pb2.TestAllTypes.RepeatedGroup(a=1), - unittest_pb2.TestAllTypes.RepeatedGroup(a=2)]) - - self.assertEqual( - [unittest_pb2.TestAllTypes.NestedMessage( - bb=unittest_pb2.TestAllTypes.FOO), - unittest_pb2.TestAllTypes.NestedMessage( - bb=unittest_pb2.TestAllTypes.BAR)], - list(proto.repeated_nested_message)) - self.assertEqual( - [unittest_pb2.ForeignMessage(c=-43), - unittest_pb2.ForeignMessage(c=45324), - unittest_pb2.ForeignMessage(c=12)], - list(proto.repeated_foreign_message)) - self.assertEqual( - [unittest_pb2.TestAllTypes.RepeatedGroup(), - unittest_pb2.TestAllTypes.RepeatedGroup(a=1), - unittest_pb2.TestAllTypes.RepeatedGroup(a=2)], - list(proto.repeatedgroup)) - - def testMixedConstructor(self): + def testMixedConstructor(self, message_module): # Constructor with only mixed types should succeed. - proto = unittest_pb2.TestAllTypes( + proto = message_module.TestAllTypes( optional_int32=24, optional_string='optional_string', repeated_double=[1.23, 54.321], repeated_bool=[True, False, False], repeated_nested_message=[ - unittest_pb2.TestAllTypes.NestedMessage( - bb=unittest_pb2.TestAllTypes.FOO), - unittest_pb2.TestAllTypes.NestedMessage( - bb=unittest_pb2.TestAllTypes.BAR)], + message_module.TestAllTypes.NestedMessage( + bb=message_module.TestAllTypes.FOO), + message_module.TestAllTypes.NestedMessage( + bb=message_module.TestAllTypes.BAR)], repeated_foreign_message=[ - unittest_pb2.ForeignMessage(c=-43), - unittest_pb2.ForeignMessage(c=45324), - unittest_pb2.ForeignMessage(c=12)], + message_module.ForeignMessage(c=-43), + message_module.ForeignMessage(c=45324), + message_module.ForeignMessage(c=12)], optional_nested_message=None) self.assertEqual(24, proto.optional_int32) @@ -206,168 +178,78 @@ class ReflectionTest(unittest.TestCase): self.assertEqual([1.23, 54.321], list(proto.repeated_double)) self.assertEqual([True, False, False], list(proto.repeated_bool)) self.assertEqual( - [unittest_pb2.TestAllTypes.NestedMessage( - bb=unittest_pb2.TestAllTypes.FOO), - unittest_pb2.TestAllTypes.NestedMessage( - bb=unittest_pb2.TestAllTypes.BAR)], + [message_module.TestAllTypes.NestedMessage( + bb=message_module.TestAllTypes.FOO), + message_module.TestAllTypes.NestedMessage( + bb=message_module.TestAllTypes.BAR)], list(proto.repeated_nested_message)) self.assertEqual( - [unittest_pb2.ForeignMessage(c=-43), - unittest_pb2.ForeignMessage(c=45324), - unittest_pb2.ForeignMessage(c=12)], + [message_module.ForeignMessage(c=-43), + message_module.ForeignMessage(c=45324), + message_module.ForeignMessage(c=12)], list(proto.repeated_foreign_message)) self.assertFalse(proto.HasField("optional_nested_message")) - def testConstructorTypeError(self): + def testConstructorTypeError(self, message_module): self.assertRaises( - TypeError, unittest_pb2.TestAllTypes, optional_int32="foo") + TypeError, message_module.TestAllTypes, optional_int32='foo') self.assertRaises( - TypeError, unittest_pb2.TestAllTypes, optional_string=1234) + TypeError, message_module.TestAllTypes, optional_string=1234) self.assertRaises( - TypeError, unittest_pb2.TestAllTypes, optional_nested_message=1234) + TypeError, message_module.TestAllTypes, optional_nested_message=1234) self.assertRaises( - TypeError, unittest_pb2.TestAllTypes, repeated_int32=1234) + TypeError, message_module.TestAllTypes, repeated_int32=1234) self.assertRaises( - TypeError, unittest_pb2.TestAllTypes, repeated_int32=["foo"]) + TypeError, message_module.TestAllTypes, repeated_int32=['foo']) self.assertRaises( - TypeError, unittest_pb2.TestAllTypes, repeated_string=1234) + TypeError, message_module.TestAllTypes, repeated_string=1234) self.assertRaises( - TypeError, unittest_pb2.TestAllTypes, repeated_string=[1234]) + TypeError, message_module.TestAllTypes, repeated_string=[1234]) self.assertRaises( - TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=1234) + TypeError, message_module.TestAllTypes, repeated_nested_message=1234) self.assertRaises( - TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=[1234]) + TypeError, message_module.TestAllTypes, repeated_nested_message=[1234]) - def testConstructorInvalidatesCachedByteSize(self): - message = unittest_pb2.TestAllTypes(optional_int32 = 12) + def testConstructorInvalidatesCachedByteSize(self, message_module): + message = message_module.TestAllTypes(optional_int32=12) self.assertEqual(2, message.ByteSize()) - message = unittest_pb2.TestAllTypes( - optional_nested_message = unittest_pb2.TestAllTypes.NestedMessage()) + message = message_module.TestAllTypes( + optional_nested_message=message_module.TestAllTypes.NestedMessage()) self.assertEqual(3, message.ByteSize()) - message = unittest_pb2.TestAllTypes(repeated_int32 = [12]) - self.assertEqual(3, message.ByteSize()) + message = message_module.TestAllTypes(repeated_int32=[12]) + # TODO(jieluo): Add this test back for proto3 + if message_module is unittest_pb2: + self.assertEqual(3, message.ByteSize()) - message = unittest_pb2.TestAllTypes( - repeated_nested_message = [unittest_pb2.TestAllTypes.NestedMessage()]) + message = message_module.TestAllTypes( + repeated_nested_message=[message_module.TestAllTypes.NestedMessage()]) self.assertEqual(3, message.ByteSize()) - def testSimpleHasBits(self): - # Test a scalar. - proto = unittest_pb2.TestAllTypes() - self.assertTrue(not proto.HasField('optional_int32')) - self.assertEqual(0, proto.optional_int32) - # HasField() shouldn't be true if all we've done is - # read the default value. - self.assertTrue(not proto.HasField('optional_int32')) - proto.optional_int32 = 1 - # Setting a value however *should* set the "has" bit. - self.assertTrue(proto.HasField('optional_int32')) - proto.ClearField('optional_int32') - # And clearing that value should unset the "has" bit. - self.assertTrue(not proto.HasField('optional_int32')) - - def testHasBitsWithSinglyNestedScalar(self): - # Helper used to test foreign messages and groups. - # - # composite_field_name should be the name of a non-repeated - # composite (i.e., foreign or group) field in TestAllTypes, - # and scalar_field_name should be the name of an integer-valued - # scalar field within that composite. - # - # I never thought I'd miss C++ macros and templates so much. :( - # This helper is semantically just: - # - # assert proto.composite_field.scalar_field == 0 - # assert not proto.composite_field.HasField('scalar_field') - # assert not proto.HasField('composite_field') - # - # proto.composite_field.scalar_field = 10 - # old_composite_field = proto.composite_field - # - # assert proto.composite_field.scalar_field == 10 - # assert proto.composite_field.HasField('scalar_field') - # assert proto.HasField('composite_field') - # - # proto.ClearField('composite_field') - # - # assert not proto.composite_field.HasField('scalar_field') - # assert not proto.HasField('composite_field') - # assert proto.composite_field.scalar_field == 0 - # - # # Now ensure that ClearField('composite_field') disconnected - # # the old field object from the object tree... - # assert old_composite_field is not proto.composite_field - # old_composite_field.scalar_field = 20 - # assert not proto.composite_field.HasField('scalar_field') - # assert not proto.HasField('composite_field') - def TestCompositeHasBits(composite_field_name, scalar_field_name): - proto = unittest_pb2.TestAllTypes() - # First, check that we can get the scalar value, and see that it's the - # default (0), but that proto.HasField('omposite') and - # proto.composite.HasField('scalar') will still return False. - composite_field = getattr(proto, composite_field_name) - original_scalar_value = getattr(composite_field, scalar_field_name) - self.assertEqual(0, original_scalar_value) - # Assert that the composite object does not "have" the scalar. - self.assertTrue(not composite_field.HasField(scalar_field_name)) - # Assert that proto does not "have" the composite field. - self.assertTrue(not proto.HasField(composite_field_name)) - - # Now set the scalar within the composite field. Ensure that the setting - # is reflected, and that proto.HasField('composite') and - # proto.composite.HasField('scalar') now both return True. - new_val = 20 - setattr(composite_field, scalar_field_name, new_val) - self.assertEqual(new_val, getattr(composite_field, scalar_field_name)) - # Hold on to a reference to the current composite_field object. - old_composite_field = composite_field - # Assert that the has methods now return true. - self.assertTrue(composite_field.HasField(scalar_field_name)) - self.assertTrue(proto.HasField(composite_field_name)) - - # Now call the clear method... - proto.ClearField(composite_field_name) - - # ...and ensure that the "has" bits are all back to False... - composite_field = getattr(proto, composite_field_name) - self.assertTrue(not composite_field.HasField(scalar_field_name)) - self.assertTrue(not proto.HasField(composite_field_name)) - # ...and ensure that the scalar field has returned to its default. - self.assertEqual(0, getattr(composite_field, scalar_field_name)) - - self.assertTrue(old_composite_field is not composite_field) - setattr(old_composite_field, scalar_field_name, new_val) - self.assertTrue(not composite_field.HasField(scalar_field_name)) - self.assertTrue(not proto.HasField(composite_field_name)) - self.assertEqual(0, getattr(composite_field, scalar_field_name)) - - # Test simple, single-level nesting when we set a scalar. - TestCompositeHasBits('optionalgroup', 'a') - TestCompositeHasBits('optional_nested_message', 'bb') - TestCompositeHasBits('optional_foreign_message', 'c') - TestCompositeHasBits('optional_import_message', 'd') - - def testReferencesToNestedMessage(self): - proto = unittest_pb2.TestAllTypes() + def testReferencesToNestedMessage(self, message_module): + proto = message_module.TestAllTypes() nested = proto.optional_nested_message del proto # A previous version had a bug where this would raise an exception when # hitting a now-dead weak reference. nested.bb = 23 - def testDisconnectingNestedMessageBeforeSettingField(self): - proto = unittest_pb2.TestAllTypes() - nested = proto.optional_nested_message - proto.ClearField('optional_nested_message') # Should disconnect from parent - self.assertTrue(nested is not proto.optional_nested_message) - nested.bb = 23 - self.assertTrue(not proto.HasField('optional_nested_message')) - self.assertEqual(0, proto.optional_nested_message.bb) + def testOneOf(self, message_module): + proto = message_module.TestAllTypes() + proto.oneof_uint32 = 10 + proto.oneof_nested_message.bb = 11 + self.assertEqual(11, proto.oneof_nested_message.bb) + self.assertFalse(proto.HasField('oneof_uint32')) + nested = proto.oneof_nested_message + proto.oneof_string = 'abc' + self.assertEqual('abc', proto.oneof_string) + self.assertEqual(11, nested.bb) + self.assertFalse(proto.HasField('oneof_nested_message')) - def testGetDefaultMessageAfterDisconnectingDefaultMessage(self): - proto = unittest_pb2.TestAllTypes() + def testGetDefaultMessageAfterDisconnectingDefaultMessage( + self, message_module): + proto = message_module.TestAllTypes() nested = proto.optional_nested_message proto.ClearField('optional_nested_message') del proto @@ -376,87 +258,56 @@ class ReflectionTest(unittest.TestCase): # with the Messages they point to. This is to make sure we're not deleting # default message instances. gc.collect() - proto = unittest_pb2.TestAllTypes() + proto = message_module.TestAllTypes() nested = proto.optional_nested_message - def testDisconnectingNestedMessageAfterSettingField(self): - proto = unittest_pb2.TestAllTypes() + def testDisconnectingNestedMessageAfterSettingField(self, message_module): + proto = message_module.TestAllTypes() nested = proto.optional_nested_message nested.bb = 5 self.assertTrue(proto.HasField('optional_nested_message')) proto.ClearField('optional_nested_message') # Should disconnect from parent self.assertEqual(5, nested.bb) self.assertEqual(0, proto.optional_nested_message.bb) - self.assertTrue(nested is not proto.optional_nested_message) + self.assertIsNot(nested, proto.optional_nested_message) nested.bb = 23 - self.assertTrue(not proto.HasField('optional_nested_message')) + self.assertFalse(proto.HasField('optional_nested_message')) self.assertEqual(0, proto.optional_nested_message.bb) - def testDisconnectingNestedMessageBeforeGettingField(self): - proto = unittest_pb2.TestAllTypes() - self.assertTrue(not proto.HasField('optional_nested_message')) + def testDisconnectingNestedMessageBeforeGettingField(self, message_module): + proto = message_module.TestAllTypes() + self.assertFalse(proto.HasField('optional_nested_message')) proto.ClearField('optional_nested_message') - self.assertTrue(not proto.HasField('optional_nested_message')) + self.assertFalse(proto.HasField('optional_nested_message')) - def testDisconnectingNestedMessageAfterMerge(self): + def testDisconnectingNestedMessageAfterMerge(self, message_module): # This test exercises the code path that does not use ReleaseMessage(). # The underlying fear is that if we use ReleaseMessage() incorrectly, # we will have memory leaks. It's hard to check that that doesn't happen, # but at least we can exercise that code path to make sure it works. - proto1 = unittest_pb2.TestAllTypes() - proto2 = unittest_pb2.TestAllTypes() + proto1 = message_module.TestAllTypes() + proto2 = message_module.TestAllTypes() proto2.optional_nested_message.bb = 5 proto1.MergeFrom(proto2) self.assertTrue(proto1.HasField('optional_nested_message')) proto1.ClearField('optional_nested_message') - self.assertTrue(not proto1.HasField('optional_nested_message')) + self.assertFalse(proto1.HasField('optional_nested_message')) - def testDisconnectingLazyNestedMessage(self): + def testDisconnectingLazyNestedMessage(self, message_module): # This test exercises releasing a nested message that is lazy. This test # only exercises real code in the C++ implementation as Python does not # support lazy parsing, but the current C++ implementation results in # memory corruption and a crash. if api_implementation.Type() != 'python': return - proto = unittest_pb2.TestAllTypes() + proto = message_module.TestAllTypes() proto.optional_lazy_message.bb = 5 proto.ClearField('optional_lazy_message') del proto gc.collect() - def testHasBitsWhenModifyingRepeatedFields(self): - # Test nesting when we add an element to a repeated field in a submessage. - proto = unittest_pb2.TestNestedMessageHasBits() - proto.optional_nested_message.nestedmessage_repeated_int32.append(5) - self.assertEqual( - [5], proto.optional_nested_message.nestedmessage_repeated_int32) - self.assertTrue(proto.HasField('optional_nested_message')) - - # Do the same test, but with a repeated composite field within the - # submessage. - proto.ClearField('optional_nested_message') - self.assertTrue(not proto.HasField('optional_nested_message')) - proto.optional_nested_message.nestedmessage_repeated_foreignmessage.add() - self.assertTrue(proto.HasField('optional_nested_message')) - - def testHasBitsForManyLevelsOfNesting(self): - # Test nesting many levels deep. - recursive_proto = unittest_pb2.TestMutualRecursionA() - self.assertTrue(not recursive_proto.HasField('bb')) - self.assertEqual(0, recursive_proto.bb.a.bb.a.bb.optional_int32) - self.assertTrue(not recursive_proto.HasField('bb')) - recursive_proto.bb.a.bb.a.bb.optional_int32 = 5 - self.assertEqual(5, recursive_proto.bb.a.bb.a.bb.optional_int32) - self.assertTrue(recursive_proto.HasField('bb')) - self.assertTrue(recursive_proto.bb.HasField('a')) - self.assertTrue(recursive_proto.bb.a.HasField('bb')) - self.assertTrue(recursive_proto.bb.a.bb.HasField('a')) - self.assertTrue(recursive_proto.bb.a.bb.a.HasField('bb')) - self.assertTrue(not recursive_proto.bb.a.bb.a.bb.HasField('a')) - self.assertTrue(recursive_proto.bb.a.bb.a.bb.HasField('optional_int32')) - - def testSingularListFields(self): - proto = unittest_pb2.TestAllTypes() + def testSingularListFields(self, message_module): + proto = message_module.TestAllTypes() proto.optional_fixed32 = 1 proto.optional_int32 = 5 proto.optional_string = 'foo' @@ -477,8 +328,8 @@ class ReflectionTest(unittest.TestCase): nested_message) ], proto.ListFields()) - def testRepeatedListFields(self): - proto = unittest_pb2.TestAllTypes() + def testRepeatedListFields(self, message_module): + proto = message_module.TestAllTypes() proto.repeated_fixed32.append(1) proto.repeated_int32.append(5) proto.repeated_int32.append(11) @@ -496,140 +347,34 @@ class ReflectionTest(unittest.TestCase): ['foo', 'bar', 'baz', '0', '1']) ], proto.ListFields()) - def testSingularListExtensions(self): - proto = unittest_pb2.TestAllExtensions() - proto.Extensions[unittest_pb2.optional_fixed32_extension] = 1 - proto.Extensions[unittest_pb2.optional_int32_extension ] = 5 - proto.Extensions[unittest_pb2.optional_string_extension ] = 'foo' - self.assertEqual( - [ (unittest_pb2.optional_int32_extension , 5), - (unittest_pb2.optional_fixed32_extension, 1), - (unittest_pb2.optional_string_extension , 'foo') ], - proto.ListFields()) - del proto.Extensions[unittest_pb2.optional_fixed32_extension] - self.assertEqual( - [(unittest_pb2.optional_int32_extension, 5), - (unittest_pb2.optional_string_extension, 'foo')], - proto.ListFields()) + def testClearFieldWithUnknownFieldName(self, message_module): + proto = message_module.TestAllTypes() + self.assertRaises(ValueError, proto.ClearField, 'nonexistent_field') + self.assertRaises(ValueError, proto.ClearField, b'nonexistent_field') - def testRepeatedListExtensions(self): - proto = unittest_pb2.TestAllExtensions() - proto.Extensions[unittest_pb2.repeated_fixed32_extension].append(1) - proto.Extensions[unittest_pb2.repeated_int32_extension ].append(5) - proto.Extensions[unittest_pb2.repeated_int32_extension ].append(11) - proto.Extensions[unittest_pb2.repeated_string_extension ].append('foo') - proto.Extensions[unittest_pb2.repeated_string_extension ].append('bar') - proto.Extensions[unittest_pb2.repeated_string_extension ].append('baz') - proto.Extensions[unittest_pb2.optional_int32_extension ] = 21 - self.assertEqual( - [ (unittest_pb2.optional_int32_extension , 21), - (unittest_pb2.repeated_int32_extension , [5, 11]), - (unittest_pb2.repeated_fixed32_extension, [1]), - (unittest_pb2.repeated_string_extension , ['foo', 'bar', 'baz']) ], - proto.ListFields()) - del proto.Extensions[unittest_pb2.repeated_int32_extension] - del proto.Extensions[unittest_pb2.repeated_string_extension] - self.assertEqual( - [(unittest_pb2.optional_int32_extension, 21), - (unittest_pb2.repeated_fixed32_extension, [1])], - proto.ListFields()) + def testDisallowedAssignments(self, message_module): + # It's illegal to assign values directly to repeated fields + # or to nonrepeated composite fields. Ensure that this fails. + proto = message_module.TestAllTypes() + # Repeated fields. + self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', 10) + # Lists shouldn't work, either. + self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', [10]) + # Composite fields. + self.assertRaises(AttributeError, setattr, proto, + 'optional_nested_message', 23) + # Assignment to a repeated nested message field without specifying + # the index in the array of nested messages. + self.assertRaises(AttributeError, setattr, proto.repeated_nested_message, + 'bb', 34) + # Assignment to an attribute of a repeated field. + self.assertRaises(AttributeError, setattr, proto.repeated_float, + 'some_attribute', 34) + # proto.nonexistent_field = 23 should fail as well. + self.assertRaises(AttributeError, setattr, proto, 'nonexistent_field', 23) - def testListFieldsAndExtensions(self): - proto = unittest_pb2.TestFieldOrderings() - test_util.SetAllFieldsAndExtensions(proto) - unittest_pb2.my_extension_int - self.assertEqual( - [ (proto.DESCRIPTOR.fields_by_name['my_int' ], 1), - (unittest_pb2.my_extension_int , 23), - (proto.DESCRIPTOR.fields_by_name['my_string'], 'foo'), - (unittest_pb2.my_extension_string , 'bar'), - (proto.DESCRIPTOR.fields_by_name['my_float' ], 1.0) ], - proto.ListFields()) - - def testDefaultValues(self): - proto = unittest_pb2.TestAllTypes() - self.assertEqual(0, proto.optional_int32) - self.assertEqual(0, proto.optional_int64) - self.assertEqual(0, proto.optional_uint32) - self.assertEqual(0, proto.optional_uint64) - self.assertEqual(0, proto.optional_sint32) - self.assertEqual(0, proto.optional_sint64) - self.assertEqual(0, proto.optional_fixed32) - self.assertEqual(0, proto.optional_fixed64) - self.assertEqual(0, proto.optional_sfixed32) - self.assertEqual(0, proto.optional_sfixed64) - self.assertEqual(0.0, proto.optional_float) - self.assertEqual(0.0, proto.optional_double) - self.assertEqual(False, proto.optional_bool) - self.assertEqual('', proto.optional_string) - self.assertEqual(b'', proto.optional_bytes) - - self.assertEqual(41, proto.default_int32) - self.assertEqual(42, proto.default_int64) - self.assertEqual(43, proto.default_uint32) - self.assertEqual(44, proto.default_uint64) - self.assertEqual(-45, proto.default_sint32) - self.assertEqual(46, proto.default_sint64) - self.assertEqual(47, proto.default_fixed32) - self.assertEqual(48, proto.default_fixed64) - self.assertEqual(49, proto.default_sfixed32) - self.assertEqual(-50, proto.default_sfixed64) - self.assertEqual(51.5, proto.default_float) - self.assertEqual(52e3, proto.default_double) - self.assertEqual(True, proto.default_bool) - self.assertEqual('hello', proto.default_string) - self.assertEqual(b'world', proto.default_bytes) - self.assertEqual(unittest_pb2.TestAllTypes.BAR, proto.default_nested_enum) - self.assertEqual(unittest_pb2.FOREIGN_BAR, proto.default_foreign_enum) - self.assertEqual(unittest_import_pb2.IMPORT_BAR, - proto.default_import_enum) - - proto = unittest_pb2.TestExtremeDefaultValues() - self.assertEqual(u'\u1234', proto.utf8_string) - - def testHasFieldWithUnknownFieldName(self): - proto = unittest_pb2.TestAllTypes() - self.assertRaises(ValueError, proto.HasField, 'nonexistent_field') - - def testClearFieldWithUnknownFieldName(self): - proto = unittest_pb2.TestAllTypes() - self.assertRaises(ValueError, proto.ClearField, 'nonexistent_field') - self.assertRaises(ValueError, proto.ClearField, b'nonexistent_field') - - def testClearRemovesChildren(self): - # Make sure there aren't any implementation bugs that are only partially - # clearing the message (which can happen in the more complex C++ - # implementation which has parallel message lists). - proto = unittest_pb2.TestRequiredForeign() - for i in range(10): - proto.repeated_message.add() - proto2 = unittest_pb2.TestRequiredForeign() - proto.CopyFrom(proto2) - self.assertRaises(IndexError, lambda: proto.repeated_message[5]) - - def testDisallowedAssignments(self): - # It's illegal to assign values directly to repeated fields - # or to nonrepeated composite fields. Ensure that this fails. - proto = unittest_pb2.TestAllTypes() - # Repeated fields. - self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', 10) - # Lists shouldn't work, either. - self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', [10]) - # Composite fields. - self.assertRaises(AttributeError, setattr, proto, - 'optional_nested_message', 23) - # Assignment to a repeated nested message field without specifying - # the index in the array of nested messages. - self.assertRaises(AttributeError, setattr, proto.repeated_nested_message, - 'bb', 34) - # Assignment to an attribute of a repeated field. - self.assertRaises(AttributeError, setattr, proto.repeated_float, - 'some_attribute', 34) - # proto.nonexistent_field = 23 should fail as well. - self.assertRaises(AttributeError, setattr, proto, 'nonexistent_field', 23) - - def testSingleScalarTypeSafety(self): - proto = unittest_pb2.TestAllTypes() + def testSingleScalarTypeSafety(self, message_module): + proto = message_module.TestAllTypes() self.assertRaises(TypeError, setattr, proto, 'optional_int32', 1.1) self.assertRaises(TypeError, setattr, proto, 'optional_int32', 'foo') self.assertRaises(TypeError, setattr, proto, 'optional_string', 10) @@ -643,18 +388,19 @@ class ReflectionTest(unittest.TestCase): else: proto.optional_bool = 1.1 - def assertIntegerTypes(self, integer_fn): + def assertIntegerTypes(self, integer_fn, message_module): """Verifies setting of scalar integers. Args: integer_fn: A function to wrap the integers that will be assigned. + message_module: unittest_pb2 or unittest_proto3_arena_pb2 """ def TestGetAndDeserialize(field_name, value, expected_type): - proto = unittest_pb2.TestAllTypes() + proto = message_module.TestAllTypes() value = integer_fn(value) setattr(proto, field_name, value) self.assertIsInstance(getattr(proto, field_name), expected_type) - proto2 = unittest_pb2.TestAllTypes() + proto2 = message_module.TestAllTypes() proto2.ParseFromString(proto.SerializeToString()) self.assertIsInstance(getattr(proto2, field_name), expected_type) @@ -674,14 +420,14 @@ class ReflectionTest(unittest.TestCase): TestGetAndDeserialize('optional_uint64', 1 << 30, integer_64) TestGetAndDeserialize('optional_uint64', 1 << 60, integer_64) - def testIntegerTypes(self): - self.assertIntegerTypes(lambda x: x) + def testIntegerTypes(self, message_module): + self.assertIntegerTypes(lambda x: x, message_module) - def testNonStandardIntegerTypes(self): - self.assertIntegerTypes(test_util.NonStandardInteger) + def testNonStandardIntegerTypes(self, message_module): + self.assertIntegerTypes(test_util.NonStandardInteger, message_module) - def testIllegalValuesForIntegers(self): - pb = unittest_pb2.TestAllTypes() + def testIllegalValuesForIntegers(self, message_module): + pb = message_module.TestAllTypes() # Strings are illegal, even when the represent an integer. with self.assertRaises(TypeError): @@ -691,14 +437,15 @@ class ReflectionTest(unittest.TestCase): with self.assertRaisesRegexp(RuntimeError, 'my_error'): pb.optional_uint64 = test_util.NonStandardInteger(5, 'my_error') - def assetIntegerBoundsChecking(self, integer_fn): + def assetIntegerBoundsChecking(self, integer_fn, message_module): """Verifies bounds checking for scalar integer fields. Args: integer_fn: A function to wrap the integers that will be assigned. + message_module: unittest_pb2 or unittest_proto3_arena_pb2 """ def TestMinAndMaxIntegers(field_name, expected_min, expected_max): - pb = unittest_pb2.TestAllTypes() + pb = message_module.TestAllTypes() expected_min = integer_fn(expected_min) expected_max = integer_fn(expected_max) setattr(pb, field_name, expected_min) @@ -716,22 +463,23 @@ class ReflectionTest(unittest.TestCase): TestMinAndMaxIntegers('optional_uint64', 0, 0xffffffffffffffff) # A bit of white-box testing since -1 is an int and not a long in C++ and # so goes down a different path. - pb = unittest_pb2.TestAllTypes() + pb = message_module.TestAllTypes() with self.assertRaises((ValueError, TypeError)): pb.optional_uint64 = integer_fn(-(1 << 63)) - pb = unittest_pb2.TestAllTypes() + pb = message_module.TestAllTypes() pb.optional_nested_enum = integer_fn(1) self.assertEqual(1, pb.optional_nested_enum) - def testSingleScalarBoundsChecking(self): - self.assetIntegerBoundsChecking(lambda x: x) + def testSingleScalarBoundsChecking(self, message_module): + self.assetIntegerBoundsChecking(lambda x: x, message_module) - def testNonStandardSingleScalarBoundsChecking(self): - self.assetIntegerBoundsChecking(test_util.NonStandardInteger) + def testNonStandardSingleScalarBoundsChecking(self, message_module): + self.assetIntegerBoundsChecking( + test_util.NonStandardInteger, message_module) - def testRepeatedScalarTypeSafety(self): - proto = unittest_pb2.TestAllTypes() + def testRepeatedScalarTypeSafety(self, message_module): + proto = message_module.TestAllTypes() self.assertRaises(TypeError, proto.repeated_int32.append, 1.1) self.assertRaises(TypeError, proto.repeated_int32.append, 'foo') self.assertRaises(TypeError, proto.repeated_string, 10) @@ -751,8 +499,8 @@ class ReflectionTest(unittest.TestCase): # Repeated enums tests. #proto.repeated_nested_enum.append(0) - def testSingleScalarGettersAndSetters(self): - proto = unittest_pb2.TestAllTypes() + def testSingleScalarGettersAndSetters(self, message_module): + proto = message_module.TestAllTypes() self.assertEqual(0, proto.optional_int32) proto.optional_int32 = 1 self.assertEqual(1, proto.optional_int32) @@ -763,85 +511,84 @@ class ReflectionTest(unittest.TestCase): self.assertEqual(0xffffffffffffffff, proto.optional_uint64) # TODO(robinson): Test all other scalar field types. - def testSingleScalarClearField(self): - proto = unittest_pb2.TestAllTypes() - # Should be allowed to clear something that's not there (a no-op). - proto.ClearField('optional_int32') - proto.optional_int32 = 1 - self.assertTrue(proto.HasField('optional_int32')) - proto.ClearField('optional_int32') - self.assertEqual(0, proto.optional_int32) - self.assertTrue(not proto.HasField('optional_int32')) - # TODO(robinson): Test all other scalar field types. - - def testEnums(self): - proto = unittest_pb2.TestAllTypes() + def testEnums(self, message_module): + proto = message_module.TestAllTypes() self.assertEqual(1, proto.FOO) - self.assertEqual(1, unittest_pb2.TestAllTypes.FOO) + self.assertEqual(1, message_module.TestAllTypes.FOO) self.assertEqual(2, proto.BAR) - self.assertEqual(2, unittest_pb2.TestAllTypes.BAR) + self.assertEqual(2, message_module.TestAllTypes.BAR) self.assertEqual(3, proto.BAZ) - self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ) - - def testEnum_Name(self): - self.assertEqual('FOREIGN_FOO', - unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_FOO)) - self.assertEqual('FOREIGN_BAR', - unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_BAR)) - self.assertEqual('FOREIGN_BAZ', - unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_BAZ)) + self.assertEqual(3, message_module.TestAllTypes.BAZ) + + def testEnum_Name(self, message_module): + self.assertEqual( + 'FOREIGN_FOO', + message_module.ForeignEnum.Name(message_module.FOREIGN_FOO)) + self.assertEqual( + 'FOREIGN_BAR', + message_module.ForeignEnum.Name(message_module.FOREIGN_BAR)) + self.assertEqual( + 'FOREIGN_BAZ', + message_module.ForeignEnum.Name(message_module.FOREIGN_BAZ)) self.assertRaises(ValueError, - unittest_pb2.ForeignEnum.Name, 11312) + message_module.ForeignEnum.Name, 11312) - proto = unittest_pb2.TestAllTypes() + proto = message_module.TestAllTypes() self.assertEqual('FOO', proto.NestedEnum.Name(proto.FOO)) self.assertEqual('FOO', - unittest_pb2.TestAllTypes.NestedEnum.Name(proto.FOO)) + message_module.TestAllTypes.NestedEnum.Name(proto.FOO)) self.assertEqual('BAR', proto.NestedEnum.Name(proto.BAR)) self.assertEqual('BAR', - unittest_pb2.TestAllTypes.NestedEnum.Name(proto.BAR)) + message_module.TestAllTypes.NestedEnum.Name(proto.BAR)) self.assertEqual('BAZ', proto.NestedEnum.Name(proto.BAZ)) self.assertEqual('BAZ', - unittest_pb2.TestAllTypes.NestedEnum.Name(proto.BAZ)) + message_module.TestAllTypes.NestedEnum.Name(proto.BAZ)) self.assertRaises(ValueError, proto.NestedEnum.Name, 11312) self.assertRaises(ValueError, - unittest_pb2.TestAllTypes.NestedEnum.Name, 11312) + message_module.TestAllTypes.NestedEnum.Name, 11312) - def testEnum_Value(self): - self.assertEqual(unittest_pb2.FOREIGN_FOO, - unittest_pb2.ForeignEnum.Value('FOREIGN_FOO')) - self.assertEqual(unittest_pb2.FOREIGN_FOO, - unittest_pb2.ForeignEnum.FOREIGN_FOO) + # Check some coercion cases. + self.assertRaises(TypeError, message_module.TestAllTypes.NestedEnum.Name, + 11312.0) + self.assertRaises(TypeError, message_module.TestAllTypes.NestedEnum.Name, + None) + self.assertEqual('FOO', message_module.TestAllTypes.NestedEnum.Name(True)) + + def testEnum_Value(self, message_module): + self.assertEqual(message_module.FOREIGN_FOO, + message_module.ForeignEnum.Value('FOREIGN_FOO')) + self.assertEqual(message_module.FOREIGN_FOO, + message_module.ForeignEnum.FOREIGN_FOO) - self.assertEqual(unittest_pb2.FOREIGN_BAR, - unittest_pb2.ForeignEnum.Value('FOREIGN_BAR')) - self.assertEqual(unittest_pb2.FOREIGN_BAR, - unittest_pb2.ForeignEnum.FOREIGN_BAR) + self.assertEqual(message_module.FOREIGN_BAR, + message_module.ForeignEnum.Value('FOREIGN_BAR')) + self.assertEqual(message_module.FOREIGN_BAR, + message_module.ForeignEnum.FOREIGN_BAR) - self.assertEqual(unittest_pb2.FOREIGN_BAZ, - unittest_pb2.ForeignEnum.Value('FOREIGN_BAZ')) - self.assertEqual(unittest_pb2.FOREIGN_BAZ, - unittest_pb2.ForeignEnum.FOREIGN_BAZ) + self.assertEqual(message_module.FOREIGN_BAZ, + message_module.ForeignEnum.Value('FOREIGN_BAZ')) + self.assertEqual(message_module.FOREIGN_BAZ, + message_module.ForeignEnum.FOREIGN_BAZ) self.assertRaises(ValueError, - unittest_pb2.ForeignEnum.Value, 'FO') + message_module.ForeignEnum.Value, 'FO') with self.assertRaises(AttributeError): - unittest_pb2.ForeignEnum.FO + message_module.ForeignEnum.FO - proto = unittest_pb2.TestAllTypes() + proto = message_module.TestAllTypes() self.assertEqual(proto.FOO, proto.NestedEnum.Value('FOO')) self.assertEqual(proto.FOO, proto.NestedEnum.FOO) self.assertEqual(proto.FOO, - unittest_pb2.TestAllTypes.NestedEnum.Value('FOO')) + message_module.TestAllTypes.NestedEnum.Value('FOO')) self.assertEqual(proto.FOO, - unittest_pb2.TestAllTypes.NestedEnum.FOO) + message_module.TestAllTypes.NestedEnum.FOO) self.assertEqual(proto.BAR, proto.NestedEnum.Value('BAR')) @@ -849,9 +596,9 @@ class ReflectionTest(unittest.TestCase): proto.NestedEnum.BAR) self.assertEqual(proto.BAR, - unittest_pb2.TestAllTypes.NestedEnum.Value('BAR')) + message_module.TestAllTypes.NestedEnum.Value('BAR')) self.assertEqual(proto.BAR, - unittest_pb2.TestAllTypes.NestedEnum.BAR) + message_module.TestAllTypes.NestedEnum.BAR) self.assertEqual(proto.BAZ, proto.NestedEnum.Value('BAZ')) @@ -859,9 +606,9 @@ class ReflectionTest(unittest.TestCase): proto.NestedEnum.BAZ) self.assertEqual(proto.BAZ, - unittest_pb2.TestAllTypes.NestedEnum.Value('BAZ')) + message_module.TestAllTypes.NestedEnum.Value('BAZ')) self.assertEqual(proto.BAZ, - unittest_pb2.TestAllTypes.NestedEnum.BAZ) + message_module.TestAllTypes.NestedEnum.BAZ) self.assertRaises(ValueError, proto.NestedEnum.Value, 'Foo') @@ -869,29 +616,582 @@ class ReflectionTest(unittest.TestCase): proto.NestedEnum.Value.Foo self.assertRaises(ValueError, - unittest_pb2.TestAllTypes.NestedEnum.Value, 'Foo') + message_module.TestAllTypes.NestedEnum.Value, 'Foo') with self.assertRaises(AttributeError): - unittest_pb2.TestAllTypes.NestedEnum.Value.Foo + message_module.TestAllTypes.NestedEnum.Value.Foo + + def testEnum_KeysAndValues(self, message_module): + if message_module == unittest_pb2: + keys = ['FOREIGN_FOO', 'FOREIGN_BAR', 'FOREIGN_BAZ'] + values = [4, 5, 6] + items = [('FOREIGN_FOO', 4), ('FOREIGN_BAR', 5), ('FOREIGN_BAZ', 6)] + else: + keys = ['FOREIGN_ZERO', 'FOREIGN_FOO', 'FOREIGN_BAR', 'FOREIGN_BAZ'] + values = [0, 4, 5, 6] + items = [('FOREIGN_ZERO', 0), ('FOREIGN_FOO', 4), + ('FOREIGN_BAR', 5), ('FOREIGN_BAZ', 6)] + self.assertEqual(keys, + list(message_module.ForeignEnum.keys())) + self.assertEqual(values, + list(message_module.ForeignEnum.values())) + self.assertEqual(items, + list(message_module.ForeignEnum.items())) + + proto = message_module.TestAllTypes() + if message_module == unittest_pb2: + keys = ['FOO', 'BAR', 'BAZ', 'NEG'] + values = [1, 2, 3, -1] + items = [('FOO', 1), ('BAR', 2), ('BAZ', 3), ('NEG', -1)] + else: + keys = ['ZERO', 'FOO', 'BAR', 'BAZ', 'NEG'] + values = [0, 1, 2, 3, -1] + items = [('ZERO', 0), ('FOO', 1), ('BAR', 2), ('BAZ', 3), ('NEG', -1)] + self.assertEqual(keys, list(proto.NestedEnum.keys())) + self.assertEqual(values, list(proto.NestedEnum.values())) + self.assertEqual(items, + list(proto.NestedEnum.items())) + + def testStaticParseFrom(self, message_module): + proto1 = message_module.TestAllTypes() + test_util.SetAllFields(proto1) + + string1 = proto1.SerializeToString() + proto2 = message_module.TestAllTypes.FromString(string1) + + # Messages should be equal. + self.assertEqual(proto2, proto1) + + def testMergeFromSingularField(self, message_module): + # Test merge with just a singular field. + proto1 = message_module.TestAllTypes() + proto1.optional_int32 = 1 + + proto2 = message_module.TestAllTypes() + # This shouldn't get overwritten. + proto2.optional_string = 'value' + + proto2.MergeFrom(proto1) + self.assertEqual(1, proto2.optional_int32) + self.assertEqual('value', proto2.optional_string) + + def testMergeFromRepeatedField(self, message_module): + # Test merge with just a repeated field. + proto1 = message_module.TestAllTypes() + proto1.repeated_int32.append(1) + proto1.repeated_int32.append(2) + + proto2 = message_module.TestAllTypes() + proto2.repeated_int32.append(0) + proto2.MergeFrom(proto1) + + self.assertEqual(0, proto2.repeated_int32[0]) + self.assertEqual(1, proto2.repeated_int32[1]) + self.assertEqual(2, proto2.repeated_int32[2]) + + def testMergeFromRepeatedNestedMessage(self, message_module): + # Test merge with a repeated nested message. + proto1 = message_module.TestAllTypes() + m = proto1.repeated_nested_message.add() + m.bb = 123 + m = proto1.repeated_nested_message.add() + m.bb = 321 + + proto2 = message_module.TestAllTypes() + m = proto2.repeated_nested_message.add() + m.bb = 999 + proto2.MergeFrom(proto1) + self.assertEqual(999, proto2.repeated_nested_message[0].bb) + self.assertEqual(123, proto2.repeated_nested_message[1].bb) + self.assertEqual(321, proto2.repeated_nested_message[2].bb) + + proto3 = message_module.TestAllTypes() + proto3.repeated_nested_message.MergeFrom(proto2.repeated_nested_message) + self.assertEqual(999, proto3.repeated_nested_message[0].bb) + self.assertEqual(123, proto3.repeated_nested_message[1].bb) + self.assertEqual(321, proto3.repeated_nested_message[2].bb) + + def testMergeFromAllFields(self, message_module): + # With all fields set. + proto1 = message_module.TestAllTypes() + test_util.SetAllFields(proto1) + proto2 = message_module.TestAllTypes() + proto2.MergeFrom(proto1) + + # Messages should be equal. + self.assertEqual(proto2, proto1) + + # Serialized string should be equal too. + string1 = proto1.SerializeToString() + string2 = proto2.SerializeToString() + self.assertEqual(string1, string2) + + def testMergeFromBug(self, message_module): + message1 = message_module.TestAllTypes() + message2 = message_module.TestAllTypes() + + # Cause optional_nested_message to be instantiated within message1, even + # though it is not considered to be "present". + message1.optional_nested_message + self.assertFalse(message1.HasField('optional_nested_message')) + + # Merge into message2. This should not instantiate the field is message2. + message2.MergeFrom(message1) + self.assertFalse(message2.HasField('optional_nested_message')) + + def testCopyFromSingularField(self, message_module): + # Test copy with just a singular field. + proto1 = message_module.TestAllTypes() + proto1.optional_int32 = 1 + proto1.optional_string = 'important-text' + + proto2 = message_module.TestAllTypes() + proto2.optional_string = 'value' + + proto2.CopyFrom(proto1) + self.assertEqual(1, proto2.optional_int32) + self.assertEqual('important-text', proto2.optional_string) + + def testCopyFromRepeatedField(self, message_module): + # Test copy with a repeated field. + proto1 = message_module.TestAllTypes() + proto1.repeated_int32.append(1) + proto1.repeated_int32.append(2) + + proto2 = message_module.TestAllTypes() + proto2.repeated_int32.append(0) + proto2.CopyFrom(proto1) + + self.assertEqual(1, proto2.repeated_int32[0]) + self.assertEqual(2, proto2.repeated_int32[1]) + + def testCopyFromAllFields(self, message_module): + # With all fields set. + proto1 = message_module.TestAllTypes() + test_util.SetAllFields(proto1) + proto2 = message_module.TestAllTypes() + proto2.CopyFrom(proto1) + + # Messages should be equal. + self.assertEqual(proto2, proto1) + + # Serialized string should be equal too. + string1 = proto1.SerializeToString() + string2 = proto2.SerializeToString() + self.assertEqual(string1, string2) + + def testCopyFromSelf(self, message_module): + proto1 = message_module.TestAllTypes() + proto1.repeated_int32.append(1) + proto1.optional_int32 = 2 + proto1.optional_string = 'important-text' + + proto1.CopyFrom(proto1) + self.assertEqual(1, proto1.repeated_int32[0]) + self.assertEqual(2, proto1.optional_int32) + self.assertEqual('important-text', proto1.optional_string) + + def testDeepCopy(self, message_module): + proto1 = message_module.TestAllTypes() + proto1.optional_int32 = 1 + proto2 = copy.deepcopy(proto1) + self.assertEqual(1, proto2.optional_int32) + + proto1.repeated_int32.append(2) + proto1.repeated_int32.append(3) + container = copy.deepcopy(proto1.repeated_int32) + self.assertEqual([2, 3], container) + container.remove(container[0]) + self.assertEqual([3], container) + + message1 = proto1.repeated_nested_message.add() + message1.bb = 1 + messages = copy.deepcopy(proto1.repeated_nested_message) + self.assertEqual(proto1.repeated_nested_message, messages) + message1.bb = 2 + self.assertNotEqual(proto1.repeated_nested_message, messages) + messages.remove(messages[0]) + self.assertEqual(len(messages), 0) + + # TODO(anuraag): Implement deepcopy for extension dict + + def testDisconnectingBeforeClear(self, message_module): + proto = message_module.TestAllTypes() + nested = proto.optional_nested_message + proto.Clear() + self.assertIsNot(nested, proto.optional_nested_message) + nested.bb = 23 + self.assertFalse(proto.HasField('optional_nested_message')) + self.assertEqual(0, proto.optional_nested_message.bb) + + proto = message_module.TestAllTypes() + nested = proto.optional_nested_message + nested.bb = 5 + foreign = proto.optional_foreign_message + foreign.c = 6 + proto.Clear() + self.assertIsNot(nested, proto.optional_nested_message) + self.assertIsNot(foreign, proto.optional_foreign_message) + self.assertEqual(5, nested.bb) + self.assertEqual(6, foreign.c) + nested.bb = 15 + foreign.c = 16 + self.assertFalse(proto.HasField('optional_nested_message')) + self.assertEqual(0, proto.optional_nested_message.bb) + self.assertFalse(proto.HasField('optional_foreign_message')) + self.assertEqual(0, proto.optional_foreign_message.c) + + def testStringUTF8Encoding(self, message_module): + proto = message_module.TestAllTypes() + + # Assignment of a unicode object to a field of type 'bytes' is not allowed. + self.assertRaises(TypeError, + setattr, proto, 'optional_bytes', u'unicode object') + + # Check that the default value is of python's 'unicode' type. + self.assertEqual(type(proto.optional_string), six.text_type) + + proto.optional_string = six.text_type('Testing') + self.assertEqual(proto.optional_string, str('Testing')) + + # Assign a value of type 'str' which can be encoded in UTF-8. + proto.optional_string = str('Testing') + self.assertEqual(proto.optional_string, six.text_type('Testing')) + + # Try to assign a 'bytes' object which contains non-UTF-8. + self.assertRaises(ValueError, + setattr, proto, 'optional_string', b'a\x80a') + # No exception: Assign already encoded UTF-8 bytes to a string field. + utf8_bytes = u'Тест'.encode('utf-8') + proto.optional_string = utf8_bytes + # No exception: Assign the a non-ascii unicode object. + proto.optional_string = u'Тест' + # No exception thrown (normal str assignment containing ASCII). + proto.optional_string = 'abc' + + def testBytesInTextFormat(self, message_module): + proto = message_module.TestAllTypes(optional_bytes=b'\x00\x7f\x80\xff') + self.assertEqual(u'optional_bytes: "\\000\\177\\200\\377"\n', + six.text_type(proto)) + + def testEmptyNestedMessage(self, message_module): + proto = message_module.TestAllTypes() + proto.optional_nested_message.MergeFrom( + message_module.TestAllTypes.NestedMessage()) + self.assertTrue(proto.HasField('optional_nested_message')) + + proto = message_module.TestAllTypes() + proto.optional_nested_message.CopyFrom( + message_module.TestAllTypes.NestedMessage()) + self.assertTrue(proto.HasField('optional_nested_message')) + + proto = message_module.TestAllTypes() + bytes_read = proto.optional_nested_message.MergeFromString(b'') + self.assertEqual(0, bytes_read) + self.assertTrue(proto.HasField('optional_nested_message')) + + proto = message_module.TestAllTypes() + proto.optional_nested_message.ParseFromString(b'') + self.assertTrue(proto.HasField('optional_nested_message')) + + serialized = proto.SerializeToString() + proto2 = message_module.TestAllTypes() + self.assertEqual( + len(serialized), + proto2.MergeFromString(serialized)) + self.assertTrue(proto2.HasField('optional_nested_message')) + + +# Class to test proto2-only features (required, extensions, etc.) +@testing_refleaks.TestCase +class Proto2ReflectionTest(unittest.TestCase): + + def testRepeatedCompositeConstructor(self): + # Constructor with only repeated composite types should succeed. + proto = unittest_pb2.TestAllTypes( + repeated_nested_message=[ + unittest_pb2.TestAllTypes.NestedMessage( + bb=unittest_pb2.TestAllTypes.FOO), + unittest_pb2.TestAllTypes.NestedMessage( + bb=unittest_pb2.TestAllTypes.BAR)], + repeated_foreign_message=[ + unittest_pb2.ForeignMessage(c=-43), + unittest_pb2.ForeignMessage(c=45324), + unittest_pb2.ForeignMessage(c=12)], + repeatedgroup=[ + unittest_pb2.TestAllTypes.RepeatedGroup(), + unittest_pb2.TestAllTypes.RepeatedGroup(a=1), + unittest_pb2.TestAllTypes.RepeatedGroup(a=2)]) + + self.assertEqual( + [unittest_pb2.TestAllTypes.NestedMessage( + bb=unittest_pb2.TestAllTypes.FOO), + unittest_pb2.TestAllTypes.NestedMessage( + bb=unittest_pb2.TestAllTypes.BAR)], + list(proto.repeated_nested_message)) + self.assertEqual( + [unittest_pb2.ForeignMessage(c=-43), + unittest_pb2.ForeignMessage(c=45324), + unittest_pb2.ForeignMessage(c=12)], + list(proto.repeated_foreign_message)) + self.assertEqual( + [unittest_pb2.TestAllTypes.RepeatedGroup(), + unittest_pb2.TestAllTypes.RepeatedGroup(a=1), + unittest_pb2.TestAllTypes.RepeatedGroup(a=2)], + list(proto.repeatedgroup)) + + def assertListsEqual(self, values, others): + self.assertEqual(len(values), len(others)) + for i in range(len(values)): + self.assertEqual(values[i], others[i]) + + def testSimpleHasBits(self): + # Test a scalar. + proto = unittest_pb2.TestAllTypes() + self.assertFalse(proto.HasField('optional_int32')) + self.assertEqual(0, proto.optional_int32) + # HasField() shouldn't be true if all we've done is + # read the default value. + self.assertFalse(proto.HasField('optional_int32')) + proto.optional_int32 = 1 + # Setting a value however *should* set the "has" bit. + self.assertTrue(proto.HasField('optional_int32')) + proto.ClearField('optional_int32') + # And clearing that value should unset the "has" bit. + self.assertFalse(proto.HasField('optional_int32')) + + def testHasBitsWithSinglyNestedScalar(self): + # Helper used to test foreign messages and groups. + # + # composite_field_name should be the name of a non-repeated + # composite (i.e., foreign or group) field in TestAllTypes, + # and scalar_field_name should be the name of an integer-valued + # scalar field within that composite. + # + # I never thought I'd miss C++ macros and templates so much. :( + # This helper is semantically just: + # + # assert proto.composite_field.scalar_field == 0 + # assert not proto.composite_field.HasField('scalar_field') + # assert not proto.HasField('composite_field') + # + # proto.composite_field.scalar_field = 10 + # old_composite_field = proto.composite_field + # + # assert proto.composite_field.scalar_field == 10 + # assert proto.composite_field.HasField('scalar_field') + # assert proto.HasField('composite_field') + # + # proto.ClearField('composite_field') + # + # assert not proto.composite_field.HasField('scalar_field') + # assert not proto.HasField('composite_field') + # assert proto.composite_field.scalar_field == 0 + # + # # Now ensure that ClearField('composite_field') disconnected + # # the old field object from the object tree... + # assert old_composite_field is not proto.composite_field + # old_composite_field.scalar_field = 20 + # assert not proto.composite_field.HasField('scalar_field') + # assert not proto.HasField('composite_field') + def TestCompositeHasBits(composite_field_name, scalar_field_name): + proto = unittest_pb2.TestAllTypes() + # First, check that we can get the scalar value, and see that it's the + # default (0), but that proto.HasField('omposite') and + # proto.composite.HasField('scalar') will still return False. + composite_field = getattr(proto, composite_field_name) + original_scalar_value = getattr(composite_field, scalar_field_name) + self.assertEqual(0, original_scalar_value) + # Assert that the composite object does not "have" the scalar. + self.assertFalse(composite_field.HasField(scalar_field_name)) + # Assert that proto does not "have" the composite field. + self.assertFalse(proto.HasField(composite_field_name)) + + # Now set the scalar within the composite field. Ensure that the setting + # is reflected, and that proto.HasField('composite') and + # proto.composite.HasField('scalar') now both return True. + new_val = 20 + setattr(composite_field, scalar_field_name, new_val) + self.assertEqual(new_val, getattr(composite_field, scalar_field_name)) + # Hold on to a reference to the current composite_field object. + old_composite_field = composite_field + # Assert that the has methods now return true. + self.assertTrue(composite_field.HasField(scalar_field_name)) + self.assertTrue(proto.HasField(composite_field_name)) + + # Now call the clear method... + proto.ClearField(composite_field_name) + + # ...and ensure that the "has" bits are all back to False... + composite_field = getattr(proto, composite_field_name) + self.assertFalse(composite_field.HasField(scalar_field_name)) + self.assertFalse(proto.HasField(composite_field_name)) + # ...and ensure that the scalar field has returned to its default. + self.assertEqual(0, getattr(composite_field, scalar_field_name)) + + self.assertIsNot(old_composite_field, composite_field) + setattr(old_composite_field, scalar_field_name, new_val) + self.assertFalse(composite_field.HasField(scalar_field_name)) + self.assertFalse(proto.HasField(composite_field_name)) + self.assertEqual(0, getattr(composite_field, scalar_field_name)) + + # Test simple, single-level nesting when we set a scalar. + TestCompositeHasBits('optionalgroup', 'a') + TestCompositeHasBits('optional_nested_message', 'bb') + TestCompositeHasBits('optional_foreign_message', 'c') + TestCompositeHasBits('optional_import_message', 'd') + + def testHasBitsWhenModifyingRepeatedFields(self): + # Test nesting when we add an element to a repeated field in a submessage. + proto = unittest_pb2.TestNestedMessageHasBits() + proto.optional_nested_message.nestedmessage_repeated_int32.append(5) + self.assertEqual( + [5], proto.optional_nested_message.nestedmessage_repeated_int32) + self.assertTrue(proto.HasField('optional_nested_message')) + + # Do the same test, but with a repeated composite field within the + # submessage. + proto.ClearField('optional_nested_message') + self.assertFalse(proto.HasField('optional_nested_message')) + proto.optional_nested_message.nestedmessage_repeated_foreignmessage.add() + self.assertTrue(proto.HasField('optional_nested_message')) + + def testHasBitsForManyLevelsOfNesting(self): + # Test nesting many levels deep. + recursive_proto = unittest_pb2.TestMutualRecursionA() + self.assertFalse(recursive_proto.HasField('bb')) + self.assertEqual(0, recursive_proto.bb.a.bb.a.bb.optional_int32) + self.assertFalse(recursive_proto.HasField('bb')) + recursive_proto.bb.a.bb.a.bb.optional_int32 = 5 + self.assertEqual(5, recursive_proto.bb.a.bb.a.bb.optional_int32) + self.assertTrue(recursive_proto.HasField('bb')) + self.assertTrue(recursive_proto.bb.HasField('a')) + self.assertTrue(recursive_proto.bb.a.HasField('bb')) + self.assertTrue(recursive_proto.bb.a.bb.HasField('a')) + self.assertTrue(recursive_proto.bb.a.bb.a.HasField('bb')) + self.assertFalse(recursive_proto.bb.a.bb.a.bb.HasField('a')) + self.assertTrue(recursive_proto.bb.a.bb.a.bb.HasField('optional_int32')) + + def testSingularListExtensions(self): + proto = unittest_pb2.TestAllExtensions() + proto.Extensions[unittest_pb2.optional_fixed32_extension] = 1 + proto.Extensions[unittest_pb2.optional_int32_extension ] = 5 + proto.Extensions[unittest_pb2.optional_string_extension ] = 'foo' + self.assertEqual( + [ (unittest_pb2.optional_int32_extension , 5), + (unittest_pb2.optional_fixed32_extension, 1), + (unittest_pb2.optional_string_extension , 'foo') ], + proto.ListFields()) + del proto.Extensions[unittest_pb2.optional_fixed32_extension] + self.assertEqual( + [(unittest_pb2.optional_int32_extension, 5), + (unittest_pb2.optional_string_extension, 'foo')], + proto.ListFields()) + + def testRepeatedListExtensions(self): + proto = unittest_pb2.TestAllExtensions() + proto.Extensions[unittest_pb2.repeated_fixed32_extension].append(1) + proto.Extensions[unittest_pb2.repeated_int32_extension ].append(5) + proto.Extensions[unittest_pb2.repeated_int32_extension ].append(11) + proto.Extensions[unittest_pb2.repeated_string_extension ].append('foo') + proto.Extensions[unittest_pb2.repeated_string_extension ].append('bar') + proto.Extensions[unittest_pb2.repeated_string_extension ].append('baz') + proto.Extensions[unittest_pb2.optional_int32_extension ] = 21 + self.assertEqual( + [ (unittest_pb2.optional_int32_extension , 21), + (unittest_pb2.repeated_int32_extension , [5, 11]), + (unittest_pb2.repeated_fixed32_extension, [1]), + (unittest_pb2.repeated_string_extension , ['foo', 'bar', 'baz']) ], + proto.ListFields()) + del proto.Extensions[unittest_pb2.repeated_int32_extension] + del proto.Extensions[unittest_pb2.repeated_string_extension] + self.assertEqual( + [(unittest_pb2.optional_int32_extension, 21), + (unittest_pb2.repeated_fixed32_extension, [1])], + proto.ListFields()) + + def testListFieldsAndExtensions(self): + proto = unittest_pb2.TestFieldOrderings() + test_util.SetAllFieldsAndExtensions(proto) + unittest_pb2.my_extension_int + self.assertEqual( + [ (proto.DESCRIPTOR.fields_by_name['my_int' ], 1), + (unittest_pb2.my_extension_int , 23), + (proto.DESCRIPTOR.fields_by_name['my_string'], 'foo'), + (unittest_pb2.my_extension_string , 'bar'), + (proto.DESCRIPTOR.fields_by_name['my_float' ], 1.0) ], + proto.ListFields()) + + def testDefaultValues(self): + proto = unittest_pb2.TestAllTypes() + self.assertEqual(0, proto.optional_int32) + self.assertEqual(0, proto.optional_int64) + self.assertEqual(0, proto.optional_uint32) + self.assertEqual(0, proto.optional_uint64) + self.assertEqual(0, proto.optional_sint32) + self.assertEqual(0, proto.optional_sint64) + self.assertEqual(0, proto.optional_fixed32) + self.assertEqual(0, proto.optional_fixed64) + self.assertEqual(0, proto.optional_sfixed32) + self.assertEqual(0, proto.optional_sfixed64) + self.assertEqual(0.0, proto.optional_float) + self.assertEqual(0.0, proto.optional_double) + self.assertEqual(False, proto.optional_bool) + self.assertEqual('', proto.optional_string) + self.assertEqual(b'', proto.optional_bytes) + + self.assertEqual(41, proto.default_int32) + self.assertEqual(42, proto.default_int64) + self.assertEqual(43, proto.default_uint32) + self.assertEqual(44, proto.default_uint64) + self.assertEqual(-45, proto.default_sint32) + self.assertEqual(46, proto.default_sint64) + self.assertEqual(47, proto.default_fixed32) + self.assertEqual(48, proto.default_fixed64) + self.assertEqual(49, proto.default_sfixed32) + self.assertEqual(-50, proto.default_sfixed64) + self.assertEqual(51.5, proto.default_float) + self.assertEqual(52e3, proto.default_double) + self.assertEqual(True, proto.default_bool) + self.assertEqual('hello', proto.default_string) + self.assertEqual(b'world', proto.default_bytes) + self.assertEqual(unittest_pb2.TestAllTypes.BAR, proto.default_nested_enum) + self.assertEqual(unittest_pb2.FOREIGN_BAR, proto.default_foreign_enum) + self.assertEqual(unittest_import_pb2.IMPORT_BAR, + proto.default_import_enum) + + proto = unittest_pb2.TestExtremeDefaultValues() + self.assertEqual(u'\u1234', proto.utf8_string) + + def testHasFieldWithUnknownFieldName(self): + proto = unittest_pb2.TestAllTypes() + self.assertRaises(ValueError, proto.HasField, 'nonexistent_field') - def testEnum_KeysAndValues(self): - self.assertEqual(['FOREIGN_FOO', 'FOREIGN_BAR', 'FOREIGN_BAZ'], - list(unittest_pb2.ForeignEnum.keys())) - self.assertEqual([4, 5, 6], - list(unittest_pb2.ForeignEnum.values())) - self.assertEqual([('FOREIGN_FOO', 4), ('FOREIGN_BAR', 5), - ('FOREIGN_BAZ', 6)], - list(unittest_pb2.ForeignEnum.items())) + def testClearRemovesChildren(self): + # Make sure there aren't any implementation bugs that are only partially + # clearing the message (which can happen in the more complex C++ + # implementation which has parallel message lists). + proto = unittest_pb2.TestRequiredForeign() + for i in range(10): + proto.repeated_message.add() + proto2 = unittest_pb2.TestRequiredForeign() + proto.CopyFrom(proto2) + self.assertRaises(IndexError, lambda: proto.repeated_message[5]) + def testSingleScalarClearField(self): proto = unittest_pb2.TestAllTypes() - self.assertEqual(['FOO', 'BAR', 'BAZ', 'NEG'], list(proto.NestedEnum.keys())) - self.assertEqual([1, 2, 3, -1], list(proto.NestedEnum.values())) - self.assertEqual([('FOO', 1), ('BAR', 2), ('BAZ', 3), ('NEG', -1)], - list(proto.NestedEnum.items())) + # Should be allowed to clear something that's not there (a no-op). + proto.ClearField('optional_int32') + proto.optional_int32 = 1 + self.assertTrue(proto.HasField('optional_int32')) + proto.ClearField('optional_int32') + self.assertEqual(0, proto.optional_int32) + self.assertFalse(proto.HasField('optional_int32')) + # TODO(robinson): Test all other scalar field types. def testRepeatedScalars(self): proto = unittest_pb2.TestAllTypes() - self.assertTrue(not proto.repeated_int32) + self.assertFalse(proto.repeated_int32) self.assertEqual(0, len(proto.repeated_int32)) proto.repeated_int32.append(5) proto.repeated_int32.append(10) @@ -952,7 +1252,7 @@ class ReflectionTest(unittest.TestCase): # Test clearing. proto.ClearField('repeated_int32') - self.assertTrue(not proto.repeated_int32) + self.assertFalse(proto.repeated_int32) self.assertEqual(0, len(proto.repeated_int32)) proto.repeated_int32.append(1) @@ -981,7 +1281,7 @@ class ReflectionTest(unittest.TestCase): def testRepeatedScalarsRemove(self): proto = unittest_pb2.TestAllTypes() - self.assertTrue(not proto.repeated_int32) + self.assertFalse(proto.repeated_int32) self.assertEqual(0, len(proto.repeated_int32)) proto.repeated_int32.append(5) proto.repeated_int32.append(10) @@ -1009,7 +1309,7 @@ class ReflectionTest(unittest.TestCase): def testRepeatedComposites(self): proto = unittest_pb2.TestAllTypes() - self.assertTrue(not proto.repeated_nested_message) + self.assertFalse(proto.repeated_nested_message) self.assertEqual(0, len(proto.repeated_nested_message)) m0 = proto.repeated_nested_message.add() m1 = proto.repeated_nested_message.add() @@ -1079,7 +1379,7 @@ class ReflectionTest(unittest.TestCase): # Test clearing. proto.ClearField('repeated_nested_message') - self.assertTrue(not proto.repeated_nested_message) + self.assertFalse(proto.repeated_nested_message) self.assertEqual(0, len(proto.repeated_nested_message)) # Test constructing an element while adding it. @@ -1143,7 +1443,7 @@ class ReflectionTest(unittest.TestCase): DESCRIPTOR = mydescriptor myproto_instance = MyProtoClass() self.assertEqual(0, myproto_instance.foo_field) - self.assertTrue(not myproto_instance.HasField('foo_field')) + self.assertFalse(myproto_instance.HasField('foo_field')) myproto_instance.foo_field = 23 self.assertEqual(23, myproto_instance.foo_field) self.assertTrue(myproto_instance.HasField('foo_field')) @@ -1200,7 +1500,7 @@ class ReflectionTest(unittest.TestCase): serialized_prius = prius.SerializeToString() new_prius = reflection.ParseMessage(desc, serialized_prius) - self.assertTrue(new_prius is not prius) + self.assertIsNot(new_prius, prius) self.assertEqual(prius, new_prius) # these are unnecessary assuming message equality works as advertised but @@ -1272,12 +1572,12 @@ class ReflectionTest(unittest.TestCase): def testTopLevelExtensionsForOptionalScalar(self): extendee_proto = unittest_pb2.TestAllExtensions() extension = unittest_pb2.optional_int32_extension - self.assertTrue(not extendee_proto.HasExtension(extension)) + self.assertFalse(extendee_proto.HasExtension(extension)) self.assertNotIn(extension, extendee_proto.Extensions) self.assertEqual(0, extendee_proto.Extensions[extension]) # As with normal scalar fields, just doing a read doesn't actually set the # "has" bit. - self.assertTrue(not extendee_proto.HasExtension(extension)) + self.assertFalse(extendee_proto.HasExtension(extension)) self.assertNotIn(extension, extendee_proto.Extensions) # Actually set the thing. extendee_proto.Extensions[extension] = 23 @@ -1287,7 +1587,7 @@ class ReflectionTest(unittest.TestCase): # Ensure that clearing works as well. extendee_proto.ClearExtension(extension) self.assertEqual(0, extendee_proto.Extensions[extension]) - self.assertTrue(not extendee_proto.HasExtension(extension)) + self.assertFalse(extendee_proto.HasExtension(extension)) self.assertNotIn(extension, extendee_proto.Extensions) def testTopLevelExtensionsForRepeatedScalar(self): @@ -1302,7 +1602,7 @@ class ReflectionTest(unittest.TestCase): extendee_proto.ClearExtension(extension) self.assertEqual(0, len(extendee_proto.Extensions[extension])) self.assertNotIn(extension, extendee_proto.Extensions) - self.assertTrue(string_list is not extendee_proto.Extensions[extension]) + self.assertIsNot(string_list, extendee_proto.Extensions[extension]) # Shouldn't be allowed to do Extensions[extension] = 'a' self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions, extension, 'a') @@ -1310,12 +1610,12 @@ class ReflectionTest(unittest.TestCase): def testTopLevelExtensionsForOptionalMessage(self): extendee_proto = unittest_pb2.TestAllExtensions() extension = unittest_pb2.optional_foreign_message_extension - self.assertTrue(not extendee_proto.HasExtension(extension)) + self.assertFalse(extendee_proto.HasExtension(extension)) self.assertNotIn(extension, extendee_proto.Extensions) self.assertEqual(0, extendee_proto.Extensions[extension].c) # As with normal (non-extension) fields, merely reading from the # thing shouldn't set the "has" bit. - self.assertTrue(not extendee_proto.HasExtension(extension)) + self.assertFalse(extendee_proto.HasExtension(extension)) self.assertNotIn(extension, extendee_proto.Extensions) extendee_proto.Extensions[extension].c = 23 self.assertEqual(23, extendee_proto.Extensions[extension].c) @@ -1324,13 +1624,13 @@ class ReflectionTest(unittest.TestCase): # Save a reference here. foreign_message = extendee_proto.Extensions[extension] extendee_proto.ClearExtension(extension) - self.assertTrue(foreign_message is not extendee_proto.Extensions[extension]) + self.assertIsNot(foreign_message, extendee_proto.Extensions[extension]) # Setting a field on foreign_message now shouldn't set # any "has" bits on extendee_proto. foreign_message.c = 42 self.assertEqual(42, foreign_message.c) self.assertTrue(foreign_message.HasField('c')) - self.assertTrue(not extendee_proto.HasExtension(extension)) + self.assertFalse(extendee_proto.HasExtension(extension)) self.assertNotIn(extension, extendee_proto.Extensions) # Shouldn't be allowed to do Extensions[extension] = 'a' self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions, @@ -1348,7 +1648,7 @@ class ReflectionTest(unittest.TestCase): group_list = extendee_proto.Extensions[extension] extendee_proto.ClearExtension(extension) self.assertEqual(0, len(extendee_proto.Extensions[extension])) - self.assertTrue(group_list is not extendee_proto.Extensions[extension]) + self.assertIsNot(group_list, extendee_proto.Extensions[extension]) # Shouldn't be allowed to do Extensions[extension] = 'a' self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions, extension, 'a') @@ -1358,19 +1658,19 @@ class ReflectionTest(unittest.TestCase): extension = unittest_pb2.TestRequired.single # We just test the non-repeated case. - self.assertTrue(not extendee_proto.HasExtension(extension)) + self.assertFalse(extendee_proto.HasExtension(extension)) self.assertNotIn(extension, extendee_proto.Extensions) required = extendee_proto.Extensions[extension] self.assertEqual(0, required.a) - self.assertTrue(not extendee_proto.HasExtension(extension)) + self.assertFalse(extendee_proto.HasExtension(extension)) self.assertNotIn(extension, extendee_proto.Extensions) required.a = 23 self.assertEqual(23, extendee_proto.Extensions[extension].a) self.assertTrue(extendee_proto.HasExtension(extension)) self.assertIn(extension, extendee_proto.Extensions) extendee_proto.ClearExtension(extension) - self.assertTrue(required is not extendee_proto.Extensions[extension]) - self.assertTrue(not extendee_proto.HasExtension(extension)) + self.assertIsNot(required, extendee_proto.Extensions[extension]) + self.assertFalse(extendee_proto.HasExtension(extension)) self.assertNotIn(extension, extendee_proto.Extensions) def testRegisteredExtensions(self): @@ -1394,10 +1694,10 @@ class ReflectionTest(unittest.TestCase): def testHasBitsForAncestorsOfExtendedMessage(self): # Optional scalar extension. toplevel = more_extensions_pb2.TopLevelMessage() - self.assertTrue(not toplevel.HasField('submessage')) + self.assertFalse(toplevel.HasField('submessage')) self.assertEqual(0, toplevel.submessage.Extensions[ more_extensions_pb2.optional_int_extension]) - self.assertTrue(not toplevel.HasField('submessage')) + self.assertFalse(toplevel.HasField('submessage')) toplevel.submessage.Extensions[ more_extensions_pb2.optional_int_extension] = 23 self.assertEqual(23, toplevel.submessage.Extensions[ @@ -1406,10 +1706,10 @@ class ReflectionTest(unittest.TestCase): # Repeated scalar extension. toplevel = more_extensions_pb2.TopLevelMessage() - self.assertTrue(not toplevel.HasField('submessage')) + self.assertFalse(toplevel.HasField('submessage')) self.assertEqual([], toplevel.submessage.Extensions[ more_extensions_pb2.repeated_int_extension]) - self.assertTrue(not toplevel.HasField('submessage')) + self.assertFalse(toplevel.HasField('submessage')) toplevel.submessage.Extensions[ more_extensions_pb2.repeated_int_extension].append(23) self.assertEqual([23], toplevel.submessage.Extensions[ @@ -1418,10 +1718,10 @@ class ReflectionTest(unittest.TestCase): # Optional message extension. toplevel = more_extensions_pb2.TopLevelMessage() - self.assertTrue(not toplevel.HasField('submessage')) + self.assertFalse(toplevel.HasField('submessage')) self.assertEqual(0, toplevel.submessage.Extensions[ more_extensions_pb2.optional_message_extension].foreign_message_int) - self.assertTrue(not toplevel.HasField('submessage')) + self.assertFalse(toplevel.HasField('submessage')) toplevel.submessage.Extensions[ more_extensions_pb2.optional_message_extension].foreign_message_int = 23 self.assertEqual(23, toplevel.submessage.Extensions[ @@ -1430,10 +1730,10 @@ class ReflectionTest(unittest.TestCase): # Repeated message extension. toplevel = more_extensions_pb2.TopLevelMessage() - self.assertTrue(not toplevel.HasField('submessage')) + self.assertFalse(toplevel.HasField('submessage')) self.assertEqual(0, len(toplevel.submessage.Extensions[ more_extensions_pb2.repeated_message_extension])) - self.assertTrue(not toplevel.HasField('submessage')) + self.assertFalse(toplevel.HasField('submessage')) foreign = toplevel.submessage.Extensions[ more_extensions_pb2.repeated_message_extension].add() self.assertEqual(foreign, toplevel.submessage.Extensions[ @@ -1448,7 +1748,7 @@ class ReflectionTest(unittest.TestCase): extendee_proto.ClearExtension(extension) extension_proto.foreign_message_int = 23 - self.assertTrue(extension_proto is not extendee_proto.Extensions[extension]) + self.assertIsNot(extension_proto, extendee_proto.Extensions[extension]) def testExtensionFailureModes(self): extendee_proto = unittest_pb2.TestAllExtensions() @@ -1481,43 +1781,6 @@ class ReflectionTest(unittest.TestCase): self.assertRaises(KeyError, extendee_proto.HasExtension, unittest_pb2.repeated_string_extension) - def testStaticParseFrom(self): - proto1 = unittest_pb2.TestAllTypes() - test_util.SetAllFields(proto1) - - string1 = proto1.SerializeToString() - proto2 = unittest_pb2.TestAllTypes.FromString(string1) - - # Messages should be equal. - self.assertEqual(proto2, proto1) - - def testMergeFromSingularField(self): - # Test merge with just a singular field. - proto1 = unittest_pb2.TestAllTypes() - proto1.optional_int32 = 1 - - proto2 = unittest_pb2.TestAllTypes() - # This shouldn't get overwritten. - proto2.optional_string = 'value' - - proto2.MergeFrom(proto1) - self.assertEqual(1, proto2.optional_int32) - self.assertEqual('value', proto2.optional_string) - - def testMergeFromRepeatedField(self): - # Test merge with just a repeated field. - proto1 = unittest_pb2.TestAllTypes() - proto1.repeated_int32.append(1) - proto1.repeated_int32.append(2) - - proto2 = unittest_pb2.TestAllTypes() - proto2.repeated_int32.append(0) - proto2.MergeFrom(proto1) - - self.assertEqual(0, proto2.repeated_int32[0]) - self.assertEqual(1, proto2.repeated_int32[1]) - self.assertEqual(2, proto2.repeated_int32[2]) - def testMergeFromOptionalGroup(self): # Test merge with an optional group. proto1 = unittest_pb2.TestAllTypes() @@ -1526,43 +1789,6 @@ class ReflectionTest(unittest.TestCase): proto2.MergeFrom(proto1) self.assertEqual(12, proto2.optionalgroup.a) - def testMergeFromRepeatedNestedMessage(self): - # Test merge with a repeated nested message. - proto1 = unittest_pb2.TestAllTypes() - m = proto1.repeated_nested_message.add() - m.bb = 123 - m = proto1.repeated_nested_message.add() - m.bb = 321 - - proto2 = unittest_pb2.TestAllTypes() - m = proto2.repeated_nested_message.add() - m.bb = 999 - proto2.MergeFrom(proto1) - self.assertEqual(999, proto2.repeated_nested_message[0].bb) - self.assertEqual(123, proto2.repeated_nested_message[1].bb) - self.assertEqual(321, proto2.repeated_nested_message[2].bb) - - proto3 = unittest_pb2.TestAllTypes() - proto3.repeated_nested_message.MergeFrom(proto2.repeated_nested_message) - self.assertEqual(999, proto3.repeated_nested_message[0].bb) - self.assertEqual(123, proto3.repeated_nested_message[1].bb) - self.assertEqual(321, proto3.repeated_nested_message[2].bb) - - def testMergeFromAllFields(self): - # With all fields set. - proto1 = unittest_pb2.TestAllTypes() - test_util.SetAllFields(proto1) - proto2 = unittest_pb2.TestAllTypes() - proto2.MergeFrom(proto1) - - # Messages should be equal. - self.assertEqual(proto2, proto1) - - # Serialized string should be equal too. - string1 = proto1.SerializeToString() - string2 = proto2.SerializeToString() - self.assertEqual(string1, string2) - def testMergeFromExtensionsSingular(self): proto1 = unittest_pb2.TestAllExtensions() proto1.Extensions[unittest_pb2.optional_int32_extension] = 1 @@ -1612,71 +1838,6 @@ class ReflectionTest(unittest.TestCase): self.assertEqual(222, ext2[1].bb) self.assertEqual(333, ext2[2].bb) - def testMergeFromBug(self): - message1 = unittest_pb2.TestAllTypes() - message2 = unittest_pb2.TestAllTypes() - - # Cause optional_nested_message to be instantiated within message1, even - # though it is not considered to be "present". - message1.optional_nested_message - self.assertFalse(message1.HasField('optional_nested_message')) - - # Merge into message2. This should not instantiate the field is message2. - message2.MergeFrom(message1) - self.assertFalse(message2.HasField('optional_nested_message')) - - def testCopyFromSingularField(self): - # Test copy with just a singular field. - proto1 = unittest_pb2.TestAllTypes() - proto1.optional_int32 = 1 - proto1.optional_string = 'important-text' - - proto2 = unittest_pb2.TestAllTypes() - proto2.optional_string = 'value' - - proto2.CopyFrom(proto1) - self.assertEqual(1, proto2.optional_int32) - self.assertEqual('important-text', proto2.optional_string) - - def testCopyFromRepeatedField(self): - # Test copy with a repeated field. - proto1 = unittest_pb2.TestAllTypes() - proto1.repeated_int32.append(1) - proto1.repeated_int32.append(2) - - proto2 = unittest_pb2.TestAllTypes() - proto2.repeated_int32.append(0) - proto2.CopyFrom(proto1) - - self.assertEqual(1, proto2.repeated_int32[0]) - self.assertEqual(2, proto2.repeated_int32[1]) - - def testCopyFromAllFields(self): - # With all fields set. - proto1 = unittest_pb2.TestAllTypes() - test_util.SetAllFields(proto1) - proto2 = unittest_pb2.TestAllTypes() - proto2.CopyFrom(proto1) - - # Messages should be equal. - self.assertEqual(proto2, proto1) - - # Serialized string should be equal too. - string1 = proto1.SerializeToString() - string2 = proto2.SerializeToString() - self.assertEqual(string1, string2) - - def testCopyFromSelf(self): - proto1 = unittest_pb2.TestAllTypes() - proto1.repeated_int32.append(1) - proto1.optional_int32 = 2 - proto1.optional_string = 'important-text' - - proto1.CopyFrom(proto1) - self.assertEqual(1, proto1.repeated_int32[0]) - self.assertEqual(2, proto1.optional_int32) - self.assertEqual('important-text', proto1.optional_string) - def testCopyFromBadType(self): # The python implementation doesn't raise an exception in this # case. In theory it should. @@ -1686,30 +1847,6 @@ class ReflectionTest(unittest.TestCase): proto2 = unittest_pb2.TestAllExtensions() self.assertRaises(TypeError, proto1.CopyFrom, proto2) - def testDeepCopy(self): - proto1 = unittest_pb2.TestAllTypes() - proto1.optional_int32 = 1 - proto2 = copy.deepcopy(proto1) - self.assertEqual(1, proto2.optional_int32) - - proto1.repeated_int32.append(2) - proto1.repeated_int32.append(3) - container = copy.deepcopy(proto1.repeated_int32) - self.assertEqual([2, 3], container) - container.remove(container[0]) - self.assertEqual([3], container) - - message1 = proto1.repeated_nested_message.add() - message1.bb = 1 - messages = copy.deepcopy(proto1.repeated_nested_message) - self.assertEqual(proto1.repeated_nested_message, messages) - message1.bb = 2 - self.assertNotEqual(proto1.repeated_nested_message, messages) - messages.remove(messages[0]) - self.assertEqual(len(messages), 0) - - # TODO(anuraag): Implement deepcopy for extension dict - def testClear(self): proto = unittest_pb2.TestAllTypes() # C++ implementation does not support lazy fields right now so leave it @@ -1733,33 +1870,6 @@ class ReflectionTest(unittest.TestCase): empty_proto = unittest_pb2.TestAllExtensions() self.assertEqual(proto, empty_proto) - def testDisconnectingBeforeClear(self): - proto = unittest_pb2.TestAllTypes() - nested = proto.optional_nested_message - proto.Clear() - self.assertTrue(nested is not proto.optional_nested_message) - nested.bb = 23 - self.assertTrue(not proto.HasField('optional_nested_message')) - self.assertEqual(0, proto.optional_nested_message.bb) - - proto = unittest_pb2.TestAllTypes() - nested = proto.optional_nested_message - nested.bb = 5 - foreign = proto.optional_foreign_message - foreign.c = 6 - - proto.Clear() - self.assertTrue(nested is not proto.optional_nested_message) - self.assertTrue(foreign is not proto.optional_foreign_message) - self.assertEqual(5, nested.bb) - self.assertEqual(6, foreign.c) - nested.bb = 15 - foreign.c = 16 - self.assertFalse(proto.HasField('optional_nested_message')) - self.assertEqual(0, proto.optional_nested_message.bb) - self.assertFalse(proto.HasField('optional_foreign_message')) - self.assertEqual(0, proto.optional_foreign_message.c) - def testDisconnectingInOneof(self): m = unittest_pb2.TestOneof2() # This message has two messages in a oneof. m.foo_message.qux_int = 5 @@ -1774,18 +1884,6 @@ class ReflectionTest(unittest.TestCase): self.assertEqual(sub_message.qux_int, 5) sub_message.qux_int = 7 - def testOneOf(self): - proto = unittest_pb2.TestAllTypes() - proto.oneof_uint32 = 10 - proto.oneof_nested_message.bb = 11 - self.assertEqual(11, proto.oneof_nested_message.bb) - self.assertFalse(proto.HasField('oneof_uint32')) - nested = proto.oneof_nested_message - proto.oneof_string = 'abc' - self.assertEqual('abc', proto.oneof_string) - self.assertEqual(11, nested.bb) - self.assertFalse(proto.HasField('oneof_nested_message')) - def assertInitialized(self, proto): self.assertTrue(proto.IsInitialized()) # Neither method should raise an exception. @@ -1894,34 +1992,6 @@ class ReflectionTest(unittest.TestCase): # dependency on the C++ logging code. self.assertIn('test_file_descriptor_errors.msg1', str(cm.exception)) - def testStringUTF8Encoding(self): - proto = unittest_pb2.TestAllTypes() - - # Assignment of a unicode object to a field of type 'bytes' is not allowed. - self.assertRaises(TypeError, - setattr, proto, 'optional_bytes', u'unicode object') - - # Check that the default value is of python's 'unicode' type. - self.assertEqual(type(proto.optional_string), six.text_type) - - proto.optional_string = six.text_type('Testing') - self.assertEqual(proto.optional_string, str('Testing')) - - # Assign a value of type 'str' which can be encoded in UTF-8. - proto.optional_string = str('Testing') - self.assertEqual(proto.optional_string, six.text_type('Testing')) - - # Try to assign a 'bytes' object which contains non-UTF-8. - self.assertRaises(ValueError, - setattr, proto, 'optional_string', b'a\x80a') - # No exception: Assign already encoded UTF-8 bytes to a string field. - utf8_bytes = u'Тест'.encode('utf-8') - proto.optional_string = utf8_bytes - # No exception: Assign the a non-ascii unicode object. - proto.optional_string = u'Тест' - # No exception thrown (normal str assignment containing ASCII). - proto.optional_string = 'abc' - def testStringUTF8Serialization(self): proto = message_set_extensions_pb2.TestMessageSet() extension_message = message_set_extensions_pb2.TestMessageSetExtension2 @@ -1976,38 +2046,6 @@ class ReflectionTest(unittest.TestCase): string_field = message2.str self.assertTrue(unicode_decode_failed or type(string_field) is bytes) - def testBytesInTextFormat(self): - proto = unittest_pb2.TestAllTypes(optional_bytes=b'\x00\x7f\x80\xff') - self.assertEqual(u'optional_bytes: "\\000\\177\\200\\377"\n', - six.text_type(proto)) - - def testEmptyNestedMessage(self): - proto = unittest_pb2.TestAllTypes() - proto.optional_nested_message.MergeFrom( - unittest_pb2.TestAllTypes.NestedMessage()) - self.assertTrue(proto.HasField('optional_nested_message')) - - proto = unittest_pb2.TestAllTypes() - proto.optional_nested_message.CopyFrom( - unittest_pb2.TestAllTypes.NestedMessage()) - self.assertTrue(proto.HasField('optional_nested_message')) - - proto = unittest_pb2.TestAllTypes() - bytes_read = proto.optional_nested_message.MergeFromString(b'') - self.assertEqual(0, bytes_read) - self.assertTrue(proto.HasField('optional_nested_message')) - - proto = unittest_pb2.TestAllTypes() - proto.optional_nested_message.ParseFromString(b'') - self.assertTrue(proto.HasField('optional_nested_message')) - - serialized = proto.SerializeToString() - proto2 = unittest_pb2.TestAllTypes() - self.assertEqual( - len(serialized), - proto2.MergeFromString(serialized)) - self.assertTrue(proto2.HasField('optional_nested_message')) - def testSetInParent(self): proto = unittest_pb2.TestAllTypes() self.assertFalse(proto.HasField('optionalgroup')) @@ -3065,7 +3103,7 @@ class SerializationTest(unittest.TestCase): self.assertTrue(proto.HasField('a')) self.assertTrue(proto.HasField('b')) self.assertTrue(proto.HasField('c')) - self.assertTrue(not proto.HasField('dummy2')) + self.assertFalse(proto.HasField('dummy2')) self.assertEqual(1, proto.a) self.assertEqual(1, proto.b) self.assertEqual(1, proto.c) @@ -3079,7 +3117,7 @@ class SerializationTest(unittest.TestCase): self.assertTrue(proto.optional_message.HasField('a')) self.assertTrue(proto.optional_message.HasField('b')) self.assertTrue(proto.optional_message.HasField('c')) - self.assertTrue(not proto.optional_message.HasField('dummy2')) + self.assertFalse(proto.optional_message.HasField('dummy2')) self.assertEqual(unittest_pb2.TestRequired(a=1, b=1, c=1), proto.optional_message) self.assertEqual(1, proto.optional_message.a) @@ -3267,3 +3305,4 @@ class ClassAPITest(unittest.TestCase): if __name__ == '__main__': unittest.main() + diff --git a/python/google/protobuf/internal/text_format_test.py b/python/google/protobuf/internal/text_format_test.py index 504af13a12..aa6f97b1b6 100755 --- a/python/google/protobuf/internal/text_format_test.py +++ b/python/google/protobuf/internal/text_format_test.py @@ -817,11 +817,19 @@ class TextFormatParserTests(TextFormatBase): r'have multiple "optional_int32" fields.'), text_format.Parse, text, message) + def testParseExistingScalarInMessage(self, message_module): + message = message_module.TestAllTypes(optional_int32=42) + text = 'optional_int32: 67' + six.assertRaisesRegex(self, text_format.ParseError, + (r'Message type "\w+.TestAllTypes" should not ' + r'have multiple "optional_int32" fields.'), + text_format.Parse, text, message) + @_parameterized.parameters(unittest_pb2, unittest_proto3_arena_pb2) class TextFormatMergeTests(TextFormatBase): - def testMergeDuplicateScalars(self, message_module): + def testMergeDuplicateScalarsInText(self, message_module): message = message_module.TestAllTypes() text = ('optional_int32: 42 ' 'optional_int32: 67') r = text_format.Merge(text, message) @@ -836,6 +844,22 @@ class TextFormatMergeTests(TextFormatBase): self.assertTrue(r is message) self.assertEqual(2, message.optional_nested_message.bb) + def testReplaceScalarInMessage(self, message_module): + message = message_module.TestAllTypes(optional_int32=42) + text = 'optional_int32: 67' + r = text_format.Merge(text, message) + self.assertIs(r, message) + self.assertEqual(67, message.optional_int32) + + def testReplaceMessageInMessage(self, message_module): + message = message_module.TestAllTypes( + optional_int32=42, optional_nested_message=dict()) + self.assertTrue(message.HasField('optional_nested_message')) + text = 'optional_nested_message{ bb: 3 }' + r = text_format.Merge(text, message) + self.assertIs(r, message) + self.assertEqual(3, message.optional_nested_message.bb) + def testMergeMultipleOneof(self, message_module): m_string = '\n'.join(['oneof_uint32: 11', 'oneof_string: "foo"']) m2 = message_module.TestAllTypes() diff --git a/python/google/protobuf/json_format.py b/python/google/protobuf/json_format.py index 6c3b1cb8cb..a11874de29 100644 --- a/python/google/protobuf/json_format.py +++ b/python/google/protobuf/json_format.py @@ -103,7 +103,8 @@ def MessageToJson( indent=2, sort_keys=False, use_integers_for_enums=False, - descriptor_pool=None): + descriptor_pool=None, + float_precision=None): """Converts protobuf message to JSON format. Args: @@ -121,6 +122,7 @@ def MessageToJson( use_integers_for_enums: If true, print integers instead of enum names. descriptor_pool: A Descriptor Pool for resolving types. If None use the default. + float_precision: If set, use this to specify float field valid digits. Returns: A string containing the JSON formatted protocol buffer message. @@ -129,7 +131,8 @@ def MessageToJson( including_default_value_fields, preserving_proto_field_name, use_integers_for_enums, - descriptor_pool) + descriptor_pool, + float_precision=float_precision) return printer.ToJsonString(message, indent, sort_keys) @@ -138,7 +141,8 @@ def MessageToDict( including_default_value_fields=False, preserving_proto_field_name=False, use_integers_for_enums=False, - descriptor_pool=None): + descriptor_pool=None, + float_precision=None): """Converts protobuf message to a dictionary. When the dictionary is encoded to JSON, it conforms to proto3 JSON spec. @@ -155,6 +159,7 @@ def MessageToDict( use_integers_for_enums: If true, print integers instead of enum names. descriptor_pool: A Descriptor Pool for resolving types. If None use the default. + float_precision: If set, use this to specify float field valid digits. Returns: A dict representation of the protocol buffer message. @@ -163,7 +168,8 @@ def MessageToDict( including_default_value_fields, preserving_proto_field_name, use_integers_for_enums, - descriptor_pool) + descriptor_pool, + float_precision=float_precision) # pylint: disable=protected-access return printer._MessageToJsonObject(message) @@ -182,11 +188,17 @@ class _Printer(object): including_default_value_fields=False, preserving_proto_field_name=False, use_integers_for_enums=False, - descriptor_pool=None): + descriptor_pool=None, + float_precision=None): self.including_default_value_fields = including_default_value_fields self.preserving_proto_field_name = preserving_proto_field_name self.use_integers_for_enums = use_integers_for_enums self.descriptor_pool = descriptor_pool + # TODO(jieluo): change the float precision default to 8 valid digits. + if float_precision: + self.float_format = '.{}g'.format(float_precision) + else: + self.float_format = None def ToJsonString(self, message, indent, sort_keys): js = self._MessageToJsonObject(message) @@ -301,6 +313,9 @@ class _Printer(object): return _INFINITY if math.isnan(value): return _NAN + if (self.float_format and + field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_FLOAT): + return float(format(value, self.float_format)) return value def _AnyMessageToJsonObject(self, message): diff --git a/python/google/protobuf/pyext/message.cc b/python/google/protobuf/pyext/message.cc index 7066cba647..e3e66ae2e1 100644 --- a/python/google/protobuf/pyext/message.cc +++ b/python/google/protobuf/pyext/message.cc @@ -3029,10 +3029,6 @@ bool InitProto2MessageModule(PyObject *m) { PyModule_AddObject(m, "DescriptorPool", reinterpret_cast( &PyDescriptorPool_Type)); - // This implementation provides full Descriptor types, we advertise it so that - // descriptor.py can use them in replacement of the Python classes. - PyModule_AddIntConstant(m, "_USE_C_DESCRIPTORS", 1); - PyModule_AddObject(m, "Descriptor", reinterpret_cast( &PyMessageDescriptor_Type)); PyModule_AddObject(m, "FieldDescriptor", reinterpret_cast( diff --git a/python/google/protobuf/text_format.py b/python/google/protobuf/text_format.py index ecdfd5a714..a85184e321 100755 --- a/python/google/protobuf/text_format.py +++ b/python/google/protobuf/text_format.py @@ -617,15 +617,23 @@ def Parse(text, NOTE: for historical reasons this function does not clear the input message. This is different from what the binary msg.ParseFrom(...) does. + If text contains a field already set in message, the value is appended if the + field is repeated. Otherwise, an error is raised. Example a = MyProto() a.repeated_field.append('test') b = MyProto() + # Repeated fields are combined text_format.Parse(repr(a), b) text_format.Parse(repr(a), b) # repeated_field contains ["test", "test"] + # Non-repeated fields cannot be overwritten + a.singular_field = 1 + b.singular_field = 2 + text_format.Parse(repr(a), b) # ParseError + # Binary version: b.ParseFromString(a.SerializeToString()) # repeated_field is now "test" @@ -665,7 +673,8 @@ def Merge(text, """Parses a text representation of a protocol message into a message. Like Parse(), but allows repeated values for a non-repeated field, and uses - the last one. + the last one. This means any non-repeated, top-level fields specified in text + replace those in the message. Args: text: Message text representation. @@ -701,6 +710,8 @@ def ParseLines(lines, allow_unknown_field=False): """Parses a text representation of a protocol message into a message. + See Parse() for caveats. + Args: lines: An iterable of lines of a message's text representation. message: A protocol buffer message to merge into. @@ -733,8 +744,7 @@ def MergeLines(lines, allow_unknown_field=False): """Parses a text representation of a protocol message into a message. - Like ParseLines(), but allows repeated values for a non-repeated field, and - uses the last one. + See Merge() for more details. Args: lines: An iterable of lines of a message's text representation. diff --git a/src/Makefile.am b/src/Makefile.am index a5bd9ce782..60bb445d9b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -228,8 +228,6 @@ libprotobuf_la_SOURCES = \ $(libprotobuf_lite_la_SOURCES) \ google/protobuf/any.pb.cc \ google/protobuf/api.pb.cc \ - google/protobuf/stubs/mathlimits.cc \ - google/protobuf/stubs/mathlimits.h \ google/protobuf/any.cc \ google/protobuf/descriptor.cc \ google/protobuf/descriptor_database.cc \ diff --git a/src/google/protobuf/any.pb.cc b/src/google/protobuf/any.pb.cc index 3ccd92167b..5a79335b6c 100644 --- a/src/google/protobuf/any.pb.cc +++ b/src/google/protobuf/any.pb.cc @@ -169,14 +169,17 @@ const char* Any::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::intern // string type_url = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_type_url(), ptr, ctx, "google.protobuf.Any.type_url"); + auto str = _internal_mutable_type_url(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Any.type_url")); CHK_(ptr); } else goto handle_unusual; continue; // bytes value = 2; case 2: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(_internal_mutable_value(), ptr, ctx); + auto str = _internal_mutable_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); CHK_(ptr); } else goto handle_unusual; continue; @@ -200,7 +203,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Any::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Any::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Any) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; diff --git a/src/google/protobuf/any.pb.h b/src/google/protobuf/any.pb.h index ca01b0477c..7ea175d4df 100644 --- a/src/google/protobuf/any.pb.h +++ b/src/google/protobuf/any.pb.h @@ -32,7 +32,6 @@ #include // IWYU pragma: export #include // IWYU pragma: export #include -#include // @@protoc_insertion_point(includes) #include #define PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2fany_2eproto PROTOBUF_EXPORT @@ -170,7 +169,7 @@ class PROTOBUF_EXPORT Any : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } diff --git a/src/google/protobuf/api.pb.cc b/src/google/protobuf/api.pb.cc index 2b0175c7f8..294c4ef435 100644 --- a/src/google/protobuf/api.pb.cc +++ b/src/google/protobuf/api.pb.cc @@ -282,7 +282,9 @@ const char* Api::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::intern // string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_name(), ptr, ctx, "google.protobuf.Api.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Api.name")); CHK_(ptr); } else goto handle_unusual; continue; @@ -313,7 +315,9 @@ const char* Api::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::intern // string version = 4; case 4: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 34)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_version(), ptr, ctx, "google.protobuf.Api.version"); + auto str = _internal_mutable_version(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Api.version")); CHK_(ptr); } else goto handle_unusual; continue; @@ -364,7 +368,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Api::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Api::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Api) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -385,7 +389,7 @@ failure: n = static_cast(this->_internal_methods_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(2, this->_internal_methods(i), target, stream); + InternalWriteMessage(2, this->_internal_methods(i), target, stream); } // repeated .google.protobuf.Option options = 3; @@ -393,7 +397,7 @@ failure: n = static_cast(this->_internal_options_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(3, this->_internal_options(i), target, stream); + InternalWriteMessage(3, this->_internal_options(i), target, stream); } // string version = 4; @@ -410,7 +414,7 @@ failure: if (this->has_source_context()) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 5, _Internal::source_context(this), target, stream); } @@ -419,7 +423,7 @@ failure: n = static_cast(this->_internal_mixins_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(6, this->_internal_mixins(i), target, stream); + InternalWriteMessage(6, this->_internal_mixins(i), target, stream); } // .google.protobuf.Syntax syntax = 7; @@ -675,14 +679,18 @@ const char* Method::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::int // string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_name(), ptr, ctx, "google.protobuf.Method.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Method.name")); CHK_(ptr); } else goto handle_unusual; continue; // string request_type_url = 2; case 2: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_request_type_url(), ptr, ctx, "google.protobuf.Method.request_type_url"); + auto str = _internal_mutable_request_type_url(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Method.request_type_url")); CHK_(ptr); } else goto handle_unusual; continue; @@ -696,7 +704,9 @@ const char* Method::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::int // string response_type_url = 4; case 4: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 34)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_response_type_url(), ptr, ctx, "google.protobuf.Method.response_type_url"); + auto str = _internal_mutable_response_type_url(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Method.response_type_url")); CHK_(ptr); } else goto handle_unusual; continue; @@ -747,7 +757,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Method::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Method::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Method) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -800,7 +810,7 @@ failure: n = static_cast(this->_internal_options_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(6, this->_internal_options(i), target, stream); + InternalWriteMessage(6, this->_internal_options(i), target, stream); } // .google.protobuf.Syntax syntax = 7; @@ -1037,14 +1047,18 @@ const char* Mixin::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::inte // string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_name(), ptr, ctx, "google.protobuf.Mixin.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Mixin.name")); CHK_(ptr); } else goto handle_unusual; continue; // string root = 2; case 2: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_root(), ptr, ctx, "google.protobuf.Mixin.root"); + auto str = _internal_mutable_root(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Mixin.root")); CHK_(ptr); } else goto handle_unusual; continue; @@ -1068,7 +1082,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Mixin::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Mixin::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Mixin) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; diff --git a/src/google/protobuf/api.pb.h b/src/google/protobuf/api.pb.h index af7ab8c425..91bc34e2b4 100644 --- a/src/google/protobuf/api.pb.h +++ b/src/google/protobuf/api.pb.h @@ -146,7 +146,7 @@ class PROTOBUF_EXPORT Api : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -387,7 +387,7 @@ class PROTOBUF_EXPORT Method : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -611,7 +611,7 @@ class PROTOBUF_EXPORT Mixin : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } diff --git a/src/google/protobuf/arena.cc b/src/google/protobuf/arena.cc index 0171c56168..069dcdfa36 100644 --- a/src/google/protobuf/arena.cc +++ b/src/google/protobuf/arena.cc @@ -144,16 +144,6 @@ void ArenaImpl::SerialArena::AddCleanupFallback(void* elem, AddCleanup(elem, cleanup); } -PROTOBUF_FUNC_ALIGN(32) -void* ArenaImpl::AllocateAligned(size_t n) { - SerialArena* arena; - if (PROTOBUF_PREDICT_TRUE(GetSerialArenaFast(&arena))) { - return arena->AllocateAligned(n); - } else { - return AllocateAlignedFallback(n); - } -} - void* ArenaImpl::AllocateAlignedAndAddCleanup(size_t n, void (*cleanup)(void*)) { SerialArena* arena; @@ -189,28 +179,6 @@ void ArenaImpl::AddCleanupFallback(void* elem, void (*cleanup)(void*)) { GetSerialArena()->AddCleanup(elem, cleanup); } -inline PROTOBUF_ALWAYS_INLINE bool ArenaImpl::GetSerialArenaFast( - ArenaImpl::SerialArena** arena) { - // If this thread already owns a block in this arena then try to use that. - // This fast path optimizes the case where multiple threads allocate from the - // same arena. - ThreadCache* tc = &thread_cache(); - if (PROTOBUF_PREDICT_TRUE(tc->last_lifecycle_id_seen == lifecycle_id_)) { - *arena = tc->last_serial_arena; - return true; - } - - // Check whether we own the last accessed SerialArena on this arena. This - // fast path optimizes the case where a single thread uses multiple arenas. - SerialArena* serial = hint_.load(std::memory_order_acquire); - if (PROTOBUF_PREDICT_TRUE(serial != NULL && serial->owner() == tc)) { - *arena = serial; - return true; - } - - return false; -} - ArenaImpl::SerialArena* ArenaImpl::GetSerialArena() { SerialArena* arena; if (PROTOBUF_PREDICT_TRUE(GetSerialArenaFast(&arena))) { @@ -391,6 +359,11 @@ ArenaImpl::SerialArena* ArenaImpl::GetSerialArenaFallback(void* me) { } // namespace internal +PROTOBUF_FUNC_ALIGN(32) +void* Arena::AllocateAlignedNoHook(size_t n) { + return impl_.AllocateAligned(n); +} + void Arena::CallDestructorHooks() { uint64 space_allocated = impl_.SpaceAllocated(); // Call the reset hook diff --git a/src/google/protobuf/arena.h b/src/google/protobuf/arena.h index 736b4e4081..d73b53c79f 100644 --- a/src/google/protobuf/arena.h +++ b/src/google/protobuf/arena.h @@ -88,6 +88,7 @@ namespace internal { struct ArenaStringPtr; // defined in arenastring.h class LazyField; // defined in lazy_field.h +class EpsCopyInputStream; // defined in parse_context.h template class GenericTypeHandler; // defined in repeated_field.h @@ -535,7 +536,7 @@ class PROTOBUF_EXPORT alignas(8) Arena final { AllocHook(RTTI_TYPE_ID(T), n); // Monitor allocation if needed. if (skip_explicit_ownership) { - return impl_.AllocateAligned(n); + return AllocateAlignedNoHook(n); } else { return impl_.AllocateAlignedAndAddCleanup( n, &internal::arena_destruct_object); @@ -596,7 +597,7 @@ class PROTOBUF_EXPORT alignas(8) Arena final { const size_t n = internal::AlignUpTo8(sizeof(T) * num_elements); // Monitor allocation if needed. AllocHook(RTTI_TYPE_ID(T), n); - return static_cast(impl_.AllocateAligned(n)); + return static_cast(AllocateAlignedNoHook(n)); } template @@ -689,9 +690,11 @@ class PROTOBUF_EXPORT alignas(8) Arena final { // For friends of arena. void* AllocateAligned(size_t n) { AllocHook(NULL, n); - return impl_.AllocateAligned(internal::AlignUpTo8(n)); + return AllocateAlignedNoHook(internal::AlignUpTo8(n)); } + void* AllocateAlignedNoHook(size_t n); + internal::ArenaImpl impl_; void (*on_arena_allocation_)(const std::type_info* allocated_type, @@ -707,6 +710,7 @@ class PROTOBUF_EXPORT alignas(8) Arena final { friend class internal::GenericTypeHandler; friend struct internal::ArenaStringPtr; // For AllocateAligned. friend class internal::LazyField; // For CreateMaybeMessage. + friend class internal::EpsCopyInputStream; // For parser performance friend class MessageLite; template friend class Map; diff --git a/src/google/protobuf/arena_impl.h b/src/google/protobuf/arena_impl.h index 0beec171f7..d7b7ed73ed 100644 --- a/src/google/protobuf/arena_impl.h +++ b/src/google/protobuf/arena_impl.h @@ -107,7 +107,27 @@ class PROTOBUF_EXPORT ArenaImpl { uint64 SpaceAllocated() const; uint64 SpaceUsed() const; - void* AllocateAligned(size_t n); + void* AllocateAligned(size_t n) { + SerialArena* arena; + if (PROTOBUF_PREDICT_TRUE(GetSerialArenaFast(&arena))) { + return arena->AllocateAligned(n); + } else { + return AllocateAlignedFallback(n); + } + } + + // This function allocates n bytes if the common happy case is true and + // returns true. Otherwise does nothing and returns false. This strange + // semantics is necessary to allow callers to program functions that only + // have fallback function calls in tail position. This substantially improves + // code for the happy path. + PROTOBUF_ALWAYS_INLINE bool MaybeAllocateAligned(size_t n, void** out) { + SerialArena* a; + if (PROTOBUF_PREDICT_TRUE(GetSerialArenaFromThreadCache(&a))) { + return a->MaybeAllocateAligned(n, out); + } + return false; + } void* AllocateAlignedAndAddCleanup(size_t n, void (*cleanup)(void*)); @@ -156,10 +176,12 @@ class PROTOBUF_EXPORT ArenaImpl { void CleanupList(); uint64 SpaceUsed() const; + bool HasSpace(size_t n) { return n <= static_cast(limit_ - ptr_); } + void* AllocateAligned(size_t n) { GOOGLE_DCHECK_EQ(internal::AlignUpTo8(n), n); // Must be already aligned. GOOGLE_DCHECK_GE(limit_, ptr_); - if (PROTOBUF_PREDICT_FALSE(static_cast(limit_ - ptr_) < n)) { + if (PROTOBUF_PREDICT_FALSE(!HasSpace(n))) { return AllocateAlignedFallback(n); } void* ret = ptr_; @@ -170,6 +192,20 @@ class PROTOBUF_EXPORT ArenaImpl { return ret; } + // Allocate space if the current region provides enough space. + bool MaybeAllocateAligned(size_t n, void** out) { + GOOGLE_DCHECK_EQ(internal::AlignUpTo8(n), n); // Must be already aligned. + GOOGLE_DCHECK_GE(limit_, ptr_); + if (PROTOBUF_PREDICT_FALSE(!HasSpace(n))) return false; + void* ret = ptr_; + ptr_ += n; +#ifdef ADDRESS_SANITIZER + ASAN_UNPOISON_MEMORY_REGION(ret, n); +#endif // ADDRESS_SANITIZER + *out = ret; + return true; + } + void AddCleanup(void* elem, void (*cleanup)(void*)) { if (PROTOBUF_PREDICT_FALSE(cleanup_ptr_ == cleanup_limit_)) { AddCleanupFallback(elem, cleanup); @@ -292,7 +328,32 @@ class PROTOBUF_EXPORT ArenaImpl { Block* NewBlock(Block* last_block, size_t min_bytes); SerialArena* GetSerialArena(); - bool GetSerialArenaFast(SerialArena** arena); + PROTOBUF_ALWAYS_INLINE bool GetSerialArenaFast(SerialArena** arena) { + if (GetSerialArenaFromThreadCache(arena)) return true; + + // Check whether we own the last accessed SerialArena on this arena. This + // fast path optimizes the case where a single thread uses multiple arenas. + ThreadCache* tc = &thread_cache(); + SerialArena* serial = hint_.load(std::memory_order_acquire); + if (PROTOBUF_PREDICT_TRUE(serial != NULL && serial->owner() == tc)) { + *arena = serial; + return true; + } + return false; + } + + PROTOBUF_ALWAYS_INLINE bool GetSerialArenaFromThreadCache( + SerialArena** arena) { + // If this thread already owns a block in this arena then try to use that. + // This fast path optimizes the case where multiple threads allocate from + // the same arena. + ThreadCache* tc = &thread_cache(); + if (PROTOBUF_PREDICT_TRUE(tc->last_lifecycle_id_seen == lifecycle_id_)) { + *arena = tc->last_serial_arena; + return true; + } + return false; + } SerialArena* GetSerialArenaFallback(void* me); LifecycleId lifecycle_id_; // Unique for each arena. Changes on Reset(). diff --git a/src/google/protobuf/arenastring.h b/src/google/protobuf/arenastring.h index 99e26b8752..122f391e51 100644 --- a/src/google/protobuf/arenastring.h +++ b/src/google/protobuf/arenastring.h @@ -32,6 +32,7 @@ #define GOOGLE_PROTOBUF_ARENASTRING_H__ #include +#include #include #include diff --git a/src/google/protobuf/arenastring_unittest.cc b/src/google/protobuf/arenastring_unittest.cc index 70a3f76722..c5da4476b4 100644 --- a/src/google/protobuf/arenastring_unittest.cc +++ b/src/google/protobuf/arenastring_unittest.cc @@ -43,6 +43,7 @@ #include #include #include +#include namespace google { @@ -50,7 +51,6 @@ namespace protobuf { using internal::ArenaStringPtr; - static std::string WrapString(const char* value) { return value; } // Test ArenaStringPtr with arena == NULL. diff --git a/src/google/protobuf/compiler/command_line_interface.cc b/src/google/protobuf/compiler/command_line_interface.cc index 1fbc34e235..9278bd0834 100644 --- a/src/google/protobuf/compiler/command_line_interface.cc +++ b/src/google/protobuf/compiler/command_line_interface.cc @@ -869,7 +869,8 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) { } descriptor_pool->EnforceWeakDependencies(true); - if (!ParseInputFiles(descriptor_pool.get(), &parsed_files)) { + if (!ParseInputFiles(descriptor_pool.get(), disk_source_tree.get(), + &parsed_files)) { return 1; } @@ -1044,7 +1045,8 @@ bool CommandLineInterface::VerifyInputFilesInDescriptors( for (const auto& input_file : input_files_) { FileDescriptorProto file_descriptor; if (!database->FindFileByName(input_file, &file_descriptor)) { - std::cerr << input_file << ": " << strerror(ENOENT) << std::endl; + std::cerr << "Could not find file in descriptor database: " << input_file + << ": " << strerror(ENOENT) << std::endl; return false; } @@ -1061,7 +1063,7 @@ bool CommandLineInterface::VerifyInputFilesInDescriptors( } bool CommandLineInterface::ParseInputFiles( - DescriptorPool* descriptor_pool, + DescriptorPool* descriptor_pool, DiskSourceTree* source_tree, std::vector* parsed_files) { // Track unused imports in all source files @@ -1154,7 +1156,8 @@ bool CommandLineInterface::MakeProtoProtoPathRelative( in_fallback_database) { return true; } else { - std::cerr << *proto << ": " << strerror(ENOENT) << std::endl; + std::cerr << "Could not make proto path relative: " << *proto << ": " + << strerror(ENOENT) << std::endl; return false; } } @@ -1177,7 +1180,8 @@ bool CommandLineInterface::MakeProtoProtoPathRelative( if (in_fallback_database) { return true; } - std::cerr << *proto << ": " << strerror(errno) << std::endl; + std::cerr << "Could not map to virtual file: " << *proto << ": " + << strerror(errno) << std::endl; return false; case DiskSourceTree::NO_MAPPING: { // Try to interpret the path as a virtual path. diff --git a/src/google/protobuf/compiler/command_line_interface.h b/src/google/protobuf/compiler/command_line_interface.h index 1a9b66ad2f..9449fa3979 100644 --- a/src/google/protobuf/compiler/command_line_interface.h +++ b/src/google/protobuf/compiler/command_line_interface.h @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -273,6 +274,7 @@ class PROTOC_EXPORT CommandLineInterface { // Parses input_files_ into parsed_files bool ParseInputFiles(DescriptorPool* descriptor_pool, + DiskSourceTree* source_tree, std::vector* parsed_files); // Generate the given output file from the given input. diff --git a/src/google/protobuf/compiler/command_line_interface_unittest.cc b/src/google/protobuf/compiler/command_line_interface_unittest.cc index 5a31215e48..e4fd54e011 100644 --- a/src/google/protobuf/compiler/command_line_interface_unittest.cc +++ b/src/google/protobuf/compiler/command_line_interface_unittest.cc @@ -1778,7 +1778,9 @@ TEST_F(CommandLineInterfaceTest, InputNotFoundError) { Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); - ExpectErrorText("foo.proto: No such file or directory\n"); + ExpectErrorText( + "Could not make proto path relative: foo.proto: No such file or " + "directory\n"); } TEST_F(CommandLineInterfaceTest, InputNotFoundError_DescriptorSetIn) { @@ -1797,7 +1799,9 @@ TEST_F(CommandLineInterfaceTest, CwdRelativeInputNotFoundError) { Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir $tmpdir/foo.proto"); - ExpectErrorText("$tmpdir/foo.proto: No such file or directory\n"); + ExpectErrorText( + "Could not make proto path relative: $tmpdir/foo.proto: No such file or " + "directory\n"); } TEST_F(CommandLineInterfaceTest, CwdRelativeInputNotMappedError) { @@ -1834,7 +1838,9 @@ TEST_F(CommandLineInterfaceTest, CwdRelativeInputNotFoundAndNotMappedError) { Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir/bar $tmpdir/foo.proto"); - ExpectErrorText("$tmpdir/foo.proto: No such file or directory\n"); + ExpectErrorText( + "Could not make proto path relative: $tmpdir/foo.proto: No such file or " + "directory\n"); } TEST_F(CommandLineInterfaceTest, CwdRelativeInputShadowedError) { @@ -1867,7 +1873,8 @@ TEST_F(CommandLineInterfaceTest, ProtoPathNotFoundError) { ExpectErrorText( "$tmpdir/foo: warning: directory does not exist.\n" - "foo.proto: No such file or directory\n"); + "Could not make proto path relative: foo.proto: No such file or " + "directory\n"); } TEST_F(CommandLineInterfaceTest, ProtoPathAndDescriptorSetIn) { @@ -2479,6 +2486,11 @@ class EncodeDecodeTest : public testing::TestWithParam { EXPECT_EQ(StripCR(expected_text), StripCR(captured_stderr_)); } + void ExpectStderrContainsText(const std::string& expected_text) { + EXPECT_NE(StripCR(captured_stderr_).find(StripCR(expected_text)), + std::string::npos); + } + private: void WriteUnittestProtoDescriptorSet() { unittest_proto_descriptor_set_filename_ = @@ -2569,7 +2581,7 @@ TEST_P(EncodeDecodeTest, ProtoParseError) { Run("net/proto2/internal/no_such_file.proto " "--encode=NoSuchType")); ExpectStdoutMatchesText(""); - ExpectStderrMatchesText( + ExpectStderrContainsText( "net/proto2/internal/no_such_file.proto: No such file or directory\n"); } diff --git a/src/google/protobuf/compiler/cpp/cpp_enum.cc b/src/google/protobuf/compiler/cpp/cpp_enum.cc index 366fcb66ec..c0a03ad40f 100644 --- a/src/google/protobuf/compiler/cpp/cpp_enum.cc +++ b/src/google/protobuf/compiler/cpp/cpp_enum.cc @@ -104,10 +104,8 @@ void EnumGenerator::GenerateDefinition(io::Printer* printer) { // 2147483648, and since 2147483648 can't fit in an integer, this produces a // compiler warning. This works around that issue. format_value.Set("number", Int32ToString(descriptor_->value(i)->number())); - format_value.Set( - "deprecation", - DeprecatedAttribute(options_, - descriptor_->value(i)->options().deprecated())); + format_value.Set("deprecation", + DeprecatedAttribute(options_, descriptor_->value(i))); if (i > 0) format_value(",\n"); format_value("${1$$prefix$$name$$}$ $deprecation$= $number$", @@ -213,8 +211,8 @@ void EnumGenerator::GenerateSymbolImports(io::Printer* printer) const { format("typedef $classname$ $resolved_name$;\n"); for (int j = 0; j < descriptor_->value_count(); j++) { - std::string deprecated_attr = DeprecatedAttribute( - options_, descriptor_->value(j)->options().deprecated()); + std::string deprecated_attr = + DeprecatedAttribute(options_, descriptor_->value(j)); format( "$1$static constexpr $resolved_name$ ${2$$3$$}$ =\n" " $classname$_$3$;\n", diff --git a/src/google/protobuf/compiler/cpp/cpp_field.cc b/src/google/protobuf/compiler/cpp/cpp_field.cc index 890387eb65..5b2ca151dc 100644 --- a/src/google/protobuf/compiler/cpp/cpp_field.cc +++ b/src/google/protobuf/compiler/cpp/cpp_field.cc @@ -69,8 +69,7 @@ void SetCommonFieldVariables(const FieldDescriptor* descriptor, (*variables)["tag_size"] = StrCat( WireFormat::TagSize(descriptor->number(), descriptor->type())); - (*variables)["deprecated_attr"] = - DeprecatedAttribute(options, descriptor->options().deprecated()); + (*variables)["deprecated_attr"] = DeprecatedAttribute(options, descriptor); (*variables)["set_hasbit"] = ""; (*variables)["clear_hasbit"] = ""; diff --git a/src/google/protobuf/compiler/cpp/cpp_file.cc b/src/google/protobuf/compiler/cpp/cpp_file.cc index 66565fb5b7..45fd30871c 100644 --- a/src/google/protobuf/compiler/cpp/cpp_file.cc +++ b/src/google/protobuf/compiler/cpp/cpp_file.cc @@ -1357,10 +1357,6 @@ void FileGenerator::GenerateLibraryIncludes(io::Printer* printer) { if (UseUnknownFieldSet(file_, options_) && !message_generators_.empty()) { IncludeFile("net/proto2/public/unknown_field_set.h", printer); } - - if (IsAnyMessage(file_, options_)) { - IncludeFile("net/proto2/internal/any.h", printer); - } } void FileGenerator::GenerateMetadataPragma(io::Printer* printer, diff --git a/src/google/protobuf/compiler/cpp/cpp_helpers.cc b/src/google/protobuf/compiler/cpp/cpp_helpers.cc index f34986ee2e..062ad6b332 100644 --- a/src/google/protobuf/compiler/cpp/cpp_helpers.cc +++ b/src/google/protobuf/compiler/cpp/cpp_helpers.cc @@ -983,12 +983,6 @@ bool IsWellKnownMessage(const FileDescriptor* file) { return well_known_files.find(file->name()) != well_known_files.end(); } -enum Utf8CheckMode { - STRICT = 0, // Parsing will fail if non UTF-8 data is in string fields. - VERIFY = 1, // Only log an error but parsing will succeed. - NONE = 2, // No UTF-8 check. -}; - static bool FieldEnforceUtf8(const FieldDescriptor* field, const Options& options) { return true; @@ -1000,8 +994,8 @@ static bool FileUtf8Verification(const FileDescriptor* file, } // Which level of UTF-8 enforcemant is placed on this file. -static Utf8CheckMode GetUtf8CheckMode(const FieldDescriptor* field, - const Options& options) { +Utf8CheckMode GetUtf8CheckMode(const FieldDescriptor* field, + const Options& options) { if (field->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 && FieldEnforceUtf8(field, options)) { return STRICT; @@ -1014,19 +1008,6 @@ static Utf8CheckMode GetUtf8CheckMode(const FieldDescriptor* field, } } -std::string GetUtf8Suffix(const FieldDescriptor* field, - const Options& options) { - switch (GetUtf8CheckMode(field, options)) { - case STRICT: - return "UTF8"; - case VERIFY: - return "UTF8Verify"; - case NONE: - default: // Some build configs warn on missing return without default. - return ""; - } -} - static void GenerateUtf8CheckCode(const FieldDescriptor* field, const Options& options, bool for_parse, const char* parameters, @@ -1418,13 +1399,7 @@ class ParseLoopGenerator { using WireFormat = internal::WireFormat; using WireFormatLite = internal::WireFormatLite; - void GenerateArenaString(const FieldDescriptor* field, - const std::string& utf8, std::string field_name) { - if (!field_name.empty()) { - format_("static const char kFieldName[] = $1$;\n", - field_name.substr(2)); // remove ", " - field_name = ", kFieldName"; - } + void GenerateArenaString(const FieldDescriptor* field) { if (HasFieldPresence(field->file())) { format_("_Internal::set_has_$1$(&$has_bits$);\n", FieldName(field)); } @@ -1436,28 +1411,17 @@ class ParseLoopGenerator { "::" + MakeDefaultName(field) + ".get()"; format_( "if (arena != nullptr) {\n" - " ptr = $pi_ns$::InlineCopyIntoArenaString$1$(&$2$_, ptr, ctx, " - " arena$3$);\n" + " ptr = ctx->ReadArenaString(ptr, &$1$_, arena);\n" "} else {\n" " ptr = " - "$pi_ns$::InlineGreedyStringParser$1$($2$_.MutableNoArenaNoDefault(&$4$" - "), ptr, ctx$3$);" - "\n}\n", - utf8, FieldName(field), field_name, default_string); + "$pi_ns$::InlineGreedyStringParser($1$_.MutableNoArenaNoDefault(&$2$" + "), ptr, ctx);" + "\n}\n" + "const std::string* str = &$1$_.Get(); (void)str;\n", + FieldName(field), default_string); } void GenerateStrings(const FieldDescriptor* field, bool check_utf8) { - std::string utf8; - std::string field_name; - if (check_utf8) { - utf8 = GetUtf8Suffix(field, options_); - if (!utf8.empty()) { - field_name = ", nullptr"; - if (HasDescriptorMethods(field->file(), options_)) { - field_name = StrCat(", \"", field->full_name(), "\""); - } - } - } FieldOptions::CType ctype = FieldOptions::STRING; if (!options_.opensource_runtime) { // Open source doesn't support other ctypes; @@ -1470,25 +1434,57 @@ class ParseLoopGenerator { field->default_value_string().empty() && !IsStringInlined(field, options_) && field->containing_oneof() == nullptr && ctype == FieldOptions::STRING) { - GenerateArenaString(field, utf8, field_name); - return; + GenerateArenaString(field); + } else { + std::string name; + switch (ctype) { + case FieldOptions::STRING: + name = "GreedyStringParser"; + break; + case FieldOptions::CORD: + name = "CordParser"; + break; + case FieldOptions::STRING_PIECE: + name = "StringPieceParser"; + break; + } + format_( + "auto str = $1$$2$_$3$();\n" + "ptr = $pi_ns$::Inline$4$(str, ptr, ctx);\n", + HasInternalAccessors(ctype) ? "_internal_" : "", + field->is_repeated() && !field->is_packable() ? "add" : "mutable", + FieldName(field), name); } - std::string name; - switch (ctype) { - case FieldOptions::STRING: - name = "GreedyStringParser" + utf8; + if (!check_utf8) return; // return if this is a bytes field + auto level = GetUtf8CheckMode(field, options_); + switch (level) { + case NONE: + return; + case VERIFY: + format_("#ifndef NDEBUG\n"); + break; + case STRICT: + format_("CHK_("); break; - case FieldOptions::CORD: - name = "CordParser" + utf8; + } + std::string field_name; + field_name = "nullptr"; + if (HasDescriptorMethods(field->file(), options_)) { + field_name = StrCat("\"", field->full_name(), "\""); + } + format_("$pi_ns$::VerifyUTF8(str, $1$)", field_name); + switch (level) { + case NONE: + return; + case VERIFY: + format_( + ";\n" + "#endif // !NDEBUG\n"); break; - case FieldOptions::STRING_PIECE: - name = "StringPieceParser" + utf8; + case STRICT: + format_(");\n"); break; } - format_("ptr = $pi_ns$::Inline$1$($2$$3$_$4$(), ptr, ctx$5$);\n", name, - HasInternalAccessors(ctype) ? "_internal_" : "", - field->is_repeated() && !field->is_packable() ? "add" : "mutable", - FieldName(field), field_name); } void GenerateLengthDelim(const FieldDescriptor* field) { diff --git a/src/google/protobuf/compiler/cpp/cpp_helpers.h b/src/google/protobuf/compiler/cpp/cpp_helpers.h index 2f11b50a07..28cf78e7e6 100644 --- a/src/google/protobuf/compiler/cpp/cpp_helpers.h +++ b/src/google/protobuf/compiler/cpp/cpp_helpers.h @@ -66,8 +66,13 @@ inline std::string MacroPrefix(const Options& options) { } inline std::string DeprecatedAttribute(const Options& options, - bool deprecated) { - return deprecated ? "PROTOBUF_DEPRECATED " : ""; + const FieldDescriptor* d) { + return d->options().deprecated() ? "PROTOBUF_DEPRECATED " : ""; +} + +inline std::string DeprecatedAttribute(const Options& options, + const EnumValueDescriptor* d) { + return d->options().deprecated() ? "PROTOBUF_DEPRECATED_ENUM " : ""; } // Commonly-used separator comments. Thick is a line of '=', thin is a line @@ -756,7 +761,15 @@ class PROTOC_EXPORT NamespaceOpener { std::vector name_stack_; }; -std::string GetUtf8Suffix(const FieldDescriptor* field, const Options& options); +enum Utf8CheckMode { + STRICT = 0, // Parsing will fail if non UTF-8 data is in string fields. + VERIFY = 1, // Only log an error but parsing will succeed. + NONE = 2, // No UTF-8 check. +}; + +Utf8CheckMode GetUtf8CheckMode(const FieldDescriptor* field, + const Options& options); + void GenerateUtf8CheckCodeForString(const FieldDescriptor* field, const Options& options, bool for_parse, const char* parameters, diff --git a/src/google/protobuf/compiler/cpp/cpp_message.cc b/src/google/protobuf/compiler/cpp/cpp_message.cc index 1a70755210..b88c1f7e5e 100644 --- a/src/google/protobuf/compiler/cpp/cpp_message.cc +++ b/src/google/protobuf/compiler/cpp/cpp_message.cc @@ -1011,10 +1011,10 @@ void MessageGenerator::GenerateClassDefinition(io::Printer* printer) { " static const $classname$* internal_default_instance() { return " "reinterpret_cast(&_$classname$_default_instance_); }\n"); - std::string suffix = GetUtf8Suffix(descriptor_->field(0), options_); + auto utf8_check = GetUtf8CheckMode(descriptor_->field(0), options_); if (descriptor_->field(0)->type() == FieldDescriptor::TYPE_STRING && - !suffix.empty()) { - if (suffix == "UTF8") { + utf8_check != NONE) { + if (utf8_check == STRICT) { format( " static bool ValidateKey(std::string* s) {\n" " return ::$proto_ns$::internal::WireFormatLite::" @@ -1023,12 +1023,13 @@ void MessageGenerator::GenerateClassDefinition(io::Printer* printer) { " }\n", descriptor_->field(0)->full_name()); } else { - GOOGLE_CHECK(suffix == "UTF8Verify"); + GOOGLE_CHECK(utf8_check == VERIFY); format( " static bool ValidateKey(std::string* s) {\n" "#ifndef NDEBUG\n" " ::$proto_ns$::internal::WireFormatLite::VerifyUtf8String(\n" - " s->data(), static_cast(s->size()), ::$proto_ns$::internal::" + " s->data(), static_cast(s->size()), " + "::$proto_ns$::internal::" "WireFormatLite::PARSE, \"$1$\");\n" "#endif\n" " return true;\n" @@ -1039,8 +1040,8 @@ void MessageGenerator::GenerateClassDefinition(io::Printer* printer) { format(" static bool ValidateKey(void*) { return true; }\n"); } if (descriptor_->field(1)->type() == FieldDescriptor::TYPE_STRING && - !suffix.empty()) { - if (suffix == "UTF8") { + utf8_check != NONE) { + if (utf8_check == STRICT) { format( " static bool ValidateValue(std::string* s) {\n" " return ::$proto_ns$::internal::WireFormatLite::" @@ -1049,12 +1050,13 @@ void MessageGenerator::GenerateClassDefinition(io::Printer* printer) { " }\n", descriptor_->field(1)->full_name()); } else { - GOOGLE_CHECK(suffix == "UTF8Verify"); + GOOGLE_CHECK(utf8_check = VERIFY); format( " static bool ValidateValue(std::string* s) {\n" "#ifndef NDEBUG\n" " ::$proto_ns$::internal::WireFormatLite::VerifyUtf8String(\n" - " s->data(), static_cast(s->size()), ::$proto_ns$::internal::" + " s->data(), static_cast(s->size()), " + "::$proto_ns$::internal::" "WireFormatLite::PARSE, \"$1$\");\n" "#endif\n" " return true;\n" @@ -1351,7 +1353,7 @@ void MessageGenerator::GenerateClassDefinition(io::Printer* printer) { "size_t ByteSizeLong() const final;\n" "const char* _InternalParse(const char* ptr, " "::$proto_ns$::internal::ParseContext* ctx) final;\n" - "$uint8$* InternalSerializeWithCachedSizesToArray(\n" + "$uint8$* _InternalSerialize(\n" " $uint8$* target, ::$proto_ns$::io::EpsCopyOutputStream* stream) " "const final;\n"); @@ -3488,7 +3490,7 @@ void MessageGenerator::GenerateSerializeOneExtensionRange( Formatter format(printer, vars); format("// Extension range [$start$, $end$)\n"); format( - "target = _extensions_.InternalSerializeWithCachedSizesToArray(\n" + "target = _extensions_._InternalSerialize(\n" " $start$, $end$, target, stream);\n\n"); } @@ -3498,7 +3500,7 @@ void MessageGenerator::GenerateSerializeWithCachedSizesToArray( if (descriptor_->options().message_set_wire_format()) { // Special-case MessageSet. format( - "$uint8$* $classname$::InternalSerializeWithCachedSizesToArray(\n" + "$uint8$* $classname$::_InternalSerialize(\n" " $uint8$* target, ::$proto_ns$::io::EpsCopyOutputStream* stream) " "const {\n" " target = _extensions_." @@ -3517,7 +3519,7 @@ void MessageGenerator::GenerateSerializeWithCachedSizesToArray( } format( - "$uint8$* $classname$::InternalSerializeWithCachedSizesToArray(\n" + "$uint8$* $classname$::_InternalSerialize(\n" " $uint8$* target, ::$proto_ns$::io::EpsCopyOutputStream* stream) " "const {\n"); format.Indent(); @@ -3759,7 +3761,7 @@ void MessageGenerator::GenerateByteSize(io::Printer* printer) { if (field->is_required()) { format( "\n" - "if (has_$1$()) {\n", + "if (_internal_has_$1$()) {\n", FieldName(field)); format.Indent(); PrintFieldComment(format, field); @@ -3820,7 +3822,7 @@ void MessageGenerator::GenerateByteSize(io::Printer* printer) { for (auto field : optimized_order_) { if (!field->is_required()) continue; PrintFieldComment(format, field); - format("if (has_$1$()) {\n", FieldName(field)); + format("if (_internal_has_$1$()) {\n", FieldName(field)); format.Indent(); field_generators_.get(field).GenerateByteSize(printer); format.Outdent(); @@ -4042,13 +4044,13 @@ void MessageGenerator::GenerateIsInitialized(io::Printer* printer) { if (IsImplicitWeakField(field, options_, scc_analyzer_)) { format( "if " - "(!::$proto_ns$::internal::AllAreInitializedWeak(this->$1$_.weak)" + "(!::$proto_ns$::internal::AllAreInitializedWeak($1$_.weak)" ")" " return false;\n", FieldName(field)); } else { format( - "if (!::$proto_ns$::internal::AllAreInitialized(this->$1$()))" + "if (!::$proto_ns$::internal::AllAreInitialized($1$_))" " return false;\n", FieldName(field)); } @@ -4057,8 +4059,8 @@ void MessageGenerator::GenerateIsInitialized(io::Printer* printer) { } else { GOOGLE_CHECK(!field->containing_oneof()); format( - "if (has_$1$()) {\n" - " if (!this->$1$_->IsInitialized()) return false;\n" + "if (_internal_has_$1$()) {\n" + " if (!$1$_->IsInitialized()) return false;\n" "}\n", FieldName(field)); } diff --git a/src/google/protobuf/compiler/cpp/cpp_message_field.cc b/src/google/protobuf/compiler/cpp/cpp_message_field.cc index 6c5a017158..12c6524b5c 100644 --- a/src/google/protobuf/compiler/cpp/cpp_message_field.cc +++ b/src/google/protobuf/compiler/cpp/cpp_message_field.cc @@ -439,7 +439,7 @@ void MessageFieldGenerator::GenerateSerializeWithCachedSizesToArray( format( "target = stream->EnsureSpace(target);\n" "target = ::$proto_ns$::internal::WireFormatLite::\n" - " InternalWrite$declared_type$ToArray(\n" + " InternalWrite$declared_type$(\n" " $number$, _Internal::$name$(this), target, stream);\n"); } @@ -505,7 +505,7 @@ void MessageOneofFieldGenerator::GenerateInlineAccessorDefinitions( "inline $type$* $classname$::$release_name$() {\n" "$annotate_accessor$" " // @@protoc_insertion_point(field_release:$full_name$)\n" - " if (has_$name$()) {\n" + " if (_internal_has_$name$()) {\n" " clear_has_$oneof_name$();\n" " $type$* temp = $field_member$;\n"); if (SupportsArenas(descriptor_)) { @@ -540,7 +540,7 @@ void MessageOneofFieldGenerator::GenerateInlineAccessorDefinitions( "$annotate_accessor$" " // @@protoc_insertion_point(field_unsafe_arena_release" ":$full_name$)\n" - " if (has_$name$()) {\n" + " if (_internal_has_$name$()) {\n" " clear_has_$oneof_name$();\n" " $type$* temp = $field_member$;\n" " $field_member$ = nullptr;\n" @@ -752,8 +752,7 @@ void RepeatedMessageFieldGenerator::GenerateSerializeWithCachedSizesToArray( " end = this->$name$_.pointer_end(); it < end; ++it) {\n" " target = stream->EnsureSpace(target);\n" " target = ::$proto_ns$::internal::WireFormatLite::\n" - " InternalWrite$declared_type$ToArray($number$, **it, target, " - "stream);\n" + " InternalWrite$declared_type$($number$, **it, target, stream);\n" "}\n"); } else { format( @@ -763,9 +762,8 @@ void RepeatedMessageFieldGenerator::GenerateSerializeWithCachedSizesToArray( "{\n" " target = stream->EnsureSpace(target);\n" " target = ::$proto_ns$::internal::WireFormatLite::\n" - " InternalWrite$declared_type$ToArray($number$, " - "this->_internal_$name$(i), target, " - "stream);\n" + " InternalWrite$declared_type$($number$, " + "this->_internal_$name$(i), target, stream);\n" "}\n"); } } diff --git a/src/google/protobuf/compiler/cpp/cpp_string_field.cc b/src/google/protobuf/compiler/cpp/cpp_string_field.cc index 966eeea577..847f76c217 100644 --- a/src/google/protobuf/compiler/cpp/cpp_string_field.cc +++ b/src/google/protobuf/compiler/cpp/cpp_string_field.cc @@ -285,7 +285,7 @@ void StringFieldGenerator::GenerateInlineAccessorDefinitions( if (HasFieldPresence(descriptor_->file())) { format( - " if (!has_$name$()) {\n" + " if (!_internal_has_$name$()) {\n" " return nullptr;\n" " }\n" " $clear_hasbit$\n" @@ -391,7 +391,7 @@ void StringFieldGenerator::GenerateInlineAccessorDefinitions( if (HasFieldPresence(descriptor_->file())) { format( - " if (!has_$name$()) {\n" + " if (!_internal_has_$name$()) {\n" " return nullptr;\n" " }\n" " $clear_hasbit$\n" diff --git a/src/google/protobuf/compiler/csharp/csharp_helpers.h b/src/google/protobuf/compiler/csharp/csharp_helpers.h index c51681edf7..6354e9e6aa 100644 --- a/src/google/protobuf/compiler/csharp/csharp_helpers.h +++ b/src/google/protobuf/compiler/csharp/csharp_helpers.h @@ -36,6 +36,7 @@ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_HELPERS_H__ #include +#include #include #include #include diff --git a/src/google/protobuf/compiler/csharp/csharp_names.h b/src/google/protobuf/compiler/csharp/csharp_names.h index fa3e245c6f..44852721a8 100644 --- a/src/google/protobuf/compiler/csharp/csharp_names.h +++ b/src/google/protobuf/compiler/csharp/csharp_names.h @@ -39,6 +39,7 @@ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_NAMES_H__ #include +#include #include #include diff --git a/src/google/protobuf/compiler/main.cc b/src/google/protobuf/compiler/main.cc index e1c539ae17..b723b14abf 100644 --- a/src/google/protobuf/compiler/main.cc +++ b/src/google/protobuf/compiler/main.cc @@ -32,11 +32,10 @@ #include #include +#include #include #include - #include -#include #include #include #include diff --git a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc b/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc index 724e94654e..09a808bf40 100644 --- a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc +++ b/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc @@ -48,6 +48,7 @@ #include #include #include +#include #include #include diff --git a/src/google/protobuf/compiler/plugin.pb.cc b/src/google/protobuf/compiler/plugin.pb.cc index b0f73dfcb3..354b4c8bc8 100644 --- a/src/google/protobuf/compiler/plugin.pb.cc +++ b/src/google/protobuf/compiler/plugin.pb.cc @@ -324,7 +324,11 @@ const char* Version::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::in // optional string suffix = 4; case 4: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 34)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_suffix(), ptr, ctx, "google.protobuf.compiler.Version.suffix"); + auto str = _internal_mutable_suffix(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.compiler.Version.suffix"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -349,7 +353,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Version::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Version::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.compiler.Version) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -625,7 +629,11 @@ const char* CodeGeneratorRequest::_InternalParse(const char* ptr, ::PROTOBUF_NAM ptr -= 1; do { ptr += 1; - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_add_file_to_generate(), ptr, ctx, "google.protobuf.compiler.CodeGeneratorRequest.file_to_generate"); + auto str = _internal_add_file_to_generate(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.compiler.CodeGeneratorRequest.file_to_generate"); + #endif // !NDEBUG CHK_(ptr); if (!ctx->DataAvailable(ptr)) break; } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr)); @@ -634,7 +642,11 @@ const char* CodeGeneratorRequest::_InternalParse(const char* ptr, ::PROTOBUF_NAM // optional string parameter = 2; case 2: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_parameter(), ptr, ctx, "google.protobuf.compiler.CodeGeneratorRequest.parameter"); + auto str = _internal_mutable_parameter(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.compiler.CodeGeneratorRequest.parameter"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -678,7 +690,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* CodeGeneratorRequest::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* CodeGeneratorRequest::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.compiler.CodeGeneratorRequest) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -709,7 +721,7 @@ failure: if (cached_has_bits & 0x00000002u) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 3, _Internal::compiler_version(this), target, stream); } @@ -718,7 +730,7 @@ failure: n = static_cast(this->_internal_proto_file_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(15, this->_internal_proto_file(i), target, stream); + InternalWriteMessage(15, this->_internal_proto_file(i), target, stream); } if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { @@ -829,7 +841,7 @@ void CodeGeneratorRequest::CopyFrom(const CodeGeneratorRequest& from) { } bool CodeGeneratorRequest::IsInitialized() const { - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->proto_file())) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(proto_file_)) return false; return true; } @@ -952,21 +964,33 @@ const char* CodeGeneratorResponse_File::_InternalParse(const char* ptr, ::PROTOB // optional string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_name(), ptr, ctx, "google.protobuf.compiler.CodeGeneratorResponse.File.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.compiler.CodeGeneratorResponse.File.name"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string insertion_point = 2; case 2: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_insertion_point(), ptr, ctx, "google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point"); + auto str = _internal_mutable_insertion_point(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string content = 15; case 15: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 122)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_content(), ptr, ctx, "google.protobuf.compiler.CodeGeneratorResponse.File.content"); + auto str = _internal_mutable_content(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.compiler.CodeGeneratorResponse.File.content"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -991,7 +1015,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* CodeGeneratorResponse_File::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* CodeGeneratorResponse_File::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.compiler.CodeGeneratorResponse.File) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1230,7 +1254,11 @@ const char* CodeGeneratorResponse::_InternalParse(const char* ptr, ::PROTOBUF_NA // optional string error = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_error(), ptr, ctx, "google.protobuf.compiler.CodeGeneratorResponse.error"); + auto str = _internal_mutable_error(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.compiler.CodeGeneratorResponse.error"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -1267,7 +1295,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* CodeGeneratorResponse::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* CodeGeneratorResponse::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.compiler.CodeGeneratorResponse) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1289,7 +1317,7 @@ failure: n = static_cast(this->_internal_file_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(15, this->_internal_file(i), target, stream); + InternalWriteMessage(15, this->_internal_file(i), target, stream); } if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { diff --git a/src/google/protobuf/compiler/plugin.pb.h b/src/google/protobuf/compiler/plugin.pb.h index ec70e03445..2dee810eca 100644 --- a/src/google/protobuf/compiler/plugin.pb.h +++ b/src/google/protobuf/compiler/plugin.pb.h @@ -165,7 +165,7 @@ class PROTOC_EXPORT Version : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -357,7 +357,7 @@ class PROTOC_EXPORT CodeGeneratorRequest : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -567,7 +567,7 @@ class PROTOC_EXPORT CodeGeneratorResponse_File : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -758,7 +758,7 @@ class PROTOC_EXPORT CodeGeneratorResponse : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -998,7 +998,7 @@ inline std::string* Version::_internal_mutable_suffix() { } inline std::string* Version::release_suffix() { // @@protoc_insertion_point(field_release:google.protobuf.compiler.Version.suffix) - if (!has_suffix()) { + if (!_internal_has_suffix()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -1147,7 +1147,7 @@ inline std::string* CodeGeneratorRequest::_internal_mutable_parameter() { } inline std::string* CodeGeneratorRequest::release_parameter() { // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorRequest.parameter) - if (!has_parameter()) { + if (!_internal_has_parameter()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -1318,7 +1318,7 @@ inline std::string* CodeGeneratorResponse_File::_internal_mutable_name() { } inline std::string* CodeGeneratorResponse_File::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorResponse.File.name) - if (!has_name()) { + if (!_internal_has_name()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -1389,7 +1389,7 @@ inline std::string* CodeGeneratorResponse_File::_internal_mutable_insertion_poin } inline std::string* CodeGeneratorResponse_File::release_insertion_point() { // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point) - if (!has_insertion_point()) { + if (!_internal_has_insertion_point()) { return nullptr; } _has_bits_[0] &= ~0x00000002u; @@ -1460,7 +1460,7 @@ inline std::string* CodeGeneratorResponse_File::_internal_mutable_content() { } inline std::string* CodeGeneratorResponse_File::release_content() { // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorResponse.File.content) - if (!has_content()) { + if (!_internal_has_content()) { return nullptr; } _has_bits_[0] &= ~0x00000004u; @@ -1535,7 +1535,7 @@ inline std::string* CodeGeneratorResponse::_internal_mutable_error() { } inline std::string* CodeGeneratorResponse::release_error() { // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorResponse.error) - if (!has_error()) { + if (!_internal_has_error()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; diff --git a/src/google/protobuf/descriptor.cc b/src/google/protobuf/descriptor.cc index f42a85e483..f50d29f3ea 100644 --- a/src/google/protobuf/descriptor.cc +++ b/src/google/protobuf/descriptor.cc @@ -6438,6 +6438,7 @@ bool DescriptorBuilder::OptionInterpreter::InterpretSingleOption( std::vector dest_path = options_path; for (int i = 0; i < uninterpreted_option_->name_size(); ++i) { + builder_->undefine_resolved_name_.clear(); const std::string& name_part = uninterpreted_option_->name(i).name_part(); if (debug_msg_name.size() > 0) { debug_msg_name += "."; diff --git a/src/google/protobuf/descriptor.pb.cc b/src/google/protobuf/descriptor.pb.cc index 0af4fb11b2..470b29264f 100644 --- a/src/google/protobuf/descriptor.pb.cc +++ b/src/google/protobuf/descriptor.pb.cc @@ -1486,7 +1486,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* FileDescriptorSet::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* FileDescriptorSet::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileDescriptorSet) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1497,7 +1497,7 @@ failure: n = static_cast(this->_internal_file_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(1, this->_internal_file(i), target, stream); + InternalWriteMessage(1, this->_internal_file(i), target, stream); } if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { @@ -1572,7 +1572,7 @@ void FileDescriptorSet::CopyFrom(const FileDescriptorSet& from) { } bool FileDescriptorSet::IsInitialized() const { - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->file())) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(file_)) return false; return true; } @@ -1799,14 +1799,22 @@ const char* FileDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAME // optional string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_name(), ptr, ctx, "google.protobuf.FileDescriptorProto.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileDescriptorProto.name"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string package = 2; case 2: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_package(), ptr, ctx, "google.protobuf.FileDescriptorProto.package"); + auto str = _internal_mutable_package(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileDescriptorProto.package"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -1816,7 +1824,11 @@ const char* FileDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAME ptr -= 1; do { ptr += 1; - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_add_dependency(), ptr, ctx, "google.protobuf.FileDescriptorProto.dependency"); + auto str = _internal_add_dependency(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileDescriptorProto.dependency"); + #endif // !NDEBUG CHK_(ptr); if (!ctx->DataAvailable(ptr)) break; } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<26>(ptr)); @@ -1917,7 +1929,11 @@ const char* FileDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAME // optional string syntax = 12; case 12: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 98)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_syntax(), ptr, ctx, "google.protobuf.FileDescriptorProto.syntax"); + auto str = _internal_mutable_syntax(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileDescriptorProto.syntax"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -1942,7 +1958,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* FileDescriptorProto::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* FileDescriptorProto::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileDescriptorProto) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1984,7 +2000,7 @@ failure: n = static_cast(this->_internal_message_type_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(4, this->_internal_message_type(i), target, stream); + InternalWriteMessage(4, this->_internal_message_type(i), target, stream); } // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; @@ -1992,7 +2008,7 @@ failure: n = static_cast(this->_internal_enum_type_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(5, this->_internal_enum_type(i), target, stream); + InternalWriteMessage(5, this->_internal_enum_type(i), target, stream); } // repeated .google.protobuf.ServiceDescriptorProto service = 6; @@ -2000,7 +2016,7 @@ failure: n = static_cast(this->_internal_service_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(6, this->_internal_service(i), target, stream); + InternalWriteMessage(6, this->_internal_service(i), target, stream); } // repeated .google.protobuf.FieldDescriptorProto extension = 7; @@ -2008,14 +2024,14 @@ failure: n = static_cast(this->_internal_extension_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(7, this->_internal_extension(i), target, stream); + InternalWriteMessage(7, this->_internal_extension(i), target, stream); } // optional .google.protobuf.FileOptions options = 8; if (cached_has_bits & 0x00000008u) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 8, _Internal::options(this), target, stream); } @@ -2023,7 +2039,7 @@ failure: if (cached_has_bits & 0x00000010u) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 9, _Internal::source_code_info(this), target, stream); } @@ -2230,12 +2246,12 @@ void FileDescriptorProto::CopyFrom(const FileDescriptorProto& from) { } bool FileDescriptorProto::IsInitialized() const { - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->message_type())) return false; - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->enum_type())) return false; - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->service())) return false; - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->extension())) return false; - if (has_options()) { - if (!this->options_->IsInitialized()) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(message_type_)) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(enum_type_)) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(service_)) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(extension_)) return false; + if (_internal_has_options()) { + if (!options_->IsInitialized()) return false; } return true; } @@ -2437,7 +2453,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* DescriptorProto_ExtensionRange::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* DescriptorProto_ExtensionRange::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto.ExtensionRange) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -2460,7 +2476,7 @@ failure: if (cached_has_bits & 0x00000001u) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 3, _Internal::options(this), target, stream); } @@ -2565,8 +2581,8 @@ void DescriptorProto_ExtensionRange::CopyFrom(const DescriptorProto_ExtensionRan } bool DescriptorProto_ExtensionRange::IsInitialized() const { - if (has_options()) { - if (!this->options_->IsInitialized()) return false; + if (_internal_has_options()) { + if (!options_->IsInitialized()) return false; } return true; } @@ -2715,7 +2731,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* DescriptorProto_ReservedRange::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* DescriptorProto_ReservedRange::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto.ReservedRange) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -2994,7 +3010,11 @@ const char* DescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPAC // optional string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_name(), ptr, ctx, "google.protobuf.DescriptorProto.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.DescriptorProto.name"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -3095,7 +3115,11 @@ const char* DescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPAC ptr -= 1; do { ptr += 1; - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_add_reserved_name(), ptr, ctx, "google.protobuf.DescriptorProto.reserved_name"); + auto str = _internal_add_reserved_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.DescriptorProto.reserved_name"); + #endif // !NDEBUG CHK_(ptr); if (!ctx->DataAvailable(ptr)) break; } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<82>(ptr)); @@ -3122,7 +3146,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* DescriptorProto::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* DescriptorProto::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -3144,7 +3168,7 @@ failure: n = static_cast(this->_internal_field_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(2, this->_internal_field(i), target, stream); + InternalWriteMessage(2, this->_internal_field(i), target, stream); } // repeated .google.protobuf.DescriptorProto nested_type = 3; @@ -3152,7 +3176,7 @@ failure: n = static_cast(this->_internal_nested_type_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(3, this->_internal_nested_type(i), target, stream); + InternalWriteMessage(3, this->_internal_nested_type(i), target, stream); } // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; @@ -3160,7 +3184,7 @@ failure: n = static_cast(this->_internal_enum_type_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(4, this->_internal_enum_type(i), target, stream); + InternalWriteMessage(4, this->_internal_enum_type(i), target, stream); } // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; @@ -3168,7 +3192,7 @@ failure: n = static_cast(this->_internal_extension_range_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(5, this->_internal_extension_range(i), target, stream); + InternalWriteMessage(5, this->_internal_extension_range(i), target, stream); } // repeated .google.protobuf.FieldDescriptorProto extension = 6; @@ -3176,14 +3200,14 @@ failure: n = static_cast(this->_internal_extension_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(6, this->_internal_extension(i), target, stream); + InternalWriteMessage(6, this->_internal_extension(i), target, stream); } // optional .google.protobuf.MessageOptions options = 7; if (cached_has_bits & 0x00000002u) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 7, _Internal::options(this), target, stream); } @@ -3192,7 +3216,7 @@ failure: n = static_cast(this->_internal_oneof_decl_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(8, this->_internal_oneof_decl(i), target, stream); + InternalWriteMessage(8, this->_internal_oneof_decl(i), target, stream); } // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9; @@ -3200,7 +3224,7 @@ failure: n = static_cast(this->_internal_reserved_range_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(9, this->_internal_reserved_range(i), target, stream); + InternalWriteMessage(9, this->_internal_reserved_range(i), target, stream); } // repeated string reserved_name = 10; @@ -3368,14 +3392,14 @@ void DescriptorProto::CopyFrom(const DescriptorProto& from) { } bool DescriptorProto::IsInitialized() const { - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->field())) return false; - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->nested_type())) return false; - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->enum_type())) return false; - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->extension_range())) return false; - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->extension())) return false; - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->oneof_decl())) return false; - if (has_options()) { - if (!this->options_->IsInitialized()) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(field_)) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(nested_type_)) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(enum_type_)) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(extension_range_)) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(extension_)) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(oneof_decl_)) return false; + if (_internal_has_options()) { + if (!options_->IsInitialized()) return false; } return true; } @@ -3521,7 +3545,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* ExtensionRangeOptions::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* ExtensionRangeOptions::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ExtensionRangeOptions) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -3532,11 +3556,11 @@ failure: n = static_cast(this->_internal_uninterpreted_option_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(999, this->_internal_uninterpreted_option(i), target, stream); + InternalWriteMessage(999, this->_internal_uninterpreted_option(i), target, stream); } // Extension range [1000, 536870912) - target = _extensions_.InternalSerializeWithCachedSizesToArray( + target = _extensions_._InternalSerialize( 1000, 536870912, target, stream); if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { @@ -3618,7 +3642,7 @@ bool ExtensionRangeOptions::IsInitialized() const { return false; } - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->uninterpreted_option())) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(uninterpreted_option_)) return false; return true; } @@ -3844,14 +3868,22 @@ const char* FieldDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAM // optional string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_name(), ptr, ctx, "google.protobuf.FieldDescriptorProto.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FieldDescriptorProto.name"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string extendee = 2; case 2: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_extendee(), ptr, ctx, "google.protobuf.FieldDescriptorProto.extendee"); + auto str = _internal_mutable_extendee(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FieldDescriptorProto.extendee"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -3890,14 +3922,22 @@ const char* FieldDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAM // optional string type_name = 6; case 6: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 50)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_type_name(), ptr, ctx, "google.protobuf.FieldDescriptorProto.type_name"); + auto str = _internal_mutable_type_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FieldDescriptorProto.type_name"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string default_value = 7; case 7: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 58)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_default_value(), ptr, ctx, "google.protobuf.FieldDescriptorProto.default_value"); + auto str = _internal_mutable_default_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FieldDescriptorProto.default_value"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -3919,7 +3959,11 @@ const char* FieldDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAM // optional string json_name = 10; case 10: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 82)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_json_name(), ptr, ctx, "google.protobuf.FieldDescriptorProto.json_name"); + auto str = _internal_mutable_json_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FieldDescriptorProto.json_name"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -3944,7 +3988,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* FieldDescriptorProto::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* FieldDescriptorProto::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldDescriptorProto) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -4015,7 +4059,7 @@ failure: if (cached_has_bits & 0x00000020u) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 8, _Internal::options(this), target, stream); } @@ -4209,8 +4253,8 @@ void FieldDescriptorProto::CopyFrom(const FieldDescriptorProto& from) { } bool FieldDescriptorProto::IsInitialized() const { - if (has_options()) { - if (!this->options_->IsInitialized()) return false; + if (_internal_has_options()) { + if (!options_->IsInitialized()) return false; } return true; } @@ -4370,7 +4414,11 @@ const char* OneofDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAM // optional string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_name(), ptr, ctx, "google.protobuf.OneofDescriptorProto.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.OneofDescriptorProto.name"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -4402,7 +4450,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* OneofDescriptorProto::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* OneofDescriptorProto::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.OneofDescriptorProto) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -4423,7 +4471,7 @@ failure: if (cached_has_bits & 0x00000002u) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 2, _Internal::options(this), target, stream); } @@ -4517,8 +4565,8 @@ void OneofDescriptorProto::CopyFrom(const OneofDescriptorProto& from) { } bool OneofDescriptorProto::IsInitialized() const { - if (has_options()) { - if (!this->options_->IsInitialized()) return false; + if (_internal_has_options()) { + if (!options_->IsInitialized()) return false; } return true; } @@ -4667,7 +4715,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* EnumDescriptorProto_EnumReservedRange::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* EnumDescriptorProto_EnumReservedRange::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumDescriptorProto.EnumReservedRange) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -4931,7 +4979,11 @@ const char* EnumDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAME // optional string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_name(), ptr, ctx, "google.protobuf.EnumDescriptorProto.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.EnumDescriptorProto.name"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -4972,7 +5024,11 @@ const char* EnumDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAME ptr -= 1; do { ptr += 1; - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_add_reserved_name(), ptr, ctx, "google.protobuf.EnumDescriptorProto.reserved_name"); + auto str = _internal_add_reserved_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.EnumDescriptorProto.reserved_name"); + #endif // !NDEBUG CHK_(ptr); if (!ctx->DataAvailable(ptr)) break; } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<42>(ptr)); @@ -4999,7 +5055,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* EnumDescriptorProto::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* EnumDescriptorProto::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumDescriptorProto) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -5021,14 +5077,14 @@ failure: n = static_cast(this->_internal_value_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(2, this->_internal_value(i), target, stream); + InternalWriteMessage(2, this->_internal_value(i), target, stream); } // optional .google.protobuf.EnumOptions options = 3; if (cached_has_bits & 0x00000002u) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 3, _Internal::options(this), target, stream); } @@ -5037,7 +5093,7 @@ failure: n = static_cast(this->_internal_reserved_range_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(4, this->_internal_reserved_range(i), target, stream); + InternalWriteMessage(4, this->_internal_reserved_range(i), target, stream); } // repeated string reserved_name = 5; @@ -5165,9 +5221,9 @@ void EnumDescriptorProto::CopyFrom(const EnumDescriptorProto& from) { } bool EnumDescriptorProto::IsInitialized() const { - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->value())) return false; - if (has_options()) { - if (!this->options_->IsInitialized()) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(value_)) return false; + if (_internal_has_options()) { + if (!options_->IsInitialized()) return false; } return true; } @@ -5325,7 +5381,11 @@ const char* EnumValueDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF // optional string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_name(), ptr, ctx, "google.protobuf.EnumValueDescriptorProto.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.EnumValueDescriptorProto.name"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -5365,7 +5425,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* EnumValueDescriptorProto::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* EnumValueDescriptorProto::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumValueDescriptorProto) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -5392,7 +5452,7 @@ failure: if (cached_has_bits & 0x00000002u) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 3, _Internal::options(this), target, stream); } @@ -5497,8 +5557,8 @@ void EnumValueDescriptorProto::CopyFrom(const EnumValueDescriptorProto& from) { } bool EnumValueDescriptorProto::IsInitialized() const { - if (has_options()) { - if (!this->options_->IsInitialized()) return false; + if (_internal_has_options()) { + if (!options_->IsInitialized()) return false; } return true; } @@ -5650,7 +5710,11 @@ const char* ServiceDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_N // optional string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_name(), ptr, ctx, "google.protobuf.ServiceDescriptorProto.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.ServiceDescriptorProto.name"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -5694,7 +5758,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* ServiceDescriptorProto::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* ServiceDescriptorProto::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ServiceDescriptorProto) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -5716,14 +5780,14 @@ failure: n = static_cast(this->_internal_method_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(2, this->_internal_method(i), target, stream); + InternalWriteMessage(2, this->_internal_method(i), target, stream); } // optional .google.protobuf.ServiceOptions options = 3; if (cached_has_bits & 0x00000002u) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 3, _Internal::options(this), target, stream); } @@ -5825,9 +5889,9 @@ void ServiceDescriptorProto::CopyFrom(const ServiceDescriptorProto& from) { } bool ServiceDescriptorProto::IsInitialized() const { - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->method())) return false; - if (has_options()) { - if (!this->options_->IsInitialized()) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(method_)) return false; + if (_internal_has_options()) { + if (!options_->IsInitialized()) return false; } return true; } @@ -6016,21 +6080,33 @@ const char* MethodDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NA // optional string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_name(), ptr, ctx, "google.protobuf.MethodDescriptorProto.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.MethodDescriptorProto.name"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string input_type = 2; case 2: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_input_type(), ptr, ctx, "google.protobuf.MethodDescriptorProto.input_type"); + auto str = _internal_mutable_input_type(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.MethodDescriptorProto.input_type"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string output_type = 3; case 3: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 26)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_output_type(), ptr, ctx, "google.protobuf.MethodDescriptorProto.output_type"); + auto str = _internal_mutable_output_type(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.MethodDescriptorProto.output_type"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -6078,7 +6154,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* MethodDescriptorProto::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* MethodDescriptorProto::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MethodDescriptorProto) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -6119,7 +6195,7 @@ failure: if (cached_has_bits & 0x00000008u) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 4, _Internal::options(this), target, stream); } @@ -6262,8 +6338,8 @@ void MethodDescriptorProto::CopyFrom(const MethodDescriptorProto& from) { } bool MethodDescriptorProto::IsInitialized() const { - if (has_options()) { - if (!this->options_->IsInitialized()) return false; + if (_internal_has_options()) { + if (!options_->IsInitialized()) return false; } return true; } @@ -6556,14 +6632,22 @@ const char* FileOptions::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID // optional string java_package = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_java_package(), ptr, ctx, "google.protobuf.FileOptions.java_package"); + auto str = _internal_mutable_java_package(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileOptions.java_package"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string java_outer_classname = 8; case 8: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 66)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_java_outer_classname(), ptr, ctx, "google.protobuf.FileOptions.java_outer_classname"); + auto str = _internal_mutable_java_outer_classname(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileOptions.java_outer_classname"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -6590,7 +6674,11 @@ const char* FileOptions::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID // optional string go_package = 11; case 11: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 90)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_go_package(), ptr, ctx, "google.protobuf.FileOptions.go_package"); + auto str = _internal_mutable_go_package(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileOptions.go_package"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -6653,35 +6741,55 @@ const char* FileOptions::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID // optional string objc_class_prefix = 36; case 36: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 34)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_objc_class_prefix(), ptr, ctx, "google.protobuf.FileOptions.objc_class_prefix"); + auto str = _internal_mutable_objc_class_prefix(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileOptions.objc_class_prefix"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string csharp_namespace = 37; case 37: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 42)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_csharp_namespace(), ptr, ctx, "google.protobuf.FileOptions.csharp_namespace"); + auto str = _internal_mutable_csharp_namespace(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileOptions.csharp_namespace"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string swift_prefix = 39; case 39: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 58)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_swift_prefix(), ptr, ctx, "google.protobuf.FileOptions.swift_prefix"); + auto str = _internal_mutable_swift_prefix(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileOptions.swift_prefix"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string php_class_prefix = 40; case 40: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 66)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_php_class_prefix(), ptr, ctx, "google.protobuf.FileOptions.php_class_prefix"); + auto str = _internal_mutable_php_class_prefix(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileOptions.php_class_prefix"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string php_namespace = 41; case 41: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 74)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_php_namespace(), ptr, ctx, "google.protobuf.FileOptions.php_namespace"); + auto str = _internal_mutable_php_namespace(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileOptions.php_namespace"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -6696,14 +6804,22 @@ const char* FileOptions::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID // optional string php_metadata_namespace = 44; case 44: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 98)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_php_metadata_namespace(), ptr, ctx, "google.protobuf.FileOptions.php_metadata_namespace"); + auto str = _internal_mutable_php_metadata_namespace(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileOptions.php_metadata_namespace"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string ruby_package = 45; case 45: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 106)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_ruby_package(), ptr, ctx, "google.protobuf.FileOptions.ruby_package"); + auto str = _internal_mutable_ruby_package(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FileOptions.ruby_package"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -6746,7 +6862,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* FileOptions::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* FileOptions::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileOptions) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -6919,11 +7035,11 @@ failure: n = static_cast(this->_internal_uninterpreted_option_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(999, this->_internal_uninterpreted_option(i), target, stream); + InternalWriteMessage(999, this->_internal_uninterpreted_option(i), target, stream); } // Extension range [1000, 536870912) - target = _extensions_.InternalSerializeWithCachedSizesToArray( + target = _extensions_._InternalSerialize( 1000, 536870912, target, stream); if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { @@ -7202,7 +7318,7 @@ bool FileOptions::IsInitialized() const { return false; } - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->uninterpreted_option())) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(uninterpreted_option_)) return false; return true; } @@ -7423,7 +7539,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* MessageOptions::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* MessageOptions::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MessageOptions) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -7459,11 +7575,11 @@ failure: n = static_cast(this->_internal_uninterpreted_option_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(999, this->_internal_uninterpreted_option(i), target, stream); + InternalWriteMessage(999, this->_internal_uninterpreted_option(i), target, stream); } // Extension range [1000, 536870912) - target = _extensions_.InternalSerializeWithCachedSizesToArray( + target = _extensions_._InternalSerialize( 1000, 536870912, target, stream); if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { @@ -7584,7 +7700,7 @@ bool MessageOptions::IsInitialized() const { return false; } - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->uninterpreted_option())) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(uninterpreted_option_)) return false; return true; } @@ -7812,7 +7928,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* FieldOptions::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* FieldOptions::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldOptions) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -7862,11 +7978,11 @@ failure: n = static_cast(this->_internal_uninterpreted_option_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(999, this->_internal_uninterpreted_option(i), target, stream); + InternalWriteMessage(999, this->_internal_uninterpreted_option(i), target, stream); } // Extension range [1000, 536870912) - target = _extensions_.InternalSerializeWithCachedSizesToArray( + target = _extensions_._InternalSerialize( 1000, 536870912, target, stream); if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { @@ -8005,7 +8121,7 @@ bool FieldOptions::IsInitialized() const { return false; } - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->uninterpreted_option())) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(uninterpreted_option_)) return false; return true; } @@ -8147,7 +8263,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* OneofOptions::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* OneofOptions::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.OneofOptions) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -8158,11 +8274,11 @@ failure: n = static_cast(this->_internal_uninterpreted_option_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(999, this->_internal_uninterpreted_option(i), target, stream); + InternalWriteMessage(999, this->_internal_uninterpreted_option(i), target, stream); } // Extension range [1000, 536870912) - target = _extensions_.InternalSerializeWithCachedSizesToArray( + target = _extensions_._InternalSerialize( 1000, 536870912, target, stream); if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { @@ -8244,7 +8360,7 @@ bool OneofOptions::IsInitialized() const { return false; } - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->uninterpreted_option())) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(uninterpreted_option_)) return false; return true; } @@ -8413,7 +8529,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* EnumOptions::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* EnumOptions::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumOptions) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -8437,11 +8553,11 @@ failure: n = static_cast(this->_internal_uninterpreted_option_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(999, this->_internal_uninterpreted_option(i), target, stream); + InternalWriteMessage(999, this->_internal_uninterpreted_option(i), target, stream); } // Extension range [1000, 536870912) - target = _extensions_.InternalSerializeWithCachedSizesToArray( + target = _extensions_._InternalSerialize( 1000, 536870912, target, stream); if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { @@ -8546,7 +8662,7 @@ bool EnumOptions::IsInitialized() const { return false; } - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->uninterpreted_option())) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(uninterpreted_option_)) return false; return true; } @@ -8700,7 +8816,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* EnumValueOptions::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* EnumValueOptions::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumValueOptions) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -8718,11 +8834,11 @@ failure: n = static_cast(this->_internal_uninterpreted_option_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(999, this->_internal_uninterpreted_option(i), target, stream); + InternalWriteMessage(999, this->_internal_uninterpreted_option(i), target, stream); } // Extension range [1000, 536870912) - target = _extensions_.InternalSerializeWithCachedSizesToArray( + target = _extensions_._InternalSerialize( 1000, 536870912, target, stream); if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { @@ -8813,7 +8929,7 @@ bool EnumValueOptions::IsInitialized() const { return false; } - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->uninterpreted_option())) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(uninterpreted_option_)) return false; return true; } @@ -8966,7 +9082,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* ServiceOptions::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* ServiceOptions::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ServiceOptions) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -8984,11 +9100,11 @@ failure: n = static_cast(this->_internal_uninterpreted_option_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(999, this->_internal_uninterpreted_option(i), target, stream); + InternalWriteMessage(999, this->_internal_uninterpreted_option(i), target, stream); } // Extension range [1000, 536870912) - target = _extensions_.InternalSerializeWithCachedSizesToArray( + target = _extensions_._InternalSerialize( 1000, 536870912, target, stream); if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { @@ -9079,7 +9195,7 @@ bool ServiceOptions::IsInitialized() const { return false; } - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->uninterpreted_option())) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(uninterpreted_option_)) return false; return true; } @@ -9256,7 +9372,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* MethodOptions::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* MethodOptions::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MethodOptions) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -9281,11 +9397,11 @@ failure: n = static_cast(this->_internal_uninterpreted_option_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(999, this->_internal_uninterpreted_option(i), target, stream); + InternalWriteMessage(999, this->_internal_uninterpreted_option(i), target, stream); } // Extension range [1000, 536870912) - target = _extensions_.InternalSerializeWithCachedSizesToArray( + target = _extensions_._InternalSerialize( 1000, 536870912, target, stream); if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { @@ -9391,7 +9507,7 @@ bool MethodOptions::IsInitialized() const { return false; } - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->uninterpreted_option())) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(uninterpreted_option_)) return false; return true; } @@ -9509,7 +9625,11 @@ const char* UninterpretedOption_NamePart::_InternalParse(const char* ptr, ::PROT // required string name_part = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_name_part(), ptr, ctx, "google.protobuf.UninterpretedOption.NamePart.name_part"); + auto str = _internal_mutable_name_part(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.UninterpretedOption.NamePart.name_part"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -9542,7 +9662,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* UninterpretedOption_NamePart::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* UninterpretedOption_NamePart::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UninterpretedOption.NamePart) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -9577,14 +9697,14 @@ size_t UninterpretedOption_NamePart::RequiredFieldsByteSizeFallback() const { // @@protoc_insertion_point(required_fields_byte_size_fallback_start:google.protobuf.UninterpretedOption.NamePart) size_t total_size = 0; - if (has_name_part()) { + if (_internal_has_name_part()) { // required string name_part = 1; total_size += 1 + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( this->_internal_name_part()); } - if (has_is_extension()) { + if (_internal_has_is_extension()) { // required bool is_extension = 2; total_size += 1 + 1; } @@ -9843,7 +9963,11 @@ const char* UninterpretedOption::_InternalParse(const char* ptr, ::PROTOBUF_NAME // optional string identifier_value = 3; case 3: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 26)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_identifier_value(), ptr, ctx, "google.protobuf.UninterpretedOption.identifier_value"); + auto str = _internal_mutable_identifier_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.UninterpretedOption.identifier_value"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -9874,14 +9998,19 @@ const char* UninterpretedOption::_InternalParse(const char* ptr, ::PROTOBUF_NAME // optional bytes string_value = 7; case 7: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 58)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(_internal_mutable_string_value(), ptr, ctx); + auto str = _internal_mutable_string_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); CHK_(ptr); } else goto handle_unusual; continue; // optional string aggregate_value = 8; case 8: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 66)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_aggregate_value(), ptr, ctx, "google.protobuf.UninterpretedOption.aggregate_value"); + auto str = _internal_mutable_aggregate_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.UninterpretedOption.aggregate_value"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -9906,7 +10035,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* UninterpretedOption::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* UninterpretedOption::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UninterpretedOption) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -9917,7 +10046,7 @@ failure: n = static_cast(this->_internal_name_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(2, this->_internal_name(i), target, stream); + InternalWriteMessage(2, this->_internal_name(i), target, stream); } cached_has_bits = _has_bits_[0]; @@ -10102,7 +10231,7 @@ void UninterpretedOption::CopyFrom(const UninterpretedOption& from) { } bool UninterpretedOption::IsInitialized() const { - if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(this->name())) return false; + if (!::PROTOBUF_NAMESPACE_ID::internal::AllAreInitialized(name_)) return false; return true; } @@ -10264,14 +10393,22 @@ const char* SourceCodeInfo_Location::_InternalParse(const char* ptr, ::PROTOBUF_ // optional string leading_comments = 3; case 3: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 26)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_leading_comments(), ptr, ctx, "google.protobuf.SourceCodeInfo.Location.leading_comments"); + auto str = _internal_mutable_leading_comments(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.SourceCodeInfo.Location.leading_comments"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; // optional string trailing_comments = 4; case 4: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 34)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_trailing_comments(), ptr, ctx, "google.protobuf.SourceCodeInfo.Location.trailing_comments"); + auto str = _internal_mutable_trailing_comments(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.SourceCodeInfo.Location.trailing_comments"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -10281,7 +10418,11 @@ const char* SourceCodeInfo_Location::_InternalParse(const char* ptr, ::PROTOBUF_ ptr -= 1; do { ptr += 1; - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_add_leading_detached_comments(), ptr, ctx, "google.protobuf.SourceCodeInfo.Location.leading_detached_comments"); + auto str = _internal_add_leading_detached_comments(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.SourceCodeInfo.Location.leading_detached_comments"); + #endif // !NDEBUG CHK_(ptr); if (!ctx->DataAvailable(ptr)) break; } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<50>(ptr)); @@ -10308,7 +10449,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* SourceCodeInfo_Location::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* SourceCodeInfo_Location::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.SourceCodeInfo.Location) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -10625,7 +10766,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* SourceCodeInfo::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* SourceCodeInfo::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.SourceCodeInfo) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -10636,7 +10777,7 @@ failure: n = static_cast(this->_internal_location_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(1, this->_internal_location(i), target, stream); + InternalWriteMessage(1, this->_internal_location(i), target, stream); } if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { @@ -10849,7 +10990,11 @@ const char* GeneratedCodeInfo_Annotation::_InternalParse(const char* ptr, ::PROT // optional string source_file = 2; case 2: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(_internal_mutable_source_file(), ptr, ctx, "google.protobuf.GeneratedCodeInfo.Annotation.source_file"); + auto str = _internal_mutable_source_file(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + #ifndef NDEBUG + ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.GeneratedCodeInfo.Annotation.source_file"); + #endif // !NDEBUG CHK_(ptr); } else goto handle_unusual; continue; @@ -10890,7 +11035,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* GeneratedCodeInfo_Annotation::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* GeneratedCodeInfo_Annotation::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.GeneratedCodeInfo.Annotation) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -11174,7 +11319,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* GeneratedCodeInfo::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* GeneratedCodeInfo::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.GeneratedCodeInfo) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -11185,7 +11330,7 @@ failure: n = static_cast(this->_internal_annotation_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(1, this->_internal_annotation(i), target, stream); + InternalWriteMessage(1, this->_internal_annotation(i), target, stream); } if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { diff --git a/src/google/protobuf/descriptor.pb.h b/src/google/protobuf/descriptor.pb.h index 6941e2e190..20912ff70d 100644 --- a/src/google/protobuf/descriptor.pb.h +++ b/src/google/protobuf/descriptor.pb.h @@ -422,7 +422,7 @@ class PROTOBUF_EXPORT FileDescriptorSet : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -590,7 +590,7 @@ class PROTOBUF_EXPORT FileDescriptorProto : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -1025,7 +1025,7 @@ class PROTOBUF_EXPORT DescriptorProto_ExtensionRange : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -1223,7 +1223,7 @@ class PROTOBUF_EXPORT DescriptorProto_ReservedRange : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -1401,7 +1401,7 @@ class PROTOBUF_EXPORT DescriptorProto : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -1769,7 +1769,7 @@ class PROTOBUF_EXPORT ExtensionRangeOptions : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -1940,7 +1940,7 @@ class PROTOBUF_EXPORT FieldDescriptorProto : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -2417,7 +2417,7 @@ class PROTOBUF_EXPORT OneofDescriptorProto : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -2616,7 +2616,7 @@ class PROTOBUF_EXPORT EnumDescriptorProto_EnumReservedRange : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -2794,7 +2794,7 @@ class PROTOBUF_EXPORT EnumDescriptorProto : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -3061,7 +3061,7 @@ class PROTOBUF_EXPORT EnumValueDescriptorProto : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -3275,7 +3275,7 @@ class PROTOBUF_EXPORT ServiceDescriptorProto : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -3494,7 +3494,7 @@ class PROTOBUF_EXPORT MethodDescriptorProto : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -3785,7 +3785,7 @@ class PROTOBUF_EXPORT FileOptions : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -4448,7 +4448,7 @@ class PROTOBUF_EXPORT MessageOptions : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -4679,7 +4679,7 @@ class PROTOBUF_EXPORT FieldOptions : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -5004,7 +5004,7 @@ class PROTOBUF_EXPORT OneofOptions : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -5175,7 +5175,7 @@ class PROTOBUF_EXPORT EnumOptions : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -5376,7 +5376,7 @@ class PROTOBUF_EXPORT EnumValueOptions : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -5562,7 +5562,7 @@ class PROTOBUF_EXPORT ServiceOptions : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -5748,7 +5748,7 @@ class PROTOBUF_EXPORT MethodOptions : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -5981,7 +5981,7 @@ class PROTOBUF_EXPORT UninterpretedOption_NamePart : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -6178,7 +6178,7 @@ class PROTOBUF_EXPORT UninterpretedOption : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -6486,7 +6486,7 @@ class PROTOBUF_EXPORT SourceCodeInfo_Location : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -6772,7 +6772,7 @@ class PROTOBUF_EXPORT SourceCodeInfo : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -6942,7 +6942,7 @@ class PROTOBUF_EXPORT GeneratedCodeInfo_Annotation : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -7176,7 +7176,7 @@ class PROTOBUF_EXPORT GeneratedCodeInfo : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -7363,7 +7363,7 @@ inline std::string* FileDescriptorProto::_internal_mutable_name() { } inline std::string* FileDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.name) - if (!has_name()) { + if (!_internal_has_name()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -7456,7 +7456,7 @@ inline std::string* FileDescriptorProto::_internal_mutable_package() { } inline std::string* FileDescriptorProto::release_package() { // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.package) - if (!has_package()) { + if (!_internal_has_package()) { return nullptr; } _has_bits_[0] &= ~0x00000002u; @@ -8009,7 +8009,7 @@ inline std::string* FileDescriptorProto::_internal_mutable_syntax() { } inline std::string* FileDescriptorProto::release_syntax() { // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.syntax) - if (!has_syntax()) { + if (!_internal_has_syntax()) { return nullptr; } _has_bits_[0] &= ~0x00000004u; @@ -8294,7 +8294,7 @@ inline std::string* DescriptorProto::_internal_mutable_name() { } inline std::string* DescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.DescriptorProto.name) - if (!has_name()) { + if (!_internal_has_name()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -8849,7 +8849,7 @@ inline std::string* FieldDescriptorProto::_internal_mutable_name() { } inline std::string* FieldDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.name) - if (!has_name()) { + if (!_internal_has_name()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -9028,7 +9028,7 @@ inline std::string* FieldDescriptorProto::_internal_mutable_type_name() { } inline std::string* FieldDescriptorProto::release_type_name() { // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.type_name) - if (!has_type_name()) { + if (!_internal_has_type_name()) { return nullptr; } _has_bits_[0] &= ~0x00000004u; @@ -9121,7 +9121,7 @@ inline std::string* FieldDescriptorProto::_internal_mutable_extendee() { } inline std::string* FieldDescriptorProto::release_extendee() { // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.extendee) - if (!has_extendee()) { + if (!_internal_has_extendee()) { return nullptr; } _has_bits_[0] &= ~0x00000002u; @@ -9214,7 +9214,7 @@ inline std::string* FieldDescriptorProto::_internal_mutable_default_value() { } inline std::string* FieldDescriptorProto::release_default_value() { // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.default_value) - if (!has_default_value()) { + if (!_internal_has_default_value()) { return nullptr; } _has_bits_[0] &= ~0x00000008u; @@ -9335,7 +9335,7 @@ inline std::string* FieldDescriptorProto::_internal_mutable_json_name() { } inline std::string* FieldDescriptorProto::release_json_name() { // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.json_name) - if (!has_json_name()) { + if (!_internal_has_json_name()) { return nullptr; } _has_bits_[0] &= ~0x00000010u; @@ -9500,7 +9500,7 @@ inline std::string* OneofDescriptorProto::_internal_mutable_name() { } inline std::string* OneofDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.OneofDescriptorProto.name) - if (!has_name()) { + if (!_internal_has_name()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -9725,7 +9725,7 @@ inline std::string* EnumDescriptorProto::_internal_mutable_name() { } inline std::string* EnumDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.EnumDescriptorProto.name) - if (!has_name()) { + if (!_internal_has_name()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -10042,7 +10042,7 @@ inline std::string* EnumValueDescriptorProto::_internal_mutable_name() { } inline std::string* EnumValueDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.EnumValueDescriptorProto.name) - if (!has_name()) { + if (!_internal_has_name()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -10235,7 +10235,7 @@ inline std::string* ServiceDescriptorProto::_internal_mutable_name() { } inline std::string* ServiceDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.ServiceDescriptorProto.name) - if (!has_name()) { + if (!_internal_has_name()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -10439,7 +10439,7 @@ inline std::string* MethodDescriptorProto::_internal_mutable_name() { } inline std::string* MethodDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.name) - if (!has_name()) { + if (!_internal_has_name()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -10532,7 +10532,7 @@ inline std::string* MethodDescriptorProto::_internal_mutable_input_type() { } inline std::string* MethodDescriptorProto::release_input_type() { // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.input_type) - if (!has_input_type()) { + if (!_internal_has_input_type()) { return nullptr; } _has_bits_[0] &= ~0x00000002u; @@ -10625,7 +10625,7 @@ inline std::string* MethodDescriptorProto::_internal_mutable_output_type() { } inline std::string* MethodDescriptorProto::release_output_type() { // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.output_type) - if (!has_output_type()) { + if (!_internal_has_output_type()) { return nullptr; } _has_bits_[0] &= ~0x00000004u; @@ -10846,7 +10846,7 @@ inline std::string* FileOptions::_internal_mutable_java_package() { } inline std::string* FileOptions::release_java_package() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.java_package) - if (!has_java_package()) { + if (!_internal_has_java_package()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -10939,7 +10939,7 @@ inline std::string* FileOptions::_internal_mutable_java_outer_classname() { } inline std::string* FileOptions::release_java_outer_classname() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.java_outer_classname) - if (!has_java_outer_classname()) { + if (!_internal_has_java_outer_classname()) { return nullptr; } _has_bits_[0] &= ~0x00000002u; @@ -11145,7 +11145,7 @@ inline std::string* FileOptions::_internal_mutable_go_package() { } inline std::string* FileOptions::release_go_package() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.go_package) - if (!has_go_package()) { + if (!_internal_has_go_package()) { return nullptr; } _has_bits_[0] &= ~0x00000004u; @@ -11406,7 +11406,7 @@ inline std::string* FileOptions::_internal_mutable_objc_class_prefix() { } inline std::string* FileOptions::release_objc_class_prefix() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.objc_class_prefix) - if (!has_objc_class_prefix()) { + if (!_internal_has_objc_class_prefix()) { return nullptr; } _has_bits_[0] &= ~0x00000008u; @@ -11499,7 +11499,7 @@ inline std::string* FileOptions::_internal_mutable_csharp_namespace() { } inline std::string* FileOptions::release_csharp_namespace() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.csharp_namespace) - if (!has_csharp_namespace()) { + if (!_internal_has_csharp_namespace()) { return nullptr; } _has_bits_[0] &= ~0x00000010u; @@ -11592,7 +11592,7 @@ inline std::string* FileOptions::_internal_mutable_swift_prefix() { } inline std::string* FileOptions::release_swift_prefix() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.swift_prefix) - if (!has_swift_prefix()) { + if (!_internal_has_swift_prefix()) { return nullptr; } _has_bits_[0] &= ~0x00000020u; @@ -11685,7 +11685,7 @@ inline std::string* FileOptions::_internal_mutable_php_class_prefix() { } inline std::string* FileOptions::release_php_class_prefix() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.php_class_prefix) - if (!has_php_class_prefix()) { + if (!_internal_has_php_class_prefix()) { return nullptr; } _has_bits_[0] &= ~0x00000040u; @@ -11778,7 +11778,7 @@ inline std::string* FileOptions::_internal_mutable_php_namespace() { } inline std::string* FileOptions::release_php_namespace() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.php_namespace) - if (!has_php_namespace()) { + if (!_internal_has_php_namespace()) { return nullptr; } _has_bits_[0] &= ~0x00000080u; @@ -11871,7 +11871,7 @@ inline std::string* FileOptions::_internal_mutable_php_metadata_namespace() { } inline std::string* FileOptions::release_php_metadata_namespace() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.php_metadata_namespace) - if (!has_php_metadata_namespace()) { + if (!_internal_has_php_metadata_namespace()) { return nullptr; } _has_bits_[0] &= ~0x00000100u; @@ -11964,7 +11964,7 @@ inline std::string* FileOptions::_internal_mutable_ruby_package() { } inline std::string* FileOptions::release_ruby_package() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.ruby_package) - if (!has_ruby_package()) { + if (!_internal_has_ruby_package()) { return nullptr; } _has_bits_[0] &= ~0x00000200u; @@ -12852,7 +12852,7 @@ inline std::string* UninterpretedOption_NamePart::_internal_mutable_name_part() } inline std::string* UninterpretedOption_NamePart::release_name_part() { // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.NamePart.name_part) - if (!has_name_part()) { + if (!_internal_has_name_part()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -13016,7 +13016,7 @@ inline std::string* UninterpretedOption::_internal_mutable_identifier_value() { } inline std::string* UninterpretedOption::release_identifier_value() { // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.identifier_value) - if (!has_identifier_value()) { + if (!_internal_has_identifier_value()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -13193,7 +13193,7 @@ inline std::string* UninterpretedOption::_internal_mutable_string_value() { } inline std::string* UninterpretedOption::release_string_value() { // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.string_value) - if (!has_string_value()) { + if (!_internal_has_string_value()) { return nullptr; } _has_bits_[0] &= ~0x00000002u; @@ -13286,7 +13286,7 @@ inline std::string* UninterpretedOption::_internal_mutable_aggregate_value() { } inline std::string* UninterpretedOption::release_aggregate_value() { // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.aggregate_value) - if (!has_aggregate_value()) { + if (!_internal_has_aggregate_value()) { return nullptr; } _has_bits_[0] &= ~0x00000004u; @@ -13477,7 +13477,7 @@ inline std::string* SourceCodeInfo_Location::_internal_mutable_leading_comments( } inline std::string* SourceCodeInfo_Location::release_leading_comments() { // @@protoc_insertion_point(field_release:google.protobuf.SourceCodeInfo.Location.leading_comments) - if (!has_leading_comments()) { + if (!_internal_has_leading_comments()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; @@ -13570,7 +13570,7 @@ inline std::string* SourceCodeInfo_Location::_internal_mutable_trailing_comments } inline std::string* SourceCodeInfo_Location::release_trailing_comments() { // @@protoc_insertion_point(field_release:google.protobuf.SourceCodeInfo.Location.trailing_comments) - if (!has_trailing_comments()) { + if (!_internal_has_trailing_comments()) { return nullptr; } _has_bits_[0] &= ~0x00000002u; @@ -13831,7 +13831,7 @@ inline std::string* GeneratedCodeInfo_Annotation::_internal_mutable_source_file( } inline std::string* GeneratedCodeInfo_Annotation::release_source_file() { // @@protoc_insertion_point(field_release:google.protobuf.GeneratedCodeInfo.Annotation.source_file) - if (!has_source_file()) { + if (!_internal_has_source_file()) { return nullptr; } _has_bits_[0] &= ~0x00000001u; diff --git a/src/google/protobuf/descriptor_unittest.cc b/src/google/protobuf/descriptor_unittest.cc index a2926e94b4..898c1da195 100644 --- a/src/google/protobuf/descriptor_unittest.cc +++ b/src/google/protobuf/descriptor_unittest.cc @@ -1902,7 +1902,7 @@ TEST_F(ExtensionDescriptorTest, ExtensionRanges) { EXPECT_EQ(20, foo_->extension_range(0)->end); EXPECT_EQ(40, foo_->extension_range(1)->end); -}; +} TEST_F(ExtensionDescriptorTest, Extensions) { EXPECT_EQ(0, foo_->extension_count()); @@ -1947,7 +1947,7 @@ TEST_F(ExtensionDescriptorTest, Extensions) { EXPECT_TRUE(foo_file_->extension(1)->extension_scope() == nullptr); EXPECT_EQ(bar_, bar_->extension(0)->extension_scope()); EXPECT_EQ(bar_, bar_->extension(1)->extension_scope()); -}; +} TEST_F(ExtensionDescriptorTest, IsExtensionNumber) { EXPECT_FALSE(foo_->IsExtensionNumber(9)); @@ -2095,7 +2095,7 @@ TEST_F(ReservedDescriptorTest, ReservedRanges) { EXPECT_EQ(15, foo_->reserved_range(2)->start); EXPECT_EQ(16, foo_->reserved_range(2)->end); -}; +} TEST_F(ReservedDescriptorTest, IsReservedNumber) { EXPECT_FALSE(foo_->IsReservedNumber(1)); @@ -2110,20 +2110,20 @@ TEST_F(ReservedDescriptorTest, IsReservedNumber) { EXPECT_FALSE(foo_->IsReservedNumber(14)); EXPECT_TRUE(foo_->IsReservedNumber(15)); EXPECT_FALSE(foo_->IsReservedNumber(16)); -}; +} TEST_F(ReservedDescriptorTest, ReservedNames) { ASSERT_EQ(2, foo_->reserved_name_count()); EXPECT_EQ("foo", foo_->reserved_name(0)); EXPECT_EQ("bar", foo_->reserved_name(1)); -}; +} TEST_F(ReservedDescriptorTest, IsReservedName) { EXPECT_TRUE(foo_->IsReservedName("foo")); EXPECT_TRUE(foo_->IsReservedName("bar")); EXPECT_FALSE(foo_->IsReservedName("baz")); -}; +} // =================================================================== diff --git a/src/google/protobuf/duration.pb.cc b/src/google/protobuf/duration.pb.cc index 4d13304a39..56775065e5 100644 --- a/src/google/protobuf/duration.pb.cc +++ b/src/google/protobuf/duration.pb.cc @@ -195,7 +195,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Duration::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Duration::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Duration) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; diff --git a/src/google/protobuf/duration.pb.h b/src/google/protobuf/duration.pb.h index 456d69f410..804361d37d 100644 --- a/src/google/protobuf/duration.pb.h +++ b/src/google/protobuf/duration.pb.h @@ -151,7 +151,7 @@ class PROTOBUF_EXPORT Duration : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } diff --git a/src/google/protobuf/dynamic_message.h b/src/google/protobuf/dynamic_message.h index a0de9f3fbd..9bd609f898 100644 --- a/src/google/protobuf/dynamic_message.h +++ b/src/google/protobuf/dynamic_message.h @@ -44,7 +44,6 @@ #include #include -#include #include #include #include diff --git a/src/google/protobuf/empty.pb.cc b/src/google/protobuf/empty.pb.cc index 2beb8b72b8..5fb1993934 100644 --- a/src/google/protobuf/empty.pb.cc +++ b/src/google/protobuf/empty.pb.cc @@ -148,8 +148,6 @@ const char* Empty::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::inte ::PROTOBUF_NAMESPACE_ID::uint32 tag; ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); CHK_(ptr); - switch (tag >> 3) { - default: { if ((tag & 7) == 4 || tag == 0) { ctx->SetLastTag(tag); goto success; @@ -157,8 +155,6 @@ const char* Empty::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::inte ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); CHK_(ptr != nullptr); continue; - } - } // switch } // while success: return ptr; @@ -168,7 +164,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Empty::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Empty::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Empty) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; diff --git a/src/google/protobuf/empty.pb.h b/src/google/protobuf/empty.pb.h index 6f0ff98c62..71d3d2029f 100644 --- a/src/google/protobuf/empty.pb.h +++ b/src/google/protobuf/empty.pb.h @@ -151,7 +151,7 @@ class PROTOBUF_EXPORT Empty : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } diff --git a/src/google/protobuf/extension_set.cc b/src/google/protobuf/extension_set.cc index 6d404fce30..b4eb6e186c 100644 --- a/src/google/protobuf/extension_set.cc +++ b/src/google/protobuf/extension_set.cc @@ -1462,9 +1462,9 @@ bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, return ParseMessageSetLite(input, &finder, &skipper); } -uint8* ExtensionSet::InternalSerializeWithCachedSizesToArray( - int start_field_number, int end_field_number, uint8* target, - io::EpsCopyOutputStream* stream) const { +uint8* ExtensionSet::_InternalSerialize(int start_field_number, + int end_field_number, uint8* target, + io::EpsCopyOutputStream* stream) const { if (PROTOBUF_PREDICT_FALSE(is_large())) { const auto& end = map_.large->end(); for (auto it = map_.large->lower_bound(start_field_number); @@ -2010,7 +2010,7 @@ uint8* ExtensionSet::Extension::InternalSerializeFieldWithCachedSizesToArray( case WireFormatLite::TYPE_##UPPERCASE: \ for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ target = stream->EnsureSpace(target); \ - target = WireFormatLite::InternalWrite##CAMELCASE##ToArray( \ + target = WireFormatLite::InternalWrite##CAMELCASE( \ number, repeated_##LOWERCASE##_value->Get(i), target, stream); \ } \ break @@ -2053,8 +2053,8 @@ uint8* ExtensionSet::Extension::InternalSerializeFieldWithCachedSizesToArray( #undef HANDLE_TYPE case WireFormatLite::TYPE_GROUP: target = stream->EnsureSpace(target); - target = WireFormatLite::InternalWriteGroupToArray( - number, *message_value, target, stream); + target = WireFormatLite::InternalWriteGroup(number, *message_value, + target, stream); break; case WireFormatLite::TYPE_MESSAGE: if (is_lazy) { @@ -2062,8 +2062,8 @@ uint8* ExtensionSet::Extension::InternalSerializeFieldWithCachedSizesToArray( lazymessage_value->WriteMessageToArray(number, target, stream); } else { target = stream->EnsureSpace(target); - target = WireFormatLite::InternalWriteMessageToArray( - number, *message_value, target, stream); + target = WireFormatLite::InternalWriteMessage(number, *message_value, + target, stream); } break; } @@ -2094,7 +2094,7 @@ ExtensionSet::Extension::InternalSerializeMessageSetItemWithCachedSizesToArray( target = lazymessage_value->WriteMessageToArray( WireFormatLite::kMessageSetMessageNumber, target, stream); } else { - target = WireFormatLite::InternalWriteMessageToArray( + target = WireFormatLite::InternalWriteMessage( WireFormatLite::kMessageSetMessageNumber, *message_value, target, stream); } diff --git a/src/google/protobuf/extension_set.h b/src/google/protobuf/extension_set.h index b704147183..222f6dbcfa 100644 --- a/src/google/protobuf/extension_set.h +++ b/src/google/protobuf/extension_set.h @@ -458,9 +458,8 @@ class PROTOBUF_EXPORT ExtensionSet { // last called. Note that the range bounds are inclusive-exclusive. void SerializeWithCachedSizes(int start_field_number, int end_field_number, io::CodedOutputStream* output) const { - output->SetCur(InternalSerializeWithCachedSizesToArray( - start_field_number, end_field_number, output->Cur(), - output->EpsCopy())); + output->SetCur(_InternalSerialize(start_field_number, end_field_number, + output->Cur(), output->EpsCopy())); } // Same as SerializeWithCachedSizes, but without any bounds checking. @@ -468,9 +467,9 @@ class PROTOBUF_EXPORT ExtensionSet { // serialized extensions. // // Returns a pointer past the last written byte. - uint8* InternalSerializeWithCachedSizesToArray( - int start_field_number, int end_field_number, uint8* target, - io::EpsCopyOutputStream* stream) const; + uint8* _InternalSerialize(int start_field_number, int end_field_number, + uint8* target, + io::EpsCopyOutputStream* stream) const; // Like above but serializes in MessageSet format. void SerializeMessageSetWithCachedSizes(io::CodedOutputStream* output) const { diff --git a/src/google/protobuf/field_mask.pb.cc b/src/google/protobuf/field_mask.pb.cc index 81c9ec4607..78c343f1b4 100644 --- a/src/google/protobuf/field_mask.pb.cc +++ b/src/google/protobuf/field_mask.pb.cc @@ -161,7 +161,9 @@ const char* FieldMask::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID:: ptr -= 1; do { ptr += 1; - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_add_paths(), ptr, ctx, "google.protobuf.FieldMask.paths"); + auto str = _internal_add_paths(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.FieldMask.paths")); CHK_(ptr); if (!ctx->DataAvailable(ptr)) break; } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr)); @@ -187,7 +189,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* FieldMask::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* FieldMask::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldMask) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; diff --git a/src/google/protobuf/field_mask.pb.h b/src/google/protobuf/field_mask.pb.h index d38333b35d..cce1e1b80c 100644 --- a/src/google/protobuf/field_mask.pb.h +++ b/src/google/protobuf/field_mask.pb.h @@ -151,7 +151,7 @@ class PROTOBUF_EXPORT FieldMask : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } diff --git a/src/google/protobuf/field_mask.proto b/src/google/protobuf/field_mask.proto index 4015b1a3ea..baac8744cb 100644 --- a/src/google/protobuf/field_mask.proto +++ b/src/google/protobuf/field_mask.proto @@ -238,7 +238,7 @@ option cc_enable_arenas = true; // // The implementation of any API method which has a FieldMask type field in the // request should verify the included field paths, and return an -// `INVALID_ARGUMENT` error if any path is duplicated or unmappable. +// `INVALID_ARGUMENT` error if any path is unmappable. message FieldMask { // The set of field mask paths. repeated string paths = 1; diff --git a/src/google/protobuf/generated_message_reflection.cc b/src/google/protobuf/generated_message_reflection.cc index b169bf1f2e..9641ebdf1a 100644 --- a/src/google/protobuf/generated_message_reflection.cc +++ b/src/google/protobuf/generated_message_reflection.cc @@ -2079,19 +2079,19 @@ void Reflection::ClearOneof(Message* message, } } -#define HANDLE_TYPE(TYPE, CPPTYPE, CTYPE) \ - template <> \ - const RepeatedField& Reflection::GetRepeatedField( \ - const Message& message, const FieldDescriptor* field) const { \ - return *static_cast*>(MutableRawRepeatedField( \ - const_cast(&message), field, CPPTYPE, CTYPE, NULL)); \ - } \ - \ - template <> \ - RepeatedField* Reflection::MutableRepeatedField( \ - Message * message, const FieldDescriptor* field) const { \ - return static_cast*>( \ - MutableRawRepeatedField(message, field, CPPTYPE, CTYPE, NULL)); \ +#define HANDLE_TYPE(TYPE, CPPTYPE, CTYPE) \ + template <> \ + const RepeatedField& Reflection::GetRepeatedFieldInternal( \ + const Message& message, const FieldDescriptor* field) const { \ + return *static_cast*>(MutableRawRepeatedField( \ + const_cast(&message), field, CPPTYPE, CTYPE, NULL)); \ + } \ + \ + template <> \ + RepeatedField* Reflection::MutableRepeatedFieldInternal( \ + Message * message, const FieldDescriptor* field) const { \ + return static_cast*>( \ + MutableRawRepeatedField(message, field, CPPTYPE, CTYPE, NULL)); \ } HANDLE_TYPE(int32, FieldDescriptor::CPPTYPE_INT32, -1); diff --git a/src/google/protobuf/generated_message_util.h b/src/google/protobuf/generated_message_util.h index ecb8c0a67c..97546751fa 100644 --- a/src/google/protobuf/generated_message_util.h +++ b/src/google/protobuf/generated_message_util.h @@ -39,17 +39,20 @@ #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__ #include + #include #include #include #include #include +#include #include #include #include #include // Add direct dep on port for pb.cc #include +#include #include #include #include @@ -95,8 +98,8 @@ PROTOBUF_EXPORT inline const std::string& GetEmptyString() { // helper here to keep the protobuf compiler from ever having to emit loops in // IsInitialized() methods. We want the C++ compiler to inline this or not // as it sees fit. -template -bool AllAreInitialized(const Type& t) { +template +bool AllAreInitialized(const RepeatedPtrField& t) { for (int i = t.size(); --i >= 0;) { if (!t.Get(i).IsInitialized()) return false; } diff --git a/src/google/protobuf/implicit_weak_message.h b/src/google/protobuf/implicit_weak_message.h index e8f1959a25..a3348daacb 100644 --- a/src/google/protobuf/implicit_weak_message.h +++ b/src/google/protobuf/implicit_weak_message.h @@ -82,8 +82,8 @@ class PROTOBUF_EXPORT ImplicitWeakMessage : public MessageLite { size_t ByteSizeLong() const override { return data_.size(); } - uint8* InternalSerializeWithCachedSizesToArray( - uint8* target, io::EpsCopyOutputStream* stream) const final { + uint8* _InternalSerialize(uint8* target, + io::EpsCopyOutputStream* stream) const final { return stream->WriteRaw(data_.data(), static_cast(data_.size()), target); } diff --git a/src/google/protobuf/io/strtod.cc b/src/google/protobuf/io/strtod.cc index 01164441a6..03acb5b294 100644 --- a/src/google/protobuf/io/strtod.cc +++ b/src/google/protobuf/io/strtod.cc @@ -38,81 +38,16 @@ #include #include +#include + namespace google { namespace protobuf { namespace io { -// ---------------------------------------------------------------------- -// NoLocaleStrtod() -// This code will make you cry. -// ---------------------------------------------------------------------- - -namespace { - // This approximately 0x1.ffffffp127, but we don't use 0x1.ffffffp127 because // it won't compile in MSVC. const double MAX_FLOAT_AS_DOUBLE_ROUNDED = 3.4028235677973366e+38; -// Returns a string identical to *input except that the character pointed to -// by radix_pos (which should be '.') is replaced with the locale-specific -// radix character. -std::string LocalizeRadix(const char* input, const char* radix_pos) { - // Determine the locale-specific radix character by calling sprintf() to - // print the number 1.5, then stripping off the digits. As far as I can - // tell, this is the only portable, thread-safe way to get the C library - // to divuldge the locale's radix character. No, localeconv() is NOT - // thread-safe. - char temp[16]; - int size = sprintf(temp, "%.1f", 1.5); - GOOGLE_CHECK_EQ(temp[0], '1'); - GOOGLE_CHECK_EQ(temp[size - 1], '5'); - GOOGLE_CHECK_LE(size, 6); - - // Now replace the '.' in the input with it. - std::string result; - result.reserve(strlen(input) + size - 3); - result.append(input, radix_pos); - result.append(temp + 1, size - 2); - result.append(radix_pos + 1); - return result; -} - -} // namespace - -double NoLocaleStrtod(const char* text, char** original_endptr) { - // We cannot simply set the locale to "C" temporarily with setlocale() - // as this is not thread-safe. Instead, we try to parse in the current - // locale first. If parsing stops at a '.' character, then this is a - // pretty good hint that we're actually in some other locale in which - // '.' is not the radix character. - - char* temp_endptr; - double result = strtod(text, &temp_endptr); - if (original_endptr != NULL) *original_endptr = temp_endptr; - if (*temp_endptr != '.') return result; - - // Parsing halted on a '.'. Perhaps we're in a different locale? Let's - // try to replace the '.' with a locale-specific radix character and - // try again. - std::string localized = LocalizeRadix(text, temp_endptr); - const char* localized_cstr = localized.c_str(); - char* localized_endptr; - result = strtod(localized_cstr, &localized_endptr); - if ((localized_endptr - localized_cstr) > (temp_endptr - text)) { - // This attempt got further, so replacing the decimal must have helped. - // Update original_endptr to point at the right location. - if (original_endptr != NULL) { - // size_diff is non-zero if the localized radix has multiple bytes. - int size_diff = localized.size() - strlen(text); - // const_cast is necessary to match the strtod() interface. - *original_endptr = const_cast( - text + (localized_endptr - localized_cstr - size_diff)); - } - } - - return result; -} - float SafeDoubleToFloat(double value) { // static_cast on a number larger than float can result in illegal // instruction error, so we need to manually convert it to infinity or max. @@ -138,6 +73,10 @@ float SafeDoubleToFloat(double value) { } } +double NoLocaleStrtod(const char* str, char** endptr) { + return google::protobuf::internal::NoLocaleStrtod(str, endptr); +} + } // namespace io } // namespace protobuf } // namespace google diff --git a/src/google/protobuf/map_entry_lite.h b/src/google/protobuf/map_entry_lite.h index fbc57a4a9f..d35b98ce2d 100644 --- a/src/google/protobuf/map_entry_lite.h +++ b/src/google/protobuf/map_entry_lite.h @@ -128,7 +128,8 @@ struct MapEntryFuncs { // Tags for key and value will both be one byte (field numbers 1 and 2). size_t inner_length = 2 + KeyTypeHandler::ByteSize(key) + ValueTypeHandler::ByteSize(value); - return inner_length + io::CodedOutputStream::VarintSize32(static_cast(inner_length)); + return inner_length + io::CodedOutputStream::VarintSize32( + static_cast(inner_length)); } static int GetCachedSize(const Key& key, const Value& value) { @@ -275,8 +276,8 @@ class MapEntryImpl : public Base { return size; } - ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( - ::google::protobuf::uint8* ptr, io::EpsCopyOutputStream* stream) const override { + ::google::protobuf::uint8* _InternalSerialize(::google::protobuf::uint8* ptr, + io::EpsCopyOutputStream* stream) const override { ptr = KeyTypeHandler::Write(kKeyFieldNumber, key(), ptr, stream); return ValueTypeHandler::Write(kValueFieldNumber, value(), ptr, stream); } diff --git a/src/google/protobuf/map_field.h b/src/google/protobuf/map_field.h index 091a0b7051..38bf26aebb 100644 --- a/src/google/protobuf/map_field.h +++ b/src/google/protobuf/map_field.h @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -311,6 +312,20 @@ class MapField : public TypeDefinedMapFieldBase { GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapField); }; +template +bool AllAreInitialized( + const MapField& field) { + const auto& t = field.GetMap(); + for (typename Map::const_iterator it = t.begin(); it != t.end(); + ++it) { + if (!it->second.IsInitialized()) return false; + } + return true; +} + template diff --git a/src/google/protobuf/map_field_lite.h b/src/google/protobuf/map_field_lite.h index 91b098d654..3f2f6324ab 100644 --- a/src/google/protobuf/map_field_lite.h +++ b/src/google/protobuf/map_field_lite.h @@ -153,8 +153,13 @@ EnumParseWrapper InitEnumParseWrapper(T* map_field, // expected to be message. It's useful to have this helper here to keep the // protobuf compiler from ever having to emit loops in IsInitialized() methods. // We want the C++ compiler to inline this or not as it sees fit. -template -bool AllAreInitialized(const Map& t) { +template +bool AllAreInitialized( + const MapFieldLite& field) { + const auto& t = field.GetMap(); for (typename Map::const_iterator it = t.begin(); it != t.end(); ++it) { if (!it->second.IsInitialized()) return false; diff --git a/src/google/protobuf/map_type_handler.h b/src/google/protobuf/map_type_handler.h index f1d8d04ab3..d63a10c374 100644 --- a/src/google/protobuf/map_type_handler.h +++ b/src/google/protobuf/map_type_handler.h @@ -363,7 +363,7 @@ inline uint8* MapTypeHandler::Write( int field, const MapEntryAccessorType& value, uint8* ptr, io::EpsCopyOutputStream* stream) { ptr = stream->EnsureSpace(ptr); - return WireFormatLite::InternalWriteMessageToArray(field, value, ptr, stream); + return WireFormatLite::InternalWriteMessage(field, value, ptr, stream); } #define WRITE_METHOD(FieldType, DeclaredType) \ diff --git a/src/google/protobuf/message.cc b/src/google/protobuf/message.cc index 09446eea47..5d768b953a 100644 --- a/src/google/protobuf/message.cc +++ b/src/google/protobuf/message.cc @@ -241,10 +241,11 @@ const char* ParsePackedField(const FieldDescriptor* field, Message* msg, const Reflection* reflection, const char* ptr, internal::ParseContext* ctx) { switch (field->type()) { -#define HANDLE_PACKED_TYPE(TYPE, CPPTYPE, METHOD_NAME) \ - case FieldDescriptor::TYPE_##TYPE: \ - return internal::Packed##METHOD_NAME##Parser( \ - reflection->MutableRepeatedField(msg, field), ptr, ctx) +#define HANDLE_PACKED_TYPE(TYPE, CPPTYPE, METHOD_NAME) \ + case FieldDescriptor::TYPE_##TYPE: \ + return internal::Packed##METHOD_NAME##Parser( \ + reflection->MutableRepeatedFieldInternal(msg, field), ptr, \ + ctx) HANDLE_PACKED_TYPE(INT32, int32, Int32); HANDLE_PACKED_TYPE(INT64, int64, Int64); HANDLE_PACKED_TYPE(SINT32, int32, SInt32); @@ -291,17 +292,13 @@ const char* ParseLenDelim(int field_number, const FieldDescriptor* field, const char* field_name = nullptr; auto parse_string = [ptr, ctx, &utf8_level, &field_name](std::string* s) -> const char* { - switch (utf8_level) { - case kNone: - return internal::InlineGreedyStringParser(s, ptr, ctx); - case kVerify: - return internal::InlineGreedyStringParserUTF8Verify(s, ptr, ctx, - field_name); - case kStrict: - return internal::InlineGreedyStringParserUTF8(s, ptr, ctx, field_name); + auto res = internal::InlineGreedyStringParser(s, ptr, ctx); + if (utf8_level != kNone) { + if (!internal::VerifyUTF8(s, field_name) && utf8_level == kStrict) { + return nullptr; + } } - GOOGLE_LOG(FATAL) << "Should not reach here"; - return nullptr; // Make compiler happy + return res; }; switch (field->type()) { case FieldDescriptor::TYPE_STRING: { @@ -324,12 +321,14 @@ const char* ParseLenDelim(int field_number, const FieldDescriptor* field, if (field->options().ctype() == FieldOptions::STRING || field->is_extension()) { auto object = - reflection->MutableRepeatedPtrField(msg, field) + reflection + ->MutableRepeatedPtrFieldInternal(msg, field) ->Mutable(index); return parse_string(object); } else { auto object = - reflection->MutableRepeatedPtrField(msg, field) + reflection + ->MutableRepeatedPtrFieldInternal(msg, field) ->Mutable(index); return parse_string(object); } @@ -490,7 +489,7 @@ const char* Message::_InternalParse(const char* ptr, // If that failed, check if the field is an extension. if (field == nullptr && descriptor_->IsExtensionNumber(num)) { const DescriptorPool* pool = ctx_->data().pool; - if (pool == NULL) { + if (pool == nullptr) { field = reflection_->FindKnownExtensionByNumber(num); } else { field = pool->FindExtensionByNumber(descriptor_, num); @@ -521,10 +520,9 @@ const char* Message::_InternalParse(const char* ptr, return internal::WireFormatParser(field_parser, ptr, ctx); } -uint8* Message::InternalSerializeWithCachedSizesToArray( - uint8* target, io::EpsCopyOutputStream* stream) const { - return WireFormat::InternalSerializeWithCachedSizesToArray(*this, target, - stream); +uint8* Message::_InternalSerialize(uint8* target, + io::EpsCopyOutputStream* stream) const { + return WireFormat::_InternalSerialize(*this, target, stream); } size_t Message::ByteSizeLong() const { diff --git a/src/google/protobuf/message.h b/src/google/protobuf/message.h index 92aa1f15b7..237ba733c3 100644 --- a/src/google/protobuf/message.h +++ b/src/google/protobuf/message.h @@ -304,8 +304,8 @@ class PROTOBUF_EXPORT Message : public MessageLite { const char* _InternalParse(const char* ptr, internal::ParseContext* ctx) override; size_t ByteSizeLong() const override; - uint8* InternalSerializeWithCachedSizesToArray( - uint8* target, io::EpsCopyOutputStream* stream) const override; + uint8* _InternalSerialize(uint8* target, + io::EpsCopyOutputStream* stream) const override; private: // This is called only by the default implementation of ByteSize(), to @@ -747,16 +747,20 @@ class PROTOBUF_EXPORT Reflection final { // for T = Cord and all protobuf scalar types except enums. template PROTOBUF_DEPRECATED_MSG("Please use GetRepeatedFieldRef() instead") - const RepeatedField& GetRepeatedField(const Message&, - const FieldDescriptor*) const; + const RepeatedField& GetRepeatedField(const Message& msg, + const FieldDescriptor* d) const { + return GetRepeatedFieldInternal(msg, d); + } // DEPRECATED. Please use GetMutableRepeatedFieldRef(). // // for T = Cord and all protobuf scalar types except enums. template PROTOBUF_DEPRECATED_MSG("Please use GetMutableRepeatedFieldRef() instead") - RepeatedField* MutableRepeatedField(Message*, - const FieldDescriptor*) const; + RepeatedField* MutableRepeatedField(Message* msg, + const FieldDescriptor* d) const { + return MutableRepeatedFieldInternal(msg, d); + } // DEPRECATED. Please use GetRepeatedFieldRef(). // @@ -764,8 +768,10 @@ class PROTOBUF_EXPORT Reflection final { // google::protobuf::Message & descendants. template PROTOBUF_DEPRECATED_MSG("Please use GetRepeatedFieldRef() instead") - const RepeatedPtrField& GetRepeatedPtrField(const Message&, - const FieldDescriptor*) const; + const RepeatedPtrField& GetRepeatedPtrField( + const Message& msg, const FieldDescriptor* d) const { + return GetRepeatedPtrFieldInternal(msg, d); + } // DEPRECATED. Please use GetMutableRepeatedFieldRef(). // @@ -773,22 +779,20 @@ class PROTOBUF_EXPORT Reflection final { // google::protobuf::Message & descendants. template PROTOBUF_DEPRECATED_MSG("Please use GetMutableRepeatedFieldRef() instead") - RepeatedPtrField* MutableRepeatedPtrField(Message*, - const FieldDescriptor*) const; + RepeatedPtrField* MutableRepeatedPtrField(Message* msg, + const FieldDescriptor* d) const { + return MutableRepeatedPtrFieldInternal(msg, d); + } // Extensions ---------------------------------------------------------------- // Try to find an extension of this message type by fully-qualified field // name. Returns nullptr if no extension is known for this name or number. - PROTOBUF_DEPRECATED_MSG( - "Please use DescriptorPool::FindExtensionByPrintableName instead") const FieldDescriptor* FindKnownExtensionByName( const std::string& name) const; // Try to find an extension of this message type by field number. // Returns nullptr if no extension is known for this name or number. - PROTOBUF_DEPRECATED_MSG( - "Please use DescriptorPool::FindExtensionByNumber instead") const FieldDescriptor* FindKnownExtensionByNumber(int number) const; // Feature Flags ------------------------------------------------------------- @@ -835,6 +839,18 @@ class PROTOBUF_EXPORT Reflection final { MessageFactory* GetMessageFactory() const; private: + template + const RepeatedField& GetRepeatedFieldInternal( + const Message& message, const FieldDescriptor* field) const; + template + RepeatedField* MutableRepeatedFieldInternal( + Message* message, const FieldDescriptor* field) const; + template + const RepeatedPtrField& GetRepeatedPtrFieldInternal( + const Message& message, const FieldDescriptor* field) const; + template + RepeatedPtrField* MutableRepeatedPtrFieldInternal( + Message* message, const FieldDescriptor* field) const; // Obtain a pointer to a Repeated Field Structure and do some type checking: // on field->cpp_type(), // on field->field_option().ctype() (if ctype >= 0) @@ -1059,6 +1075,17 @@ class PROTOBUF_EXPORT Reflection final { friend inline // inline so nobody can call this function. void RegisterAllTypesInternal(const Metadata* file_level_metadata, int size); + friend inline const char* ParseLenDelim(int field_number, + const FieldDescriptor* field, + Message* msg, + const Reflection* reflection, + const char* ptr, + internal::ParseContext* ctx); + friend inline const char* ParsePackedField(const FieldDescriptor* field, + Message* msg, + const Reflection* reflection, + const char* ptr, + internal::ParseContext* ctx); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reflection); }; @@ -1127,14 +1154,15 @@ class PROTOBUF_EXPORT MessageFactory { GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFactory); }; -#define DECLARE_GET_REPEATED_FIELD(TYPE) \ - template <> \ - PROTOBUF_EXPORT const RepeatedField& \ - Reflection::GetRepeatedField(const Message& message, \ - const FieldDescriptor* field) const; \ - \ - template <> \ - PROTOBUF_EXPORT RepeatedField* Reflection::MutableRepeatedField( \ +#define DECLARE_GET_REPEATED_FIELD(TYPE) \ + template <> \ + PROTOBUF_EXPORT const RepeatedField& \ + Reflection::GetRepeatedFieldInternal( \ + const Message& message, const FieldDescriptor* field) const; \ + \ + template <> \ + PROTOBUF_EXPORT RepeatedField* \ + Reflection::MutableRepeatedFieldInternal( \ Message * message, const FieldDescriptor* field) const; DECLARE_GET_REPEATED_FIELD(int32) @@ -1213,7 +1241,7 @@ void LinkMessageReflection() { template <> inline const RepeatedPtrField& -Reflection::GetRepeatedPtrField( +Reflection::GetRepeatedPtrFieldInternal( const Message& message, const FieldDescriptor* field) const { return *static_cast*>( MutableRawRepeatedString(const_cast(&message), field, true)); @@ -1221,7 +1249,7 @@ Reflection::GetRepeatedPtrField( template <> inline RepeatedPtrField* -Reflection::MutableRepeatedPtrField( +Reflection::MutableRepeatedPtrFieldInternal( Message* message, const FieldDescriptor* field) const { return static_cast*>( MutableRawRepeatedString(message, field, true)); @@ -1231,21 +1259,21 @@ Reflection::MutableRepeatedPtrField( // ----- template <> -inline const RepeatedPtrField& Reflection::GetRepeatedPtrField( +inline const RepeatedPtrField& Reflection::GetRepeatedPtrFieldInternal( const Message& message, const FieldDescriptor* field) const { return *static_cast*>(GetRawRepeatedField( message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1, nullptr)); } template <> -inline RepeatedPtrField* Reflection::MutableRepeatedPtrField( +inline RepeatedPtrField* Reflection::MutableRepeatedPtrFieldInternal( Message* message, const FieldDescriptor* field) const { return static_cast*>(MutableRawRepeatedField( message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1, nullptr)); } template -inline const RepeatedPtrField& Reflection::GetRepeatedPtrField( +inline const RepeatedPtrField& Reflection::GetRepeatedPtrFieldInternal( const Message& message, const FieldDescriptor* field) const { return *static_cast*>( GetRawRepeatedField(message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1, @@ -1253,7 +1281,7 @@ inline const RepeatedPtrField& Reflection::GetRepeatedPtrField( } template -inline RepeatedPtrField* Reflection::MutableRepeatedPtrField( +inline RepeatedPtrField* Reflection::MutableRepeatedPtrFieldInternal( Message* message, const FieldDescriptor* field) const { return static_cast*>( MutableRawRepeatedField(message, field, FieldDescriptor::CPPTYPE_MESSAGE, diff --git a/src/google/protobuf/message_lite.cc b/src/google/protobuf/message_lite.cc index 9a892c63fa..4f5cc5fe91 100644 --- a/src/google/protobuf/message_lite.cc +++ b/src/google/protobuf/message_lite.cc @@ -53,6 +53,7 @@ #include #include #include +#include #include @@ -316,7 +317,7 @@ inline uint8* SerializeToArrayImpl(const MessageLite& msg, uint8* target, io::EpsCopyOutputStream out( &stream, io::CodedOutputStream::IsDefaultSerializationDeterministic(), &ptr); - ptr = msg.InternalSerializeWithCachedSizesToArray(ptr, &out); + ptr = msg._InternalSerialize(ptr, &out); out.Trim(ptr); GOOGLE_DCHECK(!out.HadError() && stream.ByteCount() == size); return target + size; @@ -324,7 +325,7 @@ inline uint8* SerializeToArrayImpl(const MessageLite& msg, uint8* target, io::EpsCopyOutputStream out( target, size, io::CodedOutputStream::IsDefaultSerializationDeterministic()); - auto res = msg.InternalSerializeWithCachedSizesToArray(target, &out); + auto res = msg._InternalSerialize(target, &out); GOOGLE_DCHECK(target + size == res); return res; } @@ -384,7 +385,7 @@ bool MessageLite::SerializePartialToZeroCopyStream( io::EpsCopyOutputStream stream( output, io::CodedOutputStream::IsDefaultSerializationDeterministic(), &target); - target = InternalSerializeWithCachedSizesToArray(target, &stream); + target = _InternalSerialize(target, &stream); stream.Trim(target); if (stream.HadError()) return false; return true; @@ -499,5 +500,53 @@ void GenericTypeHandler::Merge(const std::string& from, } // namespace internal + +// =================================================================== +// Shutdown support. + +namespace internal { + +struct ShutdownData { + ~ShutdownData() { + std::reverse(functions.begin(), functions.end()); + for (auto pair : functions) pair.first(pair.second); + } + + static ShutdownData* get() { + static auto* data = new ShutdownData; + return data; + } + + std::vector> functions; + Mutex mutex; +}; + +static void RunZeroArgFunc(const void* arg) { + void (*func)() = reinterpret_cast(const_cast(arg)); + func(); +} + +void OnShutdown(void (*func)()) { + OnShutdownRun(RunZeroArgFunc, reinterpret_cast(func)); +} + +void OnShutdownRun(void (*f)(const void*), const void* arg) { + auto shutdown_data = ShutdownData::get(); + MutexLock lock(&shutdown_data->mutex); + shutdown_data->functions.push_back(std::make_pair(f, arg)); +} + +} // namespace internal + +void ShutdownProtobufLibrary() { + // This function should be called only once, but accepts multiple calls. + static bool is_shutdown = false; + if (!is_shutdown) { + delete internal::ShutdownData::get(); + is_shutdown = true; + } +} + + } // namespace protobuf } // namespace google diff --git a/src/google/protobuf/message_lite.h b/src/google/protobuf/message_lite.h index 0b718a0a2d..31746f3e38 100644 --- a/src/google/protobuf/message_lite.h +++ b/src/google/protobuf/message_lite.h @@ -405,8 +405,7 @@ class PROTOBUF_EXPORT MessageLite { // have changed since the last call to ByteSize(), and the value returned by // ByteSize must be non-negative. Otherwise the results are undefined. void SerializeWithCachedSizes(io::CodedOutputStream* output) const { - output->SetCur(InternalSerializeWithCachedSizesToArray(output->Cur(), - output->EpsCopy())); + output->SetCur(_InternalSerialize(output->Cur(), output->EpsCopy())); } // Functions below here are not part of the public interface. It isn't @@ -461,9 +460,9 @@ class PROTOBUF_EXPORT MessageLite { bool ParseFrom(const T& input); // Fast path when conditions match (ie. non-deterministic) - // uint8* InternalSerializeWithCachedSizesToArray(uint8* ptr) const; - virtual uint8* InternalSerializeWithCachedSizesToArray( - uint8* ptr, io::EpsCopyOutputStream* stream) const = 0; + // uint8* _InternalSerialize(uint8* ptr) const; + virtual uint8* _InternalSerialize(uint8* ptr, + io::EpsCopyOutputStream* stream) const = 0; private: // TODO(gerbens) make this a pure abstract function @@ -530,6 +529,40 @@ bool MessageLite::ParseFrom(const T& input) { return res && ((flags & kMergePartial) || IsInitializedWithErrors()); } +// =================================================================== +// Shutdown support. + + +// Shut down the entire protocol buffers library, deleting all static-duration +// objects allocated by the library or by generated .pb.cc files. +// +// There are two reasons you might want to call this: +// * You use a draconian definition of "memory leak" in which you expect +// every single malloc() to have a corresponding free(), even for objects +// which live until program exit. +// * You are writing a dynamically-loaded library which needs to clean up +// after itself when the library is unloaded. +// +// It is safe to call this multiple times. However, it is not safe to use +// any other part of the protocol buffers library after +// ShutdownProtobufLibrary() has been called. Furthermore this call is not +// thread safe, user needs to synchronize multiple calls. +PROTOBUF_EXPORT void ShutdownProtobufLibrary(); + +namespace internal { + +// Register a function to be called when ShutdownProtocolBuffers() is called. +PROTOBUF_EXPORT void OnShutdown(void (*func)()); +// Run an arbitrary function on an arg +PROTOBUF_EXPORT void OnShutdownRun(void (*f)(const void*), const void* arg); + +template +T* OnShutdownDelete(T* p) { + OnShutdownRun([](const void* pp) { delete static_cast(pp); }, p); + return p; +} + +} // namespace internal } // namespace protobuf } // namespace google diff --git a/src/google/protobuf/parse_context.cc b/src/google/protobuf/parse_context.cc index 1d78ee6385..76b0f3b554 100644 --- a/src/google/protobuf/parse_context.cc +++ b/src/google/protobuf/parse_context.cc @@ -424,14 +424,6 @@ const char* InlineGreedyStringParser(std::string* s, const char* ptr, return ctx->ReadString(ptr, size, s); } -const char* InlineGreedyStringParserUTF8(std::string* s, const char* ptr, - ParseContext* ctx, - const char* field_name) { - auto p = InlineGreedyStringParser(s, ptr, ctx); - GOOGLE_PROTOBUF_PARSER_ASSERT(VerifyUTF8(*s, field_name)); - return p; -} - template const char* VarintParser(void* object, const char* ptr, ParseContext* ctx) { diff --git a/src/google/protobuf/parse_context.h b/src/google/protobuf/parse_context.h index fb634f429a..921ea51beb 100644 --- a/src/google/protobuf/parse_context.h +++ b/src/google/protobuf/parse_context.h @@ -37,6 +37,7 @@ #include #include +#include #include #include #include @@ -627,26 +628,14 @@ const char* EpsCopyInputStream::ReadPackedVarint(const char* ptr, Add add) { PROTOBUF_EXPORT bool VerifyUTF8(StringPiece s, const char* field_name); +inline bool VerifyUTF8(const std::string* s, const char* field_name) { + return VerifyUTF8(*s, field_name); +} + // All the string parsers with or without UTF checking and for all CTypes. PROTOBUF_EXPORT PROTOBUF_MUST_USE_RESULT const char* InlineGreedyStringParser( std::string* s, const char* ptr, ParseContext* ctx); -PROTOBUF_EXPORT PROTOBUF_MUST_USE_RESULT const char* -InlineGreedyStringParserUTF8(std::string* s, const char* ptr, ParseContext* ctx, - const char* field_name); -// Inline because we don't want to pay the price of field_name in opt mode. -inline PROTOBUF_MUST_USE_RESULT const char* InlineGreedyStringParserUTF8Verify( - std::string* s, const char* ptr, ParseContext* ctx, - const char* field_name) { - auto p = InlineGreedyStringParser(s, ptr, ctx); -#ifndef NDEBUG - VerifyUTF8(*s, field_name); -#else // !NDEBUG - (void)field_name; -#endif // !NDEBUG - return p; -} - // Add any of the following lines to debug which parse function is failing. diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc index b6e56267fb..39cb6bde0a 100644 --- a/src/google/protobuf/port_def.inc +++ b/src/google/protobuf/port_def.inc @@ -149,9 +149,11 @@ #if defined(__GNUC__) || defined(__clang__) #define PROTOBUF_DEPRECATED __attribute__((deprecated)) +#define PROTOBUF_DEPRECATED_ENUM __attribute__((deprecated)) #define PROTOBUF_DEPRECATED_MSG(msg) __attribute__((deprecated(msg))) #elif defined(_MSC_VER) #define PROTOBUF_DEPRECATED __declspec(deprecated) +#define PROTOBUF_DEPRECATED_ENUM #define PROTOBUF_DEPRECATED_MSG(msg) __declspec(deprecated(msg)) #endif @@ -341,28 +343,20 @@ #if defined(PROTOBUF_USE_DLLS) #if defined(_MSC_VER) #ifdef LIBPROTOBUF_EXPORTS - #define PROTOBUF_EXPORT __declspec(dllexport) - #define PROTOBUF_EXPORT_TEMPLATE_DECLARE - #define PROTOBUF_EXPORT_TEMPLATE_DEFINE __declspec(dllexport) + #define PROTOBUF_EXPORT __declspec(dllexport) #else - #define PROTOBUF_EXPORT __declspec(dllimport) - #define PROTOBUF_EXPORT_TEMPLATE_DECLARE - #define PROTOBUF_EXPORT_TEMPLATE_DEFINE __declspec(dllimport) + #define PROTOBUF_EXPORT __declspec(dllimport) #endif #ifdef LIBPROTOC_EXPORTS - #define PROTOC_EXPORT __declspec(dllexport) + #define PROTOC_EXPORT __declspec(dllexport) #else - #define PROTOC_EXPORT __declspec(dllimport) + #define PROTOC_EXPORT __declspec(dllimport) #endif #else // defined(_MSC_VER) #ifdef LIBPROTOBUF_EXPORTS #define PROTOBUF_EXPORT __attribute__((visibility("default"))) - #define PROTOBUF_EXPORT_TEMPLATE_DECLARE __attribute__((visibility("default"))) - #define PROTOBUF_EXPORT_TEMPLATE_DEFINE #else #define PROTOBUF_EXPORT - #define PROTOBUF_EXPORT_TEMPLATE_DECLARE - #define PROTOBUF_EXPORT_TEMPLATE_DEFINE #endif #ifdef LIBPROTOC_EXPORTS #define PROTOC_EXPORT __attribute__((visibility("default"))) @@ -373,10 +367,168 @@ #else // defined(PROTOBUF_USE_DLLS) #define PROTOBUF_EXPORT #define PROTOC_EXPORT - #define PROTOBUF_EXPORT_TEMPLATE_DECLARE - #define PROTOBUF_EXPORT_TEMPLATE_DEFINE #endif + +// This portion provides macros for using FOO_EXPORT macros with explicit +// template instantiation declarations and definitions. +// Generally, the FOO_EXPORT macros are used at declarations, +// and GCC requires them to be used at explicit instantiation declarations, +// but MSVC requires __declspec(dllexport) to be used at the explicit +// instantiation definitions instead. + +// Usage +// +// In a header file, write: +// +// extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE(FOO_EXPORT) foo; +// +// In a source file, write: +// +// template class PROTOBUF_EXPORT_TEMPLATE_DEFINE(FOO_EXPORT) foo; +// +// Where FOO_EXPORT is either PROTOBUF_EXPORT or PROTOC_EXPORT + +// Implementation notes +// +// The implementation of these macros uses some subtle macro semantics to +// detect what the provided FOO_EXPORT value was defined as and then +// to dispatch to appropriate macro definitions. Unfortunately, +// MSVC's C preprocessor is rather non-compliant and requires special +// care to make it work. +// +// Issue 1. +// +// #define F(x) +// F() +// +// MSVC emits warning C4003 ("not enough actual parameters for macro +// 'F'), even though it's a valid macro invocation. This affects the +// macros below that take just an "export" parameter, because export +// may be empty. +// +// As a workaround, we can add a dummy parameter and arguments: +// +// #define F(x,_) +// F(,) +// +// Issue 2. +// +// #define F(x) G##x +// #define Gj() ok +// F(j()) +// +// The correct replacement for "F(j())" is "ok", but MSVC replaces it +// with "Gj()". As a workaround, we can pass the result to an +// identity macro to force MSVC to look for replacements again. (This +// is why PROTOBUF_EXPORT_TEMPLATE_STYLE_3 exists.) + +#define PROTOBUF_EXPORT_TEMPLATE_DECLARE(export) \ + PROTOBUF_EXPORT_TEMPLATE_INVOKE( \ + DECLARE, PROTOBUF_EXPORT_TEMPLATE_STYLE(export, ), export) +#define PROTOBUF_EXPORT_TEMPLATE_DEFINE(export) \ + PROTOBUF_EXPORT_TEMPLATE_INVOKE( \ + DEFINE, PROTOBUF_EXPORT_TEMPLATE_STYLE(export, ), export) + +// INVOKE is an internal helper macro to perform parameter replacements +// and token pasting to chain invoke another macro. E.g., +// PROTOBUF_EXPORT_TEMPLATE_INVOKE(DECLARE, DEFAULT, FOO_EXPORT) +// will export to call +// PROTOBUF_EXPORT_TEMPLATE_DECLARE_DEFAULT(FOO_EXPORT, ) +// (but with FOO_EXPORT expanded too). +#define PROTOBUF_EXPORT_TEMPLATE_INVOKE(which, style, export) \ + PROTOBUF_EXPORT_TEMPLATE_INVOKE_2(which, style, export) +#define PROTOBUF_EXPORT_TEMPLATE_INVOKE_2(which, style, export) \ + PROTOBUF_EXPORT_TEMPLATE_##which##_##style(export, ) + +// Default style is to apply the FOO_EXPORT macro at declaration sites. +#define PROTOBUF_EXPORT_TEMPLATE_DECLARE_DEFAULT(export, _) export +#define PROTOBUF_EXPORT_TEMPLATE_DEFINE_DEFAULT(export, _) + +// The "MSVC hack" style is used when FOO_EXPORT is defined +// as __declspec(dllexport), which MSVC requires to be used at +// definition sites instead. +#define PROTOBUF_EXPORT_TEMPLATE_DECLARE_MSVC_HACK(export, _) +#define PROTOBUF_EXPORT_TEMPLATE_DEFINE_MSVC_HACK(export, _) export + +// PROTOBUF_EXPORT_TEMPLATE_STYLE is an internal helper macro that identifies +// which export style needs to be used for the provided FOO_EXPORT macro +// definition. "", "__attribute__(...)", and "__declspec(dllimport)" are +// mapped to "DEFAULT"; while "__declspec(dllexport)" is mapped to "MSVC_HACK". +// +// It's implemented with token pasting to transform the __attribute__ and +// __declspec annotations into macro invocations. E.g., if FOO_EXPORT is +// defined as "__declspec(dllimport)", it undergoes the following sequence of +// macro substitutions: +// PROTOBUF_EXPORT_TEMPLATE_STYLE(FOO_EXPORT, ) +// PROTOBUF_EXPORT_TEMPLATE_STYLE_2(__declspec(dllimport), ) +// PROTOBUF_EXPORT_TEMPLATE_STYLE_3( +// PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH__declspec(dllimport)) +// PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH__declspec(dllimport) +// PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_DECLSPEC_dllimport +// DEFAULT +#define PROTOBUF_EXPORT_TEMPLATE_STYLE(export, _) \ + PROTOBUF_EXPORT_TEMPLATE_STYLE_2(export, ) +#define PROTOBUF_EXPORT_TEMPLATE_STYLE_2(export, _) \ + PROTOBUF_EXPORT_TEMPLATE_STYLE_3( \ + PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_foj3FJo5StF0OvIzl7oMxA##export) +#define PROTOBUF_EXPORT_TEMPLATE_STYLE_3(style) style + +// Internal helper macros for PROTOBUF_EXPORT_TEMPLATE_STYLE. +// +// XXX: C++ reserves all identifiers containing "__" for the implementation, +// but "__attribute__" and "__declspec" already contain "__" and the token-paste +// operator can only add characters; not remove them. To minimize the risk of +// conflict with implementations, we include "foj3FJo5StF0OvIzl7oMxA" (a random +// 128-bit string, encoded in Base64) in the macro name. +#define PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_foj3FJo5StF0OvIzl7oMxA DEFAULT +#define PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_foj3FJo5StF0OvIzl7oMxA__attribute__(...) \ + DEFAULT +#define PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_foj3FJo5StF0OvIzl7oMxA__declspec(arg) \ + PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_DECLSPEC_##arg + +// Internal helper macros for PROTOBUF_EXPORT_TEMPLATE_STYLE. +#define PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_DECLSPEC_dllexport MSVC_HACK +#define PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_DECLSPEC_dllimport DEFAULT + +// Sanity checks. +// +// PROTOBUF_EXPORT_TEMPLATE_TEST uses the same macro invocation pattern as +// PROTOBUF_EXPORT_TEMPLATE_DECLARE and PROTOBUF_EXPORT_TEMPLATE_DEFINE do to +// check that they're working correctly. When they're working correctly, the +// sequence of macro replacements should go something like: +// +// PROTOBUF_EXPORT_TEMPLATE_TEST(DEFAULT, __declspec(dllimport)); +// +// static_assert(PROTOBUF_EXPORT_TEMPLATE_INVOKE(TEST_DEFAULT, +// PROTOBUF_EXPORT_TEMPLATE_STYLE(__declspec(dllimport), ), +// __declspec(dllimport)), "__declspec(dllimport)"); +// +// static_assert(PROTOBUF_EXPORT_TEMPLATE_INVOKE(TEST_DEFAULT, +// DEFAULT, __declspec(dllimport)), "__declspec(dllimport)"); +// +// static_assert(PROTOBUF_EXPORT_TEMPLATE_TEST_DEFAULT_DEFAULT( +// __declspec(dllimport)), "__declspec(dllimport)"); +// +// static_assert(true, "__declspec(dllimport)"); +// +// When they're not working correctly, a syntax error should occur instead. +#define PROTOBUF_EXPORT_TEMPLATE_TEST(want, export) \ + static_assert(PROTOBUF_EXPORT_TEMPLATE_INVOKE( \ + TEST_##want, PROTOBUF_EXPORT_TEMPLATE_STYLE(export, ), \ + export), #export) +#define PROTOBUF_EXPORT_TEMPLATE_TEST_DEFAULT_DEFAULT(...) true +#define PROTOBUF_EXPORT_TEMPLATE_TEST_MSVC_HACK_MSVC_HACK(...) true + +PROTOBUF_EXPORT_TEMPLATE_TEST(DEFAULT, ); +PROTOBUF_EXPORT_TEMPLATE_TEST(DEFAULT, __attribute__((visibility("default")))); +PROTOBUF_EXPORT_TEMPLATE_TEST(MSVC_HACK, __declspec(dllexport)); +PROTOBUF_EXPORT_TEMPLATE_TEST(DEFAULT, __declspec(dllimport)); + +#undef PROTOBUF_EXPORT_TEMPLATE_TEST +#undef PROTOBUF_EXPORT_TEMPLATE_TEST_DEFAULT_DEFAULT +#undef PROTOBUF_EXPORT_TEMPLATE_TEST_MSVC_HACK_MSVC_HACK + // Windows declares several inconvenient macro names. We #undef them and then // restore them in port_undef.inc. #ifdef _MSC_VER diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc index bfa620e91b..e1b4f1b220 100644 --- a/src/google/protobuf/port_undef.inc +++ b/src/google/protobuf/port_undef.inc @@ -41,6 +41,7 @@ #undef PROTOBUF_NOINLINE #undef PROTOBUF_SECTION_VARIABLE #undef PROTOBUF_DEPRECATED +#undef PROTOBUF_DEPRECATED_ENUM #undef PROTOBUF_DEPRECATED_MSG #undef PROTOBUF_FUNC_ALIGN #undef PROTOBUF_RETURNS_NONNULL @@ -67,6 +68,20 @@ #undef PROTOBUF_ASSUME #undef PROTOBUF_EXPORT_TEMPLATE_DECLARE #undef PROTOBUF_EXPORT_TEMPLATE_DEFINE +#undef PROTOBUF_EXPORT_TEMPLATE_INVOKE +#undef PROTOBUF_EXPORT_TEMPLATE_INVOKE_2 +#undef PROTOBUF_EXPORT_TEMPLATE_DECLARE_DEFAULT +#undef PROTOBUF_EXPORT_TEMPLATE_DEFINE_DEFAULT +#undef PROTOBUF_EXPORT_TEMPLATE_DECLARE_MSVC_HACK +#undef PROTOBUF_EXPORT_TEMPLATE_DEFINE_MSVC_HACK +#undef PROTOBUF_EXPORT_TEMPLATE_STYLE +#undef PROTOBUF_EXPORT_TEMPLATE_STYLE_2 +#undef PROTOBUF_EXPORT_TEMPLATE_STYLE_3 +#undef PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_foj3FJo5StF0OvIzl7oMxA +#undef PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_foj3FJo5StF0OvIzl7oMxA__attribute__ +#undef PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_foj3FJo5StF0OvIzl7oMxA__declspec +#undef PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_DECLSPEC_dllexport +#undef PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_DECLSPEC_dllimport // Restore macro that may have been #undef'd in port_def.inc. #ifdef _MSC_VER diff --git a/src/google/protobuf/repeated_field.cc b/src/google/protobuf/repeated_field.cc index fc73917c50..1c43c56a9b 100644 --- a/src/google/protobuf/repeated_field.cc +++ b/src/google/protobuf/repeated_field.cc @@ -123,14 +123,22 @@ MessageLite* RepeatedPtrFieldBase::AddWeak(const MessageLite* prototype) { } // namespace internal -template class PROTOBUF_EXPORT_TEMPLATE_DEFINE RepeatedField; -template class PROTOBUF_EXPORT_TEMPLATE_DEFINE RepeatedField; -template class PROTOBUF_EXPORT_TEMPLATE_DEFINE RepeatedField; -template class PROTOBUF_EXPORT_TEMPLATE_DEFINE RepeatedField; -template class PROTOBUF_EXPORT_TEMPLATE_DEFINE RepeatedField; -template class PROTOBUF_EXPORT_TEMPLATE_DEFINE RepeatedField; -template class PROTOBUF_EXPORT_TEMPLATE_DEFINE RepeatedField; -template class PROTOBUF_EXPORT_TEMPLATE_DEFINE RepeatedPtrField; +template class PROTOBUF_EXPORT_TEMPLATE_DEFINE(PROTOBUF_EXPORT) + RepeatedField; +template class PROTOBUF_EXPORT_TEMPLATE_DEFINE(PROTOBUF_EXPORT) + RepeatedField; +template class PROTOBUF_EXPORT_TEMPLATE_DEFINE(PROTOBUF_EXPORT) + RepeatedField; +template class PROTOBUF_EXPORT_TEMPLATE_DEFINE(PROTOBUF_EXPORT) + RepeatedField; +template class PROTOBUF_EXPORT_TEMPLATE_DEFINE(PROTOBUF_EXPORT) + RepeatedField; +template class PROTOBUF_EXPORT_TEMPLATE_DEFINE(PROTOBUF_EXPORT) + RepeatedField; +template class PROTOBUF_EXPORT_TEMPLATE_DEFINE(PROTOBUF_EXPORT) + RepeatedField; +template class PROTOBUF_EXPORT_TEMPLATE_DEFINE(PROTOBUF_EXPORT) + RepeatedPtrField; } // namespace protobuf } // namespace google diff --git a/src/google/protobuf/repeated_field.h b/src/google/protobuf/repeated_field.h index 280e0ef2cc..cce1e4ed9e 100644 --- a/src/google/protobuf/repeated_field.h +++ b/src/google/protobuf/repeated_field.h @@ -2653,14 +2653,21 @@ UnsafeArenaAllocatedRepeatedPtrFieldBackInserter( } // Extern declarations of common instantiations to reduce libray bloat. -extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE RepeatedField; -extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE RepeatedField; -extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE RepeatedField; -extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE RepeatedField; -extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE RepeatedField; -extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE RepeatedField; -extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE RepeatedField; -extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE +extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE(PROTOBUF_EXPORT) + RepeatedField; +extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE(PROTOBUF_EXPORT) + RepeatedField; +extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE(PROTOBUF_EXPORT) + RepeatedField; +extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE(PROTOBUF_EXPORT) + RepeatedField; +extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE(PROTOBUF_EXPORT) + RepeatedField; +extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE(PROTOBUF_EXPORT) + RepeatedField; +extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE(PROTOBUF_EXPORT) + RepeatedField; +extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE(PROTOBUF_EXPORT) RepeatedPtrField; } // namespace protobuf diff --git a/src/google/protobuf/source_context.pb.cc b/src/google/protobuf/source_context.pb.cc index bb6e8a9ee2..7ae94456fa 100644 --- a/src/google/protobuf/source_context.pb.cc +++ b/src/google/protobuf/source_context.pb.cc @@ -148,7 +148,9 @@ const char* SourceContext::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ // string file_name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_file_name(), ptr, ctx, "google.protobuf.SourceContext.file_name"); + auto str = _internal_mutable_file_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.SourceContext.file_name")); CHK_(ptr); } else goto handle_unusual; continue; @@ -172,7 +174,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* SourceContext::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* SourceContext::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.SourceContext) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; diff --git a/src/google/protobuf/source_context.pb.h b/src/google/protobuf/source_context.pb.h index 4aad4e2d48..8a49008c93 100644 --- a/src/google/protobuf/source_context.pb.h +++ b/src/google/protobuf/source_context.pb.h @@ -136,7 +136,7 @@ class PROTOBUF_EXPORT SourceContext : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } diff --git a/src/google/protobuf/struct.pb.cc b/src/google/protobuf/struct.pb.cc index 770ed301f1..15a889b12e 100644 --- a/src/google/protobuf/struct.pb.cc +++ b/src/google/protobuf/struct.pb.cc @@ -297,7 +297,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Struct::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Struct::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Struct) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -646,7 +646,9 @@ const char* Value::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::inte // string string_value = 3; case 3: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 26)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_string_value(), ptr, ctx, "google.protobuf.Value.string_value"); + auto str = _internal_mutable_string_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Value.string_value")); CHK_(ptr); } else goto handle_unusual; continue; @@ -691,7 +693,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Value::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Value::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Value) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -730,7 +732,7 @@ failure: if (_internal_has_struct_value()) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 5, _Internal::struct_value(this), target, stream); } @@ -738,7 +740,7 @@ failure: if (_internal_has_list_value()) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 6, _Internal::list_value(this), target, stream); } @@ -999,7 +1001,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* ListValue::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* ListValue::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ListValue) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1010,7 +1012,7 @@ failure: n = static_cast(this->_internal_values_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(1, this->_internal_values(i), target, stream); + InternalWriteMessage(1, this->_internal_values(i), target, stream); } if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { diff --git a/src/google/protobuf/struct.pb.h b/src/google/protobuf/struct.pb.h index 4b399c06a9..05a5f74453 100644 --- a/src/google/protobuf/struct.pb.h +++ b/src/google/protobuf/struct.pb.h @@ -122,7 +122,7 @@ public: void MergeFrom(const Struct_FieldsEntry_DoNotUse& other); static const Struct_FieldsEntry_DoNotUse* internal_default_instance() { return reinterpret_cast(&_Struct_FieldsEntry_DoNotUse_default_instance_); } static bool ValidateKey(std::string* s) { - return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), s->size(), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "google.protobuf.Struct.FieldsEntry.key"); + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "google.protobuf.Struct.FieldsEntry.key"); } static bool ValidateValue(void*) { return true; } void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; @@ -223,7 +223,7 @@ class PROTOBUF_EXPORT Struct : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -398,7 +398,7 @@ class PROTOBUF_EXPORT Value : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -666,7 +666,7 @@ class PROTOBUF_EXPORT ListValue : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -1039,7 +1039,7 @@ inline void Value::clear_struct_value() { } inline PROTOBUF_NAMESPACE_ID::Struct* Value::release_struct_value() { // @@protoc_insertion_point(field_release:google.protobuf.Value.struct_value) - if (has_struct_value()) { + if (_internal_has_struct_value()) { clear_has_kind(); PROTOBUF_NAMESPACE_ID::Struct* temp = kind_.struct_value_; if (GetArenaNoVirtual() != nullptr) { @@ -1062,7 +1062,7 @@ inline const PROTOBUF_NAMESPACE_ID::Struct& Value::struct_value() const { } inline PROTOBUF_NAMESPACE_ID::Struct* Value::unsafe_arena_release_struct_value() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Value.struct_value) - if (has_struct_value()) { + if (_internal_has_struct_value()) { clear_has_kind(); PROTOBUF_NAMESPACE_ID::Struct* temp = kind_.struct_value_; kind_.struct_value_ = nullptr; @@ -1113,7 +1113,7 @@ inline void Value::clear_list_value() { } inline PROTOBUF_NAMESPACE_ID::ListValue* Value::release_list_value() { // @@protoc_insertion_point(field_release:google.protobuf.Value.list_value) - if (has_list_value()) { + if (_internal_has_list_value()) { clear_has_kind(); PROTOBUF_NAMESPACE_ID::ListValue* temp = kind_.list_value_; if (GetArenaNoVirtual() != nullptr) { @@ -1136,7 +1136,7 @@ inline const PROTOBUF_NAMESPACE_ID::ListValue& Value::list_value() const { } inline PROTOBUF_NAMESPACE_ID::ListValue* Value::unsafe_arena_release_list_value() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Value.list_value) - if (has_list_value()) { + if (_internal_has_list_value()) { clear_has_kind(); PROTOBUF_NAMESPACE_ID::ListValue* temp = kind_.list_value_; kind_.list_value_ = nullptr; diff --git a/src/google/protobuf/stubs/bytestream.h b/src/google/protobuf/stubs/bytestream.h index 23d33e4761..08403861a7 100644 --- a/src/google/protobuf/stubs/bytestream.h +++ b/src/google/protobuf/stubs/bytestream.h @@ -274,7 +274,7 @@ class PROTOBUF_EXPORT StringByteSink : public ByteSink { class PROTOBUF_EXPORT NullByteSink : public ByteSink { public: NullByteSink() {} - virtual void Append(const char* /*data*/, size_t /*n*/) override {} + void Append(const char* /*data*/, size_t /*n*/) override {} private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(NullByteSink); diff --git a/src/google/protobuf/stubs/common.cc b/src/google/protobuf/stubs/common.cc index db60393218..4db493b70c 100644 --- a/src/google/protobuf/stubs/common.cc +++ b/src/google/protobuf/stubs/common.cc @@ -55,7 +55,6 @@ #include #include -#include #include #include #include @@ -318,52 +317,6 @@ uint32 ghtonl(uint32 x) { return result; } -// =================================================================== -// Shutdown support. - -namespace internal { - -struct ShutdownData { - ~ShutdownData() { - std::reverse(functions.begin(), functions.end()); - for (auto pair : functions) pair.first(pair.second); - } - - static ShutdownData* get() { - static auto* data = new ShutdownData; - return data; - } - - std::vector> functions; - Mutex mutex; -}; - -static void RunZeroArgFunc(const void* arg) { - void (*func)() = reinterpret_cast(const_cast(arg)); - func(); -} - -void OnShutdown(void (*func)()) { - OnShutdownRun(RunZeroArgFunc, reinterpret_cast(func)); -} - -void OnShutdownRun(void (*f)(const void*), const void* arg) { - auto shutdown_data = ShutdownData::get(); - MutexLock lock(&shutdown_data->mutex); - shutdown_data->functions.push_back(std::make_pair(f, arg)); -} - -} // namespace internal - -void ShutdownProtobufLibrary() { - // This function should be called only once, but accepts multiple calls. - static bool is_shutdown = false; - if (!is_shutdown) { - delete internal::ShutdownData::get(); - is_shutdown = true; - } -} - #if PROTOBUF_USE_EXCEPTIONS FatalException::~FatalException() throw() {} diff --git a/src/google/protobuf/stubs/common.h b/src/google/protobuf/stubs/common.h index 4e11880cfe..2ee72f5ea8 100644 --- a/src/google/protobuf/stubs/common.h +++ b/src/google/protobuf/stubs/common.h @@ -154,39 +154,12 @@ PROTOBUF_EXPORT char* UTF8CoerceToStructurallyValid(const StringPiece& str, } // namespace internal - -// =================================================================== -// Shutdown support. - -// Shut down the entire protocol buffers library, deleting all static-duration -// objects allocated by the library or by generated .pb.cc files. -// -// There are two reasons you might want to call this: -// * You use a draconian definition of "memory leak" in which you expect -// every single malloc() to have a corresponding free(), even for objects -// which live until program exit. -// * You are writing a dynamically-loaded library which needs to clean up -// after itself when the library is unloaded. -// -// It is safe to call this multiple times. However, it is not safe to use -// any other part of the protocol buffers library after -// ShutdownProtobufLibrary() has been called. Furthermore this call is not -// thread safe, user needs to synchronize multiple calls. +// This lives in message_lite.h now, but we leave this here for any users that +// #include common.h and not message_lite.h. PROTOBUF_EXPORT void ShutdownProtobufLibrary(); namespace internal { -// Register a function to be called when ShutdownProtocolBuffers() is called. -PROTOBUF_EXPORT void OnShutdown(void (*func)()); -// Run an arbitrary function on an arg -PROTOBUF_EXPORT void OnShutdownRun(void (*f)(const void*), const void* arg); - -template -T* OnShutdownDelete(T* p) { - OnShutdownRun([](const void* pp) { delete static_cast(pp); }, p); - return p; -} - // Strongly references the given variable such that the linker will be forced // to pull in this variable's translation unit. template diff --git a/src/google/protobuf/stubs/mathlimits.cc b/src/google/protobuf/stubs/mathlimits.cc deleted file mode 100644 index 7a335bd6c5..0000000000 --- a/src/google/protobuf/stubs/mathlimits.cc +++ /dev/null @@ -1,89 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// All Rights Reserved. -// -// Author: Maxim Lifantsev -// - -#include - -#include - -namespace google { -namespace protobuf { - -// http://en.wikipedia.org/wiki/Quadruple_precision_floating-point_format#Double-double_arithmetic -// With some compilers (gcc 4.6.x) on some platforms (powerpc64), -// "long double" is implemented as a pair of double: "double double" format. -// This causes a problem with epsilon (eps). -// eps is the smallest positive number such that 1.0 + eps > 1.0 -// -// Normal format: 1.0 + e = 1.0...01 // N-1 zeros for N fraction bits -// D-D format: 1.0 + e = 1.000...0001 // epsilon can be very small -// -// In the normal format, 1.0 + e has to fit in one stretch of bits. -// The maximum rounding error is half of eps. -// -// In the double-double format, 1.0 + e splits across two doubles: -// 1.0 in the high double, e in the low double, and they do not have to -// be contiguous. The maximum rounding error on a value close to 1.0 is -// much larger than eps. -// -// Some code checks for errors by comparing a computed value to a golden -// value +/- some multiple of the maximum rounding error. The maximum -// rounding error is not available so we use eps as an approximation -// instead. That fails when long double is in the double-double format. -// Therefore, we define kStdError as a multiple of -// max(DBL_EPSILON * DBL_EPSILON, kEpsilon) rather than a multiple of kEpsilon. - -#define DEF_FP_LIMITS(Type, PREFIX) \ -const Type MathLimits::kPosMin = PREFIX##_MIN; \ -const Type MathLimits::kPosMax = PREFIX##_MAX; \ -const Type MathLimits::kMin = -MathLimits::kPosMax; \ -const Type MathLimits::kMax = MathLimits::kPosMax; \ -const Type MathLimits::kNegMin = -MathLimits::kPosMin; \ -const Type MathLimits::kNegMax = -MathLimits::kPosMax; \ -const Type MathLimits::kEpsilon = PREFIX##_EPSILON; \ -/* 32 is 5 bits of mantissa error; should be adequate for common errors */ \ -const Type MathLimits::kStdError = \ - 32 * (DBL_EPSILON * DBL_EPSILON > MathLimits::kEpsilon \ - ? DBL_EPSILON * DBL_EPSILON : MathLimits::kEpsilon); \ -const Type MathLimits::kNaN = HUGE_VAL - HUGE_VAL; \ -const Type MathLimits::kPosInf = HUGE_VAL; \ -const Type MathLimits::kNegInf = -HUGE_VAL; - -DEF_FP_LIMITS(float, FLT) -DEF_FP_LIMITS(double, DBL) -DEF_FP_LIMITS(long double, LDBL); - -#undef DEF_FP_LIMITS -} // namespace protobuf -} // namespace google diff --git a/src/google/protobuf/stubs/mathlimits.h b/src/google/protobuf/stubs/mathlimits.h deleted file mode 100644 index 0e8443228c..0000000000 --- a/src/google/protobuf/stubs/mathlimits.h +++ /dev/null @@ -1,307 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// All Rights Reserved. -// -// Author: Maxim Lifantsev -// -// Useful integer and floating point limits and type traits. -// -// This partially replaces/duplictes numeric_limits<> from . -// We get a Google-style class that we have a greater control over -// and thus can add new features to it or fix whatever happens to be broken in -// numeric_limits for the compilers we use. -// - -#ifndef UTIL_MATH_MATHLIMITS_H__ -#define UTIL_MATH_MATHLIMITS_H__ - -// Note that for Windows we do something different because it does not support -// the plain isinf and isnan. -#if __cplusplus >= 201103L -// GCC 4.9 has a bug that makes isinf and isnan ambigious when both -// and get pulled into the same translation unit. We use the ones in -// std:: namespace explicitly for C++11 -#include -#define GOOGLE_PROTOBUF_USE_STD_CMATH -#elif _GLIBCXX_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC -// libstdc++ header undefines the global macros and put functions in -// std:: namespace even before C++11. Use the ones in std:: instead too. -#include -#define GOOGLE_PROTOBUF_USE_STD_CMATH -#else -#include -#endif - -#include - -#include - -#include - -#include - -// ========================================================================= // - -// Useful integer and floating point limits and type traits. -// This is just for the documentation; -// real members are defined in our specializations below. -namespace google { -namespace protobuf { -template struct MathLimits { - // Type name. - typedef T Type; - // Unsigned version of the Type with the same byte size. - // Same as Type for floating point and unsigned types. - typedef T UnsignedType; - // If the type supports negative values. - static const bool kIsSigned; - // If the type supports only integer values. - static const bool kIsInteger; - // Magnitude-wise smallest representable positive value. - static const Type kPosMin; - // Magnitude-wise largest representable positive value. - static const Type kPosMax; - // Smallest representable value. - static const Type kMin; - // Largest representable value. - static const Type kMax; - // Magnitude-wise smallest representable negative value. - // Present only if kIsSigned. - static const Type kNegMin; - // Magnitude-wise largest representable negative value. - // Present only if kIsSigned. - static const Type kNegMax; - // Smallest integer x such that 10^x is representable. - static const int kMin10Exp; - // Largest integer x such that 10^x is representable. - static const int kMax10Exp; - // Smallest positive value such that Type(1) + kEpsilon != Type(1) - static const Type kEpsilon; - // Typical rounding error that is enough to cover - // a few simple floating-point operations. - // Slightly larger than kEpsilon to account for a few rounding errors. - // Is zero if kIsInteger. - static const Type kStdError; - // Number of decimal digits of mantissa precision. - // Present only if !kIsInteger. - static const int kPrecisionDigits; - // Not a number, i.e. result of 0/0. - // Present only if !kIsInteger. - static const Type kNaN; - // Positive infinity, i.e. result of 1/0. - // Present only if !kIsInteger. - static const Type kPosInf; - // Negative infinity, i.e. result of -1/0. - // Present only if !kIsInteger. - static const Type kNegInf; - - // NOTE: Special floating point values behave - // in a special (but mathematically-logical) way - // in terms of (in)equalty comparison and mathematical operations - // -- see out unittest for examples. - - // Special floating point value testers. - // Present in integer types for convenience. - static bool IsFinite(const Type x); - static bool IsNaN(const Type x); - static bool IsInf(const Type x); - static bool IsPosInf(const Type x); - static bool IsNegInf(const Type x); -}; - -// ========================================================================= // - -// All #define-s below are simply to refactor the declarations of -// MathLimits template specializations. -// They are all #undef-ined below. - -// The hoop-jumping in *_INT_(MAX|MIN) below is so that the compiler does not -// get an overflow while computing the constants. - -#define SIGNED_INT_MAX(Type) \ - (((Type(1) << (sizeof(Type)*8 - 2)) - 1) + (Type(1) << (sizeof(Type)*8 - 2))) - -#define SIGNED_INT_MIN(Type) \ - (-(Type(1) << (sizeof(Type)*8 - 2)) - (Type(1) << (sizeof(Type)*8 - 2))) - -#define UNSIGNED_INT_MAX(Type) \ - (((Type(1) << (sizeof(Type)*8 - 1)) - 1) + (Type(1) << (sizeof(Type)*8 - 1))) - -// Compile-time selected log10-related constants for integer types. -#define SIGNED_MAX_10_EXP(Type) \ - (sizeof(Type) == 1 ? 2 : ( \ - sizeof(Type) == 2 ? 4 : ( \ - sizeof(Type) == 4 ? 9 : ( \ - sizeof(Type) == 8 ? 18 : -1)))) - -#define UNSIGNED_MAX_10_EXP(Type) \ - (sizeof(Type) == 1 ? 2 : ( \ - sizeof(Type) == 2 ? 4 : ( \ - sizeof(Type) == 4 ? 9 : ( \ - sizeof(Type) == 8 ? 19 : -1)))) - -#define DECL_INT_LIMIT_FUNCS \ - static bool IsFinite(const Type /*x*/) { return true; } \ - static bool IsNaN(const Type /*x*/) { return false; } \ - static bool IsInf(const Type /*x*/) { return false; } \ - static bool IsPosInf(const Type /*x*/) { return false; } \ - static bool IsNegInf(const Type /*x*/) { return false; } - -#define DECL_SIGNED_INT_LIMITS(IntType, UnsignedIntType) \ - template <> \ - struct PROTOBUF_EXPORT MathLimits { \ - typedef IntType Type; \ - typedef UnsignedIntType UnsignedType; \ - static const bool kIsSigned = true; \ - static const bool kIsInteger = true; \ - static const Type kPosMin = 1; \ - static const Type kPosMax = SIGNED_INT_MAX(Type); \ - static const Type kMin = SIGNED_INT_MIN(Type); \ - static const Type kMax = kPosMax; \ - static const Type kNegMin = -1; \ - static const Type kNegMax = kMin; \ - static const int kMin10Exp = 0; \ - static const int kMax10Exp = SIGNED_MAX_10_EXP(Type); \ - static const Type kEpsilon = 1; \ - static const Type kStdError = 0; \ - DECL_INT_LIMIT_FUNCS \ - }; - -#define DECL_UNSIGNED_INT_LIMITS(IntType) \ - template <> \ - struct PROTOBUF_EXPORT MathLimits { \ - typedef IntType Type; \ - typedef IntType UnsignedType; \ - static const bool kIsSigned = false; \ - static const bool kIsInteger = true; \ - static const Type kPosMin = 1; \ - static const Type kPosMax = UNSIGNED_INT_MAX(Type); \ - static const Type kMin = 0; \ - static const Type kMax = kPosMax; \ - static const int kMin10Exp = 0; \ - static const int kMax10Exp = UNSIGNED_MAX_10_EXP(Type); \ - static const Type kEpsilon = 1; \ - static const Type kStdError = 0; \ - DECL_INT_LIMIT_FUNCS \ - }; - -DECL_SIGNED_INT_LIMITS(signed char, unsigned char) -DECL_SIGNED_INT_LIMITS(signed short int, unsigned short int) -DECL_SIGNED_INT_LIMITS(signed int, unsigned int) -DECL_SIGNED_INT_LIMITS(signed long int, unsigned long int) -DECL_SIGNED_INT_LIMITS(signed long long int, unsigned long long int) -DECL_UNSIGNED_INT_LIMITS(unsigned char) -DECL_UNSIGNED_INT_LIMITS(unsigned short int) -DECL_UNSIGNED_INT_LIMITS(unsigned int) -DECL_UNSIGNED_INT_LIMITS(unsigned long int) -DECL_UNSIGNED_INT_LIMITS(unsigned long long int) - -#undef DECL_SIGNED_INT_LIMITS -#undef DECL_UNSIGNED_INT_LIMITS -#undef SIGNED_INT_MAX -#undef SIGNED_INT_MIN -#undef UNSIGNED_INT_MAX -#undef SIGNED_MAX_10_EXP -#undef UNSIGNED_MAX_10_EXP -#undef DECL_INT_LIMIT_FUNCS - -// For non-Windows builds we use the std:: versions of isinf and isnan if they -// are available; see the comment about at the top of this file for the -// details on why we need to do this. -#ifdef GOOGLE_PROTOBUF_USE_STD_CMATH -#define ISINF std::isinf -#define ISNAN std::isnan -#else -#define ISINF isinf -#define ISNAN isnan -#endif - -// ========================================================================= // -#if defined(_WIN32) && !defined(__MINGW32__) // Lacks built-in isnan() and isinf() -#define DECL_FP_LIMIT_FUNCS \ - static bool IsFinite(const Type x) { return _finite(x); } \ - static bool IsNaN(const Type x) { return _isnan(x); } \ - static bool IsInf(const Type x) { return (_fpclass(x) & (_FPCLASS_NINF | _FPCLASS_PINF)) != 0; } \ - static bool IsPosInf(const Type x) { return _fpclass(x) == _FPCLASS_PINF; } \ - static bool IsNegInf(const Type x) { return _fpclass(x) == _FPCLASS_NINF; } -#else -#define DECL_FP_LIMIT_FUNCS \ - static bool IsFinite(const Type x) { return !ISINF(x) && !ISNAN(x); } \ - static bool IsNaN(const Type x) { return ISNAN(x); } \ - static bool IsInf(const Type x) { return ISINF(x); } \ - static bool IsPosInf(const Type x) { return ISINF(x) && x > 0; } \ - static bool IsNegInf(const Type x) { return ISINF(x) && x < 0; } -#endif - -// We can't put floating-point constant values in the header here because -// such constants are not considered to be primitive-type constants by gcc. -// CAVEAT: Hence, they are going to be initialized only during -// the global objects construction time. -#define DECL_FP_LIMITS(FP_Type, PREFIX) \ - template <> \ - struct PROTOBUF_EXPORT MathLimits { \ - typedef FP_Type Type; \ - typedef FP_Type UnsignedType; \ - static const bool kIsSigned = true; \ - static const bool kIsInteger = false; \ - static const Type kPosMin; \ - static const Type kPosMax; \ - static const Type kMin; \ - static const Type kMax; \ - static const Type kNegMin; \ - static const Type kNegMax; \ - static const int kMin10Exp = PREFIX##_MIN_10_EXP; \ - static const int kMax10Exp = PREFIX##_MAX_10_EXP; \ - static const Type kEpsilon; \ - static const Type kStdError; \ - static const int kPrecisionDigits = PREFIX##_DIG; \ - static const Type kNaN; \ - static const Type kPosInf; \ - static const Type kNegInf; \ - DECL_FP_LIMIT_FUNCS \ - }; - -DECL_FP_LIMITS(float, FLT) -DECL_FP_LIMITS(double, DBL) -DECL_FP_LIMITS(long double, LDBL) - -#undef ISINF -#undef ISNAN -#undef DECL_FP_LIMITS -#undef DECL_FP_LIMIT_FUNCS - -// ========================================================================= // -} // namespace protobuf -} // namespace google - -#include - -#endif // UTIL_MATH_MATHLIMITS_H__ diff --git a/src/google/protobuf/stubs/mathutil.h b/src/google/protobuf/stubs/mathutil.h index 479032d064..7116d2d556 100644 --- a/src/google/protobuf/stubs/mathutil.h +++ b/src/google/protobuf/stubs/mathutil.h @@ -30,16 +30,37 @@ #ifndef GOOGLE_PROTOBUF_STUBS_MATHUTIL_H_ #define GOOGLE_PROTOBUF_STUBS_MATHUTIL_H_ +#include #include -#include +#include #include #include -#include namespace google { namespace protobuf { namespace internal { + +// Like std::make_unsigned_t except floating point types map to themselves. +template +using MakeUnsignedT = + typename std::conditional::value, std::make_unsigned, + std::common_type>::type::type; + +// Like std::isnan() except a template function that is defined for all numeric +// types. +template ::value, int>::type = 0> +bool IsNan(T val) { + return false; +} + +template ::value, + int>::type = 0> +bool IsNan(T val) { + return std::isnan(val); +} + template bool AlmostEquals(T a, T b) { return a == b; @@ -53,19 +74,20 @@ template<> inline bool AlmostEquals(double a, double b) { return fabs(a - b) < 32 * DBL_EPSILON; } + } // namespace internal class MathUtil { public: - template + template static T Sign(T value) { - if (value == T(0) || MathLimits::IsNaN(value)) { + if (value == T(0) || internal::IsNan(value)) { return value; } return value > T(0) ? 1 : -1; } - template + template static bool AlmostEquals(T a, T b) { return internal::AlmostEquals(a, b); } @@ -76,9 +98,9 @@ class MathUtil { // which should be OK because, although they (can) have different // bit representation, they are observably the same when examined // with arithmetic and (in)equality operators. - template + template static T Max(const T x, const T y) { - return MathLimits::IsNaN(x) || x > y ? x : y; + return internal::IsNan(x) || x > y ? x : y; } // Absolute value of x @@ -93,10 +115,10 @@ class MathUtil { // Absolute value of the difference between two numbers. // Works correctly for signed types and special floating point values. - template - static typename MathLimits::UnsignedType AbsDiff(const T x, const T y) { + template + static typename internal::MakeUnsignedT AbsDiff(const T x, const T y) { // Carries out arithmetic as unsigned to avoid overflow. - typedef typename MathLimits::UnsignedType R; + typedef typename internal::MakeUnsignedT R; return x > y ? R(x) - R(y) : R(y) - R(x); } @@ -123,10 +145,10 @@ bool MathUtil::WithinFractionOrMargin(const T x, const T y, // which will cause the compiler to generate code for either the "if" part // or the "then" part. In this way we avoid a compiler warning // about a potential integer overflow in crosstool v12 (gcc 4.3.1). - if (MathLimits::kIsInteger) { + if (std::numeric_limits::is_integer) { return x == y; } else { - if (!MathLimits::IsFinite(x) || !MathLimits::IsFinite(y)) { + if (!std::isfinite(x) || !std::isfinite(y)) { return false; } T relative_margin = static_cast(fraction * Max(Abs(x), Abs(y))); diff --git a/src/google/protobuf/stubs/port.h b/src/google/protobuf/stubs/port.h index 2903775ff4..31d2a10c07 100644 --- a/src/google/protobuf/stubs/port.h +++ b/src/google/protobuf/stubs/port.h @@ -32,17 +32,11 @@ #define GOOGLE_PROTOBUF_STUBS_PORT_H_ #include +#include #include #include #include #include -#if defined(__osf__) -// Tru64 lacks stdint.h, but has inttypes.h which defines a superset of -// what stdint.h would define. -#include -#elif !defined(_MSC_VER) -#include -#endif #include @@ -105,7 +99,7 @@ #define PROTOBUF_RUNTIME_DEPRECATED(message) PROTOBUF_DEPRECATED_MSG(message) #define GOOGLE_PROTOBUF_RUNTIME_DEPRECATED(message) \ - PROTOBUF_DEPRECATED_MSG(message) + PROTOBUF_DEPRECATED_MSG(message) // =================================================================== // from google3/base/port.h @@ -116,18 +110,8 @@ // undefined otherwise. Do NOT define it to 0 -- that causes // '#ifdef LANG_CXX11' to behave differently from '#if LANG_CXX11'. #define LANG_CXX11 1 -#endif - -#if LANG_CXX11 && !defined(__NVCC__) -#define PROTOBUF_CXX11 1 #else -#define PROTOBUF_CXX11 0 -#endif - -#if PROTOBUF_CXX11 -#define PROTOBUF_FINAL final -#else -#define PROTOBUF_FINAL +#error "Protobuf requires at least C++11." #endif namespace google { @@ -135,17 +119,6 @@ namespace protobuf { typedef unsigned int uint; -#ifdef _MSC_VER -typedef signed __int8 int8; -typedef __int16 int16; -typedef __int32 int32; -typedef __int64 int64; - -typedef unsigned __int8 uint8; -typedef unsigned __int16 uint16; -typedef unsigned __int32 uint32; -typedef unsigned __int64 uint64; -#else typedef int8_t int8; typedef int16_t int16; typedef int32_t int32; @@ -155,7 +128,6 @@ typedef uint8_t uint8; typedef uint16_t uint16; typedef uint32_t uint32; typedef uint64_t uint64; -#endif static const int32 kint32max = 0x7FFFFFFF; static const int32 kint32min = -kint32max - 1; diff --git a/src/google/protobuf/stubs/status.h b/src/google/protobuf/stubs/status.h index 440a0ed41a..04ecc633bc 100644 --- a/src/google/protobuf/stubs/status.h +++ b/src/google/protobuf/stubs/status.h @@ -116,8 +116,6 @@ class PROTOBUF_EXPORT Status { // Prints a human-readable representation of 'x' to 'os'. PROTOBUF_EXPORT std::ostream& operator<<(std::ostream& os, const Status& x); -#define EXPECT_OK(value) EXPECT_TRUE((value).ok()) - } // namespace util } // namespace protobuf } // namespace google diff --git a/src/google/protobuf/stubs/strutil.cc b/src/google/protobuf/stubs/strutil.cc index 06250b1dd3..62b3f0a871 100644 --- a/src/google/protobuf/stubs/strutil.cc +++ b/src/google/protobuf/stubs/strutil.cc @@ -42,7 +42,6 @@ #include #include -#include #ifdef _WIN32 // MSVC has only _snprintf, not snprintf. @@ -1277,7 +1276,7 @@ char* DoubleToBuffer(double value, char* buffer) { // of a double. This long double may have extra bits that make it compare // unequal to "value" even though it would be exactly equal if it were // truncated to a double. - volatile double parsed_value = io::NoLocaleStrtod(buffer, nullptr); + volatile double parsed_value = internal::NoLocaleStrtod(buffer, nullptr); if (parsed_value != value) { int snprintf_result = snprintf(buffer, kDoubleToBufferSize, "%.*g", DBL_DIG+2, value); @@ -1329,7 +1328,7 @@ bool safe_strtof(const char* str, float* value) { char* endptr; errno = 0; // errno only gets set on errors #if defined(_WIN32) || defined (__hpux) // has no strtof() - *value = io::NoLocaleStrtod(str, &endptr); + *value = internal::NoLocaleStrtod(str, &endptr); #else *value = strtof(str, &endptr); #endif @@ -1338,7 +1337,7 @@ bool safe_strtof(const char* str, float* value) { bool safe_strtod(const char* str, double* value) { char* endptr; - *value = io::NoLocaleStrtod(str, &endptr); + *value = internal::NoLocaleStrtod(str, &endptr); if (endptr != str) { while (ascii_isspace(*endptr)) ++endptr; } @@ -2397,5 +2396,76 @@ void CleanStringLineEndings(string *str, bool auto_end_last_line) { } } +namespace internal { + +// ---------------------------------------------------------------------- +// NoLocaleStrtod() +// This code will make you cry. +// ---------------------------------------------------------------------- + +namespace { + +// Returns a string identical to *input except that the character pointed to +// by radix_pos (which should be '.') is replaced with the locale-specific +// radix character. +std::string LocalizeRadix(const char *input, const char *radix_pos) { + // Determine the locale-specific radix character by calling sprintf() to + // print the number 1.5, then stripping off the digits. As far as I can + // tell, this is the only portable, thread-safe way to get the C library + // to divuldge the locale's radix character. No, localeconv() is NOT + // thread-safe. + char temp[16]; + int size = snprintf(temp, sizeof(temp), "%.1f", 1.5); + GOOGLE_CHECK_EQ(temp[0], '1'); + GOOGLE_CHECK_EQ(temp[size - 1], '5'); + GOOGLE_CHECK_LE(size, 6); + + // Now replace the '.' in the input with it. + std::string result; + result.reserve(strlen(input) + size - 3); + result.append(input, radix_pos); + result.append(temp + 1, size - 2); + result.append(radix_pos + 1); + return result; +} + +} // namespace + +double NoLocaleStrtod(const char *str, char **endptr) { + // We cannot simply set the locale to "C" temporarily with setlocale() + // as this is not thread-safe. Instead, we try to parse in the current + // locale first. If parsing stops at a '.' character, then this is a + // pretty good hint that we're actually in some other locale in which + // '.' is not the radix character. + + char *temp_endptr; + double result = strtod(str, &temp_endptr); + if (endptr != NULL) *endptr = temp_endptr; + if (*temp_endptr != '.') return result; + + // Parsing halted on a '.'. Perhaps we're in a different locale? Let's + // try to replace the '.' with a locale-specific radix character and + // try again. + std::string localized = LocalizeRadix(str, temp_endptr); + const char *localized_cstr = localized.c_str(); + char *localized_endptr; + result = strtod(localized_cstr, &localized_endptr); + if ((localized_endptr - localized_cstr) > (temp_endptr - str)) { + // This attempt got further, so replacing the decimal must have helped. + // Update endptr to point at the right location. + if (endptr != NULL) { + // size_diff is non-zero if the localized radix has multiple bytes. + int size_diff = localized.size() - strlen(str); + // const_cast is necessary to match the strtod() interface. + *endptr = const_cast( + str + (localized_endptr - localized_cstr - size_diff)); + } + } + + return result; +} + +} // namespace internal + } // namespace protobuf } // namespace google diff --git a/src/google/protobuf/stubs/strutil.h b/src/google/protobuf/stubs/strutil.h index e28d22ec8b..e688c8e838 100644 --- a/src/google/protobuf/stubs/strutil.h +++ b/src/google/protobuf/stubs/strutil.h @@ -930,6 +930,14 @@ inline bool EndsWith(StringPiece text, StringPiece suffix) { } } // namespace strings +namespace internal { + +// A locale-independent version of the standard strtod(), which always +// uses a dot as the decimal separator. +double NoLocaleStrtod(const char* str, char** endptr); + +} // namespace internal + } // namespace protobuf } // namespace google diff --git a/src/google/protobuf/stubs/strutil_unittest.cc b/src/google/protobuf/stubs/strutil_unittest.cc index 07d16efacd..141d263a40 100644 --- a/src/google/protobuf/stubs/strutil_unittest.cc +++ b/src/google/protobuf/stubs/strutil_unittest.cc @@ -836,49 +836,59 @@ TEST(StrCat, Ints) { EXPECT_EQ(answer, "130"); } -class ReplaceChars : public ::testing::TestWithParam> { -}; +class ReplaceChars : public ::testing::TestWithParam< + std::tuple> {}; TEST_P(ReplaceChars, ReplacesAllOccurencesOfAnyCharInReplaceWithAReplaceChar) { - string expected = std::get<0>(GetParam()); - string string_to_replace_in = std::get<1>(GetParam()); - const char* what_to_replace = std::get<2>(GetParam()); - char replacement = std::get<3>(GetParam()); - ReplaceCharacters(&string_to_replace_in, what_to_replace, replacement); - ASSERT_EQ(expected, string_to_replace_in); + string expected = std::get<0>(GetParam()); + string string_to_replace_in = std::get<1>(GetParam()); + const char* what_to_replace = std::get<2>(GetParam()); + char replacement = std::get<3>(GetParam()); + ReplaceCharacters(&string_to_replace_in, what_to_replace, replacement); + ASSERT_EQ(expected, string_to_replace_in); } -INSTANTIATE_TEST_CASE_P(Replace, - ReplaceChars, +INSTANTIATE_TEST_CASE_P( + Replace, ReplaceChars, ::testing::Values( - std::make_tuple("", "", "", '_'), // empty string should remain empty - std::make_tuple(" ", " ", "", '_'), // no replacement string - std::make_tuple(" ", " ", "_-abcedf", '*'), // replacement character not in string - std::make_tuple("replace", "Replace", "R", 'r'), // replace one character - std::make_tuple("not_spaces__", "not\nspaces\t ", " \t\r\n", '_'), // replace some special characters - std::make_tuple("c++", "cxx", "x", '+'), // same character multiple times - std::make_tuple("qvvvvvng v T", "queueing a T", "aeiou", 'v'))); // replace all voewls - -class StripWs: public ::testing::TestWithParam> { -}; + std::make_tuple("", "", "", '_'), // empty string should remain empty + std::make_tuple(" ", " ", "", '_'), // no replacement string + std::make_tuple(" ", " ", "_-abcedf", + '*'), // replacement character not in string + std::make_tuple("replace", "Replace", "R", + 'r'), // replace one character + std::make_tuple("not_spaces__", "not\nspaces\t ", " \t\r\n", + '_'), // replace some special characters + std::make_tuple("c++", "cxx", "x", + '+'), // same character multiple times + std::make_tuple("qvvvvvng v T", "queueing a T", "aeiou", + 'v'))); // replace all voewls + +class StripWs : public ::testing::TestWithParam> {}; TEST_P(StripWs, AlwaysStripsLeadingAndTrailingWhitespace) { - string expected = std::get<0>(GetParam()); - string string_to_strip = std::get<1>(GetParam()); - StripWhitespace(&string_to_strip); - ASSERT_EQ(expected, string_to_strip); + string expected = std::get<0>(GetParam()); + string string_to_strip = std::get<1>(GetParam()); + StripWhitespace(&string_to_strip); + ASSERT_EQ(expected, string_to_strip); } -INSTANTIATE_TEST_CASE_P(Strip, - StripWs, +INSTANTIATE_TEST_CASE_P( + Strip, StripWs, ::testing::Values( - std::make_tuple("", ""), // empty string should remain empty - std::make_tuple("", " "), // only ws should become empty - std::make_tuple("no whitespace", " no whitespace"), // leading ws removed - std::make_tuple("no whitespace", "no whitespace "), // trailing ws removed - std::make_tuple("no whitespace", " no whitespace "), // same nb. of leading and trailing - std::make_tuple("no whitespace", " no whitespace "), // different nb. of leading/trailing - std::make_tuple("no whitespace", " no whitespace "))); // more trailing than leading + std::make_tuple("", ""), // empty string should remain empty + std::make_tuple("", " "), // only ws should become empty + std::make_tuple("no whitespace", + " no whitespace"), // leading ws removed + std::make_tuple("no whitespace", + "no whitespace "), // trailing ws removed + std::make_tuple("no whitespace", + " no whitespace "), // same nb. of leading and trailing + std::make_tuple( + "no whitespace", + " no whitespace "), // different nb. of leading/trailing + std::make_tuple("no whitespace", + " no whitespace "))); // more trailing than leading } // anonymous namespace } // namespace protobuf diff --git a/src/google/protobuf/test_messages_proto2.proto b/src/google/protobuf/test_messages_proto2.proto index 1d0c33f566..f8207431e3 100644 --- a/src/google/protobuf/test_messages_proto2.proto +++ b/src/google/protobuf/test_messages_proto2.proto @@ -1,3 +1,33 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // https://developers.google.com/protocol-buffers/ diff --git a/src/google/protobuf/test_messages_proto3.proto b/src/google/protobuf/test_messages_proto3.proto index a10f44d946..803e2c31ea 100644 --- a/src/google/protobuf/test_messages_proto3.proto +++ b/src/google/protobuf/test_messages_proto3.proto @@ -1,3 +1,33 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // https://developers.google.com/protocol-buffers/ diff --git a/src/google/protobuf/text_format.cc b/src/google/protobuf/text_format.cc index be8231d659..6b33088927 100644 --- a/src/google/protobuf/text_format.cc +++ b/src/google/protobuf/text_format.cc @@ -35,11 +35,11 @@ #include #include -#include #include #include #include +#include #include #include @@ -2093,7 +2093,7 @@ bool MapFieldPrinterHelper::SortMap( if (base.IsRepeatedFieldValid()) { const RepeatedPtrField& map_field = - reflection->GetRepeatedPtrField(message, field); + reflection->GetRepeatedPtrFieldInternal(message, field); for (int i = 0; i < map_field.size(); ++i) { sorted_map_field->push_back( const_cast*>(&map_field)->Mutable(i)); @@ -2367,8 +2367,7 @@ void TextFormat::Printer::PrintFieldValue(const Message& message, // it is possible for the user to force an unknown integer value. So we // simply use the integer value itself as the enum value name in this // case. - printer->PrintEnum(enum_value, StringPrintf("%d", enum_value), - generator); + printer->PrintEnum(enum_value, StrCat(enum_value), generator); } break; } diff --git a/src/google/protobuf/text_format_unittest.cc b/src/google/protobuf/text_format_unittest.cc index dd507da8b6..3bb20b793a 100644 --- a/src/google/protobuf/text_format_unittest.cc +++ b/src/google/protobuf/text_format_unittest.cc @@ -58,7 +58,6 @@ #include #include #include -#include #include @@ -1203,8 +1202,8 @@ TEST_F(TextFormatTest, ParseExotic) { -std::numeric_limits::infinity()); EXPECT_EQ(message.repeated_double(10), -std::numeric_limits::infinity()); - EXPECT_TRUE(MathLimits::IsNaN(message.repeated_double(11))); - EXPECT_TRUE(MathLimits::IsNaN(message.repeated_double(12))); + EXPECT_TRUE(std::isnan(message.repeated_double(11))); + EXPECT_TRUE(std::isnan(message.repeated_double(12))); // Note: Since these string literals have \0's in them, we must explicitly // pass their sizes to string's constructor. diff --git a/src/google/protobuf/timestamp.pb.cc b/src/google/protobuf/timestamp.pb.cc index d079916b07..24a299ef01 100644 --- a/src/google/protobuf/timestamp.pb.cc +++ b/src/google/protobuf/timestamp.pb.cc @@ -195,7 +195,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Timestamp::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Timestamp::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Timestamp) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; diff --git a/src/google/protobuf/timestamp.pb.h b/src/google/protobuf/timestamp.pb.h index ec8a709d34..497db63c7b 100644 --- a/src/google/protobuf/timestamp.pb.h +++ b/src/google/protobuf/timestamp.pb.h @@ -151,7 +151,7 @@ class PROTOBUF_EXPORT Timestamp : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } diff --git a/src/google/protobuf/type.pb.cc b/src/google/protobuf/type.pb.cc index b6d9390840..0db802cccc 100644 --- a/src/google/protobuf/type.pb.cc +++ b/src/google/protobuf/type.pb.cc @@ -486,7 +486,9 @@ const char* Type::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::inter // string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_name(), ptr, ctx, "google.protobuf.Type.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Type.name")); CHK_(ptr); } else goto handle_unusual; continue; @@ -508,7 +510,9 @@ const char* Type::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::inter ptr -= 1; do { ptr += 1; - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_add_oneofs(), ptr, ctx, "google.protobuf.Type.oneofs"); + auto str = _internal_add_oneofs(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Type.oneofs")); CHK_(ptr); if (!ctx->DataAvailable(ptr)) break; } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<26>(ptr)); @@ -561,7 +565,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Type::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Type::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Type) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -582,7 +586,7 @@ failure: n = static_cast(this->_internal_fields_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(2, this->_internal_fields(i), target, stream); + InternalWriteMessage(2, this->_internal_fields(i), target, stream); } // repeated string oneofs = 3; @@ -600,14 +604,14 @@ failure: n = static_cast(this->_internal_options_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(4, this->_internal_options(i), target, stream); + InternalWriteMessage(4, this->_internal_options(i), target, stream); } // .google.protobuf.SourceContext source_context = 5; if (this->has_source_context()) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 5, _Internal::source_context(this), target, stream); } @@ -898,14 +902,18 @@ const char* Field::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::inte // string name = 4; case 4: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 34)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_name(), ptr, ctx, "google.protobuf.Field.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Field.name")); CHK_(ptr); } else goto handle_unusual; continue; // string type_url = 6; case 6: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 50)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_type_url(), ptr, ctx, "google.protobuf.Field.type_url"); + auto str = _internal_mutable_type_url(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Field.type_url")); CHK_(ptr); } else goto handle_unusual; continue; @@ -938,14 +946,18 @@ const char* Field::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::inte // string json_name = 10; case 10: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 82)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_json_name(), ptr, ctx, "google.protobuf.Field.json_name"); + auto str = _internal_mutable_json_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Field.json_name")); CHK_(ptr); } else goto handle_unusual; continue; // string default_value = 11; case 11: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 90)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_default_value(), ptr, ctx, "google.protobuf.Field.default_value"); + auto str = _internal_mutable_default_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Field.default_value")); CHK_(ptr); } else goto handle_unusual; continue; @@ -969,7 +981,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Field::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Field::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Field) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1032,7 +1044,7 @@ failure: n = static_cast(this->_internal_options_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(9, this->_internal_options(i), target, stream); + InternalWriteMessage(9, this->_internal_options(i), target, stream); } // string json_name = 10; @@ -1370,7 +1382,9 @@ const char* Enum::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::inter // string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_name(), ptr, ctx, "google.protobuf.Enum.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Enum.name")); CHK_(ptr); } else goto handle_unusual; continue; @@ -1433,7 +1447,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Enum::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Enum::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Enum) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1454,7 +1468,7 @@ failure: n = static_cast(this->_internal_enumvalue_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(2, this->_internal_enumvalue(i), target, stream); + InternalWriteMessage(2, this->_internal_enumvalue(i), target, stream); } // repeated .google.protobuf.Option options = 3; @@ -1462,14 +1476,14 @@ failure: n = static_cast(this->_internal_options_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(3, this->_internal_options(i), target, stream); + InternalWriteMessage(3, this->_internal_options(i), target, stream); } // .google.protobuf.SourceContext source_context = 4; if (this->has_source_context()) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 4, _Internal::source_context(this), target, stream); } @@ -1697,7 +1711,9 @@ const char* EnumValue::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID:: // string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_name(), ptr, ctx, "google.protobuf.EnumValue.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.EnumValue.name")); CHK_(ptr); } else goto handle_unusual; continue; @@ -1740,7 +1756,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* EnumValue::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* EnumValue::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumValue) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1767,7 +1783,7 @@ failure: n = static_cast(this->_internal_options_size()); i < n; i++) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray(3, this->_internal_options(i), target, stream); + InternalWriteMessage(3, this->_internal_options(i), target, stream); } if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { @@ -1999,7 +2015,9 @@ const char* Option::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::int // string name = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_name(), ptr, ctx, "google.protobuf.Option.name"); + auto str = _internal_mutable_name(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.Option.name")); CHK_(ptr); } else goto handle_unusual; continue; @@ -2030,7 +2048,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Option::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Option::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Option) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -2050,7 +2068,7 @@ failure: if (this->has_value()) { target = stream->EnsureSpace(target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessageToArray( + InternalWriteMessage( 2, _Internal::value(this), target, stream); } diff --git a/src/google/protobuf/type.pb.h b/src/google/protobuf/type.pb.h index 56d4d0ca3b..679e132502 100644 --- a/src/google/protobuf/type.pb.h +++ b/src/google/protobuf/type.pb.h @@ -264,7 +264,7 @@ class PROTOBUF_EXPORT Type : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -528,7 +528,7 @@ class PROTOBUF_EXPORT Field : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -949,7 +949,7 @@ class PROTOBUF_EXPORT Enum : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -1187,7 +1187,7 @@ class PROTOBUF_EXPORT EnumValue : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -1385,7 +1385,7 @@ class PROTOBUF_EXPORT Option : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } diff --git a/src/google/protobuf/unittest_lite.proto b/src/google/protobuf/unittest_lite.proto index d6f1149cf0..979c8416b4 100644 --- a/src/google/protobuf/unittest_lite.proto +++ b/src/google/protobuf/unittest_lite.proto @@ -33,17 +33,16 @@ // This is like unittest.proto but with optimize_for = LITE_RUNTIME. syntax = "proto2"; + package protobuf_unittest; import "google/protobuf/unittest_import_lite.proto"; option optimize_for = LITE_RUNTIME; - option java_package = "com.google.protobuf"; // Same as TestAllTypes but with the lite runtime. message TestAllTypesLite { - message NestedMessage { optional int32 bb = 1; optional int64 cc = 2; @@ -56,104 +55,105 @@ message TestAllTypesLite { } // Singular - optional int32 optional_int32 = 1; - optional int64 optional_int64 = 2; - optional uint32 optional_uint32 = 3; - optional uint64 optional_uint64 = 4; - optional sint32 optional_sint32 = 5; - optional sint64 optional_sint64 = 6; - optional fixed32 optional_fixed32 = 7; - optional fixed64 optional_fixed64 = 8; - optional sfixed32 optional_sfixed32 = 9; + optional int32 optional_int32 = 1; + optional int64 optional_int64 = 2; + optional uint32 optional_uint32 = 3; + optional uint64 optional_uint64 = 4; + optional sint32 optional_sint32 = 5; + optional sint64 optional_sint64 = 6; + optional fixed32 optional_fixed32 = 7; + optional fixed64 optional_fixed64 = 8; + optional sfixed32 optional_sfixed32 = 9; optional sfixed64 optional_sfixed64 = 10; - optional float optional_float = 11; - optional double optional_double = 12; - optional bool optional_bool = 13; - optional string optional_string = 14; - optional bytes optional_bytes = 15; + optional float optional_float = 11; + optional double optional_double = 12; + optional bool optional_bool = 13; + optional string optional_string = 14; + optional bytes optional_bytes = 15; optional group OptionalGroup = 16 { optional int32 a = 17; } - optional NestedMessage optional_nested_message = 18; + optional NestedMessage optional_nested_message = 18; optional ForeignMessageLite optional_foreign_message = 19; - optional protobuf_unittest_import.ImportMessageLite - optional_import_message = 20; + optional protobuf_unittest_import.ImportMessageLite optional_import_message = + 20; - optional NestedEnum optional_nested_enum = 21; - optional ForeignEnumLite optional_foreign_enum = 22; + optional NestedEnum optional_nested_enum = 21; + optional ForeignEnumLite optional_foreign_enum = 22; optional protobuf_unittest_import.ImportEnumLite optional_import_enum = 23; - optional string optional_string_piece = 24 [ctype=STRING_PIECE]; - optional string optional_cord = 25 [ctype=CORD]; + optional string optional_string_piece = 24 [ctype = STRING_PIECE]; + optional string optional_cord = 25 [ctype = CORD]; // Defined in unittest_import_public.proto optional protobuf_unittest_import.PublicImportMessageLite optional_public_import_message = 26; - optional NestedMessage optional_lazy_message = 27 [lazy=true]; + optional NestedMessage optional_lazy_message = 27 [lazy = true]; // Repeated - repeated int32 repeated_int32 = 31; - repeated int64 repeated_int64 = 32; - repeated uint32 repeated_uint32 = 33; - repeated uint64 repeated_uint64 = 34; - repeated sint32 repeated_sint32 = 35; - repeated sint64 repeated_sint64 = 36; - repeated fixed32 repeated_fixed32 = 37; - repeated fixed64 repeated_fixed64 = 38; + repeated int32 repeated_int32 = 31; + repeated int64 repeated_int64 = 32; + repeated uint32 repeated_uint32 = 33; + repeated uint64 repeated_uint64 = 34; + repeated sint32 repeated_sint32 = 35; + repeated sint64 repeated_sint64 = 36; + repeated fixed32 repeated_fixed32 = 37; + repeated fixed64 repeated_fixed64 = 38; repeated sfixed32 repeated_sfixed32 = 39; repeated sfixed64 repeated_sfixed64 = 40; - repeated float repeated_float = 41; - repeated double repeated_double = 42; - repeated bool repeated_bool = 43; - repeated string repeated_string = 44; - repeated bytes repeated_bytes = 45; + repeated float repeated_float = 41; + repeated double repeated_double = 42; + repeated bool repeated_bool = 43; + repeated string repeated_string = 44; + repeated bytes repeated_bytes = 45; repeated group RepeatedGroup = 46 { optional int32 a = 47; } - repeated NestedMessage repeated_nested_message = 48; + repeated NestedMessage repeated_nested_message = 48; repeated ForeignMessageLite repeated_foreign_message = 49; - repeated protobuf_unittest_import.ImportMessageLite - repeated_import_message = 50; + repeated protobuf_unittest_import.ImportMessageLite repeated_import_message = + 50; - repeated NestedEnum repeated_nested_enum = 51; + repeated NestedEnum repeated_nested_enum = 51; repeated ForeignEnumLite repeated_foreign_enum = 52; repeated protobuf_unittest_import.ImportEnumLite repeated_import_enum = 53; - repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; - repeated string repeated_cord = 55 [ctype=CORD]; + repeated string repeated_string_piece = 54 [ctype = STRING_PIECE]; + repeated string repeated_cord = 55 [ctype = CORD]; - repeated NestedMessage repeated_lazy_message = 57 [lazy=true]; + repeated NestedMessage repeated_lazy_message = 57 [lazy = true]; // Singular with defaults - optional int32 default_int32 = 61 [default = 41 ]; - optional int64 default_int64 = 62 [default = 42 ]; - optional uint32 default_uint32 = 63 [default = 43 ]; - optional uint64 default_uint64 = 64 [default = 44 ]; - optional sint32 default_sint32 = 65 [default = -45 ]; - optional sint64 default_sint64 = 66 [default = 46 ]; - optional fixed32 default_fixed32 = 67 [default = 47 ]; - optional fixed64 default_fixed64 = 68 [default = 48 ]; - optional sfixed32 default_sfixed32 = 69 [default = 49 ]; - optional sfixed64 default_sfixed64 = 70 [default = -50 ]; - optional float default_float = 71 [default = 51.5 ]; - optional double default_double = 72 [default = 52e3 ]; - optional bool default_bool = 73 [default = true ]; - optional string default_string = 74 [default = "hello"]; - optional bytes default_bytes = 75 [default = "world"]; + optional int32 default_int32 = 61 [default = 41]; + optional int64 default_int64 = 62 [default = 42]; + optional uint32 default_uint32 = 63 [default = 43]; + optional uint64 default_uint64 = 64 [default = 44]; + optional sint32 default_sint32 = 65 [default = -45]; + optional sint64 default_sint64 = 66 [default = 46]; + optional fixed32 default_fixed32 = 67 [default = 47]; + optional fixed64 default_fixed64 = 68 [default = 48]; + optional sfixed32 default_sfixed32 = 69 [default = 49]; + optional sfixed64 default_sfixed64 = 70 [default = -50]; + optional float default_float = 71 [default = 51.5]; + optional double default_double = 72 [default = 52e3]; + optional bool default_bool = 73 [default = true]; + optional string default_string = 74 [default = "hello"]; + optional bytes default_bytes = 75 [default = "world"]; optional NestedEnum default_nested_enum = 81 [default = BAR]; optional ForeignEnumLite default_foreign_enum = 82 [default = FOREIGN_LITE_BAR]; - optional protobuf_unittest_import.ImportEnumLite - default_import_enum = 83 [default = IMPORT_LITE_BAR]; + optional protobuf_unittest_import.ImportEnumLite default_import_enum = 83 + [default = IMPORT_LITE_BAR]; - optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"]; - optional string default_cord = 85 [ctype=CORD,default="123"]; + optional string default_string_piece = 84 + [ctype = STRING_PIECE, default = "abc"]; + optional string default_cord = 85 [ctype = CORD, default = "123"]; // For oneof test oneof oneof_field { @@ -179,20 +179,20 @@ enum ForeignEnumLite { } message TestPackedTypesLite { - repeated int32 packed_int32 = 90 [packed = true]; - repeated int64 packed_int64 = 91 [packed = true]; - repeated uint32 packed_uint32 = 92 [packed = true]; - repeated uint64 packed_uint64 = 93 [packed = true]; - repeated sint32 packed_sint32 = 94 [packed = true]; - repeated sint64 packed_sint64 = 95 [packed = true]; - repeated fixed32 packed_fixed32 = 96 [packed = true]; - repeated fixed64 packed_fixed64 = 97 [packed = true]; - repeated sfixed32 packed_sfixed32 = 98 [packed = true]; - repeated sfixed64 packed_sfixed64 = 99 [packed = true]; - repeated float packed_float = 100 [packed = true]; - repeated double packed_double = 101 [packed = true]; - repeated bool packed_bool = 102 [packed = true]; - repeated ForeignEnumLite packed_enum = 103 [packed = true]; + repeated int32 packed_int32 = 90 [packed = true]; + repeated int64 packed_int64 = 91 [packed = true]; + repeated uint32 packed_uint32 = 92 [packed = true]; + repeated uint64 packed_uint64 = 93 [packed = true]; + repeated sint32 packed_sint32 = 94 [packed = true]; + repeated sint64 packed_sint64 = 95 [packed = true]; + repeated fixed32 packed_fixed32 = 96 [packed = true]; + repeated fixed64 packed_fixed64 = 97 [packed = true]; + repeated sfixed32 packed_sfixed32 = 98 [packed = true]; + repeated sfixed64 packed_sfixed64 = 99 [packed = true]; + repeated float packed_float = 100 [packed = true]; + repeated double packed_double = 101 [packed = true]; + repeated bool packed_bool = 102 [packed = true]; + repeated ForeignEnumLite packed_enum = 103 [packed = true]; } message TestAllExtensionsLite { @@ -201,117 +201,119 @@ message TestAllExtensionsLite { extend TestAllExtensionsLite { // Singular - optional int32 optional_int32_extension_lite = 1; - optional int64 optional_int64_extension_lite = 2; - optional uint32 optional_uint32_extension_lite = 3; - optional uint64 optional_uint64_extension_lite = 4; - optional sint32 optional_sint32_extension_lite = 5; - optional sint64 optional_sint64_extension_lite = 6; - optional fixed32 optional_fixed32_extension_lite = 7; - optional fixed64 optional_fixed64_extension_lite = 8; - optional sfixed32 optional_sfixed32_extension_lite = 9; + optional int32 optional_int32_extension_lite = 1; + optional int64 optional_int64_extension_lite = 2; + optional uint32 optional_uint32_extension_lite = 3; + optional uint64 optional_uint64_extension_lite = 4; + optional sint32 optional_sint32_extension_lite = 5; + optional sint64 optional_sint64_extension_lite = 6; + optional fixed32 optional_fixed32_extension_lite = 7; + optional fixed64 optional_fixed64_extension_lite = 8; + optional sfixed32 optional_sfixed32_extension_lite = 9; optional sfixed64 optional_sfixed64_extension_lite = 10; - optional float optional_float_extension_lite = 11; - optional double optional_double_extension_lite = 12; - optional bool optional_bool_extension_lite = 13; - optional string optional_string_extension_lite = 14; - optional bytes optional_bytes_extension_lite = 15; + optional float optional_float_extension_lite = 11; + optional double optional_double_extension_lite = 12; + optional bool optional_bool_extension_lite = 13; + optional string optional_string_extension_lite = 14; + optional bytes optional_bytes_extension_lite = 15; optional group OptionalGroup_extension_lite = 16 { optional int32 a = 17; } - optional TestAllTypesLite.NestedMessage optional_nested_message_extension_lite - = 18; + optional TestAllTypesLite.NestedMessage + optional_nested_message_extension_lite = 18; optional ForeignMessageLite optional_foreign_message_extension_lite = 19; optional protobuf_unittest_import.ImportMessageLite - optional_import_message_extension_lite = 20; + optional_import_message_extension_lite = 20; optional TestAllTypesLite.NestedEnum optional_nested_enum_extension_lite = 21; optional ForeignEnumLite optional_foreign_enum_extension_lite = 22; optional protobuf_unittest_import.ImportEnumLite - optional_import_enum_extension_lite = 23; + optional_import_enum_extension_lite = 23; optional string optional_string_piece_extension_lite = 24 - [ctype=STRING_PIECE]; - optional string optional_cord_extension_lite = 25 [ctype=CORD]; + [ctype = STRING_PIECE]; + optional string optional_cord_extension_lite = 25 [ctype = CORD]; optional protobuf_unittest_import.PublicImportMessageLite - optional_public_import_message_extension_lite = 26; + optional_public_import_message_extension_lite = 26; - optional TestAllTypesLite.NestedMessage - optional_lazy_message_extension_lite = 27 [lazy=true]; + optional TestAllTypesLite.NestedMessage optional_lazy_message_extension_lite = + 27 [lazy = true]; // Repeated - repeated int32 repeated_int32_extension_lite = 31; - repeated int64 repeated_int64_extension_lite = 32; - repeated uint32 repeated_uint32_extension_lite = 33; - repeated uint64 repeated_uint64_extension_lite = 34; - repeated sint32 repeated_sint32_extension_lite = 35; - repeated sint64 repeated_sint64_extension_lite = 36; - repeated fixed32 repeated_fixed32_extension_lite = 37; - repeated fixed64 repeated_fixed64_extension_lite = 38; + repeated int32 repeated_int32_extension_lite = 31; + repeated int64 repeated_int64_extension_lite = 32; + repeated uint32 repeated_uint32_extension_lite = 33; + repeated uint64 repeated_uint64_extension_lite = 34; + repeated sint32 repeated_sint32_extension_lite = 35; + repeated sint64 repeated_sint64_extension_lite = 36; + repeated fixed32 repeated_fixed32_extension_lite = 37; + repeated fixed64 repeated_fixed64_extension_lite = 38; repeated sfixed32 repeated_sfixed32_extension_lite = 39; repeated sfixed64 repeated_sfixed64_extension_lite = 40; - repeated float repeated_float_extension_lite = 41; - repeated double repeated_double_extension_lite = 42; - repeated bool repeated_bool_extension_lite = 43; - repeated string repeated_string_extension_lite = 44; - repeated bytes repeated_bytes_extension_lite = 45; + repeated float repeated_float_extension_lite = 41; + repeated double repeated_double_extension_lite = 42; + repeated bool repeated_bool_extension_lite = 43; + repeated string repeated_string_extension_lite = 44; + repeated bytes repeated_bytes_extension_lite = 45; repeated group RepeatedGroup_extension_lite = 46 { optional int32 a = 47; } - repeated TestAllTypesLite.NestedMessage repeated_nested_message_extension_lite - = 48; + repeated TestAllTypesLite.NestedMessage + repeated_nested_message_extension_lite = 48; repeated ForeignMessageLite repeated_foreign_message_extension_lite = 49; repeated protobuf_unittest_import.ImportMessageLite - repeated_import_message_extension_lite = 50; + repeated_import_message_extension_lite = 50; repeated TestAllTypesLite.NestedEnum repeated_nested_enum_extension_lite = 51; repeated ForeignEnumLite repeated_foreign_enum_extension_lite = 52; repeated protobuf_unittest_import.ImportEnumLite - repeated_import_enum_extension_lite = 53; + repeated_import_enum_extension_lite = 53; repeated string repeated_string_piece_extension_lite = 54 - [ctype=STRING_PIECE]; - repeated string repeated_cord_extension_lite = 55 [ctype=CORD]; + [ctype = STRING_PIECE]; + repeated string repeated_cord_extension_lite = 55 [ctype = CORD]; - repeated TestAllTypesLite.NestedMessage - repeated_lazy_message_extension_lite = 57 [lazy=true]; + repeated TestAllTypesLite.NestedMessage repeated_lazy_message_extension_lite = + 57 [lazy = true]; // Singular with defaults - optional int32 default_int32_extension_lite = 61 [default = 41 ]; - optional int64 default_int64_extension_lite = 62 [default = 42 ]; - optional uint32 default_uint32_extension_lite = 63 [default = 43 ]; - optional uint64 default_uint64_extension_lite = 64 [default = 44 ]; - optional sint32 default_sint32_extension_lite = 65 [default = -45 ]; - optional sint64 default_sint64_extension_lite = 66 [default = 46 ]; - optional fixed32 default_fixed32_extension_lite = 67 [default = 47 ]; - optional fixed64 default_fixed64_extension_lite = 68 [default = 48 ]; - optional sfixed32 default_sfixed32_extension_lite = 69 [default = 49 ]; - optional sfixed64 default_sfixed64_extension_lite = 70 [default = -50 ]; - optional float default_float_extension_lite = 71 [default = 51.5 ]; - optional double default_double_extension_lite = 72 [default = 52e3 ]; - optional bool default_bool_extension_lite = 73 [default = true ]; - optional string default_string_extension_lite = 74 [default = "hello"]; - optional bytes default_bytes_extension_lite = 75 [default = "world"]; - - optional TestAllTypesLite.NestedEnum - default_nested_enum_extension_lite = 81 [default = BAR]; - optional ForeignEnumLite - default_foreign_enum_extension_lite = 82 [default = FOREIGN_LITE_BAR]; + optional int32 default_int32_extension_lite = 61 [default = 41]; + optional int64 default_int64_extension_lite = 62 [default = 42]; + optional uint32 default_uint32_extension_lite = 63 [default = 43]; + optional uint64 default_uint64_extension_lite = 64 [default = 44]; + optional sint32 default_sint32_extension_lite = 65 [default = -45]; + optional sint64 default_sint64_extension_lite = 66 [default = 46]; + optional fixed32 default_fixed32_extension_lite = 67 [default = 47]; + optional fixed64 default_fixed64_extension_lite = 68 [default = 48]; + optional sfixed32 default_sfixed32_extension_lite = 69 [default = 49]; + optional sfixed64 default_sfixed64_extension_lite = 70 [default = -50]; + optional float default_float_extension_lite = 71 [default = 51.5]; + optional double default_double_extension_lite = 72 [default = 52e3]; + optional bool default_bool_extension_lite = 73 [default = true]; + optional string default_string_extension_lite = 74 [default = "hello"]; + optional bytes default_bytes_extension_lite = 75 [default = "world"]; + + optional TestAllTypesLite.NestedEnum default_nested_enum_extension_lite = 81 + [default = BAR]; + optional ForeignEnumLite default_foreign_enum_extension_lite = 82 + [default = FOREIGN_LITE_BAR]; optional protobuf_unittest_import.ImportEnumLite - default_import_enum_extension_lite = 83 [default = IMPORT_LITE_BAR]; + default_import_enum_extension_lite = 83 [default = IMPORT_LITE_BAR]; - optional string default_string_piece_extension_lite = 84 [ctype=STRING_PIECE, - default="abc"]; - optional string default_cord_extension_lite = 85 [ctype=CORD, default="123"]; + optional string default_string_piece_extension_lite = 84 + [ctype = STRING_PIECE, default = "abc"]; + optional string default_cord_extension_lite = 85 + [ctype = CORD, default = "123"]; // For oneof test optional uint32 oneof_uint32_extension_lite = 111; - optional TestAllTypesLite.NestedMessage oneof_nested_message_extension_lite = 112; + optional TestAllTypesLite.NestedMessage oneof_nested_message_extension_lite = + 112; optional string oneof_string_extension_lite = 113; optional bytes oneof_bytes_extension_lite = 114; } @@ -321,19 +323,19 @@ message TestPackedExtensionsLite { } extend TestPackedExtensionsLite { - repeated int32 packed_int32_extension_lite = 90 [packed = true]; - repeated int64 packed_int64_extension_lite = 91 [packed = true]; - repeated uint32 packed_uint32_extension_lite = 92 [packed = true]; - repeated uint64 packed_uint64_extension_lite = 93 [packed = true]; - repeated sint32 packed_sint32_extension_lite = 94 [packed = true]; - repeated sint64 packed_sint64_extension_lite = 95 [packed = true]; - repeated fixed32 packed_fixed32_extension_lite = 96 [packed = true]; - repeated fixed64 packed_fixed64_extension_lite = 97 [packed = true]; - repeated sfixed32 packed_sfixed32_extension_lite = 98 [packed = true]; - repeated sfixed64 packed_sfixed64_extension_lite = 99 [packed = true]; - repeated float packed_float_extension_lite = 100 [packed = true]; - repeated double packed_double_extension_lite = 101 [packed = true]; - repeated bool packed_bool_extension_lite = 102 [packed = true]; + repeated int32 packed_int32_extension_lite = 90 [packed = true]; + repeated int64 packed_int64_extension_lite = 91 [packed = true]; + repeated uint32 packed_uint32_extension_lite = 92 [packed = true]; + repeated uint64 packed_uint64_extension_lite = 93 [packed = true]; + repeated sint32 packed_sint32_extension_lite = 94 [packed = true]; + repeated sint64 packed_sint64_extension_lite = 95 [packed = true]; + repeated fixed32 packed_fixed32_extension_lite = 96 [packed = true]; + repeated fixed64 packed_fixed64_extension_lite = 97 [packed = true]; + repeated sfixed32 packed_sfixed32_extension_lite = 98 [packed = true]; + repeated sfixed64 packed_sfixed64_extension_lite = 99 [packed = true]; + repeated float packed_float_extension_lite = 100 [packed = true]; + repeated double packed_double_extension_lite = 101 [packed = true]; + repeated bool packed_bool_extension_lite = 102 [packed = true]; repeated ForeignEnumLite packed_enum_extension_lite = 103 [packed = true]; } @@ -347,6 +349,9 @@ message TestNestedExtensionLite { // point this failed). message TestDeprecatedLite { optional int32 deprecated_field = 1 [deprecated = true]; + required int32 deprecated_field2 = 2 [deprecated = true]; + optional string deprecated_field3 = 3 [deprecated = true]; + optional TestDeprecatedLite deprecated_field4 = 4 [deprecated = true]; } // See the comments of the same type in unittest.proto. @@ -381,8 +386,7 @@ message TestParsingMergeLite { } // TestEmptyMessageLite is used to test unknown fields support in lite mode. -message TestEmptyMessageLite{ -} +message TestEmptyMessageLite {} // Like above, but declare all field numbers as potential extensions. No // actual extensions should ever be defined for this type. @@ -390,23 +394,21 @@ message TestEmptyMessageWithExtensionsLite { extensions 1 to max; } -enum V1EnumLite { - V1_FIRST = 1; -} +enum V1EnumLite { V1_FIRST = 1; } enum V2EnumLite { - V2_FIRST = 1; - V2_SECOND = 2; + V2_FIRST = 1; + V2_SECOND = 2; } message V1MessageLite { - required int32 int_field = 1; - optional V1EnumLite enum_field = 2 [ default = V1_FIRST ]; + required int32 int_field = 1; + optional V1EnumLite enum_field = 2 [default = V1_FIRST]; } message V2MessageLite { - required int32 int_field = 1; - optional V2EnumLite enum_field = 2 [ default = V2_FIRST ]; + required int32 int_field = 1; + optional V2EnumLite enum_field = 2 [default = V2_FIRST]; } message TestHugeFieldNumbersLite { @@ -433,7 +435,7 @@ message TestHugeFieldNumbersLite { bytes oneof_bytes = 536870014; } - extensions 536860000 to 536869999; + extensions 536860000 to 536869999; } extend TestHugeFieldNumbersLite { diff --git a/src/google/protobuf/unittest_proto3.proto b/src/google/protobuf/unittest_proto3.proto index 1c3bf91d4c..e93622a187 100644 --- a/src/google/protobuf/unittest_proto3.proto +++ b/src/google/protobuf/unittest_proto3.proto @@ -30,11 +30,11 @@ syntax = "proto3"; -option optimize_for = SPEED; +package proto3_unittest; import "google/protobuf/unittest_import.proto"; -package proto3_unittest; +option optimize_for = SPEED; // This proto includes every type of field in both singular and repeated // forms. @@ -55,88 +55,88 @@ message TestAllTypes { } // Singular - int32 optional_int32 = 1; - int64 optional_int64 = 2; - uint32 optional_uint32 = 3; - uint64 optional_uint64 = 4; - sint32 optional_sint32 = 5; - sint64 optional_sint64 = 6; - fixed32 optional_fixed32 = 7; - fixed64 optional_fixed64 = 8; - sfixed32 optional_sfixed32 = 9; + int32 optional_int32 = 1; + int64 optional_int64 = 2; + uint32 optional_uint32 = 3; + uint64 optional_uint64 = 4; + sint32 optional_sint32 = 5; + sint64 optional_sint64 = 6; + fixed32 optional_fixed32 = 7; + fixed64 optional_fixed64 = 8; + sfixed32 optional_sfixed32 = 9; sfixed64 optional_sfixed64 = 10; - float optional_float = 11; - double optional_double = 12; - bool optional_bool = 13; - string optional_string = 14; - bytes optional_bytes = 15; + float optional_float = 11; + double optional_double = 12; + bool optional_bool = 13; + string optional_string = 14; + bytes optional_bytes = 15; // Groups are not allowed in proto3. // optional group OptionalGroup = 16 { // optional int32 a = 17; // } - NestedMessage optional_nested_message = 18; - ForeignMessage optional_foreign_message = 19; - protobuf_unittest_import.ImportMessage optional_import_message = 20; + NestedMessage optional_nested_message = 18; + ForeignMessage optional_foreign_message = 19; + protobuf_unittest_import.ImportMessage optional_import_message = 20; - NestedEnum optional_nested_enum = 21; - ForeignEnum optional_foreign_enum = 22; + NestedEnum optional_nested_enum = 21; + ForeignEnum optional_foreign_enum = 22; // Omitted (compared to unittest.proto) because proto2 enums are not allowed // inside proto2 messages. // // optional protobuf_unittest_import.ImportEnum optional_import_enum = 23; - string optional_string_piece = 24 [ctype=STRING_PIECE]; - string optional_cord = 25 [ctype=CORD]; + string optional_string_piece = 24 [ctype = STRING_PIECE]; + string optional_cord = 25 [ctype = CORD]; // Defined in unittest_import_public.proto - protobuf_unittest_import.PublicImportMessage - optional_public_import_message = 26; + protobuf_unittest_import.PublicImportMessage optional_public_import_message = + 26; - NestedMessage optional_lazy_message = 27 [lazy=true]; + NestedMessage optional_lazy_message = 27 [lazy = true]; protobuf_unittest_import.ImportMessage optional_lazy_import_message = 115 [lazy = true]; // Repeated - repeated int32 repeated_int32 = 31; - repeated int64 repeated_int64 = 32; - repeated uint32 repeated_uint32 = 33; - repeated uint64 repeated_uint64 = 34; - repeated sint32 repeated_sint32 = 35; - repeated sint64 repeated_sint64 = 36; - repeated fixed32 repeated_fixed32 = 37; - repeated fixed64 repeated_fixed64 = 38; + repeated int32 repeated_int32 = 31; + repeated int64 repeated_int64 = 32; + repeated uint32 repeated_uint32 = 33; + repeated uint64 repeated_uint64 = 34; + repeated sint32 repeated_sint32 = 35; + repeated sint64 repeated_sint64 = 36; + repeated fixed32 repeated_fixed32 = 37; + repeated fixed64 repeated_fixed64 = 38; repeated sfixed32 repeated_sfixed32 = 39; repeated sfixed64 repeated_sfixed64 = 40; - repeated float repeated_float = 41; - repeated double repeated_double = 42; - repeated bool repeated_bool = 43; - repeated string repeated_string = 44; - repeated bytes repeated_bytes = 45; + repeated float repeated_float = 41; + repeated double repeated_double = 42; + repeated bool repeated_bool = 43; + repeated string repeated_string = 44; + repeated bytes repeated_bytes = 45; // Groups are not allowed in proto3. // repeated group RepeatedGroup = 46 { // optional int32 a = 47; // } - repeated NestedMessage repeated_nested_message = 48; - repeated ForeignMessage repeated_foreign_message = 49; - repeated protobuf_unittest_import.ImportMessage repeated_import_message = 50; + repeated NestedMessage repeated_nested_message = 48; + repeated ForeignMessage repeated_foreign_message = 49; + repeated protobuf_unittest_import.ImportMessage repeated_import_message = 50; - repeated NestedEnum repeated_nested_enum = 51; - repeated ForeignEnum repeated_foreign_enum = 52; + repeated NestedEnum repeated_nested_enum = 51; + repeated ForeignEnum repeated_foreign_enum = 52; // Omitted (compared to unittest.proto) because proto2 enums are not allowed // inside proto2 messages. // // repeated protobuf_unittest_import.ImportEnum repeated_import_enum = 53; - repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; - repeated string repeated_cord = 55 [ctype=CORD]; + repeated string repeated_string_piece = 54 [ctype = STRING_PIECE]; + repeated string repeated_cord = 55 [ctype = CORD]; - repeated NestedMessage repeated_lazy_message = 57 [lazy=true]; + repeated NestedMessage repeated_lazy_message = 57 [lazy = true]; oneof oneof_field { uint32 oneof_uint32 = 111; @@ -149,37 +149,37 @@ message TestAllTypes { // Test messages for packed fields message TestPackedTypes { - repeated int32 packed_int32 = 90 [packed = true]; - repeated int64 packed_int64 = 91 [packed = true]; - repeated uint32 packed_uint32 = 92 [packed = true]; - repeated uint64 packed_uint64 = 93 [packed = true]; - repeated sint32 packed_sint32 = 94 [packed = true]; - repeated sint64 packed_sint64 = 95 [packed = true]; - repeated fixed32 packed_fixed32 = 96 [packed = true]; - repeated fixed64 packed_fixed64 = 97 [packed = true]; - repeated sfixed32 packed_sfixed32 = 98 [packed = true]; - repeated sfixed64 packed_sfixed64 = 99 [packed = true]; - repeated float packed_float = 100 [packed = true]; - repeated double packed_double = 101 [packed = true]; - repeated bool packed_bool = 102 [packed = true]; - repeated ForeignEnum packed_enum = 103 [packed = true]; + repeated int32 packed_int32 = 90 [packed = true]; + repeated int64 packed_int64 = 91 [packed = true]; + repeated uint32 packed_uint32 = 92 [packed = true]; + repeated uint64 packed_uint64 = 93 [packed = true]; + repeated sint32 packed_sint32 = 94 [packed = true]; + repeated sint64 packed_sint64 = 95 [packed = true]; + repeated fixed32 packed_fixed32 = 96 [packed = true]; + repeated fixed64 packed_fixed64 = 97 [packed = true]; + repeated sfixed32 packed_sfixed32 = 98 [packed = true]; + repeated sfixed64 packed_sfixed64 = 99 [packed = true]; + repeated float packed_float = 100 [packed = true]; + repeated double packed_double = 101 [packed = true]; + repeated bool packed_bool = 102 [packed = true]; + repeated ForeignEnum packed_enum = 103 [packed = true]; } // Explicitly set packed to false message TestUnpackedTypes { - repeated int32 repeated_int32 = 1 [packed = false]; - repeated int64 repeated_int64 = 2 [packed = false]; - repeated uint32 repeated_uint32 = 3 [packed = false]; - repeated uint64 repeated_uint64 = 4 [packed = false]; - repeated sint32 repeated_sint32 = 5 [packed = false]; - repeated sint64 repeated_sint64 = 6 [packed = false]; - repeated fixed32 repeated_fixed32 = 7 [packed = false]; - repeated fixed64 repeated_fixed64 = 8 [packed = false]; - repeated sfixed32 repeated_sfixed32 = 9 [packed = false]; + repeated int32 repeated_int32 = 1 [packed = false]; + repeated int64 repeated_int64 = 2 [packed = false]; + repeated uint32 repeated_uint32 = 3 [packed = false]; + repeated uint64 repeated_uint64 = 4 [packed = false]; + repeated sint32 repeated_sint32 = 5 [packed = false]; + repeated sint64 repeated_sint64 = 6 [packed = false]; + repeated fixed32 repeated_fixed32 = 7 [packed = false]; + repeated fixed64 repeated_fixed64 = 8 [packed = false]; + repeated sfixed32 repeated_sfixed32 = 9 [packed = false]; repeated sfixed64 repeated_sfixed64 = 10 [packed = false]; - repeated float repeated_float = 11 [packed = false]; - repeated double repeated_double = 12 [packed = false]; - repeated bool repeated_bool = 13 [packed = false]; + repeated float repeated_float = 11 [packed = false]; + repeated double repeated_double = 12 [packed = false]; + repeated bool repeated_bool = 13 [packed = false]; repeated TestAllTypes.NestedEnum repeated_nested_enum = 14 [packed = false]; } @@ -203,7 +203,13 @@ enum ForeignEnum { } // TestEmptyMessage is used to test behavior of unknown fields. -message TestEmptyMessage { +message TestEmptyMessage {} + +// TestMessageWithDummy is also used to test behavior of unknown fields. +message TestMessageWithDummy { + // This field is only here for triggering copy-on-write; it's not intended to + // be serialized. + bool dummy = 536870911; } // Same layout as TestOneof2 in unittest.proto to test unknown enum value diff --git a/src/google/protobuf/util/field_comparator.cc b/src/google/protobuf/util/field_comparator.cc index 3316506b9c..54abcd43a4 100644 --- a/src/google/protobuf/util/field_comparator.cc +++ b/src/google/protobuf/util/field_comparator.cc @@ -32,13 +32,13 @@ #include +#include #include #include #include #include #include -#include #include namespace google { @@ -175,14 +175,12 @@ bool DefaultFieldComparator::CompareDoubleOrFloat(const FieldDescriptor& field, // themselves), and is a shortcut for finite values. return true; } else if (float_comparison_ == EXACT) { - if (treat_nan_as_equal_ && MathLimits::IsNaN(value_1) && - MathLimits::IsNaN(value_2)) { + if (treat_nan_as_equal_ && std::isnan(value_1) && std::isnan(value_2)) { return true; } return false; } else { - if (treat_nan_as_equal_ && MathLimits::IsNaN(value_1) && - MathLimits::IsNaN(value_2)) { + if (treat_nan_as_equal_ && std::isnan(value_1) && std::isnan(value_2)) { return true; } // float_comparison_ == APPROXIMATE covers two use cases. diff --git a/src/google/protobuf/util/field_comparator_test.cc b/src/google/protobuf/util/field_comparator_test.cc index 7e538f8951..90a5cafdca 100644 --- a/src/google/protobuf/util/field_comparator_test.cc +++ b/src/google/protobuf/util/field_comparator_test.cc @@ -32,16 +32,13 @@ #include +#include + #include #include -#include -// This gtest header is put after mathutil.h intentionally. We have to do -// this because mathutil.h includes mathlimits.h which requires cmath not -// being included to compile on some versions of gcc: -// https://github.com/protocolbuffers/protobuf/blob/818c5eee08840355d70d2f3bdf1a2f17986a5e70/src/google/protobuf/stubs/mathlimits.h#L48 -// and the opensource version gtest.h header includes cmath transitively -// somehow. #include +#include + namespace google { namespace protobuf { namespace util { @@ -248,10 +245,10 @@ TEST_F(DefaultFieldComparatorTest, FloatingPointComparisonTreatNaNsAsEqual) { const FieldDescriptor* field_double = descriptor_->FindFieldByName("optional_double"); - message_1_.set_optional_float(MathLimits::kNaN); - message_2_.set_optional_float(MathLimits::kNaN); - message_1_.set_optional_double(MathLimits::kNaN); - message_2_.set_optional_double(MathLimits::kNaN); + message_1_.set_optional_float(std::numeric_limits::quiet_NaN()); + message_2_.set_optional_float(std::numeric_limits::quiet_NaN()); + message_1_.set_optional_double(std::numeric_limits::quiet_NaN()); + message_2_.set_optional_double(std::numeric_limits::quiet_NaN()); // DefaultFieldComparator's default float comparison mode is EXACT with // treating NaNs as different. diff --git a/src/google/protobuf/util/internal/datapiece.cc b/src/google/protobuf/util/internal/datapiece.cc index 1ab0b86d2f..041ff7b74d 100644 --- a/src/google/protobuf/util/internal/datapiece.cc +++ b/src/google/protobuf/util/internal/datapiece.cc @@ -30,12 +30,14 @@ #include +#include +#include + #include #include #include #include #include -#include #include namespace google { @@ -96,9 +98,9 @@ StatusOr FloatToDouble(float before) { } StatusOr DoubleToFloat(double before) { - if (MathLimits::IsNaN(before)) { + if (std::isnan(before)) { return std::numeric_limits::quiet_NaN(); - } else if (!MathLimits::IsFinite(before)) { + } else if (!std::isfinite(before)) { // Converting a double +inf/-inf to float should just work. return static_cast(before); } else if (before > std::numeric_limits::max() || @@ -171,7 +173,7 @@ StatusOr DataPiece::ToDouble() const { if (str_ == "-Infinity") return -std::numeric_limits::infinity(); if (str_ == "NaN") return std::numeric_limits::quiet_NaN(); StatusOr value = StringToNumber(safe_strtod); - if (value.ok() && !MathLimits::IsFinite(value.ValueOrDie())) { + if (value.ok() && !std::isfinite(value.ValueOrDie())) { // safe_strtod converts out-of-range values to +inf/-inf, but we want // to report them as errors. return InvalidArgument(StrCat("\"", str_, "\"")); diff --git a/src/google/protobuf/util/internal/json_objectwriter.cc b/src/google/protobuf/util/internal/json_objectwriter.cc index 54a405ac8a..a98e7bad5c 100644 --- a/src/google/protobuf/util/internal/json_objectwriter.cc +++ b/src/google/protobuf/util/internal/json_objectwriter.cc @@ -30,7 +30,8 @@ #include -#include +#include +#include #include #include @@ -38,7 +39,6 @@ #include #include #include -#include namespace google { namespace protobuf { @@ -115,7 +115,7 @@ JsonObjectWriter* JsonObjectWriter::RenderUint64(StringPiece name, JsonObjectWriter* JsonObjectWriter::RenderDouble(StringPiece name, double value) { - if (MathLimits::IsFinite(value)) { + if (std::isfinite(value)) { return RenderSimple(name, SimpleDtoa(value)); } @@ -125,7 +125,7 @@ JsonObjectWriter* JsonObjectWriter::RenderDouble(StringPiece name, JsonObjectWriter* JsonObjectWriter::RenderFloat(StringPiece name, float value) { - if (MathLimits::IsFinite(value)) { + if (std::isfinite(value)) { return RenderSimple(name, SimpleFtoa(value)); } diff --git a/src/google/protobuf/util/internal/json_stream_parser.cc b/src/google/protobuf/util/internal/json_stream_parser.cc index 2ecdb3c6bf..a221b98c31 100644 --- a/src/google/protobuf/util/internal/json_stream_parser.cc +++ b/src/google/protobuf/util/internal/json_stream_parser.cc @@ -33,8 +33,10 @@ #include #include #include +#include #include #include +#include #include #include @@ -42,7 +44,6 @@ #include #include #include -#include namespace google { @@ -527,8 +528,7 @@ util::Status JsonStreamParser::ParseDoubleHelper(const std::string& number, if (!safe_strtod(number, &result->double_val)) { return ReportFailure("Unable to parse number."); } - if (!loose_float_number_conversion_ && - !MathLimits::IsFinite(result->double_val)) { + if (!loose_float_number_conversion_ && !std::isfinite(result->double_val)) { return ReportFailure("Number exceeds the range of double."); } result->type = NumberResult::DOUBLE; diff --git a/src/google/protobuf/util/internal/json_stream_parser_test.cc b/src/google/protobuf/util/internal/json_stream_parser_test.cc index 398363a4f3..6bb22a6c0e 100644 --- a/src/google/protobuf/util/internal/json_stream_parser_test.cc +++ b/src/google/protobuf/util/internal/json_stream_parser_test.cc @@ -130,7 +130,7 @@ class JsonStreamParserTest : public ::testing::Test { if (!result.ok()) { GOOGLE_LOG(WARNING) << result; } - EXPECT_OK(result); + EXPECT_TRUE(result.ok()); } void DoErrorTest( diff --git a/src/google/protobuf/util/internal/protostream_objectsource.cc b/src/google/protobuf/util/internal/protostream_objectsource.cc index 89f424b0cc..4fc026fa81 100644 --- a/src/google/protobuf/util/internal/protostream_objectsource.cc +++ b/src/google/protobuf/util/internal/protostream_objectsource.cc @@ -128,7 +128,8 @@ ProtoStreamObjectSource::ProtoStreamObjectSource( render_unknown_fields_(false), render_unknown_enum_values_(true), add_trailing_zeros_for_timestamp_and_duration_(false), - suppress_empty_object_(false) { + suppress_empty_object_(false), + use_legacy_json_map_format_(false) { GOOGLE_LOG_IF(DFATAL, stream == nullptr) << "Input stream is nullptr."; } @@ -147,7 +148,8 @@ ProtoStreamObjectSource::ProtoStreamObjectSource( render_unknown_fields_(false), render_unknown_enum_values_(true), add_trailing_zeros_for_timestamp_and_duration_(false), - suppress_empty_object_(false) { + suppress_empty_object_(false), + use_legacy_json_map_format_(false) { GOOGLE_LOG_IF(DFATAL, stream == nullptr) << "Input stream is nullptr."; } diff --git a/src/google/protobuf/util/internal/protostream_objectsource.h b/src/google/protobuf/util/internal/protostream_objectsource.h index 9a9a74c318..a83031d17c 100644 --- a/src/google/protobuf/util/internal/protostream_objectsource.h +++ b/src/google/protobuf/util/internal/protostream_objectsource.h @@ -324,6 +324,8 @@ class PROTOBUF_EXPORT ProtoStreamObjectSource : public ObjectSource { // the fields of the message are filtered out by field mask. bool suppress_empty_object_; + bool use_legacy_json_map_format_; + GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoStreamObjectSource); }; diff --git a/src/google/protobuf/util/internal/utility.cc b/src/google/protobuf/util/internal/utility.cc index fb958e081e..e3cdbcb128 100644 --- a/src/google/protobuf/util/internal/utility.cc +++ b/src/google/protobuf/util/internal/utility.cc @@ -31,6 +31,8 @@ #include #include +#include +#include #include #include @@ -41,7 +43,6 @@ #include #include #include -#include // clang-format off #include @@ -377,15 +378,15 @@ bool IsMessageSetWireFormat(const google::protobuf::Type& type) { } std::string DoubleAsString(double value) { - if (MathLimits::IsPosInf(value)) return "Infinity"; - if (MathLimits::IsNegInf(value)) return "-Infinity"; - if (MathLimits::IsNaN(value)) return "NaN"; + if (value == std::numeric_limits::infinity()) return "Infinity"; + if (value == -std::numeric_limits::infinity()) return "-Infinity"; + if (std::isnan(value)) return "NaN"; return SimpleDtoa(value); } std::string FloatAsString(float value) { - if (MathLimits::IsFinite(value)) return SimpleFtoa(value); + if (std::isfinite(value)) return SimpleFtoa(value); return DoubleAsString(value); } @@ -395,9 +396,7 @@ bool SafeStrToFloat(StringPiece str, float* value) { return false; } - if (MathLimits::IsInf(double_value) || - MathLimits::IsNaN(double_value)) - return false; + if (std::isinf(double_value) || std::isnan(double_value)) return false; // Fail if the value is not representable in float. if (double_value > std::numeric_limits::max() || diff --git a/src/google/protobuf/util/message_differencer.cc b/src/google/protobuf/util/message_differencer.cc index de08096b13..c9f10baeab 100644 --- a/src/google/protobuf/util/message_differencer.cc +++ b/src/google/protobuf/util/message_differencer.cc @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #include @@ -309,6 +308,11 @@ void MessageDifferencer::set_repeated_field_comparison( repeated_field_comparison_ = comparison; } +MessageDifferencer::RepeatedFieldComparison +MessageDifferencer::repeated_field_comparison() { + return repeated_field_comparison_; +} + void MessageDifferencer::CheckRepeatedFieldComparisons( const FieldDescriptor* field, const RepeatedFieldComparison& new_comparison) { @@ -454,7 +458,7 @@ void MessageDifferencer::ReportDifferencesToString(std::string* output) { void MessageDifferencer::ReportDifferencesTo(Reporter* reporter) { // If an output string is set, clear it to prevent - // it superceding the specified reporter. + // it superseding the specified reporter. if (output_string_) { output_string_ = NULL; } @@ -580,7 +584,7 @@ bool MessageDifferencer::Compare(const Message& message1, *unknown_field_set2, parent_fields)) { if (reporter_ == NULL) { return false; - }; + } unknown_compare_result = false; } } @@ -861,7 +865,7 @@ bool MessageDifferencer::CompareWithFieldsInternal( parent_fields->pop_back(); } } - // Increment the field indicies. + // Increment the field indices. ++field_index1; ++field_index2; } diff --git a/src/google/protobuf/util/message_differencer.h b/src/google/protobuf/util/message_differencer.h index dd4267b512..21cf374dd0 100644 --- a/src/google/protobuf/util/message_differencer.h +++ b/src/google/protobuf/util/message_differencer.h @@ -570,6 +570,9 @@ class PROTOBUF_EXPORT MessageDifferencer { // differencer when compare repeated fields in messages. void set_repeated_field_comparison(RepeatedFieldComparison comparison); + // Returns the current repeated field comparison used by this differencer. + RepeatedFieldComparison repeated_field_comparison(); + // Compares the two specified messages, returning true if they are the same, // false otherwise. If this method returns false, any changes between the // two messages will be reported if a Reporter was specified via diff --git a/src/google/protobuf/wire_format.cc b/src/google/protobuf/wire_format.cc index c94881b036..f60b774f3b 100644 --- a/src/google/protobuf/wire_format.cc +++ b/src/google/protobuf/wire_format.cc @@ -655,8 +655,8 @@ bool WireFormat::ParseAndMergeMessageSetItem(io::CodedInputStream* input, // =================================================================== -uint8* WireFormat::InternalSerializeWithCachedSizesToArray( - const Message& message, uint8* target, io::EpsCopyOutputStream* stream) { +uint8* WireFormat::_InternalSerialize(const Message& message, uint8* target, + io::EpsCopyOutputStream* stream) { const Descriptor* descriptor = message.GetDescriptor(); const Reflection* message_reflection = message.GetReflection(); @@ -751,12 +751,12 @@ static uint8* SerializeMapValueRefWithCachedSizes( target = stream->WriteString(2, value.GetStringValue(), target); break; case FieldDescriptor::TYPE_MESSAGE: - target = WireFormatLite::InternalWriteMessageToArray( - 2, value.GetMessageValue(), target, stream); + target = WireFormatLite::InternalWriteMessage(2, value.GetMessageValue(), + target, stream); break; case FieldDescriptor::TYPE_GROUP: - target = WireFormatLite::InternalWriteGroupToArray( - 2, value.GetMessageValue(), target, stream); + target = WireFormatLite::InternalWriteGroup(2, value.GetMessageValue(), + target, stream); break; } return target; @@ -902,12 +902,13 @@ uint8* WireFormat::InternalSerializeField(const FieldDescriptor* field, if (count == 0) return target; target = stream->EnsureSpace(target); switch (field->type()) { -#define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD) \ - case FieldDescriptor::TYPE_##TYPE: { \ - auto r = message_reflection->GetRepeatedField(message, field); \ - target = stream->Write##TYPE_METHOD##Packed( \ - field->number(), r, FieldDataOnlyByteSize(field, message), target); \ - break; \ +#define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD) \ + case FieldDescriptor::TYPE_##TYPE: { \ + auto r = \ + message_reflection->GetRepeatedFieldInternal(message, field); \ + target = stream->Write##TYPE_METHOD##Packed( \ + field->number(), r, FieldDataOnlyByteSize(field, message), target); \ + break; \ } HANDLE_PRIMITIVE_TYPE(INT32, int32, Int32, Int32) @@ -919,11 +920,12 @@ uint8* WireFormat::InternalSerializeField(const FieldDescriptor* field, HANDLE_PRIMITIVE_TYPE(ENUM, int, Enum, Enum) #undef HANDLE_PRIMITIVE_TYPE -#define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD) \ - case FieldDescriptor::TYPE_##TYPE: { \ - auto r = message_reflection->GetRepeatedField(message, field); \ - target = stream->WriteFixedPacked(field->number(), r, target); \ - break; \ +#define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD) \ + case FieldDescriptor::TYPE_##TYPE: { \ + auto r = \ + message_reflection->GetRepeatedFieldInternal(message, field); \ + target = stream->WriteFixedPacked(field->number(), r, target); \ + break; \ } HANDLE_PRIMITIVE_TYPE(FIXED32, uint32, Fixed32, UInt32) @@ -977,7 +979,7 @@ uint8* WireFormat::InternalSerializeField(const FieldDescriptor* field, #define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD) \ case FieldDescriptor::TYPE_##TYPE: \ - target = WireFormatLite::InternalWrite##TYPE_METHOD##ToArray( \ + target = WireFormatLite::InternalWrite##TYPE_METHOD( \ field->number(), \ field->is_repeated() \ ? (map_entries.empty() \ @@ -1054,7 +1056,7 @@ uint8* WireFormat::InternalSerializeMessageSetItem( target = WireFormatLite::WriteUInt32ToArray( WireFormatLite::kMessageSetTypeIdNumber, field->number(), target); // Write message. - target = WireFormatLite::InternalWriteMessageToArray( + target = WireFormatLite::InternalWriteMessage( WireFormatLite::kMessageSetMessageNumber, message_reflection->GetMessage(message, field), target, stream); // End group. diff --git a/src/google/protobuf/wire_format.h b/src/google/protobuf/wire_format.h index 9721fe0cba..57582e337b 100644 --- a/src/google/protobuf/wire_format.h +++ b/src/google/protobuf/wire_format.h @@ -116,15 +116,15 @@ class PROTOBUF_EXPORT WireFormat { static void SerializeWithCachedSizes(const Message& message, int size, io::CodedOutputStream* output) { int expected_endpoint = output->ByteCount() + size; - output->SetCur(InternalSerializeWithCachedSizesToArray( - message, output->Cur(), output->EpsCopy())); + output->SetCur( + _InternalSerialize(message, output->Cur(), output->EpsCopy())); GOOGLE_CHECK_EQ(output->ByteCount(), expected_endpoint) << ": Protocol message serialized to a size different from what was " "originally expected. Perhaps it was modified by another thread " "during serialization?"; } - static uint8* InternalSerializeWithCachedSizesToArray( - const Message& message, uint8* target, io::EpsCopyOutputStream* stream); + static uint8* _InternalSerialize(const Message& message, uint8* target, + io::EpsCopyOutputStream* stream); // Implements Message::ByteSize() via reflection. WARNING: The result // of this method is *not* cached anywhere. However, all embedded messages diff --git a/src/google/protobuf/wire_format_lite.cc b/src/google/protobuf/wire_format_lite.cc index f2017da0cd..47ad0f1e8b 100644 --- a/src/google/protobuf/wire_format_lite.cc +++ b/src/google/protobuf/wire_format_lite.cc @@ -526,8 +526,7 @@ void WireFormatLite::WriteMessage(int field_number, const MessageLite& value, void WireFormatLite::WriteSubMessageMaybeToArray( int size, const MessageLite& value, io::CodedOutputStream* output) { - output->SetCur(value.InternalSerializeWithCachedSizesToArray( - output->Cur(), output->EpsCopy())); + output->SetCur(value._InternalSerialize(output->Cur(), output->EpsCopy())); } void WireFormatLite::WriteGroupMaybeToArray(int field_number, diff --git a/src/google/protobuf/wire_format_lite.h b/src/google/protobuf/wire_format_lite.h index 012206b13f..449517a5a2 100644 --- a/src/google/protobuf/wire_format_lite.h +++ b/src/google/protobuf/wire_format_lite.h @@ -621,11 +621,11 @@ class PROTOBUF_EXPORT WireFormatLite { // have a CodedOutputStream available, so they get an additional parameter // telling them whether to serialize deterministically. template - PROTOBUF_ALWAYS_INLINE static uint8* InternalWriteGroupToArray( + PROTOBUF_ALWAYS_INLINE static uint8* InternalWriteGroup( int field_number, const MessageType& value, uint8* target, io::EpsCopyOutputStream* stream); template - PROTOBUF_ALWAYS_INLINE static uint8* InternalWriteMessageToArray( + PROTOBUF_ALWAYS_INLINE static uint8* InternalWriteMessage( int field_number, const MessageType& value, uint8* target, io::EpsCopyOutputStream* stream); @@ -649,7 +649,7 @@ class PROTOBUF_EXPORT WireFormatLite { static_cast(2 * io::CodedOutputStream::VarintSize32( static_cast(field_number) << 3)), io::CodedOutputStream::IsDefaultSerializationDeterministic()); - return InternalWriteGroupToArray(field_number, value, target, &stream); + return InternalWriteGroup(field_number, value, target, &stream); } PROTOBUF_ALWAYS_INLINE static uint8* WriteMessageToArray( int field_number, const MessageLite& value, uint8* target) { @@ -660,7 +660,7 @@ class PROTOBUF_EXPORT WireFormatLite { static_cast(field_number) << 3) + io::CodedOutputStream::VarintSize32(size)), io::CodedOutputStream::IsDefaultSerializationDeterministic()); - return InternalWriteMessageToArray(field_number, value, target, &stream); + return InternalWriteMessage(field_number, value, target, &stream); } // Compute the byte size of a field. The XxSize() functions do NOT include @@ -1698,22 +1698,22 @@ inline uint8* WireFormatLite::WriteBytesToArray(int field_number, template -inline uint8* WireFormatLite::InternalWriteGroupToArray( +inline uint8* WireFormatLite::InternalWriteGroup( int field_number, const MessageType& value, uint8* target, io::EpsCopyOutputStream* stream) { target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target); - target = value.InternalSerializeWithCachedSizesToArray(target, stream); + target = value._InternalSerialize(target, stream); target = stream->EnsureSpace(target); return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target); } template -inline uint8* WireFormatLite::InternalWriteMessageToArray( +inline uint8* WireFormatLite::InternalWriteMessage( int field_number, const MessageType& value, uint8* target, io::EpsCopyOutputStream* stream) { target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target); target = io::CodedOutputStream::WriteVarint32ToArray( static_cast(value.GetCachedSize()), target); - return value.InternalSerializeWithCachedSizesToArray(target, stream); + return value._InternalSerialize(target, stream); } // See comment on ReadGroupNoVirtual to understand the need for this template @@ -1724,7 +1724,7 @@ inline uint8* WireFormatLite::InternalWriteGroupNoVirtualToArray( uint8* target) { target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target); target = value.MessageType_WorkAroundCppLookupDefect:: - InternalSerializeWithCachedSizesToArray(target); + SerializeWithCachedSizesToArray(target); return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target); } template @@ -1736,8 +1736,9 @@ inline uint8* WireFormatLite::InternalWriteMessageNoVirtualToArray( static_cast( value.MessageType_WorkAroundCppLookupDefect::GetCachedSize()), target); - return value.MessageType_WorkAroundCppLookupDefect:: - InternalSerializeWithCachedSizesToArray(target); + return value + .MessageType_WorkAroundCppLookupDefect::SerializeWithCachedSizesToArray( + target); } // =================================================================== diff --git a/src/google/protobuf/wrappers.pb.cc b/src/google/protobuf/wrappers.pb.cc index f3787362b7..8c8ce6846b 100644 --- a/src/google/protobuf/wrappers.pb.cc +++ b/src/google/protobuf/wrappers.pb.cc @@ -403,7 +403,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* DoubleValue::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* DoubleValue::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DoubleValue) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -602,7 +602,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* FloatValue::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* FloatValue::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FloatValue) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -801,7 +801,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Int64Value::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Int64Value::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Int64Value) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1002,7 +1002,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* UInt64Value::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* UInt64Value::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UInt64Value) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1203,7 +1203,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* Int32Value::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* Int32Value::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Int32Value) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1404,7 +1404,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* UInt32Value::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* UInt32Value::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UInt32Value) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1605,7 +1605,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* BoolValue::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* BoolValue::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.BoolValue) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1786,7 +1786,9 @@ const char* StringValue::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID // string value = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(_internal_mutable_value(), ptr, ctx, "google.protobuf.StringValue.value"); + auto str = _internal_mutable_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "google.protobuf.StringValue.value")); CHK_(ptr); } else goto handle_unusual; continue; @@ -1810,7 +1812,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* StringValue::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* StringValue::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.StringValue) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; @@ -1998,7 +2000,8 @@ const char* BytesValue::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID: // bytes value = 1; case 1: if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(_internal_mutable_value(), ptr, ctx); + auto str = _internal_mutable_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); CHK_(ptr); } else goto handle_unusual; continue; @@ -2022,7 +2025,7 @@ failure: #undef CHK_ } -::PROTOBUF_NAMESPACE_ID::uint8* BytesValue::InternalSerializeWithCachedSizesToArray( +::PROTOBUF_NAMESPACE_ID::uint8* BytesValue::_InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.BytesValue) ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; diff --git a/src/google/protobuf/wrappers.pb.h b/src/google/protobuf/wrappers.pb.h index 95c7d6f728..4ee66db9ae 100644 --- a/src/google/protobuf/wrappers.pb.h +++ b/src/google/protobuf/wrappers.pb.h @@ -183,7 +183,7 @@ class PROTOBUF_EXPORT DoubleValue : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -334,7 +334,7 @@ class PROTOBUF_EXPORT FloatValue : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -485,7 +485,7 @@ class PROTOBUF_EXPORT Int64Value : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -636,7 +636,7 @@ class PROTOBUF_EXPORT UInt64Value : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -787,7 +787,7 @@ class PROTOBUF_EXPORT Int32Value : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -938,7 +938,7 @@ class PROTOBUF_EXPORT UInt32Value : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -1089,7 +1089,7 @@ class PROTOBUF_EXPORT BoolValue : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -1240,7 +1240,7 @@ class PROTOBUF_EXPORT StringValue : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); } @@ -1407,7 +1407,7 @@ class PROTOBUF_EXPORT BytesValue : size_t ByteSizeLong() const final; const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; int GetCachedSize() const final { return _cached_size_.Get(); }