diff graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLFunctionForeignAccess.java @ 21770:c76742cc2c6f

Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Mon, 08 Jun 2015 04:50:13 +0200
parents ed234a3178af
children
line wrap: on
line diff
--- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLFunctionForeignAccess.java	Sun Jun 07 16:59:03 2015 +0200
+++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLFunctionForeignAccess.java	Mon Jun 08 04:50:13 2015 +0200
@@ -25,41 +25,37 @@
 import com.oracle.truffle.api.CallTarget;
 import com.oracle.truffle.api.Truffle;
 import com.oracle.truffle.api.frame.VirtualFrame;
-import com.oracle.truffle.api.interop.ForeignAccessFactory;
-import com.oracle.truffle.api.interop.InteropPredicate;
-import com.oracle.truffle.api.interop.exception.UnsupportedMessageException;
-import com.oracle.truffle.api.interop.messages.Message;
 import com.oracle.truffle.api.nodes.RootNode;
-import com.oracle.truffle.interop.ForeignAccessArguments;
-import com.oracle.truffle.interop.messages.Execute;
-import com.oracle.truffle.interop.messages.IsNull;
-import com.oracle.truffle.interop.messages.Receiver;
+import com.oracle.truffle.api.interop.TruffleObject;
+import com.oracle.truffle.api.interop.ForeignAccess;
+import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.sl.nodes.call.SLDispatchNode;
 import com.oracle.truffle.sl.nodes.call.SLDispatchNodeGen;
 import java.math.BigInteger;
+import java.util.List;
 
 /**
- * Implementation of foreing access for {@link SLFunction}.
+ * Implementation of foreign access for {@link SLFunction}.
  */
-final class SLFunctionForeignAccess implements ForeignAccessFactory {
-    public static final ForeignAccessFactory INSTANCE = new SLFunctionForeignAccess();
+final class SLFunctionForeignAccess implements ForeignAccess.Factory {
+    public static final ForeignAccess INSTANCE = ForeignAccess.create(new SLFunctionForeignAccess());
 
     private SLFunctionForeignAccess() {
     }
 
     @Override
-    public InteropPredicate getLanguageCheck() {
-        return (com.oracle.truffle.api.interop.TruffleObject o) -> o instanceof SLFunction;
+    public boolean canHandle(TruffleObject o) {
+        return o instanceof SLFunction;
     }
 
     @Override
-    public CallTarget getAccess(Message tree) {
-        if (Execute.create(Receiver.create(), 0).matchStructure(tree)) {
+    public CallTarget accessMessage(Message tree) {
+        if (Message.createExecute(0).equals(tree)) {
             return Truffle.getRuntime().createCallTarget(new SLForeignCallerRootNode());
-        } else if (IsNull.create(Receiver.create()).matchStructure(tree)) {
+        } else if (Message.IS_NULL.equals(tree)) {
             return Truffle.getRuntime().createCallTarget(new SLForeignNullCheckNode());
         } else {
-            throw new UnsupportedMessageException(tree.toString() + " not supported");
+            throw new IllegalArgumentException(tree.toString() + " not supported");
         }
     }
 
@@ -68,24 +64,25 @@
 
         @Override
         public Object execute(VirtualFrame frame) {
-            SLFunction function = (SLFunction) ForeignAccessArguments.getReceiver(frame.getArguments());
+            SLFunction function = (SLFunction) ForeignAccess.getReceiver(frame);
             // the calling convention of interop passes the receiver of a
             // function call (the this object)
             // as an implicit 1st argument; we need to ignore this argument for SL
-            Object[] arguments = ForeignAccessArguments.extractUserArguments(1, frame.getArguments());
-            for (int i = 0; i < arguments.length; i++) {
-                if (arguments[i] instanceof Long) {
+            List<Object> args = ForeignAccess.getArguments(frame);
+            Object[] arr = args.subList(1, args.size()).toArray();
+            for (int i = 0; i < arr.length; i++) {
+                Object a = arr[i];
+                if (a instanceof Long) {
                     continue;
                 }
-                if (arguments[i] instanceof BigInteger) {
+                if (a instanceof BigInteger) {
                     continue;
                 }
-                if (arguments[i] instanceof Number) {
-                    arguments[i] = ((Number) arguments[i]).longValue();
+                if (a instanceof Number) {
+                    arr[i] = ((Number) a).longValue();
                 }
             }
-
-            return dispatch.executeDispatch(frame, function, arguments);
+            return dispatch.executeDispatch(frame, function, arr);
         }
 
     }
@@ -93,7 +90,7 @@
     private static class SLForeignNullCheckNode extends RootNode {
         @Override
         public Object execute(VirtualFrame frame) {
-            Object receiver = ForeignAccessArguments.getReceiver(frame.getArguments());
+            Object receiver = ForeignAccess.getReceiver(frame);
             return SLNull.SINGLETON == receiver;
         }
     }