From 9edbbed098c12eceb3e086b57980c3cfaed838f0 Mon Sep 17 00:00:00 2001 From: Tomas Stupka <tomas.stupka@oracle.com> Date: Tue, 29 Aug 2017 17:01:16 +0200 Subject: [PATCH] handle also foreign null in Foreign2R --- .../oracle/truffle/r/runtime/interop/Foreign2R.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/Foreign2R.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/Foreign2R.java index 5642fa86b7..df43ab4120 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/Foreign2R.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/Foreign2R.java @@ -30,8 +30,8 @@ import com.oracle.truffle.api.interop.ForeignAccess; import com.oracle.truffle.api.interop.Message; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.r.runtime.RInternalError; +import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.nodes.RBaseNode; @@ -40,6 +40,7 @@ import com.oracle.truffle.r.runtime.nodes.RBaseNode; public abstract class Foreign2R extends RBaseNode { @Child private Foreign2R recursive; + @Child private Node isNull; @Child private Node isBoxed; @Child private Node unbox; @@ -85,7 +86,15 @@ public abstract class Foreign2R extends RBaseNode { } @Specialization(guards = "isForeignObject(obj)") - public Object doUnbox(TruffleObject obj) { + public Object doForeignObject(TruffleObject obj) { + if (isNull == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + isNull = insert(Message.IS_NULL.createNode()); + } + if (ForeignAccess.sendIsNull(isNull, obj)) { + return RNull.instance; + } + /* * For the time being, we have to ask "IS_BOXED" all the time (instead of simply trying * UNBOX first), because some TruffleObjects return bogus values from UNBOX when IS_BOXED is -- GitLab