diff truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLFunctionForeignAccess.java @ 22135:e70b20f4bb00

Implementing API for Java/Truffle interop. Based around JavaInterop.asJavaObject and JavaInterop.asTruffleObject methods. Connected to TruffleVM via Symbol.as(Class) wrapper. Verified by extended TCK.
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Mon, 07 Sep 2015 17:07:20 +0200
parents 31eb066d75ac
children 597953a8e6f0
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLFunctionForeignAccess.java	Fri Sep 04 16:41:38 2015 +0200
+++ b/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLFunctionForeignAccess.java	Mon Sep 07 17:07:20 2015 +0200
@@ -74,6 +74,8 @@
             return Truffle.getRuntime().createCallTarget(new SLForeignCallerRootNode());
         } else if (Message.IS_NULL.equals(tree)) {
             return Truffle.getRuntime().createCallTarget(new SLForeignNullCheckNode());
+        } else if (Message.IS_EXECUTABLE.equals(tree)) {
+            return Truffle.getRuntime().createCallTarget(new SLForeignExecutableCheckNode());
         } else {
             throw new IllegalArgumentException(tree.toString() + " not supported");
         }
@@ -93,7 +95,12 @@
             // function call (the this object)
             // as an implicit 1st argument; we need to ignore this argument for SL
             List<Object> args = ForeignAccess.getArguments(frame);
-            Object[] arr = args.subList(1, args.size()).toArray();
+            Object[] arr;
+            if (args.size() > 0 && args.get(0) instanceof SLContext) {
+                arr = args.subList(1, args.size()).toArray();
+            } else {
+                arr = args.toArray();
+            }
             for (int i = 0; i < arr.length; i++) {
                 Object a = arr[i];
                 if (a instanceof Long) {
@@ -122,4 +129,16 @@
             return SLNull.SINGLETON == receiver;
         }
     }
+
+    private static class SLForeignExecutableCheckNode extends RootNode {
+        public SLForeignExecutableCheckNode() {
+            super(SLLanguage.class, null, null);
+        }
+
+        @Override
+        public Object execute(VirtualFrame frame) {
+            Object receiver = ForeignAccess.getReceiver(frame);
+            return receiver instanceof SLFunction;
+        }
+    }
 }