From 4ed49723048ec8631a4cec425f0bc497be05848b Mon Sep 17 00:00:00 2001 From: cpovirk Date: Fri, 17 May 2024 20:22:17 -0700 Subject: [PATCH] Remove workaround for an ancient Android `toArray` bug. I can't seem to access the Android issue report anymore, but there are details in [this Harmony issue](https://issues.apache.org/jira/browse/HARMONY-6681). The Android codebase was fixed in 2012, which gives it more than enough [time to make it into Lollipop](https://en.wikipedia.org/wiki/Android_version_history), which is the minimum version that we now test with. RELNOTES=n/a PiperOrigin-RevId: 634956139 --- .../com/google/common/cache/LocalCache.java | 35 ---------------- .../common/collect/MapMakerInternalMap.java | 40 +------------------ .../com/google/common/cache/LocalCache.java | 35 ---------------- .../common/collect/MapMakerInternalMap.java | 40 +------------------ 4 files changed, 4 insertions(+), 146 deletions(-) diff --git a/android/guava/src/com/google/common/cache/LocalCache.java b/android/guava/src/com/google/common/cache/LocalCache.java index 49f7c44fa0bb..7852a08ba3ab 100644 --- a/android/guava/src/com/google/common/cache/LocalCache.java +++ b/android/guava/src/com/google/common/cache/LocalCache.java @@ -40,7 +40,6 @@ import com.google.common.collect.AbstractSequentialIterator; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterators; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.primitives.Ints; @@ -67,7 +66,6 @@ import java.util.AbstractMap; import java.util.AbstractQueue; import java.util.AbstractSet; -import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.Map; @@ -4438,26 +4436,6 @@ public boolean isEmpty() { public void clear() { LocalCache.this.clear(); } - - // super.toArray() may misbehave if size() is inaccurate, at least on old versions of Android. - // https://code.google.com/p/android/issues/detail?id=36519 / http://r.android.com/47508 - - @Override - public Object[] toArray() { - return toArrayList(this).toArray(); - } - - @Override - public E[] toArray(E[] a) { - return toArrayList(this).toArray(a); - } - } - - private static ArrayList toArrayList(Collection c) { - // Avoid calling ArrayList(Collection), which may call back into toArray. - ArrayList result = new ArrayList<>(c.size()); - Iterators.addAll(result, c.iterator()); - return result; } final class KeySet extends AbstractCacheSet { @@ -4503,19 +4481,6 @@ public Iterator iterator() { public boolean contains(Object o) { return LocalCache.this.containsValue(o); } - - // super.toArray() may misbehave if size() is inaccurate, at least on old versions of Android. - // https://code.google.com/p/android/issues/detail?id=36519 / http://r.android.com/47508 - - @Override - public Object[] toArray() { - return toArrayList(this).toArray(); - } - - @Override - public E[] toArray(E[] a) { - return toArrayList(this).toArray(a); - } } final class EntrySet extends AbstractCacheSet> { diff --git a/android/guava/src/com/google/common/collect/MapMakerInternalMap.java b/android/guava/src/com/google/common/collect/MapMakerInternalMap.java index ead769e12427..f5016f7fa393 100644 --- a/android/guava/src/com/google/common/collect/MapMakerInternalMap.java +++ b/android/guava/src/com/google/common/collect/MapMakerInternalMap.java @@ -39,7 +39,6 @@ import java.util.AbstractCollection; import java.util.AbstractMap; import java.util.AbstractSet; -import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.Map; @@ -2729,7 +2728,7 @@ public Entry next() { } @WeakOuter - final class KeySet extends SafeToArraySet { + final class KeySet extends AbstractSet { @Override public Iterator iterator() { @@ -2789,23 +2788,10 @@ public boolean contains(Object o) { public void clear() { MapMakerInternalMap.this.clear(); } - - // super.toArray() may misbehave if size() is inaccurate, at least on old versions of Android. - // https://code.google.com/p/android/issues/detail?id=36519 / http://r.android.com/47508 - - @Override - public Object[] toArray() { - return toArrayList(this).toArray(); - } - - @Override - public T[] toArray(T[] a) { - return toArrayList(this).toArray(a); - } } @WeakOuter - final class EntrySet extends SafeToArraySet> { + final class EntrySet extends AbstractSet> { @Override public Iterator> iterator() { @@ -2853,28 +2839,6 @@ public void clear() { } } - private abstract static class SafeToArraySet extends AbstractSet { - // super.toArray() may misbehave if size() is inaccurate, at least on old versions of Android. - // https://code.google.com/p/android/issues/detail?id=36519 / http://r.android.com/47508 - - @Override - public Object[] toArray() { - return toArrayList(this).toArray(); - } - - @Override - public T[] toArray(T[] a) { - return toArrayList(this).toArray(a); - } - } - - private static ArrayList toArrayList(Collection c) { - // Avoid calling ArrayList(Collection), which may call back into toArray. - ArrayList result = new ArrayList<>(c.size()); - Iterators.addAll(result, c.iterator()); - return result; - } - // Serialization Support private static final long serialVersionUID = 5; diff --git a/guava/src/com/google/common/cache/LocalCache.java b/guava/src/com/google/common/cache/LocalCache.java index aa52a52af617..b1a4438aced4 100644 --- a/guava/src/com/google/common/cache/LocalCache.java +++ b/guava/src/com/google/common/cache/LocalCache.java @@ -39,7 +39,6 @@ import com.google.common.collect.AbstractSequentialIterator; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterators; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.primitives.Ints; @@ -66,7 +65,6 @@ import java.util.AbstractMap; import java.util.AbstractQueue; import java.util.AbstractSet; -import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.Map; @@ -4592,26 +4590,6 @@ public boolean isEmpty() { public void clear() { LocalCache.this.clear(); } - - // super.toArray() may misbehave if size() is inaccurate, at least on old versions of Android. - // https://code.google.com/p/android/issues/detail?id=36519 / http://r.android.com/47508 - - @Override - public Object[] toArray() { - return toArrayList(this).toArray(); - } - - @Override - public E[] toArray(E[] a) { - return toArrayList(this).toArray(a); - } - } - - private static ArrayList toArrayList(Collection c) { - // Avoid calling ArrayList(Collection), which may call back into toArray. - ArrayList result = new ArrayList<>(c.size()); - Iterators.addAll(result, c.iterator()); - return result; } boolean removeIf(BiPredicate filter) { @@ -4680,19 +4658,6 @@ public boolean removeIf(Predicate filter) { public boolean contains(Object o) { return LocalCache.this.containsValue(o); } - - // super.toArray() may misbehave if size() is inaccurate, at least on old versions of Android. - // https://code.google.com/p/android/issues/detail?id=36519 / http://r.android.com/47508 - - @Override - public Object[] toArray() { - return toArrayList(this).toArray(); - } - - @Override - public E[] toArray(E[] a) { - return toArrayList(this).toArray(a); - } } final class EntrySet extends AbstractCacheSet> { diff --git a/guava/src/com/google/common/collect/MapMakerInternalMap.java b/guava/src/com/google/common/collect/MapMakerInternalMap.java index ead769e12427..f5016f7fa393 100644 --- a/guava/src/com/google/common/collect/MapMakerInternalMap.java +++ b/guava/src/com/google/common/collect/MapMakerInternalMap.java @@ -39,7 +39,6 @@ import java.util.AbstractCollection; import java.util.AbstractMap; import java.util.AbstractSet; -import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.Map; @@ -2729,7 +2728,7 @@ public Entry next() { } @WeakOuter - final class KeySet extends SafeToArraySet { + final class KeySet extends AbstractSet { @Override public Iterator iterator() { @@ -2789,23 +2788,10 @@ public boolean contains(Object o) { public void clear() { MapMakerInternalMap.this.clear(); } - - // super.toArray() may misbehave if size() is inaccurate, at least on old versions of Android. - // https://code.google.com/p/android/issues/detail?id=36519 / http://r.android.com/47508 - - @Override - public Object[] toArray() { - return toArrayList(this).toArray(); - } - - @Override - public T[] toArray(T[] a) { - return toArrayList(this).toArray(a); - } } @WeakOuter - final class EntrySet extends SafeToArraySet> { + final class EntrySet extends AbstractSet> { @Override public Iterator> iterator() { @@ -2853,28 +2839,6 @@ public void clear() { } } - private abstract static class SafeToArraySet extends AbstractSet { - // super.toArray() may misbehave if size() is inaccurate, at least on old versions of Android. - // https://code.google.com/p/android/issues/detail?id=36519 / http://r.android.com/47508 - - @Override - public Object[] toArray() { - return toArrayList(this).toArray(); - } - - @Override - public T[] toArray(T[] a) { - return toArrayList(this).toArray(a); - } - } - - private static ArrayList toArrayList(Collection c) { - // Avoid calling ArrayList(Collection), which may call back into toArray. - ArrayList result = new ArrayList<>(c.size()); - Iterators.addAll(result, c.iterator()); - return result; - } - // Serialization Support private static final long serialVersionUID = 5;