Mercurial > hg > truffle
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; + } + } + }