Skip to content

Commit 54ab57a

Browse files
committed
[GR-2798] ForeignObject related fixes/impls.
PullRequest: fastr/1703
2 parents a006e74 + 56060ab commit 54ab57a

File tree

24 files changed

+297
-289
lines changed

24 files changed

+297
-289
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import com.oracle.truffle.r.runtime.data.RAttributesLayout;
6363
import com.oracle.truffle.r.runtime.data.RDataFactory;
6464
import com.oracle.truffle.r.runtime.data.RExpression;
65+
import com.oracle.truffle.r.runtime.data.RFunction;
6566
import com.oracle.truffle.r.runtime.data.RNull;
6667
import com.oracle.truffle.r.runtime.data.RPairList;
6768
import com.oracle.truffle.r.runtime.data.RS4Object;
@@ -133,13 +134,20 @@ protected Object asVector(@SuppressWarnings("unused") REnvironment x, String mod
133134
throw RError.error(RError.SHOW_CALLER, Message.CANNOT_COERCE, RType.Environment.getName(), type != null ? type.getName() : mode);
134135
}
135136

137+
@TruffleBoundary
138+
@Specialization
139+
protected Object asVector(RFunction x, String mode) {
140+
RType type = RType.fromMode(mode);
141+
throw RError.error(RError.SHOW_CALLER, Message.CANNOT_COERCE, x.getRType().getName(), type != null ? type.getName() : mode);
142+
}
143+
136144
protected static boolean isREnvironment(Object value) {
137145
return value instanceof REnvironment;
138146
}
139147

140148
// there should never be more than ~12 specializations
141149
@SuppressWarnings("unused")
142-
@Specialization(limit = "99", guards = {"!isREnvironment(x)", "matchesMode(mode, cachedMode)"})
150+
@Specialization(limit = "99", guards = {"!isREnvironment(x)", "!isRFunction(x)", "matchesMode(mode, cachedMode)"})
143151
protected Object asVector(Object x, String mode,
144152
@Cached("mode") String cachedMode,
145153
@Cached("fromMode(cachedMode)") RType type,

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.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDim.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.oracle.truffle.r.nodes.attributes.RemoveFixedAttributeNode;
3535
import com.oracle.truffle.r.nodes.attributes.SetFixedAttributeNode;
3636
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
37+
import com.oracle.truffle.r.runtime.RError;
3738
import com.oracle.truffle.r.runtime.builtins.RBuiltin;
3839
import com.oracle.truffle.r.runtime.data.RAttributesLayout;
3940
import com.oracle.truffle.r.runtime.data.RIntVector;
@@ -42,6 +43,7 @@
4243
import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
4344
import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
4445
import com.oracle.truffle.r.runtime.data.nodes.VectorReuse;
46+
import com.oracle.truffle.r.runtime.nodes.RBaseNode;
4547

4648
@RBuiltin(name = "dim<-", kind = PRIMITIVE, parameterNames = {"x", "value"}, behavior = PURE)
4749
public abstract class UpdateDim extends RBuiltinNode.Arg2 {
@@ -96,4 +98,13 @@ protected RAbstractVector updateDimGeneric(RAbstractVector vector, RAbstractIntV
9698
@Cached("createNonSharedGeneric()") VectorReuse reuseNonSharedNode) {
9799
return updateDim(vector, dimensions, initAttrProfile, putDimensions, removeNames, reuseNonSharedNode);
98100
}
101+
102+
@Specialization(guards = "!isRAbstractVector(obj)")
103+
protected RAbstractVector noVector(@SuppressWarnings("unused") Object obj, @SuppressWarnings("unused") RAbstractIntVector dimensions) {
104+
throw error(RError.Message.INVALID_FIRST_ARGUMENT);
105+
}
106+
107+
protected boolean isAstractVector(Object obj) {
108+
return RBaseNode.isRAbstractVector(obj);
109+
}
99110
}

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);

0 commit comments

Comments
 (0)