Parcourir la source

am ce2f5991: Merge "Revert "Don\'t reset cachedSize to 0 in getSerializedSize""

* commit 'ce2f59915e0b41c935e3f72a2b7b71b6c19b6860':
  Revert "Don't reset cachedSize to 0 in getSerializedSize"
Wink Saville il y a 11 ans
Parent
commit
6ba01e2439

+ 0 - 9
java/README.txt

@@ -437,15 +437,6 @@ and the runtime overhead. An overview of Nano features:
   MessageNano.
 - The 'bytes' type translates to the Java type byte[].
 
-The generated messages are not thread-safe for writes, but may be
-used simultaneously from multiple threads in a read-only manner.
-In other words, an appropriate synchronization mechanism (such as
-a ReadWriteLock) must be used to ensure that a message, its
-ancestors, and descendants are not accessed by any other threads
-while the message is being modified. Field reads, getter methods,
-toByteArray(...), writeTo(...), getCachedSize(), and
-getSerializedSize() are all considered read-only operations.
-
 IMPORTANT: If you have fields with defaults and opt out of accessors
 
 How fields with defaults are serialized has changed. Because we don't

+ 2 - 1
java/src/main/java/com/google/protobuf/nano/ExtendableMessageNano.java

@@ -47,7 +47,7 @@ public abstract class ExtendableMessageNano<M extends ExtendableMessageNano<M>>
     protected List<UnknownFieldData> unknownFieldData;
 
     @Override
-    protected int computeSerializedSize() {
+    public int getSerializedSize() {
         int size = 0;
         int unknownFieldCount = unknownFieldData == null ? 0 : unknownFieldData.size();
         for (int i = 0; i < unknownFieldCount; i++) {
@@ -55,6 +55,7 @@ public abstract class ExtendableMessageNano<M extends ExtendableMessageNano<M>>
             size += CodedOutputByteBufferNano.computeRawVarint32Size(unknownField.tag);
             size += unknownField.bytes.length;
         }
+        cachedSize = size;
         return size;
     }
 

+ 5 - 14
java/src/main/java/com/google/protobuf/nano/MessageNano.java

@@ -38,7 +38,7 @@ import java.io.IOException;
  * @author wink@google.com Wink Saville
  */
 public abstract class MessageNano {
-    protected volatile int cachedSize = -1;
+    protected int cachedSize = -1;
 
     /**
      * Get the number of bytes required to encode this message.
@@ -60,19 +60,10 @@ public abstract class MessageNano {
      * The size is cached and the cached result can be retrieved
      * using getCachedSize().
      */
-    public final int getSerializedSize() {
-        int size = computeSerializedSize();
-        cachedSize = size;
-        return size;
-    }
-
-    /**
-     * Computes the number of bytes required to encode this message. This does not update the
-     * cached size.
-     */
-    protected int computeSerializedSize() {
-      // This is overridden if the generated message has serialized fields.
-      return 0;
+    public int getSerializedSize() {
+        // This is overridden if the generated message has serialized fields.
+        cachedSize = 0;
+        return 0;
     }
 
     /**

+ 0 - 15
java/src/test/java/com/google/protobuf/NanoTest.java

@@ -105,14 +105,6 @@ public class NanoTest extends TestCase {
     assertEquals(456, newMsg.d);
     assertEquals(2, msg.nestedMsg.bb);
     assertEquals(SimpleMessageNano.BAR, msg.defaultNestedEnum);
-
-    msg.nestedMsg = null;
-    assertEquals(msgSerializedSize, msg.getCachedSize());
-    assertTrue(msgSerializedSize != msg.getSerializedSize());
-
-    msg.clear();
-    assertEquals(0, msg.getCachedSize());
-    assertEquals(0, msg.getSerializedSize());
   }
 
   public void testRecursiveMessageNano() throws Exception {
@@ -3540,13 +3532,6 @@ public class NanoTest extends TestCase {
     assertTrue(Arrays.equals(new boolean[] {false, true, false, true}, nonPacked.bools));
   }
 
-  public void testMessageNoFields() {
-    SingleMessageNano msg = new SingleMessageNano();
-    assertEquals(0, msg.getSerializedSize());
-    assertEquals(0, msg.getCachedSize());
-    assertEquals(0, MessageNano.toByteArray(msg).length);
-  }
-
   private void assertRepeatedPackablesEqual(
       NanoRepeatedPackables.NonPacked nonPacked, NanoRepeatedPackables.Packed packed) {
     // Not using MessageNano.equals() -- that belongs to a separate test.

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

@@ -304,8 +304,8 @@ GenerateMessageSerializationMethods(io::Printer* printer) {
   printer->Print(
     "\n"
     "@Override\n"
-    "protected int computeSerializedSize() {\n"
-    "  int size = super.computeSerializedSize();\n");
+    "public int getSerializedSize() {\n"
+    "  int size = super.getSerializedSize();\n");
   printer->Indent();
 
   for (int i = 0; i < descriptor_->field_count(); i++) {
@@ -314,6 +314,7 @@ GenerateMessageSerializationMethods(io::Printer* printer) {
 
   printer->Outdent();
   printer->Print(
+    "  cachedSize = size;\n"
     "  return size;\n"
     "}\n");
 }