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" |