From 509c735ad60d9d1bea5ad59dad688fd0aa4f9ed1 Mon Sep 17 00:00:00 2001 From: Tomas Stupka <tomas.stupka@oracle.com> Date: Wed, 16 Aug 2017 11:31:58 +0200 Subject: [PATCH] handle foreign objects in BinaryBooleanScalarNode --- .../nodes/binary/BinaryBooleanScalarNode.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanScalarNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanScalarNode.java index 444696a3f7..00ca1de4b2 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanScalarNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanScalarNode.java @@ -26,8 +26,12 @@ import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.interop.Message; +import com.oracle.truffle.api.interop.TruffleObject; +import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.BranchProfile; import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.r.nodes.binary.BinaryBooleanScalarNodeGen.LogicalScalarCastNodeGen; @@ -39,6 +43,7 @@ import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.data.RComplex; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; +import com.oracle.truffle.r.runtime.interop.ForeignArray2R; import com.oracle.truffle.r.runtime.nodes.RBaseNode; import com.oracle.truffle.r.runtime.ops.BooleanOperation; import com.oracle.truffle.r.runtime.ops.BooleanOperationFactory; @@ -85,6 +90,7 @@ public abstract class BinaryBooleanScalarNode extends RBuiltinNode.Arg2 { return left; } + @ImportStatic({ForeignArray2R.class, Message.class}) protected abstract static class LogicalScalarCastNode extends RBaseNode { protected static final int CACHE_LIMIT = 3; @@ -147,6 +153,19 @@ public abstract class BinaryBooleanScalarNode extends RBuiltinNode.Arg2 { return null; } + @Specialization(guards = {"isForeignVector(operand, hasSize)"}) + protected byte doForeignVector(TruffleObject operand, + @Cached("HAS_SIZE.createNode()") Node hasSize, + @Cached("createForeignArray2R()") ForeignArray2R foreignArray2R, + @Cached("createRecursive()") LogicalScalarCastNode recursive) { + Object o = foreignArray2R.execute(operand, true); + return recursive.executeCast(o); + } + + protected LogicalScalarCastNode createRecursive() { + return LogicalScalarCastNodeGen.create(opName, argumentName, check); + } + @Fallback protected byte doFallback(@SuppressWarnings("unused") Object operand) { throw RError.error(this, RError.Message.INVALID_TYPE_IN, argumentName, opName); -- GitLab