On Tue, 19 Jan 2021 21:40:24 GMT, Paul Sandoz <[email protected]> wrote:
>> Hi all,
>>
>> For this reproducer:
>>
>> import jdk.incubator.vector.ByteVector;
>> import jdk.incubator.vector.VectorSpecies;
>>
>> public class Test {
>> static final VectorSpecies<Byte> SPECIES_128 = ByteVector.SPECIES_128;
>> static byte[] a = new byte[8];
>> static byte[] b = new byte[8];
>>
>> public static void main(String[] args) {
>> ByteVector av = ByteVector.fromArray(SPECIES_128, a, 0);
>> av.intoArray(b, 0);
>> System.out.println("b: " + b[0]);
>> }
>> }
>>
>> The following IndexOutOfBoundsException message (length -7) is unreasonable.
>>
>> Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out
>> of bounds for length -7
>>
>> It might be better to fix it like this.
>>
>> Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out
>> of bounds for length 0
>>
>> Thanks.
>> Best regards,
>> Jie
>
> That change may cause performance issues. I would recommend leaving as is for
> now even through the error message is not great. Bounds checking is quite
> sensitive and WIP. Notice that we also have an option to call
> `Objects.checkFromIndexSize` which expresses the intent more accurately, but
> that is currently less optimal (at least it was when i last checked since it
> is non an intrinsic).
Thanks @PaulSandoz for your review and comments.
Updated:
- The performance issue has been fixed since there is no more operation for
common cases.
- The readability of OOB exception msg has been improved by following the
style of Objects.checkFromIndexSize.
- Less code generated (several blocks of code were optimized out for the
Test::test method below).
import jdk.incubator.vector.ByteVector;
import jdk.incubator.vector.VectorSpecies;
public class Test {
static final VectorSpecies<Byte> SPECIES_128 = ByteVector.SPECIES_128;
static byte[] a = new byte[88];
static byte[] b = new byte[88];
public static void test() {
ByteVector av = ByteVector.fromArray(SPECIES_128, a, 0);
av.intoArray(b, 0);
}
public static void main(String[] args) {
for (int i = 0; i < 100000; i++) {
test();
}
System.out.println("b: " + b[0]);
}
}
What do you think of it?
Thanks.
-------------
PR: https://git.openjdk.java.net/jdk/pull/2127