From b83e20b571f9023484d341ab858ad48b6cda40ab Mon Sep 17 00:00:00 2001 From: Skylot Date: Mon, 30 Jul 2018 12:44:56 +0300 Subject: [PATCH] core: improve immutable list implementation --- .../java/jadx/core/utils/ImmutableList.java | 21 +++++++++++++------ .../src/main/java/jadx/core/utils/Utils.java | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/utils/ImmutableList.java b/jadx-core/src/main/java/jadx/core/utils/ImmutableList.java index 04965d01..92b9f4f3 100644 --- a/jadx-core/src/main/java/jadx/core/utils/ImmutableList.java +++ b/jadx-core/src/main/java/jadx/core/utils/ImmutableList.java @@ -6,6 +6,7 @@ import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.ListIterator; +import java.util.NoSuchElementException; import java.util.Objects; import java.util.RandomAccess; import java.util.function.Consumer; @@ -21,9 +22,13 @@ import org.jetbrains.annotations.NotNull; public final class ImmutableList implements List, RandomAccess { private final E[] arr; - @SuppressWarnings("unchecked") - public ImmutableList(Object[] arr) { - this.arr = (E[]) Objects.requireNonNull(arr); + @SuppressWarnings({"unchecked", "SuspiciousArrayCast"}) + public ImmutableList(Collection col) { + this((E[]) Objects.requireNonNull(col).toArray()); + } + + public ImmutableList(E[] arr) { + this.arr = Objects.requireNonNull(arr); } @Override @@ -88,7 +93,11 @@ public final class ImmutableList implements List, RandomAccess { @Override public E next() { - return arr[index++]; + try { + return arr[index++]; + } catch (IndexOutOfBoundsException e) { + throw new NoSuchElementException(e.getMessage()); + } } }; } @@ -103,14 +112,14 @@ public final class ImmutableList implements List, RandomAccess { @NotNull @Override public Object[] toArray() { - return arr; + return Arrays.copyOf(arr, arr.length); } @NotNull @Override @SuppressWarnings("unchecked") public T[] toArray(@NotNull T[] a) { - return (T[]) arr; + return (T[]) Arrays.copyOf(arr, arr.length); } @Override diff --git a/jadx-core/src/main/java/jadx/core/utils/Utils.java b/jadx-core/src/main/java/jadx/core/utils/Utils.java index f8e02fac..530eabe8 100644 --- a/jadx-core/src/main/java/jadx/core/utils/Utils.java +++ b/jadx-core/src/main/java/jadx/core/utils/Utils.java @@ -118,6 +118,6 @@ public class Utils { if (list.size() == 1) { return Collections.singletonList(list.get(0)); } - return new ImmutableList<>(list.toArray()); + return new ImmutableList<>(list); } } -- GitLab