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