diff --git a/src/google/protobuf/compiler/javanano/javanano_field.cc b/src/google/protobuf/compiler/javanano/javanano_field.cc index 07517567..e40db620 100644 --- a/src/google/protobuf/compiler/javanano/javanano_field.cc +++ b/src/google/protobuf/compiler/javanano/javanano_field.cc @@ -168,26 +168,48 @@ void SetCommonOneofVariables(const FieldDescriptor* descriptor, SimpleItoa(descriptor->number()); } -void GenerateOneofFieldEquals(const map& variables, +void GenerateOneofFieldEquals(const FieldDescriptor* descriptor, + const map& variables, io::Printer* printer) { - printer->Print(variables, - "if (this.has$capitalized_name$()) {\n" - " if (!this.$oneof_name$_.equals(other.$oneof_name$_)) {\n" - " return false;\n" - " }\n" - "} else {\n" - " if (other.has$capitalized_name$()) {\n" - " return false;\n" - " }\n" - "}\n"); - + if (GetJavaType(descriptor) == JAVATYPE_BYTES) { + printer->Print(variables, + "if (this.has$capitalized_name$()) {\n" + " if (!other.has$capitalized_name$() ||\n" + " !java.util.Arrays.equals((byte[]) this.$oneof_name$_,\n" + " (byte[]) other.$oneof_name$_)) {\n" + " return false;\n" + " }\n" + "} else {\n" + " if (other.has$capitalized_name$()) {\n" + " return false;\n" + " }\n" + "}\n"); + } else { + printer->Print(variables, + "if (this.has$capitalized_name$()) {\n" + " if (!this.$oneof_name$_.equals(other.$oneof_name$_)) {\n" + " return false;\n" + " }\n" + "} else {\n" + " if (other.has$capitalized_name$()) {\n" + " return false;\n" + " }\n" + "}\n"); + } } -void GenerateOneofFieldHashCode(const map& variables, +void GenerateOneofFieldHashCode(const FieldDescriptor* descriptor, + const map& variables, io::Printer* printer) { - printer->Print(variables, - "result = 31 * result +\n" - " ($has_oneof_case$ ? this.$oneof_name$_.hashCode() : 0);\n"); + if (GetJavaType(descriptor) == JAVATYPE_BYTES) { + printer->Print(variables, + "result = 31 * result + ($has_oneof_case$\n" + " ? java.util.Arrays.hashCode((byte[]) this.$oneof_name$_) : 0);\n"); + } else { + printer->Print(variables, + "result = 31 * result +\n" + " ($has_oneof_case$ ? this.$oneof_name$_.hashCode() : 0);\n"); + } } } // namespace javanano diff --git a/src/google/protobuf/compiler/javanano/javanano_field.h b/src/google/protobuf/compiler/javanano/javanano_field.h index b31b517b..c2cf091c 100644 --- a/src/google/protobuf/compiler/javanano/javanano_field.h +++ b/src/google/protobuf/compiler/javanano/javanano_field.h @@ -114,9 +114,11 @@ class FieldGeneratorMap { void SetCommonOneofVariables(const FieldDescriptor* descriptor, map* variables); -void GenerateOneofFieldEquals(const map& variables, +void GenerateOneofFieldEquals(const FieldDescriptor* descriptor, + const map& variables, io::Printer* printer); -void GenerateOneofFieldHashCode(const map& variables, +void GenerateOneofFieldHashCode(const FieldDescriptor* descriptor, + const map& variables, io::Printer* printer); } // namespace javanano diff --git a/src/google/protobuf/compiler/javanano/javanano_message_field.cc b/src/google/protobuf/compiler/javanano/javanano_message_field.cc index 6e12bf63..181c4060 100644 --- a/src/google/protobuf/compiler/javanano/javanano_message_field.cc +++ b/src/google/protobuf/compiler/javanano/javanano_message_field.cc @@ -214,12 +214,12 @@ GenerateSerializedSizeCode(io::Printer* printer) const { void MessageOneofFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { - GenerateOneofFieldEquals(variables_, printer); + GenerateOneofFieldEquals(descriptor_, variables_, printer); } void MessageOneofFieldGenerator:: GenerateHashCodeCode(io::Printer* printer) const { - GenerateOneofFieldHashCode(variables_, printer); + GenerateOneofFieldHashCode(descriptor_, variables_, printer); } // =================================================================== diff --git a/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc b/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc index 038db6e2..106a7506 100644 --- a/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc +++ b/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc @@ -767,12 +767,12 @@ void PrimitiveOneofFieldGenerator::GenerateSerializedSizeCode( void PrimitiveOneofFieldGenerator::GenerateEqualsCode( io::Printer* printer) const { - GenerateOneofFieldEquals(variables_, printer); + GenerateOneofFieldEquals(descriptor_, variables_, printer); } void PrimitiveOneofFieldGenerator::GenerateHashCodeCode( io::Printer* printer) const { - GenerateOneofFieldHashCode(variables_, printer); + GenerateOneofFieldHashCode(descriptor_, variables_, printer); } // ===================================================================