diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Names.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Names.java index 659212324dd25b285ec30292c7736785cd716a13..cc09614f38e9b177055a10306df953c5685e74c0 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Names.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Names.java @@ -96,8 +96,7 @@ public abstract class Names extends RBuiltinNode.Arg1 { String[] staticNames = new String[0]; try { if (JavaInterop.isJavaObject(Object.class, obj)) { - TruffleObject clazz = JavaInterop.toJavaClass(obj); - staticNames = readKeys(keysNode, clazz, getSizeNode, readNode, isBoxedNode, unboxNode); + staticNames = readKeys(keysNode, toJavaClass(obj), getSizeNode, readNode, isBoxedNode, unboxNode); } } catch (UnknownIdentifierException | NoSuchFieldError | UnsupportedMessageException e) { // because it is a class ... ? @@ -114,6 +113,11 @@ public abstract class Names extends RBuiltinNode.Arg1 { } } + @TruffleBoundary + private static TruffleObject toJavaClass(TruffleObject obj) { + return JavaInterop.toJavaClass(obj); + } + private static String[] readKeys(Node keysNode, TruffleObject obj, Node getSizeNode, Node readNode, Node isBoxedNode, Node unboxNode) throws UnknownIdentifierException, InteropException, UnsupportedMessageException { TruffleObject keys = (TruffleObject) ForeignAccess.send(keysNode, obj); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java index 540740532ea6d6368dcc873eb3065cb858465019..e6017cd2746fa9853aa2c871c72e8e69550f7e36 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java @@ -177,7 +177,7 @@ public abstract class ExtractVectorNode extends RBaseNode { if (KeyInfo.isReadable(info)) { return ForeignAccess.sendRead(foreignRead, object, pos); } else if (pos instanceof String && !KeyInfo.isExisting(info) && JavaInterop.isJavaObject(Object.class, object)) { - TruffleObject clazz = JavaInterop.toJavaClass(object); + TruffleObject clazz = toJavaClass(object); info = ForeignAccess.sendKeyInfo(keyInfoNode, clazz, pos); if (KeyInfo.isReadable(info)) { return ForeignAccess.sendRead(foreignRead, clazz, pos); @@ -186,6 +186,11 @@ public abstract class ExtractVectorNode extends RBaseNode { throw caller.error(RError.Message.GENERIC, "invalid index/identifier during foreign access: " + pos); } + @TruffleBoundary + private static TruffleObject toJavaClass(TruffleObject obj) { + return JavaInterop.toJavaClass(obj); + } + @Specialization(guards = {"cached != null", "cached.isSupported(vector, positions)"}) protected Object doExtractSameDimensions(VirtualFrame frame, RAbstractVector vector, Object[] positions, Object exact, Object dropDimensions, // @Cached("createRecursiveCache(vector, positions)") RecursiveExtractSubscriptNode cached) { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ReplaceVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ReplaceVectorNode.java index be2aeca6132a03a751aabf4b37785dd88bd0ee73..574f7f314cfd6b4f65c91fb6ec1eb0124a3ca073 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ReplaceVectorNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ReplaceVectorNode.java @@ -146,7 +146,7 @@ public abstract class ReplaceVectorNode extends RBaseNode { ForeignAccess.sendWrite(foreignWrite, object, pos, r2Foreign.execute(writtenValue)); return; } else if (pos instanceof String && !KeyInfo.isExisting(info) && JavaInterop.isJavaObject(Object.class, object)) { - TruffleObject clazz = JavaInterop.toJavaClass(object); + TruffleObject clazz = toJavaClass(object); info = ForeignAccess.sendKeyInfo(keyInfoNode, clazz, pos); if (KeyInfo.isWritable(info)) { ForeignAccess.sendWrite(foreignWrite, clazz, pos, r2Foreign.execute(writtenValue)); @@ -156,6 +156,11 @@ public abstract class ReplaceVectorNode extends RBaseNode { throw error(RError.Message.GENERIC, "invalid index/identifier during foreign access: " + pos); } + @TruffleBoundary + private static TruffleObject toJavaClass(TruffleObject obj) { + return JavaInterop.toJavaClass(obj); + } + @Specialization(limit = "CACHE_LIMIT", guards = {"cached != null", "cached.isSupported(vector, positions)"}) protected Object doRecursive(VirtualFrame frame, RAbstractListVector vector, Object[] positions, Object value, // @Cached("createRecursiveCache(vector, positions)") RecursiveReplaceSubscriptNode cached) {