diff truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLObjectType.java @ 22436:46a6d3eb790c

Adopt TCK and Polyglot after changes to execute and invoke message
author Matthias Grimmer <grimmer@ssw.jku.at>
date Mon, 30 Nov 2015 10:24:00 +0100
parents c1f804ce6cad
children 6c8f146710d1
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLObjectType.java	Thu Nov 26 14:22:48 2015 +0100
+++ b/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLObjectType.java	Mon Nov 30 10:24:00 2015 +0100
@@ -40,14 +40,22 @@
  */
 package com.oracle.truffle.sl.runtime;
 
+import static com.oracle.truffle.sl.runtime.SLContext.fromForeignValue;
+
+import java.util.List;
+
 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.ForeignAccess;
 import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.nodes.RootNode;
 import com.oracle.truffle.api.object.DynamicObject;
 import com.oracle.truffle.api.object.ObjectType;
+import com.oracle.truffle.sl.SLLanguage;
+import com.oracle.truffle.sl.nodes.call.SLDispatchNode;
+import com.oracle.truffle.sl.nodes.call.SLDispatchNodeGen;
 import com.oracle.truffle.sl.nodes.interop.SLForeignReadNode;
 import com.oracle.truffle.sl.nodes.interop.SLForeignWriteNode;
 
@@ -110,7 +118,7 @@
 
     @Override
     public CallTarget accessInvoke(int argumentsLength) {
-        return null;
+        return Truffle.getRuntime().createCallTarget(new SLForeignInvokeRootNode());
     }
 
     @Override
@@ -128,4 +136,26 @@
         return SLContext.isSLObject(obj);
     }
 
+    private static class SLForeignInvokeRootNode extends RootNode {
+        @Child private SLDispatchNode dispatch = SLDispatchNodeGen.create();
+
+        public SLForeignInvokeRootNode() {
+            super(SLLanguage.class, null, null);
+        }
+
+        @Override
+        public Object execute(VirtualFrame frame) {
+            DynamicObject receiver = (DynamicObject) ForeignAccess.getReceiver(frame);
+            String name = (String) ForeignAccess.getArguments(frame).get(0);
+            SLFunction function = (SLFunction) receiver.get(name);
+            List<Object> args = ForeignAccess.getArguments(frame);
+            Object[] arr = new Object[args.size() - 1];
+            for (int i = 1; i < args.size(); i++) {
+                arr[i - 1] = fromForeignValue(args.get(i));
+            }
+            Object result = dispatch.executeDispatch(frame, function, arr);
+            return result;
+        }
+    }
+
 }