Skip to content

Commit dfab275

Browse files
committed
Sync from Piper @317197168
PROTOBUF_SYNC_PIPER
1 parent f77065d commit dfab275

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+348
-240
lines changed

CHANGES.txt

+11-2
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,25 @@ Unreleased Changes
1111
* Added more Windows macros to proto whitelist.
1212
* Arena constructors for map entry messages are now marked "explicit"
1313
(for regular messages they were already explicit).
14+
* Fix subtle aliasing bug in RepeatedField::Add
15+
* Fix mismatch between MapEntry ByteSize and Serialize with respect to unset
16+
fields.
1417

1518
Python:
16-
* Reject lowercase t for Timestamp json format. Fixes a conformance test.
19+
* JSON format conformance fixes:
20+
* Reject lowercase t for Timestamp json format.
21+
* Print full_name directly for extensions (no camelCase).
22+
* Reject boolean values for integer fields.
23+
* Reject NaN, Infinity, -Infinity that is not quoted.
24+
* Base64 fixes for bytes fields: accept URL-safe base64 and missing padding.
25+
* Bugfix for fields/files named "async" or "await".
1726
* Improved the error message when AttributeError is returned from __getattr__
1827
in EnumTypeWrapper.
19-
* Json format will print full_name directly for extensions.
2028

2129
Java:
2230
* Fixed a bug where setting optional proto3 enums with setFooValue() would
2331
not mark the value as present.
32+
* Add Subtract function to FieldMaskUtil.
2433

2534
C#:
2635
* Dropped support for netstandard1.0 (replaced by support for netstandard1.1).

conformance/binary_json_conformance_suite.cc

+23
Original file line numberDiff line numberDiff line change
@@ -3051,6 +3051,29 @@ void BinaryAndJsonConformanceSuite::RunJsonTestsForValue() {
30513051
}
30523052
]
30533053
)");
3054+
RunValidJsonTestWithValidator(
3055+
"NullValueInOtherOneofOldFormat", RECOMMENDED,
3056+
R"({"oneofNullValue": "NULL_VALUE"})",
3057+
[](const Json::Value& value) {
3058+
return (value.isMember("oneofNullValue") &&
3059+
value["oneofNullValue"].isNull());
3060+
},
3061+
true);
3062+
RunValidJsonTestWithValidator(
3063+
"NullValueInOtherOneofNewFormat", RECOMMENDED,
3064+
R"({"oneofNullValue": null})",
3065+
[](const Json::Value& value) {
3066+
return (value.isMember("oneofNullValue") &&
3067+
value["oneofNullValue"].isNull());
3068+
},
3069+
true);
3070+
RunValidJsonTestWithValidator(
3071+
"NullValueInNormalMessage", RECOMMENDED,
3072+
R"({"optionalNullValue": null})",
3073+
[](const Json::Value& value) {
3074+
return value.empty();
3075+
},
3076+
true);
30543077
}
30553078

30563079
void BinaryAndJsonConformanceSuite::RunJsonTestsForAny() {

csharp/src/Google.Protobuf.Test.TestProtos/TestMessagesProto3.cs

+162-91
Large diffs are not rendered by default.
275 Bytes
Binary file not shown.

csharp/src/Google.Protobuf/Reflection/Descriptor.cs

+3-4
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,9 @@ static DescriptorReflection() {
155155
"dGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJ",
156156
"bmZvLkFubm90YXRpb24aTwoKQW5ub3RhdGlvbhIQCgRwYXRoGAEgAygFQgIQ",
157157
"ARITCgtzb3VyY2VfZmlsZRgCIAEoCRINCgViZWdpbhgDIAEoBRILCgNlbmQY",
158-
"BCABKAVCjwEKE2NvbS5nb29nbGUucHJvdG9idWZCEERlc2NyaXB0b3JQcm90",
159-
"b3NIAVo+Z2l0aHViLmNvbS9nb2xhbmcvcHJvdG9idWYvcHJvdG9jLWdlbi1n",
160-
"by9kZXNjcmlwdG9yO2Rlc2NyaXB0b3L4AQGiAgNHUEKqAhpHb29nbGUuUHJv",
161-
"dG9idWYuUmVmbGVjdGlvbg=="));
158+
"BCABKAVCfgoTY29tLmdvb2dsZS5wcm90b2J1ZkIQRGVzY3JpcHRvclByb3Rv",
159+
"c0gBWi1nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9kZXNjcmlw",
160+
"dG9ycGL4AQGiAgNHUEKqAhpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbg=="));
162161
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
163162
new pbr::FileDescriptor[] { },
164163
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

csharp/src/Google.Protobuf/WellKnownTypes/Any.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ static AnyReflection() {
2525
byte[] descriptorData = global::System.Convert.FromBase64String(
2626
string.Concat(
2727
"Chlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYi",
28-
"JgoDQW55EhAKCHR5cGVfdXJsGAEgASgJEg0KBXZhbHVlGAIgASgMQm8KE2Nv",
29-
"bS5nb29nbGUucHJvdG9idWZCCEFueVByb3RvUAFaJWdpdGh1Yi5jb20vZ29s",
30-
"YW5nL3Byb3RvYnVmL3B0eXBlcy9hbnmiAgNHUEKqAh5Hb29nbGUuUHJvdG9i",
31-
"dWYuV2VsbEtub3duVHlwZXNiBnByb3RvMw=="));
28+
"JgoDQW55EhAKCHR5cGVfdXJsGAEgASgJEg0KBXZhbHVlGAIgASgMQnYKE2Nv",
29+
"bS5nb29nbGUucHJvdG9idWZCCEFueVByb3RvUAFaLGdvb2dsZS5nb2xhbmcu",
30+
"b3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2FueXBiogIDR1BCqgIeR29vZ2xl",
31+
"LlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzM="));
3232
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
3333
new pbr::FileDescriptor[] { },
3434
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

csharp/src/Google.Protobuf/WellKnownTypes/Api.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ static ApiReflection() {
3737
"ChFyZXNwb25zZV90eXBlX3VybBgEIAEoCRIaChJyZXNwb25zZV9zdHJlYW1p",
3838
"bmcYBSABKAgSKAoHb3B0aW9ucxgGIAMoCzIXLmdvb2dsZS5wcm90b2J1Zi5P",
3939
"cHRpb24SJwoGc3ludGF4GAcgASgOMhcuZ29vZ2xlLnByb3RvYnVmLlN5bnRh",
40-
"eCIjCgVNaXhpbhIMCgRuYW1lGAEgASgJEgwKBHJvb3QYAiABKAlCdQoTY29t",
41-
"Lmdvb2dsZS5wcm90b2J1ZkIIQXBpUHJvdG9QAVorZ29vZ2xlLmdvbGFuZy5v",
42-
"cmcvZ2VucHJvdG8vcHJvdG9idWYvYXBpO2FwaaICA0dQQqoCHkdvb2dsZS5Q",
43-
"cm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8z"));
40+
"eCIjCgVNaXhpbhIMCgRuYW1lGAEgASgJEgwKBHJvb3QYAiABKAlCdgoTY29t",
41+
"Lmdvb2dsZS5wcm90b2J1ZkIIQXBpUHJvdG9QAVosZ29vZ2xlLmdvbGFuZy5v",
42+
"cmcvcHJvdG9idWYvdHlwZXMva25vd24vYXBpcGKiAgNHUEKqAh5Hb29nbGUu",
43+
"UHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMw=="));
4444
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
4545
new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.SourceContextReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TypeReflection.Descriptor, },
4646
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

csharp/src/Google.Protobuf/WellKnownTypes/Duration.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ static DurationReflection() {
2626
string.Concat(
2727
"Ch5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8SD2dvb2dsZS5wcm90",
2828
"b2J1ZiIqCghEdXJhdGlvbhIPCgdzZWNvbmRzGAEgASgDEg0KBW5hbm9zGAIg",
29-
"ASgFQnwKE2NvbS5nb29nbGUucHJvdG9idWZCDUR1cmF0aW9uUHJvdG9QAVoq",
30-
"Z2l0aHViLmNvbS9nb2xhbmcvcHJvdG9idWYvcHR5cGVzL2R1cmF0aW9u+AEB",
31-
"ogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90",
32-
"bzM="));
29+
"ASgFQoMBChNjb20uZ29vZ2xlLnByb3RvYnVmQg1EdXJhdGlvblByb3RvUAFa",
30+
"MWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2R1cmF0",
31+
"aW9ucGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlw",
32+
"ZXNiBnByb3RvMw=="));
3333
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
3434
new pbr::FileDescriptor[] { },
3535
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

csharp/src/Google.Protobuf/WellKnownTypes/Empty.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ static EmptyReflection() {
2525
byte[] descriptorData = global::System.Convert.FromBase64String(
2626
string.Concat(
2727
"Chtnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8SD2dvb2dsZS5wcm90b2J1",
28-
"ZiIHCgVFbXB0eUJ2ChNjb20uZ29vZ2xlLnByb3RvYnVmQgpFbXB0eVByb3Rv",
29-
"UAFaJ2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3B0eXBlcy9lbXB0efgB",
30-
"AaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJv",
31-
"dG8z"));
28+
"ZiIHCgVFbXB0eUJ9ChNjb20uZ29vZ2xlLnByb3RvYnVmQgpFbXB0eVByb3Rv",
29+
"UAFaLmdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2Vt",
30+
"cHR5cGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlw",
31+
"ZXNiBnByb3RvMw=="));
3232
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
3333
new pbr::FileDescriptor[] { },
3434
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs

+4-5
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,10 @@ static FieldMaskReflection() {
2525
byte[] descriptorData = global::System.Convert.FromBase64String(
2626
string.Concat(
2727
"CiBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90bxIPZ29vZ2xlLnBy",
28-
"b3RvYnVmIhoKCUZpZWxkTWFzaxINCgVwYXRocxgBIAMoCUKMAQoTY29tLmdv",
29-
"b2dsZS5wcm90b2J1ZkIORmllbGRNYXNrUHJvdG9QAVo5Z29vZ2xlLmdvbGFu",
30-
"Zy5vcmcvZ2VucHJvdG8vcHJvdG9idWYvZmllbGRfbWFzaztmaWVsZF9tYXNr",
31-
"+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZw",
32-
"cm90bzM="));
28+
"b3RvYnVmIhoKCUZpZWxkTWFzaxINCgVwYXRocxgBIAMoCUKFAQoTY29tLmdv",
29+
"b2dsZS5wcm90b2J1ZkIORmllbGRNYXNrUHJvdG9QAVoyZ29vZ2xlLmdvbGFu",
30+
"Zy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vZmllbGRtYXNrcGL4AQGiAgNH",
31+
"UEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMw=="));
3332
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
3433
new pbr::FileDescriptor[] { },
3534
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

csharp/src/Google.Protobuf/WellKnownTypes/SourceContext.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ static SourceContextReflection() {
2626
string.Concat(
2727
"CiRnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucHJvdG8SD2dvb2ds",
2828
"ZS5wcm90b2J1ZiIiCg1Tb3VyY2VDb250ZXh0EhEKCWZpbGVfbmFtZRgBIAEo",
29-
"CUKVAQoTY29tLmdvb2dsZS5wcm90b2J1ZkISU291cmNlQ29udGV4dFByb3Rv",
30-
"UAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL3Byb3RvYnVmL3NvdXJj",
31-
"ZV9jb250ZXh0O3NvdXJjZV9jb250ZXh0ogIDR1BCqgIeR29vZ2xlLlByb3Rv",
32-
"YnVmLldlbGxLbm93blR5cGVzYgZwcm90bzM="));
29+
"CUKKAQoTY29tLmdvb2dsZS5wcm90b2J1ZkISU291cmNlQ29udGV4dFByb3Rv",
30+
"UAFaNmdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3Nv",
31+
"dXJjZWNvbnRleHRwYqICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25v",
32+
"d25UeXBlc2IGcHJvdG8z"));
3333
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
3434
new pbr::FileDescriptor[] { },
3535
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ static StructReflection() {
3535
"ABIwCgpsaXN0X3ZhbHVlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkxpc3RW",
3636
"YWx1ZUgAQgYKBGtpbmQiMwoJTGlzdFZhbHVlEiYKBnZhbHVlcxgBIAMoCzIW",
3737
"Lmdvb2dsZS5wcm90b2J1Zi5WYWx1ZSobCglOdWxsVmFsdWUSDgoKTlVMTF9W",
38-
"QUxVRRAAQoEBChNjb20uZ29vZ2xlLnByb3RvYnVmQgtTdHJ1Y3RQcm90b1AB",
39-
"WjFnaXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wdHlwZXMvc3RydWN0O3N0",
40-
"cnVjdHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5",
41-
"cGVzYgZwcm90bzM="));
38+
"QUxVRRAAQn8KE2NvbS5nb29nbGUucHJvdG9idWZCC1N0cnVjdFByb3RvUAFa",
39+
"L2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3N0cnVj",
40+
"dHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVz",
41+
"YgZwcm90bzM="));
4242
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
4343
new pbr::FileDescriptor[] { },
4444
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Google.Protobuf.WellKnownTypes.NullValue), }, null, new pbr::GeneratedClrTypeInfo[] {

csharp/src/Google.Protobuf/WellKnownTypes/Timestamp.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ static TimestampReflection() {
2626
string.Concat(
2727
"Ch9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvEg9nb29nbGUucHJv",
2828
"dG9idWYiKwoJVGltZXN0YW1wEg8KB3NlY29uZHMYASABKAMSDQoFbmFub3MY",
29-
"AiABKAVCfgoTY29tLmdvb2dsZS5wcm90b2J1ZkIOVGltZXN0YW1wUHJvdG9Q",
30-
"AVorZ2l0aHViLmNvbS9nb2xhbmcvcHJvdG9idWYvcHR5cGVzL3RpbWVzdGFt",
31-
"cPgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IG",
32-
"cHJvdG8z"));
29+
"AiABKAVChQEKE2NvbS5nb29nbGUucHJvdG9idWZCDlRpbWVzdGFtcFByb3Rv",
30+
"UAFaMmdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3Rp",
31+
"bWVzdGFtcHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93",
32+
"blR5cGVzYgZwcm90bzM="));
3333
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
3434
new pbr::FileDescriptor[] { },
3535
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

csharp/src/Google.Protobuf/WellKnownTypes/Type.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ static TypeReflection() {
5656
"ASgFEigKB29wdGlvbnMYAyADKAsyFy5nb29nbGUucHJvdG9idWYuT3B0aW9u",
5757
"IjsKBk9wdGlvbhIMCgRuYW1lGAEgASgJEiMKBXZhbHVlGAIgASgLMhQuZ29v",
5858
"Z2xlLnByb3RvYnVmLkFueSouCgZTeW50YXgSEQoNU1lOVEFYX1BST1RPMhAA",
59-
"EhEKDVNZTlRBWF9QUk9UTzMQAUJ9ChNjb20uZ29vZ2xlLnByb3RvYnVmQglU",
60-
"eXBlUHJvdG9QAVovZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vcHJvdG9i",
61-
"dWYvcHR5cGU7cHR5cGX4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2Vs",
62-
"bEtub3duVHlwZXNiBnByb3RvMw=="));
59+
"EhEKDVNZTlRBWF9QUk9UTzMQAUJ7ChNjb20uZ29vZ2xlLnByb3RvYnVmQglU",
60+
"eXBlUHJvdG9QAVotZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMv",
61+
"a25vd24vdHlwZXBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxL",
62+
"bm93blR5cGVzYgZwcm90bzM="));
6363
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
6464
new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.AnyReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.SourceContextReflection.Descriptor, },
6565
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Google.Protobuf.WellKnownTypes.Syntax), }, null, new pbr::GeneratedClrTypeInfo[] {

csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs

+5-4
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@ static WrappersReflection() {
3030
"KAMiHAoLVUludDY0VmFsdWUSDQoFdmFsdWUYASABKAQiGwoKSW50MzJWYWx1",
3131
"ZRINCgV2YWx1ZRgBIAEoBSIcCgtVSW50MzJWYWx1ZRINCgV2YWx1ZRgBIAEo",
3232
"DSIaCglCb29sVmFsdWUSDQoFdmFsdWUYASABKAgiHAoLU3RyaW5nVmFsdWUS",
33-
"DQoFdmFsdWUYASABKAkiGwoKQnl0ZXNWYWx1ZRINCgV2YWx1ZRgBIAEoDEJ8",
34-
"ChNjb20uZ29vZ2xlLnByb3RvYnVmQg1XcmFwcGVyc1Byb3RvUAFaKmdpdGh1",
35-
"Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3B0eXBlcy93cmFwcGVyc/gBAaICA0dQ",
36-
"QqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8z"));
33+
"DQoFdmFsdWUYASABKAkiGwoKQnl0ZXNWYWx1ZRINCgV2YWx1ZRgBIAEoDEKD",
34+
"AQoTY29tLmdvb2dsZS5wcm90b2J1ZkINV3JhcHBlcnNQcm90b1ABWjFnb29n",
35+
"bGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi93cmFwcGVyc3Bi",
36+
"+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZw",
37+
"cm90bzM="));
3738
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
3839
new pbr::FileDescriptor[] { },
3940
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

python/google/protobuf/internal/json_format_test.py

+14
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,20 @@ def testListValueMessage(self):
636636
parsed_message = json_format_proto3_pb2.TestListValue()
637637
self.CheckParseBack(message, parsed_message)
638638

639+
def testNullValue(self):
640+
message = json_format_proto3_pb2.TestOneof()
641+
message.oneof_null_value = 0
642+
self.assertEqual(json_format.MessageToJson(message),
643+
'{\n "oneofNullValue": null\n}')
644+
parsed_message = json_format_proto3_pb2.TestOneof()
645+
self.CheckParseBack(message, parsed_message)
646+
# Check old format is also accepted
647+
new_message = json_format_proto3_pb2.TestOneof()
648+
json_format.Parse('{\n "oneofNullValue": "NULL_VALUE"\n}',
649+
new_message)
650+
self.assertEqual(json_format.MessageToJson(new_message),
651+
'{\n "oneofNullValue": null\n}')
652+
639653
def testAnyMessage(self):
640654
message = json_format_proto3_pb2.TestAny()
641655
value1 = json_format_proto3_pb2.MessageType()

python/google/protobuf/json_format.py

+5
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,8 @@ def _FieldToJsonObject(self, field, value):
286286
elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM:
287287
if self.use_integers_for_enums:
288288
return value
289+
if field.enum_type.full_name == 'google.protobuf.NullValue':
290+
return None
289291
enum_value = field.enum_type.values_by_number.get(value, None)
290292
if enum_value is not None:
291293
return enum_value.name
@@ -544,6 +546,9 @@ def _ConvertFieldValuePair(self, js, message):
544546
and field.message_type.full_name == 'google.protobuf.Value'):
545547
sub_message = getattr(message, field.name)
546548
sub_message.null_value = 0
549+
elif (field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM
550+
and field.enum_type.full_name == 'google.protobuf.NullValue'):
551+
setattr(message, field.name, 0)
547552
else:
548553
message.ClearField(field.name)
549554
continue

src/google/protobuf/any.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ void AnyMetadata::PackFrom(const Message& message) {
4646
}
4747

4848
void AnyMetadata::PackFrom(const Message& message,
49-
const std::string& type_url_prefix) {
49+
StringPiece type_url_prefix) {
5050
type_url_->SetNoArena(
5151
&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyString(),
5252
GetTypeUrl(message.GetDescriptor()->full_name(), type_url_prefix));

src/google/protobuf/any.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class PROTOBUF_EXPORT AnyMetadata {
8282
InternalPackFrom(message, type_url_prefix, T::FullMessageName());
8383
}
8484

85-
void PackFrom(const Message& message, const std::string& type_url_prefix);
85+
void PackFrom(const Message& message, StringPiece type_url_prefix);
8686

8787
// Unpacks the payload into the given message. Returns false if the message's
8888
// type doesn't match the type specified in the type URL (i.e., the full
@@ -124,14 +124,14 @@ class PROTOBUF_EXPORT AnyMetadata {
124124
//
125125
// NOTE: this function is available publicly as:
126126
// google::protobuf::Any() // static method on the generated message type.
127-
bool ParseAnyTypeUrl(const std::string& type_url, std::string* full_type_name);
127+
bool ParseAnyTypeUrl(StringPiece type_url, std::string* full_type_name);
128128

129129
// Get the proto type name and prefix from Any::type_url value. For example,
130130
// passing "type.googleapis.com/rpc.QueryOrigin" will return
131131
// "type.googleapis.com/" in *url_prefix and "rpc.QueryOrigin" in
132132
// *full_type_name. Returns false if the type_url does not have a "/" in the
133133
// type url separating the full type name.
134-
bool ParseAnyTypeUrl(const std::string& type_url, std::string* url_prefix,
134+
bool ParseAnyTypeUrl(StringPiece type_url, std::string* url_prefix,
135135
std::string* full_type_name);
136136

137137
// See if message is of type google.protobuf.Any, if so, return the descriptors

src/google/protobuf/any.pb.cc

+5-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/google/protobuf/any.proto

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ syntax = "proto3";
3333
package google.protobuf;
3434

3535
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
36-
option go_package = "github.com/golang/protobuf/ptypes/any";
36+
option go_package = "google.golang.org/protobuf/types/known/anypb";
3737
option java_package = "com.google.protobuf";
3838
option java_outer_classname = "AnyProto";
3939
option java_multiple_files = true;

0 commit comments

Comments
 (0)