Skip to content

Commit dc37c9a

Browse files
committed
[GR-10823] Specialize array access in Java interop.
PullRequest: graal/1822
2 parents d9ad51c + a17d4ba commit dc37c9a

File tree

3 files changed

+110
-6
lines changed

3 files changed

+110
-6
lines changed

truffle/src/com.oracle.truffle.api.interop.java/src/com/oracle/truffle/api/interop/java/ArrayReadNode.java

+55-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
*/
2525
package com.oracle.truffle.api.interop.java;
2626

27-
import java.lang.reflect.Array;
2827
import java.util.List;
2928

3029
import com.oracle.truffle.api.CompilerDirectives;
@@ -34,11 +33,64 @@
3433
import com.oracle.truffle.api.interop.Message;
3534
import com.oracle.truffle.api.interop.UnknownIdentifierException;
3635
import com.oracle.truffle.api.interop.UnsupportedMessageException;
36+
import com.oracle.truffle.api.interop.java.ArrayReadNodeGen.ArrayGetNodeGen;
3737
import com.oracle.truffle.api.nodes.Node;
3838

3939
@SuppressWarnings("deprecation")
4040
abstract class ArrayReadNode extends Node {
4141

42+
abstract static class ArrayGet extends Node {
43+
44+
protected abstract Object execute(Object array, int index);
45+
46+
@Specialization
47+
boolean doBoolean(boolean[] array, int index) {
48+
return array[index];
49+
}
50+
51+
@Specialization
52+
byte doByte(byte[] array, int index) {
53+
return array[index];
54+
}
55+
56+
@Specialization
57+
short doShort(short[] array, int index) {
58+
return array[index];
59+
}
60+
61+
@Specialization
62+
char doChar(char[] array, int index) {
63+
return array[index];
64+
}
65+
66+
@Specialization
67+
int doInt(int[] array, int index) {
68+
return array[index];
69+
}
70+
71+
@Specialization
72+
long doLong(long[] array, int index) {
73+
return array[index];
74+
}
75+
76+
@Specialization
77+
float doFloat(float[] array, int index) {
78+
return array[index];
79+
}
80+
81+
@Specialization
82+
double doDouble(double[] array, int index) {
83+
return array[index];
84+
}
85+
86+
@Specialization
87+
Object doObject(Object[] array, int index) {
88+
return array[index];
89+
}
90+
}
91+
92+
@Child private ArrayGet arrayGet = ArrayGetNodeGen.create();
93+
4294
protected abstract Object executeWithTarget(JavaObject receiver, Object index);
4395

4496
@Specialization(guards = {"receiver.isArray()"})
@@ -81,12 +133,12 @@ protected static Object notArray(JavaObject receiver, Number index) {
81133
throw UnsupportedMessageException.raise(Message.READ);
82134
}
83135

84-
private static Object doArrayAccess(JavaObject object, int index) {
136+
private Object doArrayAccess(JavaObject object, int index) {
85137
Object obj = object.obj;
86138
assert object.isArray();
87139
Object val = null;
88140
try {
89-
val = Array.get(obj, index);
141+
val = arrayGet.execute(obj, index);
90142
} catch (ArrayIndexOutOfBoundsException outOfBounds) {
91143
CompilerDirectives.transferToInterpreter();
92144
throw UnknownIdentifierException.raise(String.valueOf(index));

truffle/src/com.oracle.truffle.api.interop.java/src/com/oracle/truffle/api/interop/java/ArrayWriteNode.java

+54-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
*/
2525
package com.oracle.truffle.api.interop.java;
2626

27-
import java.lang.reflect.Array;
2827
import java.util.List;
2928

3029
import com.oracle.truffle.api.CompilerDirectives;
@@ -34,10 +33,63 @@
3433
import com.oracle.truffle.api.interop.Message;
3534
import com.oracle.truffle.api.interop.UnknownIdentifierException;
3635
import com.oracle.truffle.api.interop.UnsupportedMessageException;
36+
import com.oracle.truffle.api.interop.java.ArrayWriteNodeGen.ArraySetNodeGen;
3737
import com.oracle.truffle.api.nodes.Node;
3838

3939
abstract class ArrayWriteNode extends Node {
40+
41+
abstract static class ArraySet extends Node {
42+
43+
protected abstract void execute(Object array, int index, Object value);
44+
45+
@Specialization
46+
void doBoolean(boolean[] array, int index, boolean value) {
47+
array[index] = value;
48+
}
49+
50+
@Specialization
51+
void doByte(byte[] array, int index, byte value) {
52+
array[index] = value;
53+
}
54+
55+
@Specialization
56+
void doShort(short[] array, int index, short value) {
57+
array[index] = value;
58+
}
59+
60+
@Specialization
61+
void doChar(char[] array, int index, char value) {
62+
array[index] = value;
63+
}
64+
65+
@Specialization
66+
void doInt(int[] array, int index, int value) {
67+
array[index] = value;
68+
}
69+
70+
@Specialization
71+
void doLong(long[] array, int index, long value) {
72+
array[index] = value;
73+
}
74+
75+
@Specialization
76+
void doFloat(float[] array, int index, float value) {
77+
array[index] = value;
78+
}
79+
80+
@Specialization
81+
void doDouble(double[] array, int index, double value) {
82+
array[index] = value;
83+
}
84+
85+
@Specialization
86+
void doObject(Object[] array, int index, Object value) {
87+
array[index] = value;
88+
}
89+
}
90+
4091
@Child private ToJavaNode toJavaNode = ToJavaNode.create();
92+
@Child private ArraySet arraySet = ArraySetNodeGen.create();
4193

4294
protected abstract Object executeWithTarget(JavaObject receiver, Object index, Object value);
4395

@@ -94,7 +146,7 @@ private Object doArrayAccess(JavaObject receiver, int index, Object value) {
94146
assert receiver.isArray();
95147
final Object javaValue = toJavaNode.execute(value, obj.getClass().getComponentType(), null, receiver.languageContext);
96148
try {
97-
Array.set(obj, index, javaValue);
149+
arraySet.execute(obj, index, javaValue);
98150
} catch (ArrayIndexOutOfBoundsException outOfBounds) {
99151
CompilerDirectives.transferToInterpreter();
100152
throw UnknownIdentifierException.raise(String.valueOf(index));

vm/mx.vm/suite.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
},
6969
{
7070
"name": "sulong",
71-
"version": "82898b4c1b17965b468038a7cd798f59436e1d6b",
71+
"version": "0999f49991c1777791fb3a49ad4f76b462a72273",
7272
"dynamic": True,
7373
"urls": [
7474
{"url": "https://github.com/graalvm/sulong.git", "kind": "git"},

0 commit comments

Comments
 (0)