| Index: third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc
|
| diff --git a/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc b/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc
|
| index 6e1620d4d2e3c6d72ef211518fef462557f8fbe8..824e2205e43c6c33b096908fa26e978231ad20b9 100644
|
| --- a/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc
|
| +++ b/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc
|
| @@ -1,6 +1,6 @@
|
| // Protocol Buffers - Google's data interchange format
|
| // Copyright 2008 Google Inc. All rights reserved.
|
| -// http://code.google.com/p/protobuf/
|
| +// 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
|
| @@ -35,7 +35,6 @@
|
| #include <google/protobuf/compiler/cpp/cpp_enum_field.h>
|
| #include <google/protobuf/compiler/cpp/cpp_helpers.h>
|
| #include <google/protobuf/io/printer.h>
|
| -#include <google/protobuf/descriptor.pb.h>
|
| #include <google/protobuf/stubs/strutil.h>
|
|
|
| namespace google {
|
| @@ -51,7 +50,8 @@ void SetEnumVariables(const FieldDescriptor* descriptor,
|
| SetCommonFieldVariables(descriptor, variables, options);
|
| const EnumValueDescriptor* default_value = descriptor->default_value_enum();
|
| (*variables)["type"] = ClassName(descriptor->enum_type(), true);
|
| - (*variables)["default"] = SimpleItoa(default_value->number());
|
| + (*variables)["default"] = Int32ToString(default_value->number());
|
| + (*variables)["full_name"] = descriptor->full_name();
|
| }
|
|
|
| } // namespace
|
| @@ -75,20 +75,29 @@ GeneratePrivateMembers(io::Printer* printer) const {
|
| void EnumFieldGenerator::
|
| GenerateAccessorDeclarations(io::Printer* printer) const {
|
| printer->Print(variables_,
|
| - "inline $type$ $name$() const$deprecation$;\n"
|
| - "inline void set_$name$($type$ value)$deprecation$;\n");
|
| + "$type$ $name$() const$deprecation$;\n"
|
| + "void set_$name$($type$ value)$deprecation$;\n");
|
| }
|
|
|
| void EnumFieldGenerator::
|
| -GenerateInlineAccessorDefinitions(io::Printer* printer) const {
|
| - printer->Print(variables_,
|
| - "inline $type$ $classname$::$name$() const {\n"
|
| +GenerateInlineAccessorDefinitions(io::Printer* printer,
|
| + bool is_inline) const {
|
| + map<string, string> variables(variables_);
|
| + variables["inline"] = is_inline ? "inline" : "";
|
| + printer->Print(variables,
|
| + "$inline$ $type$ $classname$::$name$() const {\n"
|
| + " // @@protoc_insertion_point(field_get:$full_name$)\n"
|
| " return static_cast< $type$ >($name$_);\n"
|
| "}\n"
|
| - "inline void $classname$::set_$name$($type$ value) {\n"
|
| - " assert($type$_IsValid(value));\n"
|
| - " set_has_$name$();\n"
|
| + "$inline$ void $classname$::set_$name$($type$ value) {\n");
|
| + if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) {
|
| + printer->Print(variables,
|
| + " assert($type$_IsValid(value));\n");
|
| + }
|
| + printer->Print(variables,
|
| + " $set_hasbit$\n"
|
| " $name$_ = value;\n"
|
| + " // @@protoc_insertion_point(field_set:$full_name$)\n"
|
| "}\n");
|
| }
|
|
|
| @@ -118,16 +127,27 @@ GenerateMergeFromCodedStream(io::Printer* printer) const {
|
| "int value;\n"
|
| "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n"
|
| " int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n"
|
| - " input, &value)));\n"
|
| - "if ($type$_IsValid(value)) {\n"
|
| - " set_$name$(static_cast< $type$ >(value));\n");
|
| - if (HasUnknownFields(descriptor_->file())) {
|
| + " input, &value)));\n");
|
| + if (HasPreservingUnknownEnumSemantics(descriptor_->file())) {
|
| + printer->Print(variables_,
|
| + "set_$name$(static_cast< $type$ >(value));\n");
|
| + } else {
|
| + printer->Print(variables_,
|
| + "if ($type$_IsValid(value)) {\n"
|
| + " set_$name$(static_cast< $type$ >(value));\n");
|
| + if (UseUnknownFieldSet(descriptor_->file())) {
|
| + printer->Print(variables_,
|
| + "} else {\n"
|
| + " mutable_unknown_fields()->AddVarint($number$, value);\n");
|
| + } else {
|
| + printer->Print(
|
| + "} else {\n"
|
| + " unknown_fields_stream.WriteVarint32(tag);\n"
|
| + " unknown_fields_stream.WriteVarint32(value);\n");
|
| + }
|
| printer->Print(variables_,
|
| - "} else {\n"
|
| - " mutable_unknown_fields()->AddVarint($number$, value);\n");
|
| + "}\n");
|
| }
|
| - printer->Print(variables_,
|
| - "}\n");
|
| }
|
|
|
| void EnumFieldGenerator::
|
| @@ -153,6 +173,61 @@ GenerateByteSize(io::Printer* printer) const {
|
|
|
| // ===================================================================
|
|
|
| +EnumOneofFieldGenerator::
|
| +EnumOneofFieldGenerator(const FieldDescriptor* descriptor,
|
| + const Options& options)
|
| + : EnumFieldGenerator(descriptor, options) {
|
| + SetCommonOneofFieldVariables(descriptor, &variables_);
|
| +}
|
| +
|
| +EnumOneofFieldGenerator::~EnumOneofFieldGenerator() {}
|
| +
|
| +void EnumOneofFieldGenerator::
|
| +GenerateInlineAccessorDefinitions(io::Printer* printer,
|
| + bool is_inline) const {
|
| + map<string, string> variables(variables_);
|
| + variables["inline"] = is_inline ? "inline" : "";
|
| + printer->Print(variables,
|
| + "$inline$ $type$ $classname$::$name$() const {\n"
|
| + " // @@protoc_insertion_point(field_get:$full_name$)\n"
|
| + " if (has_$name$()) {\n"
|
| + " return static_cast< $type$ >($oneof_prefix$$name$_);\n"
|
| + " }\n"
|
| + " return static_cast< $type$ >($default$);\n"
|
| + "}\n"
|
| + "$inline$ void $classname$::set_$name$($type$ value) {\n");
|
| + if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) {
|
| + printer->Print(variables,
|
| + " assert($type$_IsValid(value));\n");
|
| + }
|
| + printer->Print(variables,
|
| + " if (!has_$name$()) {\n"
|
| + " clear_$oneof_name$();\n"
|
| + " set_has_$name$();\n"
|
| + " }\n"
|
| + " $oneof_prefix$$name$_ = value;\n"
|
| + " // @@protoc_insertion_point(field_set:$full_name$)\n"
|
| + "}\n");
|
| +}
|
| +
|
| +void EnumOneofFieldGenerator::
|
| +GenerateClearingCode(io::Printer* printer) const {
|
| + printer->Print(variables_, "$oneof_prefix$$name$_ = $default$;\n");
|
| +}
|
| +
|
| +void EnumOneofFieldGenerator::
|
| +GenerateSwappingCode(io::Printer* printer) const {
|
| + // Don't print any swapping code. Swapping the union will swap this field.
|
| +}
|
| +
|
| +void EnumOneofFieldGenerator::
|
| +GenerateConstructorCode(io::Printer* printer) const {
|
| + printer->Print(variables_,
|
| + " $classname$_default_oneof_instance_->$name$_ = $default$;\n");
|
| +}
|
| +
|
| +// ===================================================================
|
| +
|
| RepeatedEnumFieldGenerator::
|
| RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor,
|
| const Options& options)
|
| @@ -166,7 +241,8 @@ void RepeatedEnumFieldGenerator::
|
| GeneratePrivateMembers(io::Printer* printer) const {
|
| printer->Print(variables_,
|
| "::google::protobuf::RepeatedField<int> $name$_;\n");
|
| - if (descriptor_->options().packed() && HasGeneratedMethods(descriptor_->file())) {
|
| + if (descriptor_->is_packed()
|
| + && HasGeneratedMethods(descriptor_->file())) {
|
| printer->Print(variables_,
|
| "mutable int _$name$_cached_byte_size_;\n");
|
| }
|
| @@ -175,35 +251,51 @@ GeneratePrivateMembers(io::Printer* printer) const {
|
| void RepeatedEnumFieldGenerator::
|
| GenerateAccessorDeclarations(io::Printer* printer) const {
|
| printer->Print(variables_,
|
| - "inline $type$ $name$(int index) const$deprecation$;\n"
|
| - "inline void set_$name$(int index, $type$ value)$deprecation$;\n"
|
| - "inline void add_$name$($type$ value)$deprecation$;\n");
|
| + "$type$ $name$(int index) const$deprecation$;\n"
|
| + "void set_$name$(int index, $type$ value)$deprecation$;\n"
|
| + "void add_$name$($type$ value)$deprecation$;\n");
|
| printer->Print(variables_,
|
| - "inline const ::google::protobuf::RepeatedField<int>& $name$() const$deprecation$;\n"
|
| - "inline ::google::protobuf::RepeatedField<int>* mutable_$name$()$deprecation$;\n");
|
| + "const ::google::protobuf::RepeatedField<int>& $name$() const$deprecation$;\n"
|
| + "::google::protobuf::RepeatedField<int>* mutable_$name$()$deprecation$;\n");
|
| }
|
|
|
| void RepeatedEnumFieldGenerator::
|
| -GenerateInlineAccessorDefinitions(io::Printer* printer) const {
|
| - printer->Print(variables_,
|
| - "inline $type$ $classname$::$name$(int index) const {\n"
|
| +GenerateInlineAccessorDefinitions(io::Printer* printer,
|
| + bool is_inline) const {
|
| + map<string, string> variables(variables_);
|
| + variables["inline"] = is_inline ? "inline" : "";
|
| + printer->Print(variables,
|
| + "$inline$ $type$ $classname$::$name$(int index) const {\n"
|
| + " // @@protoc_insertion_point(field_get:$full_name$)\n"
|
| " return static_cast< $type$ >($name$_.Get(index));\n"
|
| "}\n"
|
| - "inline void $classname$::set_$name$(int index, $type$ value) {\n"
|
| - " assert($type$_IsValid(value));\n"
|
| + "$inline$ void $classname$::set_$name$(int index, $type$ value) {\n");
|
| + if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) {
|
| + printer->Print(variables,
|
| + " assert($type$_IsValid(value));\n");
|
| + }
|
| + printer->Print(variables,
|
| " $name$_.Set(index, value);\n"
|
| + " // @@protoc_insertion_point(field_set:$full_name$)\n"
|
| "}\n"
|
| - "inline void $classname$::add_$name$($type$ value) {\n"
|
| - " assert($type$_IsValid(value));\n"
|
| + "$inline$ void $classname$::add_$name$($type$ value) {\n");
|
| + if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) {
|
| + printer->Print(variables,
|
| + " assert($type$_IsValid(value));\n");
|
| + }
|
| + printer->Print(variables,
|
| " $name$_.Add(value);\n"
|
| + " // @@protoc_insertion_point(field_add:$full_name$)\n"
|
| "}\n");
|
| - printer->Print(variables_,
|
| - "inline const ::google::protobuf::RepeatedField<int>&\n"
|
| + printer->Print(variables,
|
| + "$inline$ const ::google::protobuf::RepeatedField<int>&\n"
|
| "$classname$::$name$() const {\n"
|
| + " // @@protoc_insertion_point(field_list:$full_name$)\n"
|
| " return $name$_;\n"
|
| "}\n"
|
| - "inline ::google::protobuf::RepeatedField<int>*\n"
|
| + "$inline$ ::google::protobuf::RepeatedField<int>*\n"
|
| "$classname$::mutable_$name$() {\n"
|
| + " // @@protoc_insertion_point(field_mutable_list:$full_name$)\n"
|
| " return &$name$_;\n"
|
| "}\n");
|
| }
|
| @@ -220,7 +312,7 @@ GenerateMergingCode(io::Printer* printer) const {
|
|
|
| void RepeatedEnumFieldGenerator::
|
| GenerateSwappingCode(io::Printer* printer) const {
|
| - printer->Print(variables_, "$name$_.Swap(&other->$name$_);\n");
|
| + printer->Print(variables_, "$name$_.UnsafeArenaSwap(&other->$name$_);\n");
|
| }
|
|
|
| void RepeatedEnumFieldGenerator::
|
| @@ -235,27 +327,59 @@ GenerateMergeFromCodedStream(io::Printer* printer) const {
|
| "int value;\n"
|
| "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n"
|
| " int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n"
|
| - " input, &value)));\n"
|
| - "if ($type$_IsValid(value)) {\n"
|
| - " add_$name$(static_cast< $type$ >(value));\n");
|
| - if (HasUnknownFields(descriptor_->file())) {
|
| + " input, &value)));\n");
|
| + if (HasPreservingUnknownEnumSemantics(descriptor_->file())) {
|
| printer->Print(variables_,
|
| - "} else {\n"
|
| - " mutable_unknown_fields()->AddVarint($number$, value);\n");
|
| + "add_$name$(static_cast< $type$ >(value));\n");
|
| + } else {
|
| + printer->Print(variables_,
|
| + "if ($type$_IsValid(value)) {\n"
|
| + " add_$name$(static_cast< $type$ >(value));\n");
|
| + if (UseUnknownFieldSet(descriptor_->file())) {
|
| + printer->Print(variables_,
|
| + "} else {\n"
|
| + " mutable_unknown_fields()->AddVarint($number$, value);\n");
|
| + } else {
|
| + printer->Print(
|
| + "} else {\n"
|
| + " unknown_fields_stream.WriteVarint32(tag);\n"
|
| + " unknown_fields_stream.WriteVarint32(value);\n");
|
| + }
|
| + printer->Print("}\n");
|
| }
|
| - printer->Print("}\n");
|
| }
|
|
|
| void RepeatedEnumFieldGenerator::
|
| GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const {
|
| - if (!descriptor_->options().packed()) {
|
| - // We use a non-inlined implementation in this case, since this path will
|
| - // rarely be executed.
|
| - printer->Print(variables_,
|
| - "DO_((::google::protobuf::internal::WireFormatLite::ReadPackedEnumNoInline(\n"
|
| - " input,\n"
|
| - " &$type$_IsValid,\n"
|
| - " this->mutable_$name$())));\n");
|
| + if (!descriptor_->is_packed()) {
|
| + // This path is rarely executed, so we use a non-inlined implementation.
|
| + if (HasPreservingUnknownEnumSemantics(descriptor_->file())) {
|
| + printer->Print(variables_,
|
| + "DO_((::google::protobuf::internal::"
|
| + "WireFormatLite::ReadPackedEnumPreserveUnknowns(\n"
|
| + " input,\n"
|
| + " $number$,\n"
|
| + " NULL,\n"
|
| + " NULL,\n"
|
| + " this->mutable_$name$())));\n");
|
| + } else if (UseUnknownFieldSet(descriptor_->file())) {
|
| + printer->Print(variables_,
|
| + "DO_((::google::protobuf::internal::WireFormat::ReadPackedEnumPreserveUnknowns(\n"
|
| + " input,\n"
|
| + " $number$,\n"
|
| + " $type$_IsValid,\n"
|
| + " mutable_unknown_fields(),\n"
|
| + " this->mutable_$name$())));\n");
|
| + } else {
|
| + printer->Print(variables_,
|
| + "DO_((::google::protobuf::internal::"
|
| + "WireFormatLite::ReadPackedEnumPreserveUnknowns(\n"
|
| + " input,\n"
|
| + " $number$,\n"
|
| + " $type$_IsValid,\n"
|
| + " &unknown_fields_stream,\n"
|
| + " this->mutable_$name$())));\n");
|
| + }
|
| } else {
|
| printer->Print(variables_,
|
| "::google::protobuf::uint32 length;\n"
|
| @@ -266,10 +390,27 @@ GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const {
|
| " int value;\n"
|
| " DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n"
|
| " int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n"
|
| - " input, &value)));\n"
|
| + " input, &value)));\n");
|
| + if (HasPreservingUnknownEnumSemantics(descriptor_->file())) {
|
| + printer->Print(variables_,
|
| + " add_$name$(static_cast< $type$ >(value));\n");
|
| + } else {
|
| + printer->Print(variables_,
|
| " if ($type$_IsValid(value)) {\n"
|
| " add_$name$(static_cast< $type$ >(value));\n"
|
| - " }\n"
|
| + " } else {\n");
|
| + if (UseUnknownFieldSet(descriptor_->file())) {
|
| + printer->Print(variables_,
|
| + " mutable_unknown_fields()->AddVarint($number$, value);\n");
|
| + } else {
|
| + printer->Print(variables_,
|
| + " unknown_fields_stream.WriteVarint32(tag);\n"
|
| + " unknown_fields_stream.WriteVarint32(value);\n");
|
| + }
|
| + printer->Print(
|
| + " }\n");
|
| + }
|
| + printer->Print(variables_,
|
| "}\n"
|
| "input->PopLimit(limit);\n");
|
| }
|
| @@ -277,7 +418,7 @@ GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const {
|
|
|
| void RepeatedEnumFieldGenerator::
|
| GenerateSerializeWithCachedSizes(io::Printer* printer) const {
|
| - if (descriptor_->options().packed()) {
|
| + if (descriptor_->is_packed()) {
|
| // Write the tag and the size.
|
| printer->Print(variables_,
|
| "if (this->$name$_size() > 0) {\n"
|
| @@ -290,7 +431,7 @@ GenerateSerializeWithCachedSizes(io::Printer* printer) const {
|
| }
|
| printer->Print(variables_,
|
| "for (int i = 0; i < this->$name$_size(); i++) {\n");
|
| - if (descriptor_->options().packed()) {
|
| + if (descriptor_->is_packed()) {
|
| printer->Print(variables_,
|
| " ::google::protobuf::internal::WireFormatLite::WriteEnumNoTag(\n"
|
| " this->$name$(i), output);\n");
|
| @@ -304,7 +445,7 @@ GenerateSerializeWithCachedSizes(io::Printer* printer) const {
|
|
|
| void RepeatedEnumFieldGenerator::
|
| GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
|
| - if (descriptor_->options().packed()) {
|
| + if (descriptor_->is_packed()) {
|
| // Write the tag and the size.
|
| printer->Print(variables_,
|
| "if (this->$name$_size() > 0) {\n"
|
| @@ -318,7 +459,7 @@ GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
|
| }
|
| printer->Print(variables_,
|
| "for (int i = 0; i < this->$name$_size(); i++) {\n");
|
| - if (descriptor_->options().packed()) {
|
| + if (descriptor_->is_packed()) {
|
| printer->Print(variables_,
|
| " target = ::google::protobuf::internal::WireFormatLite::WriteEnumNoTagToArray(\n"
|
| " this->$name$(i), target);\n");
|
| @@ -342,7 +483,7 @@ GenerateByteSize(io::Printer* printer) const {
|
| " this->$name$(i));\n"
|
| "}\n");
|
|
|
| - if (descriptor_->options().packed()) {
|
| + if (descriptor_->is_packed()) {
|
| printer->Print(variables_,
|
| "if (data_size > 0) {\n"
|
| " total_size += $tag_size$ +\n"
|
|
|