private Object doExecute(TruffleObject compiledRegexObject, RegexObject regexObject, Object input, Object fromIndex) { try { return ForeignAccess.sendExecute(executeNode, compiledRegexObject, regexObject, input, fromIndex); } catch (InteropException ex) { throw ex.raise(); } } }
@Override public TruffleObject compile(RegexSource source) throws RegexSyntaxException, UnsupportedRegexException { try { return (TruffleObject) ForeignAccess.sendExecute(executeNode, foreignCompiler, source.getPattern(), source.getFlags()); } catch (InteropException ex) { throw ex.raise(); } } }
@Override protected Object executeImpl(VirtualFrame frame) { Object[] callArgs = frame.getArguments(); final TruffleObject function = receiverType.cast(callArgs[0]); final Object[] args = (Object[]) callArgs[1]; unwrapArgs(engine, args); try { if (executeNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); executeNode = insert(Message.createExecute(0).createNode()); } Object tmp = ForeignAccess.sendExecute(executeNode, function, args); if (tmp == null) { tmp = JavaInterop.asTruffleValue(null); } Object result = returnConvertNode.convert(tmp); // TODO we must check here that the language returns a valid value. return result; } catch (InteropException e) { CompilerDirectives.transferToInterpreter(); throw e.raise(); } } }
@TruffleBoundary Object invoke(PolyglotLanguageContext context, ProxyObject object, String key, Object[] arguments) { if (object.hasMember(key)) { Object member = context.toGuestValue(object.getMember(key)); if (member instanceof TruffleObject && ForeignAccess.sendIsExecutable(isExecutable, (TruffleObject) member)) { try { return ForeignAccess.sendExecute(executeNode, ((TruffleObject) member), copyFromStart(arguments, 2)); } catch (InteropException e) { throw e.raise(); } } else { throw UnknownIdentifierException.raise(key); } } else { throw UnknownIdentifierException.raise(key); } } }
@TruffleBoundary Object invoke(PolyglotLanguageContext context, ProxyObject object, String key, Object[] arguments) { if (object.hasMember(key)) { Object member = context.toGuestValue(object.getMember(key)); if (member instanceof TruffleObject && ForeignAccess.sendIsExecutable(isExecutable, (TruffleObject) member)) { try { return ForeignAccess.sendExecute(executeNode, ((TruffleObject) member), copyFromStart(arguments, 2)); } catch (InteropException e) { throw e.raise(); } } else { throw UnknownIdentifierException.raise(key); } } else { throw UnknownIdentifierException.raise(key); } } }
protected final Object executeShared(Object receiver, Object[] args) { Object[] guestArguments = toGuestValues.apply(polyglot.languageContext, args); try { return ForeignAccess.sendExecute(executeNode, (TruffleObject) receiver, guestArguments); } catch (UnsupportedTypeException e) { CompilerDirectives.transferToInterpreter(); throw invalidExecuteArgumentType(polyglot.languageContext, receiver, e); } catch (ArityException e) { CompilerDirectives.transferToInterpreter(); throw invalidExecuteArity(polyglot.languageContext, receiver, guestArguments, e.getExpectedArity(), e.getActualArity()); } catch (UnsupportedMessageException e) { CompilerDirectives.transferToInterpreter(); return polyglot.executeUnsupported(receiver); } }
protected final Object executeShared(PolyglotLanguageContext context, Object receiver, Object[] args) { Object[] guestArguments = toGuestValues.apply(context, args); try { return ForeignAccess.sendExecute(executeNode, (TruffleObject) receiver, guestArguments); } catch (UnsupportedTypeException e) { CompilerDirectives.transferToInterpreter(); throw invalidExecuteArgumentType(context, receiver, e); } catch (ArityException e) { CompilerDirectives.transferToInterpreter(); throw invalidExecuteArity(context, receiver, guestArguments, e.getExpectedArity(), e.getActualArity()); } catch (UnsupportedMessageException e) { CompilerDirectives.transferToInterpreter(); return executeUnsupported(context, receiver); } }
private static Object handleMessage(Message message, Node messageNode, TruffleObject obj, String name, Object[] args) throws InteropException { if (message == Message.WRITE) { ForeignAccess.sendWrite(messageNode, obj, name, args[0]); return null; } if (message == Message.HAS_SIZE || message == Message.IS_BOXED || message == Message.IS_EXECUTABLE || message == Message.IS_NULL || message == Message.GET_SIZE) { return ForeignAccess.send(messageNode, obj); } if (message == Message.KEY_INFO) { return ForeignAccess.sendKeyInfo(messageNode, obj, name); } if (message == Message.READ) { return ForeignAccess.sendRead(messageNode, obj, name); } if (message == Message.UNBOX) { return ForeignAccess.sendUnbox(messageNode, obj); } if (Message.createExecute(0).equals(message)) { return ForeignAccess.sendExecute(messageNode, obj, args); } if (Message.createInvoke(0).equals(message)) { return ForeignAccess.sendInvoke(messageNode, obj, name, args); } if (Message.createNew(0).equals(message)) { return ForeignAccess.sendNew(messageNode, obj, args); } CompilerDirectives.transferToInterpreter(); throw UnsupportedMessageException.raise(message); }
try { if (executable) { result = sendExecute(execute, function, functionArgs); } else if (sendIsInstantiable(isInstantiable, function)) { result = sendNew(instantiate, function, functionArgs);
return ForeignAccess.sendExecute(sendExecuteNode, fieldObject, args); } catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e) { throw e.raise();
try { if (executable) { result = sendExecute(execute, function, functionArgs); } else if (sendIsInstantiable(isInstantiable, function)) { result = sendNew(instantiate, function, functionArgs);
return ForeignAccess.sendExecute(sendExecuteNode, fieldObject, args); } catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e) { throw e.raise();
TruffleObject truffleReadValue = (TruffleObject) readValue; if (ForeignAccess.sendIsExecutable(isExecutableNode, truffleReadValue)) { return ForeignAccess.sendExecute(executeNode, truffleReadValue, arguments);
TruffleObject truffleReadValue = (TruffleObject) readValue; if (ForeignAccess.sendIsExecutable(isExecutableNode, truffleReadValue)) { return ForeignAccess.sendExecute(executeNode, truffleReadValue, arguments);