Browse Source

Fix access around unknownFieldData.

Instead of publishing its class I chose to encapsulate the troublesome
references in equals()/hashCode() in the generated code into superclass
methods in ExtendableMessageNano.

Changed a couple of java packages in the test suite to catch this issue
easier in the future.

Change-Id: I43f88411f63bb6f3ffc8d63361f2f77bebf6220a
Max Cai 11 years ago
parent
commit
d1a8a8f6f1

+ 25 - 0
java/src/main/java/com/google/protobuf/nano/ExtendableMessageNano.java

@@ -147,4 +147,29 @@ public abstract class ExtendableMessageNano<M extends ExtendableMessageNano<M>>
         field.addUnknownField(unknownField);
         return true;
     }
+
+    /**
+     * Returns whether the stored unknown field data in this message is equivalent to that in the
+     * other message.
+     *
+     * @param other the other message.
+     * @return whether the two sets of unknown field data are equal.
+     */
+    protected final boolean unknownFieldDataEquals(M other) {
+        if (unknownFieldData == null || unknownFieldData.isEmpty()) {
+            return other.unknownFieldData == null || other.unknownFieldData.isEmpty();
+        } else {
+            return unknownFieldData.equals(other.unknownFieldData);
+        }
+    }
+
+    /**
+     * Computes the hashcode representing the unknown field data stored in this message.
+     *
+     * @return the hashcode for the unknown field data.
+     */
+    protected final int unknownFieldDataHashCode() {
+        return (unknownFieldData == null || unknownFieldData.isEmpty()
+                ? 0 : unknownFieldData.hashCode());
+    }
 }

+ 4 - 4
java/src/test/java/com/google/protobuf/NanoTest.java

@@ -35,9 +35,6 @@ import com.google.protobuf.nano.EnumClassNanoMultiple;
 import com.google.protobuf.nano.EnumClassNanos;
 import com.google.protobuf.nano.EnumValidity;
 import com.google.protobuf.nano.EnumValidityAccessors;
-import com.google.protobuf.nano.Extensions;
-import com.google.protobuf.nano.Extensions.AnotherMessage;
-import com.google.protobuf.nano.Extensions.MessageWithGroup;
 import com.google.protobuf.nano.FileScopeEnumMultiple;
 import com.google.protobuf.nano.FileScopeEnumRefNano;
 import com.google.protobuf.nano.InternalNano;
@@ -57,11 +54,14 @@ import com.google.protobuf.nano.PackedExtensions;
 import com.google.protobuf.nano.RepeatedExtensions;
 import com.google.protobuf.nano.SingularExtensions;
 import com.google.protobuf.nano.TestRepeatedMergeNano;
-import com.google.protobuf.nano.UnittestImportNano;
 import com.google.protobuf.nano.UnittestMultipleNano;
 import com.google.protobuf.nano.UnittestRecursiveNano.RecursiveMessageNano;
 import com.google.protobuf.nano.UnittestSimpleNano.SimpleMessageNano;
 import com.google.protobuf.nano.UnittestSingleNano.SingleMessageNano;
+import com.google.protobuf.nano.testext.Extensions;
+import com.google.protobuf.nano.testext.Extensions.AnotherMessage;
+import com.google.protobuf.nano.testext.Extensions.MessageWithGroup;
+import com.google.protobuf.nano.testimport.UnittestImportNano;
 
 import junit.framework.TestCase;
 

+ 2 - 7
src/google/protobuf/compiler/javanano/javanano_message.cc

@@ -501,11 +501,7 @@ void MessageGenerator::GenerateEquals(io::Printer* printer) {
 
   if (params_.store_unknown_fields()) {
     printer->Print(
-      "if (unknownFieldData == null || unknownFieldData.isEmpty()) {\n"
-      "  return other.unknownFieldData == null || other.unknownFieldData.isEmpty();"
-      "} else {\n"
-      "  return unknownFieldData.equals(other.unknownFieldData);\n"
-      "}\n");
+      "return unknownFieldDataEquals(other);\n");
   } else {
     printer->Print(
       "return true;\n");
@@ -534,8 +530,7 @@ void MessageGenerator::GenerateHashCode(io::Printer* printer) {
 
   if (params_.store_unknown_fields()) {
     printer->Print(
-      "result = 31 * result + (unknownFieldData == null || unknownFieldData.isEmpty()\n"
-      "    ? 0 : unknownFieldData.hashCode());\n");
+      "result = 31 * result + unknownFieldDataHashCode();\n");
   }
 
   printer->Print("return result;\n");

+ 1 - 1
src/google/protobuf/unittest_extension_nano.proto

@@ -1,7 +1,7 @@
 syntax = "proto2";
 
 option java_outer_classname = "Extensions";
-option java_package = "com.google.protobuf.nano";
+option java_package = "com.google.protobuf.nano.testext";
 
 message ExtendableMessage {
   optional int32 field = 1;

+ 1 - 1
src/google/protobuf/unittest_import_nano.proto

@@ -35,7 +35,7 @@
 package protobuf_unittest_import;
 
 // java_package and java_outer_classname are specified on the command line.
-//option java_package = "com.google.protobuf.nano";
+//option java_package = "com.google.protobuf.nano.testimport";
 //option java_outer_classname = "UnittestImportNano";
 
 message ImportMessageNano {