Merge branch 'sync-piper' into sync-stage

pull/7402/head
Joshua Haberman 5 years ago
commit e164e15027
  1. 13
      python/google/protobuf/pyext/message.cc
  2. 6
      python/google/protobuf/text_format.py
  3. 2
      src/google/protobuf/arena_impl.h
  4. 8
      src/google/protobuf/compiler/command_line_interface.cc
  5. 9
      src/google/protobuf/compiler/java/java_enum_field_lite.cc
  6. 9
      src/google/protobuf/compiler/java/java_message_field_lite.cc
  7. 9
      src/google/protobuf/compiler/java/java_primitive_field_lite.cc
  8. 10
      src/google/protobuf/compiler/java/java_string_field_lite.cc
  9. 18
      src/google/protobuf/descriptor.h
  10. 14
      src/google/protobuf/proto3_arena_unittest.cc
  11. 5
      src/google/protobuf/util/internal/protostream_objectsource.h

@ -1427,8 +1427,7 @@ bool CheckHasPresence(const FieldDescriptor* field_descriptor, bool in_oneof) {
return false; return false;
} }
if (field_descriptor->containing_oneof() == NULL && if (!field_descriptor->has_presence()) {
!field_descriptor->is_singular_with_presence()) {
PyErr_Format(PyExc_ValueError, PyErr_Format(PyExc_ValueError,
"Can't test non-optional, non-submessage field \"%s.%s\" for " "Can't test non-optional, non-submessage field \"%s.%s\" for "
"presence in proto3.", "presence in proto3.",
@ -2171,7 +2170,8 @@ static PyObject* RichCompare(CMessage* self, PyObject* other, int opid) {
// If other is not a message, it cannot be equal. // If other is not a message, it cannot be equal.
if (!PyObject_TypeCheck(other, CMessage_Type)) { if (!PyObject_TypeCheck(other, CMessage_Type)) {
equals = false; equals = false;
} } else {
// Otherwise, we have a CMessage whose message we can inspect.
const google::protobuf::Message* other_message = const google::protobuf::Message* other_message =
reinterpret_cast<CMessage*>(other)->message; reinterpret_cast<CMessage*>(other)->message;
// If messages don't have the same descriptors, they are not equal. // If messages don't have the same descriptors, they are not equal.
@ -2180,11 +2180,12 @@ static PyObject* RichCompare(CMessage* self, PyObject* other, int opid) {
equals = false; equals = false;
} }
// Check the message contents. // Check the message contents.
if (equals && !google::protobuf::util::MessageDifferencer::Equals( if (equals &&
*self->message, !google::protobuf::util::MessageDifferencer::Equals(
*reinterpret_cast<CMessage*>(other)->message)) { *self->message, *reinterpret_cast<CMessage*>(other)->message)) {
equals = false; equals = false;
} }
}
if (equals ^ (opid == Py_EQ)) { if (equals ^ (opid == Py_EQ)) {
Py_RETURN_FALSE; Py_RETURN_FALSE;

@ -120,7 +120,8 @@ class TextWriter(object):
return self._writer.getvalue() return self._writer.getvalue()
def MessageToString(message, def MessageToString(
message,
as_utf8=False, as_utf8=False,
as_one_line=False, as_one_line=False,
use_short_repeated_primitives=False, use_short_repeated_primitives=False,
@ -329,7 +330,8 @@ WIRETYPE_START_GROUP = 3
class _Printer(object): class _Printer(object):
"""Text format printer for protocol message.""" """Text format printer for protocol message."""
def __init__(self, def __init__(
self,
out, out,
indent=0, indent=0,
as_utf8=False, as_utf8=False,

@ -135,6 +135,8 @@ class PROTOBUF_EXPORT ArenaImpl {
void AddCleanup(void* elem, void (*cleanup)(void*)); void AddCleanup(void* elem, void (*cleanup)(void*));
private: private:
friend class ArenaBenchmark;
void* AllocateAlignedFallback(size_t n); void* AllocateAlignedFallback(size_t n);
void* AllocateAlignedAndAddCleanupFallback(size_t n, void (*cleanup)(void*)); void* AllocateAlignedAndAddCleanupFallback(size_t n, void (*cleanup)(void*));
void AddCleanupFallback(void* elem, void (*cleanup)(void*)); void AddCleanupFallback(void* elem, void (*cleanup)(void*));

@ -1105,14 +1105,18 @@ PopulateSingleSimpleDescriptorDatabase(const std::string& descriptor_set_name) {
bool CommandLineInterface::AllowProto3Optional( bool CommandLineInterface::AllowProto3Optional(
const FileDescriptor& file) const { const FileDescriptor& file) const {
if (allow_proto3_optional_) return true; if (allow_proto3_optional_) return true;
// Whitelist all ads protos. Ads is an early adopter of this feature. // Whitelist all ads protos. Ads is an early adopter of this feature.
if (file.name().find("google/ads/googleads") != std::string::npos) { if (file.name().find("google/ads/googleads") != std::string::npos) {
return true; return true;
} }
if (file.name() == "google/protobuf/unittest_proto3_optional.proto" ||
file.name() == "google/protobuf/internal/test_proto3_optional.proto") { // Whitelist all protos testing proto3 optional.
if (file.name().find("test_proto3_optional") != std::string::npos) {
return true; return true;
} }
return false; return false;
} }

@ -103,9 +103,6 @@ void SetEnumVariables(const FieldDescriptor* descriptor, int messageBitIndex,
".getNumber()"; ".getNumber()";
} }
// For repeated builders, the underlying list tracks mutability state.
(*variables)["is_mutable"] = (*variables)["name"] + "_.isModifiable()";
(*variables)["get_has_field_bit_from_local"] = (*variables)["get_has_field_bit_from_local"] =
GenerateGetBitFromLocal(builderBitIndex); GenerateGetBitFromLocal(builderBitIndex);
(*variables)["set_has_field_bit_to_local"] = (*variables)["set_has_field_bit_to_local"] =
@ -572,9 +569,11 @@ void RepeatedImmutableEnumFieldLiteGenerator::GenerateMembers(
printer->Print( printer->Print(
variables_, variables_,
"private void ensure$capitalized_name$IsMutable() {\n" "private void ensure$capitalized_name$IsMutable() {\n"
" if (!$is_mutable$) {\n" // Use a temporary to avoid a redundant iget-object.
" com.google.protobuf.Internal.IntList tmp = $name$_;\n"
" if (!tmp.isModifiable()) {\n"
" $name$_ =\n" " $name$_ =\n"
" com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy(tmp);\n"
" }\n" " }\n"
"}\n"); "}\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_SETTER); WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_SETTER);

@ -89,9 +89,6 @@ void SetMessageVariables(const FieldDescriptor* descriptor, int messageBitIndex,
(*variables)["name"] + "_ != null"; (*variables)["name"] + "_ != null";
} }
// For repeated builders, the underlying list tracks mutability state.
(*variables)["is_mutable"] = (*variables)["name"] + "_.isModifiable()";
(*variables)["get_has_field_bit_from_local"] = (*variables)["get_has_field_bit_from_local"] =
GenerateGetBitFromLocal(builderBitIndex); GenerateGetBitFromLocal(builderBitIndex);
(*variables)["set_has_field_bit_to_local"] = (*variables)["set_has_field_bit_to_local"] =
@ -532,9 +529,11 @@ void RepeatedImmutableMessageFieldLiteGenerator::GenerateMembers(
printer->Print( printer->Print(
variables_, variables_,
"private void ensure$capitalized_name$IsMutable() {\n" "private void ensure$capitalized_name$IsMutable() {\n"
" if (!$is_mutable$) {\n" // Use a temporary to avoid a redundant iget-object.
" com.google.protobuf.Internal.ProtobufList<$type$> tmp = $name$_;\n"
" if (!tmp.isModifiable()) {\n"
" $name$_ =\n" " $name$_ =\n"
" com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy(tmp);\n"
" }\n" " }\n"
"}\n" "}\n"
"\n"); "\n");

@ -164,9 +164,6 @@ void SetPrimitiveVariables(const FieldDescriptor* descriptor,
} }
} }
// For repeated builders, the underlying list tracks mutability state.
(*variables)["is_mutable"] = (*variables)["name"] + "_.isModifiable()";
(*variables)["get_has_field_bit_from_local"] = (*variables)["get_has_field_bit_from_local"] =
GenerateGetBitFromLocal(builderBitIndex); GenerateGetBitFromLocal(builderBitIndex);
(*variables)["set_has_field_bit_to_local"] = (*variables)["set_has_field_bit_to_local"] =
@ -511,9 +508,11 @@ void RepeatedImmutablePrimitiveFieldLiteGenerator::GenerateMembers(
printer->Print( printer->Print(
variables_, variables_,
"private void ensure$capitalized_name$IsMutable() {\n" "private void ensure$capitalized_name$IsMutable() {\n"
" if (!$is_mutable$) {\n" // Use a temporary to avoid a redundant iget-object.
" $field_list_type$ tmp = $name$_;\n"
" if (!tmp.isModifiable()) {\n"
" $name$_ =\n" " $name$_ =\n"
" com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy(tmp);\n"
" }\n" " }\n"
"}\n"); "}\n");

@ -104,9 +104,6 @@ void SetPrimitiveVariables(const FieldDescriptor* descriptor,
"!" + (*variables)["name"] + "_.isEmpty()"; "!" + (*variables)["name"] + "_.isEmpty()";
} }
// For repeated builders, the underlying list tracks mutability state.
(*variables)["is_mutable"] = (*variables)["name"] + "_.isModifiable()";
(*variables)["get_has_field_bit_from_local"] = (*variables)["get_has_field_bit_from_local"] =
GenerateGetBitFromLocal(builderBitIndex); GenerateGetBitFromLocal(builderBitIndex);
(*variables)["set_has_field_bit_to_local"] = (*variables)["set_has_field_bit_to_local"] =
@ -567,9 +564,12 @@ void RepeatedImmutableStringFieldLiteGenerator::GenerateMembers(
printer->Print( printer->Print(
variables_, variables_,
"private void ensure$capitalized_name$IsMutable() {\n" "private void ensure$capitalized_name$IsMutable() {\n"
" if (!$is_mutable$) {\n" // Use a temporary to avoid a redundant iget-object.
" com.google.protobuf.Internal.ProtobufList<java.lang.String> tmp =\n"
" $name$_;"
" if (!tmp.isModifiable()) {\n"
" $name$_ =\n" " $name$_ =\n"
" com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy(tmp);\n"
" }\n" " }\n"
"}\n"); "}\n");

@ -693,13 +693,14 @@ class PROTOBUF_EXPORT FieldDescriptor {
// .proto file. Excludes singular proto3 fields that do not have a label. // .proto file. Excludes singular proto3 fields that do not have a label.
bool has_optional_keyword() const; bool has_optional_keyword() const;
// Returns true if this is a non-oneof field that tracks presence. // Returns true if this field tracks presence, ie. does the message
// This includes all "required" and "optional" fields in the .proto file, // distinguish between "unset" and "present with default value."
// but excludes oneof fields and singular proto3 fields without "optional". // This includes required, optional, and oneof fields. It excludes maps,
// repeated fields, and singular proto3 fields without "optional".
// //
// In implementations that use hasbits, this method will probably indicate // For fields where has_presence() == true, the return value of
// whether this field uses a hasbit. // Reflection::HasField() is semantically meaningful.
bool is_singular_with_presence() const; bool has_presence() const;
// Index of this field within the message's field array, or the file or // Index of this field within the message's field array, or the file or
// extension scope's extensions array. // extension scope's extensions array.
@ -2182,10 +2183,9 @@ inline const OneofDescriptor* FieldDescriptor::real_containing_oneof() const {
: nullptr; : nullptr;
} }
inline bool FieldDescriptor::is_singular_with_presence() const { inline bool FieldDescriptor::has_presence() const {
if (is_repeated()) return false; if (is_repeated()) return false;
if (real_containing_oneof()) return false; return cpp_type() == CPPTYPE_MESSAGE || containing_oneof() ||
return cpp_type() == CPPTYPE_MESSAGE || proto3_optional_ ||
file()->syntax() == FileDescriptor::SYNTAX_PROTO2; file()->syntax() == FileDescriptor::SYNTAX_PROTO2;
} }

@ -218,7 +218,7 @@ TEST(Proto3OptionalTest, OptionalFieldDescriptor) {
for (int i = 0; i < d->field_count(); i++) { for (int i = 0; i < d->field_count(); i++) {
const FieldDescriptor* f = d->field(i); const FieldDescriptor* f = d->field(i);
EXPECT_TRUE(f->has_optional_keyword()) << f->full_name(); EXPECT_TRUE(f->has_optional_keyword()) << f->full_name();
EXPECT_TRUE(f->is_singular_with_presence()) << f->full_name(); EXPECT_TRUE(f->has_presence()) << f->full_name();
EXPECT_TRUE(f->containing_oneof()) << f->full_name(); EXPECT_TRUE(f->containing_oneof()) << f->full_name();
} }
} }
@ -470,16 +470,8 @@ TEST(Proto3OptionalTest, ReflectiveSwapRoundTrip) {
TEST(Proto3OptionalTest, PlainFields) { TEST(Proto3OptionalTest, PlainFields) {
const Descriptor* d = TestAllTypes::descriptor(); const Descriptor* d = TestAllTypes::descriptor();
for (int i = 0; i < d->field_count(); i++) { EXPECT_FALSE(d->FindFieldByName("optional_int32")->has_presence());
const FieldDescriptor* f = d->field(i); EXPECT_TRUE(d->FindFieldByName("oneof_nested_message")->has_presence());
EXPECT_FALSE(f->has_optional_keyword()) << f->full_name();
if (f->is_optional() && f->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {
EXPECT_FALSE(f->is_singular_with_presence()) << f->full_name();
}
}
EXPECT_FALSE(
d->FindFieldByName("oneof_nested_message")->is_singular_with_presence());
} }
} // namespace } // namespace

@ -160,6 +160,9 @@ class PROTOBUF_EXPORT ProtoStreamObjectSource : public ObjectSource {
const google::protobuf::Field& field) const; const google::protobuf::Field& field) const;
// Returns the input stream.
io::CodedInputStream* stream() const { return stream_; }
private: private:
ProtoStreamObjectSource(io::CodedInputStream* stream, ProtoStreamObjectSource(io::CodedInputStream* stream,
const TypeInfo* typeinfo, const TypeInfo* typeinfo,
@ -281,7 +284,7 @@ class PROTOBUF_EXPORT ProtoStreamObjectSource : public ObjectSource {
StringPiece field_name) const; StringPiece field_name) const;
// Input stream to read from. Ownership rests with the caller. // Input stream to read from. Ownership rests with the caller.
io::CodedInputStream* stream_; mutable io::CodedInputStream* stream_;
// Type information for all the types used in the descriptor. Used to find // Type information for all the types used in the descriptor. Used to find
// google::protobuf::Type of nested messages/enums. // google::protobuf::Type of nested messages/enums.

Loading…
Cancel
Save