Skip to content

Commit f7cd402

Browse files
committed
remove java iterable handling from builtins
1 parent 0d95e43 commit f7cd402

File tree

11 files changed

+650
-733
lines changed

11 files changed

+650
-733
lines changed

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java

Lines changed: 15 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,11 @@
3131
import com.oracle.truffle.api.dsl.Specialization;
3232
import com.oracle.truffle.api.dsl.TypeSystemReference;
3333
import com.oracle.truffle.api.frame.VirtualFrame;
34-
import com.oracle.truffle.api.interop.ArityException;
3534
import com.oracle.truffle.api.interop.ForeignAccess;
3635
import com.oracle.truffle.api.interop.Message;
3736
import com.oracle.truffle.api.interop.TruffleObject;
3837
import com.oracle.truffle.api.interop.UnknownIdentifierException;
3938
import com.oracle.truffle.api.interop.UnsupportedMessageException;
40-
import com.oracle.truffle.api.interop.UnsupportedTypeException;
4139
import com.oracle.truffle.api.nodes.Node;
4240
import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
4341
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
@@ -216,31 +214,7 @@ protected int getForeignArrayLength(TruffleObject obj,
216214
return totalSize;
217215
}
218216

219-
@Specialization(guards = {"isJavaIterable(obj)", "!isForeignArray(obj, hasSize)"})
220-
protected int getJavaIterableLength(TruffleObject obj,
221-
@Cached("READ.createNode()") Node read,
222-
@Cached("EXECUTE.createNode()") Node execute,
223-
@SuppressWarnings("unused") @Cached("HAS_SIZE.createNode()") Node hasSize,
224-
@Cached("create()") Foreign2R foreign2R) {
225-
int totalSize = 0;
226-
try {
227-
TruffleObject itFunction = (TruffleObject) ForeignAccess.sendRead(read, obj, "iterator");
228-
TruffleObject it = (TruffleObject) ForeignAccess.sendExecute(execute, itFunction);
229-
TruffleObject hasNextFunction = (TruffleObject) ForeignAccess.sendRead(read, it, "hasNext");
230-
231-
while ((boolean) ForeignAccess.sendExecute(execute, hasNextFunction)) {
232-
TruffleObject nextFunction = (TruffleObject) ForeignAccess.sendRead(read, it, "next");
233-
Object element = ForeignAccess.sendExecute(execute, nextFunction);
234-
element = foreign2R.execute(element);
235-
totalSize += getRecursiveLength(element);
236-
}
237-
} catch (ArityException | UnsupportedTypeException | UnsupportedMessageException | UnknownIdentifierException ex) {
238-
throw RError.interopError(RError.findParentRBase(this), ex, obj);
239-
}
240-
return totalSize;
241-
}
242-
243-
@Specialization(guards = {"isForeignObject(obj)", "!isForeignArray(obj, hasSize)", "!isJavaIterable(obj)"})
217+
@Specialization(guards = {"isForeignObject(obj)", "!isForeignArray(obj, hasSize)"})
244218
protected int getForeignObject(@SuppressWarnings("unused") TruffleObject obj,
245219
@SuppressWarnings("unused") @Cached("HAS_SIZE.createNode()") Node hasSize) {
246220
return 1;
@@ -322,12 +296,6 @@ protected Object unlistForeignArray(VirtualFrame frame, TruffleObject obj, boole
322296
return unlistForeign(frame, obj, recursive, useNames, foreignArray2R);
323297
}
324298

325-
@Specialization(guards = {"isJavaIterable(obj)"})
326-
protected Object unlistJavaIterable(VirtualFrame frame, TruffleObject obj, boolean recursive, boolean useNames,
327-
@Cached("create()") ForeignArray2R foreignArray2R) {
328-
return unlistForeign(frame, obj, recursive, useNames, foreignArray2R);
329-
}
330-
331299
private Object unlistForeign(VirtualFrame frame, TruffleObject obj, boolean recursive, boolean useNames, ForeignArray2R foreignArray2R) {
332300
Object result = foreignArray2R.convert(obj, recursive);
333301
if (result instanceof RAbstractListVector) {
@@ -336,7 +304,7 @@ private Object unlistForeign(VirtualFrame frame, TruffleObject obj, boolean recu
336304
return result;
337305
}
338306

339-
@Specialization(guards = {"isForeignObject(obj)", "!isForeignVector(obj)"})
307+
@Specialization(guards = {"isForeignObject(obj)", "!isForeignArray(obj)"})
340308
protected Object unlistForeign(TruffleObject obj, @SuppressWarnings("unused") boolean recursive, @SuppressWarnings("unused") boolean useNames) {
341309
return obj;
342310
}
@@ -347,14 +315,6 @@ protected Object unlist(Object o, Object recursive, Object useNames) {
347315
return o;
348316
}
349317

350-
protected boolean isForeignVector(Object obj) {
351-
return ForeignArray2R.isForeignVector(obj, getHasSizeNode());
352-
}
353-
354-
protected boolean isJavaIterable(Object obj) {
355-
return ForeignArray2R.isJavaIterable(obj);
356-
}
357-
358318
protected boolean isForeignArray(Object obj) {
359319
return ForeignArray2R.isForeignArray(obj, getHasSizeNode());
360320
}
@@ -365,7 +325,7 @@ protected boolean isForeignArray(Object obj) {
365325
* @param obj the foreign object. Has to be ensured it is a foreign array or java iterable.
366326
*/
367327
private RAbstractVector foreignToVector(TruffleObject obj, boolean recursive) {
368-
assert isForeignVector(obj);
328+
assert isForeignArray(obj);
369329
return (RAbstractVector) getForeignArray2RNode().convert(obj, recursive);
370330
}
371331

@@ -740,7 +700,7 @@ private int unlistHelperComplex(double[] result, String[] namesData, int pos, Na
740700
@TruffleBoundary
741701
private int unlistHelperList(Object[] result, String[] namesData, int pos, NamesInfo namesInfo, Object obj, String outerBase, String tag, boolean recursive, boolean useNames) {
742702
Object o;
743-
if (isForeignVector(obj)) {
703+
if (isForeignArray(obj)) {
744704
o = foreignToVector((TruffleObject) obj, recursive);
745705
} else {
746706
o = handlePairList(obj);
@@ -765,7 +725,7 @@ private int unlistHelperList(Object[] result, String[] namesData, int pos, Names
765725
for (int i = 0; i < v.getLength(); i++) {
766726
String name = itemName(listNames, i);
767727
Object cur = v.getDataAtAsObject(i);
768-
if (recursive && isForeignVector(obj)) {
728+
if (recursive && isForeignArray(obj)) {
769729
position = unlistHelperForeign(result, position, (TruffleObject) cur, recursive);
770730
} else if (v instanceof RList && recursive) {
771731
position = unlistHelperList(result, namesData, position, namesInfo, cur, base, name, recursive, useNames);
@@ -785,11 +745,11 @@ private int unlistHelperList(Object[] result, String[] namesData, int pos, Names
785745
@TruffleBoundary
786746
private int unlistHelperForeign(Object[] result, int pos, TruffleObject obj, boolean recursive) {
787747
int position = pos;
788-
if (recursive && isForeignVector(obj)) {
748+
if (recursive && isForeignArray(obj)) {
789749
RAbstractVector v = foreignToVector(obj, recursive);
790750
for (int i = 0; i < v.getLength(); i++) {
791751
Object cur = v.getDataAtAsObject(i);
792-
if (isForeignVector(cur)) {
752+
if (isForeignArray(cur)) {
793753
position = unlistHelperForeign(result, position, (TruffleObject) cur, recursive);
794754
} else {
795755
result[position++] = cur;
@@ -807,10 +767,10 @@ private int unlistHelperForeignLogical(byte[] result, int pos, TruffleObject obj
807767
Object cur = v.getDataAtAsObject(i);
808768
if (!RRuntime.isForeignObject(cur)) {
809769
result[position++] = unlistValueLogical(cur);
810-
} else if (recursive && isForeignVector(cur)) {
770+
} else if (recursive && isForeignArray(cur)) {
811771
position = unlistHelperForeignLogical(result, position, (TruffleObject) cur, recursive);
812772
} else {
813-
assert false : "recursive=" + recursive + ", isIterable=" + ForeignArray2R.isJavaIterable(cur) + ", isArray=" + isForeignArray(cur);
773+
assert false : "recursive=" + recursive + ", isArray=" + isForeignArray(cur);
814774
}
815775
}
816776
return position;
@@ -824,10 +784,10 @@ private int unlistHelperForeignInt(int[] result, int pos, TruffleObject obj, boo
824784
Object cur = v.getDataAtAsObject(i);
825785
if (!RRuntime.isForeignObject(cur)) {
826786
result[position++] = unlistValueInt(cur);
827-
} else if (recursive && isForeignVector(cur)) {
787+
} else if (recursive && isForeignArray(cur)) {
828788
position = unlistHelperForeignInt(result, position, (TruffleObject) cur, recursive);
829789
} else {
830-
assert false : "recursive=" + recursive + ", isIterable=" + ForeignArray2R.isJavaIterable(cur) + ", isArray=" + isForeignArray(cur);
790+
assert false : "recursive=" + recursive + ", isArray=" + isForeignArray(cur);
831791
}
832792
}
833793
return position;
@@ -841,10 +801,10 @@ private int unlistHelperForeignDouble(double[] result, int pos, TruffleObject ob
841801
Object cur = v.getDataAtAsObject(i);
842802
if (!RRuntime.isForeignObject(cur)) {
843803
result[position++] = unlistValueDouble(cur);
844-
} else if (recursive && isForeignVector(cur)) {
804+
} else if (recursive && isForeignArray(cur)) {
845805
position = unlistHelperForeignDouble(result, position, (TruffleObject) cur, recursive);
846806
} else {
847-
assert false : "recursive=" + recursive + ", isIterable=" + ForeignArray2R.isJavaIterable(cur) + ", isArray=" + isForeignArray(cur);
807+
assert false : "recursive=" + recursive + ", isArray=" + isForeignArray(cur);
848808
}
849809
}
850810
return position;
@@ -858,10 +818,10 @@ private int unlistHelperForeignString(String[] result, int pos, TruffleObject ob
858818
Object cur = v.getDataAtAsObject(i);
859819
if (!RRuntime.isForeignObject(cur)) {
860820
result[position++] = unlistValueString(cur);
861-
} else if (recursive && isForeignVector(cur)) {
821+
} else if (recursive && isForeignArray(cur)) {
862822
position = unlistHelperForeignString(result, position, (TruffleObject) cur, recursive);
863823
} else {
864-
assert false : "recursive=" + recursive + ", isIterable=" + ForeignArray2R.isJavaIterable(cur) + ", isArray=" + isForeignArray(cur);
824+
assert false : "recursive=" + recursive + ", isArray=" + isForeignArray(cur);
865825
}
866826
}
867827
return position;

com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanScalarNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ protected static Class<? extends RAbstractVector> getNumericVectorClass(Object v
157157
protected byte doForeignVector(TruffleObject operand,
158158
@Cached("create()") ForeignArray2R foreignArray2R,
159159
@Cached("createRecursive()") LogicalScalarCastNode recursive) {
160-
if (foreignArray2R.isForeignVector(operand)) {
160+
if (foreignArray2R.isForeignArray(operand)) {
161161
Object o = foreignArray2R.convert(operand);
162162
return recursive.executeCast(o);
163163
}

com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ protected static Object doCastUnknown(RAbstractVector value, RType type) {
7777
}
7878

7979
@SuppressWarnings("unused")
80-
@Specialization(guards = {"isForeignVector(value, hasSize)", "typeof.execute(value) != type",
80+
@Specialization(guards = {"isForeignArray(value, hasSize)", "typeof.execute(value) != type",
8181
"type == cachedType", "!isNull(cast)"}, limit = "NUMBER_OF_TYPES")
8282
protected static Object doCast(TruffleObject value, RType type,
8383
@Cached("type") RType cachedType,

com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/CastForeignNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ protected Object execute(Object obj) {
5555
CompilerDirectives.transferToInterpreterAndInvalidate();
5656
isInteropScalar = ConditionProfile.createBinaryProfile();
5757
}
58-
if (isForeign.profile(foreignArray2R.isForeignVector(obj))) {
58+
if (isForeign.profile(foreignArray2R.isForeignArray(obj))) {
5959
return foreignArray2R.convert((TruffleObject) obj);
6060
} else if (isInteropScalar.profile(isInteropScalar(obj))) {
6161
return ((RInteropScalar) obj).getRValue();

com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/ForNode.java

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -111,23 +111,7 @@ protected Object iterateForeignArray(VirtualFrame frame, Object range,
111111
return iterate(frame, range, indexName, rangeName, lengthName, writeIndexNode, writeRangeNode, writeLengthNode, length, l);
112112
}
113113

114-
@Specialization(guards = "isJavaIterable(range)")
115-
protected Object iterateForeignArray(VirtualFrame frame, Object range,
116-
@Cached("createIteratorName()") @SuppressWarnings("unused") String iteratorName,
117-
@Cached("createWriteVariable(iteratorName)") WriteVariableNode writeIteratorNode,
118-
@Cached("createForIterableLoopNode(iteratorName)") LoopNode l,
119-
@Cached("READ.createNode()") Node readNode,
120-
@Cached("EXECUTE.createNode()") Node executeNode) {
121-
122-
TruffleObject iterator = getIterator((TruffleObject) range, readNode, executeNode);
123-
writeIteratorNode.execute(frame, iterator);
124-
125-
l.executeLoop(frame);
126-
127-
return RNull.instance;
128-
}
129-
130-
@Specialization(guards = {"isForeignObject(range)", "!isForeignArray(range, hasSizeNode)", "!isJavaIterable(range)"})
114+
@Specialization(guards = {"isForeignObject(range)", "!isForeignArray(range, hasSizeNode)"})
131115
protected Object iterateKeys(VirtualFrame frame, Object range,
132116
@Cached("createIndexName()") @SuppressWarnings("unused") String indexName,
133117
@Cached("createPositionName()") @SuppressWarnings("unused") String positionName,
@@ -204,16 +188,6 @@ private static LoopNode createLoopNode(AbstractRepeatingNode n) {
204188
return Truffle.getRuntime().createLoopNode(n);
205189
}
206190

207-
private static TruffleObject getIterator(TruffleObject obj, Node readNode, Node executeNode) {
208-
assert ForeignArray2R.isJavaIterable(obj);
209-
try {
210-
TruffleObject itFun = (TruffleObject) ForeignAccess.sendRead(readNode, obj, "iterator");
211-
return (TruffleObject) ForeignAccess.sendExecute(executeNode, itFun);
212-
} catch (UnknownIdentifierException | UnsupportedMessageException | UnsupportedTypeException | ArityException ex) {
213-
throw RInternalError.shouldNotReachHere(ex, "is java.lang.Iterable but could not access the iterator() function: " + obj);
214-
}
215-
}
216-
217191
private static int getKeysLength(TruffleObject keys, Node sizeNode) {
218192
try {
219193
return (int) ForeignAccess.sendGetSize(sizeNode, keys);

com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/RLengthNode.java

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,11 @@
2525
import com.oracle.truffle.api.dsl.Cached;
2626
import com.oracle.truffle.api.dsl.ImportStatic;
2727
import com.oracle.truffle.api.dsl.Specialization;
28-
import com.oracle.truffle.api.interop.ArityException;
2928
import com.oracle.truffle.api.interop.ForeignAccess;
3029
import com.oracle.truffle.api.interop.InteropException;
3130
import com.oracle.truffle.api.interop.Message;
3231
import com.oracle.truffle.api.interop.TruffleObject;
33-
import com.oracle.truffle.api.interop.UnknownIdentifierException;
34-
import com.oracle.truffle.api.interop.UnsupportedMessageException;
35-
import com.oracle.truffle.api.interop.UnsupportedTypeException;
3632
import com.oracle.truffle.api.nodes.Node;
37-
import com.oracle.truffle.api.profiles.ConditionProfile;
3833
import com.oracle.truffle.r.nodes.profile.VectorLengthProfile;
3934
import com.oracle.truffle.r.runtime.RError;
4035
import com.oracle.truffle.r.runtime.RRuntime;
@@ -155,43 +150,7 @@ protected static boolean isForeignObject(TruffleObject object) {
155150
return RRuntime.isForeignObject(object);
156151
}
157152

158-
@Specialization(guards = "isJavaIterable(object)")
159-
protected int getJavaIterableSize(TruffleObject object,
160-
@Cached("READ.createNode()") Node read,
161-
@Cached("EXECUTE.createNode()") Node execute,
162-
@Cached("createBinaryProfile()") ConditionProfile profile) {
163-
try {
164-
Number sizeByMethod = null;
165-
for (String method : new String[]{"size", "getSize", "length", "getLength"}) {
166-
TruffleObject sizeFunction;
167-
try {
168-
sizeFunction = (TruffleObject) ForeignAccess.sendRead(read, object, method);
169-
} catch (UnknownIdentifierException ex) {
170-
continue;
171-
}
172-
Object value = ForeignAccess.sendExecute(execute, sizeFunction);
173-
if (value instanceof Number) {
174-
sizeByMethod = (Number) value;
175-
}
176-
}
177-
if (profile.profile(sizeByMethod != null)) {
178-
return sizeByMethod.intValue();
179-
}
180-
181-
TruffleObject itMethod = (TruffleObject) ForeignAccess.sendRead(read, object, "iterator");
182-
TruffleObject it = (TruffleObject) ForeignAccess.sendExecute(execute, itMethod);
183-
TruffleObject hasNextMethod = (TruffleObject) ForeignAccess.sendRead(read, it, "hasNext");
184-
int size = 0;
185-
while ((boolean) ForeignAccess.sendExecute(execute, hasNextMethod)) {
186-
++size;
187-
}
188-
return size;
189-
} catch (ArityException | UnsupportedTypeException | UnknownIdentifierException | UnsupportedMessageException ex) {
190-
throw error(RError.Message.GENERIC, "error while accessing java iterable: " + ex.getMessage());
191-
}
192-
}
193-
194-
@Specialization(guards = {"isForeignObject(object)", "!isJavaIterable(object)"})
153+
@Specialization(guards = {"isForeignObject(object)"})
195154
protected int getForeignSize(TruffleObject object,
196155
@Cached("createHasSize()") Node hasSizeNode,
197156
@Cached("createGetSize()") Node getSizeNode) {

0 commit comments

Comments
 (0)