This is an automated email from the ASF dual-hosted git repository. paulk pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 8d76395455a689d058b2428b00e4eaf391ad31c2 Author: Esko Toivonen <[email protected]> AuthorDate: Wed Apr 7 17:52:47 2021 +0300 GROOVY-9649: Fixed getAt for primitive arrays by introducing a new helper method, added few test cases for getAt --- .../groovy/runtime/DefaultGroovyMethods.java | 16 ++++++------- .../runtime/DefaultGroovyMethodsSupport.java | 28 ++++++++++++++++++++++ src/test/groovy/GroovyMethodsTest.groovy | 3 +++ 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java index 1ce0ea6..c756d84 100644 --- a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java +++ b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java @@ -13944,7 +13944,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { @SuppressWarnings("unchecked") public static List<Byte> getAt(byte[] array, IntRange range) { RangeInfo info = subListBorders(array.length, range); - List<Byte> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1)); + List<Byte> answer = primitiveArrayGet(array, subListRange(info, range)); return info.reverse ? reverse(answer) : answer; } @@ -13959,7 +13959,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { @SuppressWarnings("unchecked") public static List<Character> getAt(char[] array, IntRange range) { RangeInfo info = subListBorders(array.length, range); - List<Character> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1)); + List<Character> answer = primitiveArrayGet(array, subListRange(info, range)); return info.reverse ? reverse(answer) : answer; } @@ -13974,7 +13974,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { @SuppressWarnings("unchecked") public static List<Short> getAt(short[] array, IntRange range) { RangeInfo info = subListBorders(array.length, range); - List<Short> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1)); + List<Short> answer = primitiveArrayGet(array, subListRange(info, range)); return info.reverse ? reverse(answer) : answer; } @@ -13989,7 +13989,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { @SuppressWarnings("unchecked") public static List<Integer> getAt(int[] array, IntRange range) { RangeInfo info = subListBorders(array.length, range); - List<Integer> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1)); + List<Integer> answer = primitiveArrayGet(array, subListRange(info, range)); return info.reverse ? reverse(answer) : answer; } @@ -14004,7 +14004,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { @SuppressWarnings("unchecked") public static List<Long> getAt(long[] array, IntRange range) { RangeInfo info = subListBorders(array.length, range); - List<Long> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1)); + List<Long> answer = primitiveArrayGet(array, subListRange(info, range)); return info.reverse ? reverse(answer) : answer; } @@ -14019,7 +14019,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { @SuppressWarnings("unchecked") public static List<Float> getAt(float[] array, IntRange range) { RangeInfo info = subListBorders(array.length, range); - List<Float> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1)); + List<Float> answer = primitiveArrayGet(array, subListRange(info, range)); return info.reverse ? reverse(answer) : answer; } @@ -14034,7 +14034,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { @SuppressWarnings("unchecked") public static List<Double> getAt(double[] array, IntRange range) { RangeInfo info = subListBorders(array.length, range); - List<Double> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1)); + List<Double> answer = primitiveArrayGet(array, subListRange(info, range)); return info.reverse ? reverse(answer) : answer; } @@ -14049,7 +14049,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { @SuppressWarnings("unchecked") public static List<Boolean> getAt(boolean[] array, IntRange range) { RangeInfo info = subListBorders(array.length, range); - List<Boolean> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1)); + List<Boolean> answer = primitiveArrayGet(array, subListRange(info, range)); return info.reverse ? reverse(answer) : answer; } diff --git a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.java b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.java index 43136d5..14f2b9d 100644 --- a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.java +++ b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.java @@ -101,6 +101,34 @@ public class DefaultGroovyMethodsSupport { return new RangeInfo(from, from, false); } + // Helper method for primitive array getAt + protected static IntRange subListRange(RangeInfo info, IntRange range) { + int from = info.from; + int to = info.to - 1; + + // Undo inclusiveness effects done by subListBorders() + if (!info.reverse) { + if (!range.getInclusiveLeft()) { + from--; + } + if (!range.getInclusiveRight()) { + to++; + } + } else { + if (!range.getInclusiveLeft()) { + to++; + } + if (!range.getInclusiveRight()) { + from--; + } + } + + boolean inclusiveLeft = info.reverse ? range.getInclusiveRight() : range.getInclusiveLeft(); + boolean inclusiveRight = info.reverse ? range.getInclusiveLeft() : range.getInclusiveRight(); + + return new IntRange(inclusiveLeft, inclusiveRight, from, to); + } + /** * This converts a possibly negative index to a real index into the array. * diff --git a/src/test/groovy/GroovyMethodsTest.groovy b/src/test/groovy/GroovyMethodsTest.groovy index 0c9d5d3..63ac9df 100644 --- a/src/test/groovy/GroovyMethodsTest.groovy +++ b/src/test/groovy/GroovyMethodsTest.groovy @@ -295,6 +295,9 @@ class GroovyMethodsTest extends GroovyTestCase { def list = ['a', 'b', 'c'] assert list[1..2] == ['b', 'c'] assert list[0..<0] == [] + assert list[0<..0] == [] + assert list[0<..<0] == [] + assert list[0<..<1] == [] } void testCharSequenceGetAt() {
