private Object[] insertArg2(Object[] arguments, Object arg0, Object arg1) { int length = profileLength(arguments.length); Object[] newArguments = new Object[length + 2]; newArguments[0] = checkInteropType(arg0); newArguments[1] = checkInteropType(arg1); arraycopy(arguments, 0, newArguments, 2, length); return newArguments; }
static Object checkInteropType(Object obj) { assert checkInteropTypeImpl(obj); return obj; }
@SuppressWarnings("unused") public final Object execute(TruffleObject receiver, Object[] arguments) throws InteropException { return checkInteropType(executeImpl(receiver, insertArg1(arguments, receiver))); }
@SuppressWarnings("unused") public final Object execute(TruffleObject receiver, Object arg0, Object[] arguments) throws InteropException { return checkInteropType(executeImpl(receiver, insertArg2(arguments, receiver, arg0))); }
@SuppressWarnings("unused") public final Object execute(TruffleObject receiver, Object arg0) throws InteropException { return checkInteropType(executeImpl(receiver, new Object[]{receiver, checkInteropType(arg0)})); }
/** * Sends a {@link Message} to the foreign receiver object by executing the * {@link Message#createNode() foreign node}. * * @param foreignNode the createNode created by {@link Message#createNode()} * @param receiver foreign object to receive the message passed to {@link Message#createNode()} * method * @param arguments parameters for the receiver * @return return value, if any * @throws ClassCastException if the createNode has not been created by * {@link Message#createNode()} method. * @throws InteropException if any error occurred while accessing the <code>receiver</code> * object * @since 0.24 */ public static Object send(Node foreignNode, TruffleObject receiver, Object... arguments) throws InteropException { try { return ((InteropAccessNode) foreignNode).execute(receiver, arguments); } catch (InteropException e) { CompilerDirectives.transferToInterpreter(); throw e; } }
public final Object executeOrFalse(TruffleObject receiver) throws InteropException { try { return checkInteropType(executeImplInterop(receiver, new Object[]{receiver})); } catch (UnsupportedMessageException ex) { profileDefaultUnsupported.enter(); return false; } }
@TruffleBoundary protected CallTarget createGenericMessageTarget(TruffleObject receiver) { assert assertHandlesItself(receiver); return createMessageTarget(receiver.getForeignAccess()); }
private static void arraycopy(Object[] src, int srcPos, Object[] dest, int destPos, int length) { for (int i = 0; i < length; i++) { dest[destPos + i] = checkInteropType(src[srcPos + i]); } }
@Specialization protected Object doGeneric(TruffleObject receiver, Object[] arguments, @Cached("create()") IndirectCallNode indirectCall) { return indirectCall.call(createGenericMessageTarget(receiver), arguments); }
/** * Creates an AST node for this message. The node can be inserted into AST of your language and * will handle communication with the foreign language. * * @return node to be inserted into your AST and passed back to * {@link ForeignAccess#send(com.oracle.truffle.api.nodes.Node, com.oracle.truffle.api.interop.TruffleObject, java.lang.Object...)} * method. * @since 0.8 or earlier */ public final Node createNode() { CompilerAsserts.neverPartOfCompilation(); return InteropAccessNode.create(this); }
@SuppressWarnings("unused") private Object executeImplInterop(TruffleObject receiver, Object[] arguments) throws InteropException { return executeImpl(receiver, arguments); }
/** * Executes {@link Message#createNode() foreign node}. * * @deprecated replaced by specialized methods for sending individual messages (e.g. * {@link #sendRead(Node, VirtualFrame, TruffleObject, Object)}). For sending any * message use the rare {@link #send(Node, VirtualFrame, TruffleObject, Object...)} * method. * * @param foreignNode the createNode created by {@link Message#createNode()} * @param frame the call frame * @param receiver foreign object to receive the message passed to {@link Message#createNode()} * method * @param arguments parameters for the receiver * @return return value, if any * @throws ClassCastException if the createNode has not been created by * {@link Message#createNode()} method. * @throws IllegalStateException if any error occurred while accessing the <code>receiver</code> * object * @since 0.8 or earlier */ @SuppressWarnings("deprecation") @Deprecated public static Object execute(Node foreignNode, VirtualFrame frame, TruffleObject receiver, Object... arguments) { return ((InteropAccessNode) foreignNode).executeOld(receiver, arguments); }
@TruffleBoundary protected CallTarget createGenericMessageTarget(TruffleObject receiver) { return createMessageTarget(receiver.getForeignAccess()); }
@SuppressWarnings("unused") public final Object execute(TruffleObject receiver, Object arg0, Object arg1) throws InteropException { return checkInteropType(executeImpl(receiver, new Object[]{receiver, checkInteropType(arg0), checkInteropType(arg1)})); }
/** * Sends a {@link Message} to the foreign receiver object by executing the * {@link Message#createNode() foreign node}. * * @param foreignNode the createNode created by {@link Message#createNode()} * @param receiver foreign object to receive the message passed to {@link Message#createNode()} * method * @param arguments parameters for the receiver * @return return value, if any * @throws ClassCastException if the createNode has not been created by * {@link Message#createNode()} method. * @throws InteropException if any error occurred while accessing the <code>receiver</code> * object * @since 0.24 */ public static Object send(Node foreignNode, TruffleObject receiver, Object... arguments) throws InteropException { try { return ((InteropAccessNode) foreignNode).execute(receiver, arguments); } catch (InteropException e) { CompilerDirectives.transferToInterpreter(); throw e; } }
@SuppressWarnings("unused") public final Object execute(TruffleObject receiver, Object arg0, Object[] arguments) throws InteropException { return checkInteropType(executeImpl(receiver, insertArg2(arguments, receiver, arg0))); }
public final Object executeOrFalse(TruffleObject receiver) throws InteropException { try { return checkInteropType(executeImplInterop(receiver, new Object[]{receiver})); } catch (UnsupportedMessageException ex) { profileDefaultUnsupported.enter(); return false; } }
private static void arraycopy(Object[] src, int srcPos, Object[] dest, int destPos, int length) { for (int i = 0; i < length; i++) { dest[destPos + i] = checkInteropType(src[srcPos + i]); } }
@Specialization protected Object doGeneric(TruffleObject receiver, Object[] arguments, @Cached("create()") IndirectCallNode indirectCall) { return indirectCall.call(createGenericMessageTarget(receiver), arguments); }