File protobuf-58d4420e2dd8a3cd354fff9db0052881c25369ce.patch of Package protobuf.36265

From 58d4420e2dd8a3cd354fff9db0052881c25369ce Mon Sep 17 00:00:00 2001
From: Rafi Kamal <rafikamal@google.com>
Date: Mon, 11 Nov 2019 17:06:56 -0800
Subject: [PATCH] Down Integrate Internal Changes

---
 java/core/src/main/java/com/google/protobuf/ByteString.java           |   10 ++-
 java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java |    2 
 java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java   |    3 -
 java/core/src/main/java/com/google/protobuf/MessageLiteToString.java  |    2 
 java/core/src/main/java/com/google/protobuf/MessageSchema.java        |    8 +-
 java/core/src/main/java/com/google/protobuf/RopeByteString.java       |   28 +++++++---
 java/core/src/test/java/com/google/protobuf/RopeByteStringTest.java   |    9 +--
 java/core/src/test/java/com/google/protobuf/UnknownFieldSetTest.java  |   25 ++++++++
 java/lite/proguard.pgcfg                                              |    3 +
 9 files changed, 68 insertions(+), 22 deletions(-)
 create mode 100755 java/lite/proguard.pgcfg

--- a/java/core/src/main/java/com/google/protobuf/ByteString.java
+++ b/java/core/src/main/java/com/google/protobuf/ByteString.java
@@ -57,13 +57,17 @@ import java.util.Locale;
 import java.util.NoSuchElementException;
 
 /**
- * Immutable sequence of bytes. Substring is supported by sharing the reference to the immutable
- * underlying bytes. Concatenation is likewise supported without copying (long strings) by building
- * a tree of pieces in {@link RopeByteString}.
+ * Immutable sequence of bytes. Provides conversions to and from {@code byte[]}, {@link
+ * java.lang.String}, {@link ByteBuffer}, {@link InputStream}, {@link OutputStream}. Also provides a
+ * conversion to {@link CodedInputStream}.
  *
  * <p>Like {@link String}, the contents of a {@link ByteString} can never be observed to change, not
  * even in the presence of a data race or incorrect API usage in the client code.
  *
+ * <p>Substring is supported by sharing the reference to the immutable underlying bytes.
+ * Concatenation is likewise supported without copying (long strings) by building a tree of pieces
+ * in {@link RopeByteString}.
+ *
  * @author crazybob@google.com Bob Lee
  * @author kenton@google.com Kenton Varda
  * @author carlanton@google.com Carl Haverl
--- a/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
+++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
@@ -1023,7 +1023,7 @@ public abstract class GeneratedMessageLi
     }
 
     /** Clear an extension. */
-    public final <Type> BuilderType clearExtension(final ExtensionLite<MessageType, ?> extension) {
+    public final BuilderType clearExtension(final ExtensionLite<MessageType, ?> extension) {
       GeneratedExtension<MessageType, ?> extensionLite = checkIsLite(extension);
 
       verifyExtensionContainingType(extensionLite);
--- a/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java
+++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java
@@ -1498,8 +1498,7 @@ public abstract class GeneratedMessageV3
     }
 
     /** Clear an extension. */
-    public final <Type> BuilderType clearExtension(
-        final ExtensionLite<MessageType, ?> extensionLite) {
+    public final BuilderType clearExtension(final ExtensionLite<MessageType, ?> extensionLite) {
       Extension<MessageType, ?> extension = checkNotLite(extensionLite);
 
       verifyExtensionContainingType(extension);
--- a/java/core/src/main/java/com/google/protobuf/MessageLiteToString.java
+++ b/java/core/src/main/java/com/google/protobuf/MessageLiteToString.java
@@ -88,7 +88,7 @@ final class MessageLiteToString {
     }
 
     for (String getter : getters) {
-      String suffix = getter.replaceFirst("get", "");
+      String suffix = getter.startsWith("get") ? getter.substring(3) : getter;
       if (suffix.endsWith(LIST_SUFFIX)
           && !suffix.endsWith(BUILDER_LIST_SUFFIX)
           // Sometimes people have fields named 'list' that aren't repeated.
--- a/java/core/src/main/java/com/google/protobuf/MessageSchema.java
+++ b/java/core/src/main/java/com/google/protobuf/MessageSchema.java
@@ -1173,12 +1173,10 @@ final class MessageSchema<T> implements
       mergeSingleField(message, other, i);
     }
 
-    if (!proto3) {
-      SchemaUtil.mergeUnknownFields(unknownFieldSchema, message, other);
+    SchemaUtil.mergeUnknownFields(unknownFieldSchema, message, other);
 
-      if (hasExtensions) {
-        SchemaUtil.mergeExtensions(extensionSchema, message, other);
-      }
+    if (hasExtensions) {
+      SchemaUtil.mergeExtensions(extensionSchema, message, other);
     }
   }
 
--- a/java/core/src/main/java/com/google/protobuf/RopeByteString.java
+++ b/java/core/src/main/java/com/google/protobuf/RopeByteString.java
@@ -211,7 +211,7 @@ final class RopeByteString extends ByteS
 
     // Fine, we'll add a node and increase the tree depth--unless we rebalance ;^)
     int newDepth = Math.max(left.getTreeDepth(), right.getTreeDepth()) + 1;
-    if (newLength >= minLengthByDepth[newDepth]) {
+    if (newLength >= minLength(newDepth)) {
       // The tree is shallow enough, so don't rebalance
       return new RopeByteString(left, right);
     }
@@ -251,6 +251,22 @@ final class RopeByteString extends ByteS
   }
 
   /**
+   * Returns the minimum length for which a tree of the given depth is considered balanced according
+   * to BAP95, which means the tree is flat-enough with respect to the bounds. Defaults to {@code
+   * Integer.MAX_VALUE} if {@code depth >= minLengthByDepth.length} in order to avoid an {@code
+   * ArrayIndexOutOfBoundsException}.
+   *
+   * @param depth tree depth
+   * @return minimum balanced length
+   */
+  static int minLength(int depth) {
+    if (depth >= minLengthByDepth.length) {
+      return Integer.MAX_VALUE;
+    }
+    return minLengthByDepth[depth];
+  }
+
+  /**
    * Gets the byte at the given index. Throws {@link ArrayIndexOutOfBoundsException} for
    * backwards-compatibility reasons although it would more properly be {@link
    * IndexOutOfBoundsException}.
@@ -328,7 +344,7 @@ final class RopeByteString extends ByteS
    */
   @Override
   protected boolean isBalanced() {
-    return totalLength >= minLengthByDepth[treeDepth];
+    return totalLength >= minLength(treeDepth);
   }
 
   /**
@@ -656,7 +672,7 @@ final class RopeByteString extends ByteS
      */
     private void insert(ByteString byteString) {
       int depthBin = getDepthBinForLength(byteString.size());
-      int binEnd = minLengthByDepth[depthBin + 1];
+      int binEnd = minLength(depthBin + 1);
 
       // BAP95: Concatenate all trees occupying bins representing the length of
       // our new piece or of shorter pieces, to the extent that is possible.
@@ -665,7 +681,7 @@ final class RopeByteString extends ByteS
       if (prefixesStack.isEmpty() || prefixesStack.peek().size() >= binEnd) {
         prefixesStack.push(byteString);
       } else {
-        int binStart = minLengthByDepth[depthBin];
+        int binStart = minLength(depthBin);
 
         // Concatenate the subtrees of shorter length
         ByteString newTree = prefixesStack.pop();
@@ -680,7 +696,7 @@ final class RopeByteString extends ByteS
         // Continue concatenating until we land in an empty bin
         while (!prefixesStack.isEmpty()) {
           depthBin = getDepthBinForLength(newTree.size());
-          binEnd = minLengthByDepth[depthBin + 1];
+          binEnd = minLength(depthBin + 1);
           if (prefixesStack.peek().size() < binEnd) {
             ByteString left = prefixesStack.pop();
             newTree = new RopeByteString(left, newTree);
@@ -816,7 +832,7 @@ final class RopeByteString extends ByteS
      *
      * <p>Note that {@link InputStream#read(byte[], int, int)} and {@link
      * ByteArrayInputStream#read(byte[], int, int)} behave inconsistently when reading 0 bytes at
-     * EOF; the interface defines the return value to be 0 and the latter returns -1.  We use the
+     * EOF; the interface defines the return value to be 0 and the latter returns -1. We use the
      * latter behavior so that all ByteString streams are consistent.
      *
      * @return -1 if at EOF, otherwise the actual number of bytes read.
--- a/java/core/src/test/java/com/google/protobuf/RopeByteStringTest.java
+++ b/java/core/src/test/java/com/google/protobuf/RopeByteStringTest.java
@@ -62,18 +62,19 @@ public class RopeByteStringTest extends
     expectedHashCode = -1214197238;
   }
 
-  public void testMinLengthByDepth() {
-    // minLengthByDepth should match the Fibonacci sequence
+  public void testMinLength() {
+    // minLength should match the Fibonacci sequence
     int a = 1;
     int b = 1;
     int i;
     for (i = 0; a > 0; i++) {
-      assertEquals(a, RopeByteString.minLengthByDepth[i]);
+      assertEquals(a, RopeByteString.minLength(i));
       int c = a + b;
       a = b;
       b = c;
     }
-    assertEquals(Integer.MAX_VALUE, RopeByteString.minLengthByDepth[i]);
+    assertEquals(Integer.MAX_VALUE, RopeByteString.minLength(i));
+    assertEquals(Integer.MAX_VALUE, RopeByteString.minLength(i + 1));
     assertEquals(i + 1, RopeByteString.minLengthByDepth.length);
   }
 
--- a/java/core/src/test/java/com/google/protobuf/UnknownFieldSetTest.java
+++ b/java/core/src/test/java/com/google/protobuf/UnknownFieldSetTest.java
@@ -38,6 +38,7 @@ import protobuf_unittest.UnittestProto.T
 import protobuf_unittest.UnittestProto.TestEmptyMessageWithExtensions;
 import protobuf_unittest.UnittestProto.TestPackedExtensions;
 import protobuf_unittest.UnittestProto.TestPackedTypes;
+import proto3_unittest.UnittestProto3;
 import java.util.Arrays;
 import java.util.Map;
 import junit.framework.TestCase;
@@ -379,4 +380,28 @@ public class UnknownFieldSetTest extends
   }
 
   // =================================================================
+
+  public void testProto3RoundTrip() throws Exception {
+    ByteString data = getBizarroData();
+
+    UnittestProto3.TestEmptyMessage message =
+        UnittestProto3.TestEmptyMessage.parseFrom(data, ExtensionRegistryLite.getEmptyRegistry());
+    assertEquals(data, message.toByteString());
+
+    message = UnittestProto3.TestEmptyMessage.newBuilder().mergeFrom(message).build();
+    assertEquals(data, message.toByteString());
+
+    assertEquals(
+        data,
+        UnittestProto3.TestMessageWithDummy.parseFrom(
+                data, ExtensionRegistryLite.getEmptyRegistry())
+            .toBuilder()
+            // force copy-on-write
+            .setDummy(true)
+            .build()
+            .toBuilder()
+            .clearDummy()
+            .build()
+            .toByteString());
+  }
 }
--- /dev/null
+++ b/java/lite/proguard.pgcfg
@@ -0,0 +1,3 @@
+-keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite {
+  <fields>;
+}
openSUSE Build Service is sponsored by