use of org.graalvm.polyglot.PolyglotException in project graal by oracle.
the class ProxyAPITest method testProxyExecutable.
@Test
public void testProxyExecutable() {
ProxyExecutableTest proxy = new ProxyExecutableTest();
Value value = context.asValue(proxy);
assertTrue(value.canExecute());
assertSame(proxy, value.asProxyObject());
assertEquals(0, proxy.executeCounter);
proxy.execute = (args) -> {
assertEquals(2, args.length);
assertEquals("a", args[0].asString());
assertEquals('a', args[0].as(Object.class));
ValueAssert.assertValue(context, args[0], Trait.STRING);
assertTrue(args[1].isNumber());
assertEquals((byte) 42, args[1].asByte());
assertEquals((short) 42, args[1].asShort());
assertEquals(42, args[1].asInt());
assertEquals(42L, args[1].asLong());
assertEquals(42, args[1].as(Object.class));
ValueAssert.assertValue(context, args[1], Trait.NUMBER);
return 42;
};
assertEquals(42, value.execute('a', 42).asInt());
assertEquals(1, proxy.executeCounter);
final RuntimeException ex = new RuntimeException();
proxy.execute = (args) -> {
throw ex;
};
try {
value.execute();
Assert.fail();
} catch (PolyglotException e) {
assertTrue(e.isHostException());
assertSame(ex, e.asHostException());
assertEquals(2, proxy.executeCounter);
}
assertValue(context, value, Trait.PROXY_OBJECT, Trait.EXECUTABLE);
}
use of org.graalvm.polyglot.PolyglotException in project graal by oracle.
the class ValueHostConversionTest method testExceptionFrames2.
@Test
public void testExceptionFrames2() {
Value value = context.asValue(new TestExceptionFrames2());
try {
value.getMember("foo").execute();
Assert.fail();
} catch (PolyglotException e) {
assertTrue(e.isHostException());
assertTrue(e.asHostException() instanceof RuntimeException);
assertEquals("foo", e.getMessage());
Iterator<StackFrame> frameIterator = e.getPolyglotStackTrace().iterator();
StackFrame frame;
frame = frameIterator.next();
assertTrue(frame.isHostFrame());
assertEquals("foo", frame.toHostFrame().getMethodName());
frame = frameIterator.next();
assertTrue(frame.isHostFrame());
assertEquals("execute", frame.toHostFrame().getMethodName());
frame = frameIterator.next();
assertTrue(frame.isHostFrame());
assertEquals("testExceptionFrames2", frame.toHostFrame().getMethodName());
}
}
use of org.graalvm.polyglot.PolyglotException in project graal by oracle.
the class ValueHostInteropTest method testException2.
@Test
public void testException2() {
Value hashMapClass = context.asValue(HashMap.class);
try {
hashMapClass.newInstance(-1);
fail("expected an exception but none was thrown");
} catch (PolyglotException ex) {
assertTrue("expected HostException but was: " + ex.getClass(), ex.isHostException());
assertThat(ex.asHostException(), CoreMatchers.instanceOf(IllegalArgumentException.class));
}
try {
hashMapClass.newInstance("");
fail("expected an exception but none was thrown");
} catch (IllegalArgumentException ex) {
}
}
use of org.graalvm.polyglot.PolyglotException in project graal by oracle.
the class MultiLanguageShell method readEvalPrint.
public int readEvalPrint() throws IOException {
ConsoleReader console = new ConsoleReader(in, out);
console.setHandleUserInterrupt(true);
console.setExpandEvents(false);
console.setCopyPasteDetection(true);
console.println("GraalVM MultiLanguage Shell " + context.getEngine().getVersion());
console.println("Copyright (c) 2013-2018, Oracle and/or its affiliates");
List<Language> languages = new ArrayList<>();
Set<Language> uniqueValues = new HashSet<>();
for (Language language : context.getEngine().getLanguages().values()) {
if (language.isInteractive()) {
if (uniqueValues.add(language)) {
languages.add(language);
}
}
}
languages.sort(Comparator.comparing(Language::getName));
Map<String, Language> prompts = new HashMap<>();
StringBuilder promptsString = new StringBuilder();
for (Language language : languages) {
String prompt = createPrompt(language).trim();
promptsString.append(prompt).append(" ");
prompts.put(prompt, language);
console.println(" " + language.getName() + " version " + language.getVersion());
}
if (languages.isEmpty()) {
throw new Launcher.AbortException("Error: No Graal languages installed. Exiting shell.", 1);
}
printUsage(console, promptsString, false);
int maxNameLength = 0;
for (Language language : languages) {
maxNameLength = Math.max(maxNameLength, language.getName().length());
}
String startLanguage = defaultStartLanguage;
if (startLanguage == null) {
startLanguage = languages.get(0).getId();
}
Language currentLanguage = context.getEngine().getLanguages().get(startLanguage);
if (currentLanguage == null) {
throw new Launcher.AbortException("Error: could not find language '" + startLanguage + "'", 1);
}
assert languages.indexOf(currentLanguage) >= 0;
Source bufferSource = null;
String id = currentLanguage.getId();
// console.println("initialize time: " + (System.currentTimeMillis() - start));
String prompt = createPrompt(currentLanguage);
console.getKeys().bind(String.valueOf((char) 12), new ActionListener() {
public void actionPerformed(ActionEvent e) {
throw new ChangeLanguageException(null);
}
});
console.getKeys().bind(String.valueOf((char) 10), new ActionListener() {
public void actionPerformed(ActionEvent e) {
throw new RuntimeIncompleteSourceException();
}
});
// initializes the language
context.initialize(currentLanguage.getId());
boolean verboseErrors = false;
for (; ; ) {
String input = null;
Source source = null;
try {
input = console.readLine(bufferSource == null ? prompt : createBufferPrompt(prompt));
if (input == null) {
break;
} else if (input.trim().equals("")) {
continue;
}
Language switchedLanguage = null;
String trimmedInput = input.trim();
if (trimmedInput.equals("-usage")) {
printUsage(console, promptsString, true);
input = "";
} else if (trimmedInput.equals("-verboseErrors")) {
verboseErrors = !verboseErrors;
if (verboseErrors) {
console.println("Verbose errors is now on.");
} else {
console.println("Verbose errors is now off.");
}
input = "";
} else if (prompts.containsKey(trimmedInput)) {
switchedLanguage = prompts.get(input);
input = "";
}
NonBlockingInputStream nonBlockIn = ((NonBlockingInputStream) console.getInput());
while (nonBlockIn.isNonBlockingEnabled() && nonBlockIn.peek(10) != -2 && switchedLanguage == null) {
String line = console.readLine(createBufferPrompt(prompt));
String trimmedLine = line.trim();
if (prompts.containsKey(trimmedLine)) {
switchedLanguage = prompts.get(trimmedLine);
break;
} else {
input += "\n" + line;
}
}
if (!input.trim().equals("")) {
source = Source.newBuilder(currentLanguage.getId(), input, "<shell>").interactive(true).build();
context.eval(source);
bufferSource = null;
console.getHistory().replace(source.getCharacters());
}
if (switchedLanguage != null) {
throw new ChangeLanguageException(switchedLanguage);
}
} catch (UserInterruptException | EOFException e) {
// interrupted by ctrl-c
break;
} catch (ChangeLanguageException e) {
bufferSource = null;
histories.put(currentLanguage, console.getHistory());
currentLanguage = e.getLanguage() == null ? languages.get((languages.indexOf(currentLanguage) + 1) % languages.size()) : e.getLanguage();
History history = histories.computeIfAbsent(currentLanguage, k -> new MemoryHistory());
console.setHistory(history);
id = currentLanguage.getId();
prompt = createPrompt(currentLanguage);
console.resetPromptLine("", "", 0);
context.initialize(id);
} catch (ThreadDeath e) {
console.println("Execution killed!");
continue;
} catch (RuntimeIncompleteSourceException e) {
console.println();
input += "\n";
bufferSource = source;
} catch (PolyglotException e) {
input += "\n";
bufferSource = source;
if (e.isExit()) {
return e.getExitStatus();
} else if (e.isIncompleteSource()) {
input += "\n";
bufferSource = source;
} else if (!e.isInternalError()) {
if (e.getMessage() != null && e.getMessage().isEmpty()) {
console.println(e.toString());
} else {
if (verboseErrors) {
e.printStackTrace(new PrintWriter(console.getOutput()));
}
}
} else {
e.printStackTrace(new PrintWriter(console.getOutput()));
}
} catch (Throwable e) {
e.printStackTrace(new PrintWriter(console.getOutput()));
}
}
return 0;
}
use of org.graalvm.polyglot.PolyglotException in project graal by oracle.
the class PolyglotLauncher method runScripts.
private void runScripts(List<Script> scripts, Context.Builder contextBuilder, String[] programArgs) {
Script mainScript = scripts.get(scripts.size() - 1);
try (Context context = contextBuilder.arguments(mainScript.getLanguage(), programArgs).build()) {
Engine engine = context.getEngine();
checkLanguage(mainLanguage, engine);
for (Script script : scripts) {
checkLanguage(script.languageId, engine);
}
for (Script script : scripts) {
try {
Value result = context.eval(script.getSource());
if (script.isPrintResult()) {
System.out.println(result);
}
} catch (PolyglotException e) {
if (e.isExit()) {
throw exit(e.getExitStatus());
} else if (e.isGuestException()) {
e.printStackTrace();
throw exit(1);
} else {
throw abort(e);
}
} catch (IOException e) {
throw abort(e);
} catch (Throwable t) {
throw abort(t);
}
}
}
}
Aggregations