com.oracle.truffle.sl.launcher.SLMain Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of truffle-sl-launcher Show documentation
Show all versions of truffle-sl-launcher Show documentation
Truffle SL launchers using the polyglot API.
The newest version!
/*
* Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
*
* Subject to the condition set forth below, permission is hereby granted to any
* person obtaining a copy of this software, associated documentation and/or
* data (collectively the "Software"), free of charge and under any and all
* copyright rights in the Software, and any and all patent rights owned or
* freely licensable by each licensor hereunder covering either (i) the
* unmodified Software as contributed to or provided by such licensor, or (ii)
* the Larger Works (as defined below), to deal in both
*
* (a) the Software, and
*
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
* one is included with the Software each a "Larger Work" to which the Software
* is contributed by such licensors),
*
* without restriction, including without limitation the rights to copy, create
* derivative works of, display, perform, and distribute the Software and make,
* use, sell, offer for sale, import, export, have made, and have sold the
* Software and the Larger Work(s), and to sublicense the foregoing rights on
* either these or other terms.
*
* This license is subject to the following condition:
*
* The above copyright notice and either this complete permission notice or at a
* minimum a reference to the UPL must be included in all copies or substantial
* portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.oracle.truffle.sl.launcher;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.PolyglotException;
import org.graalvm.polyglot.Source;
import org.graalvm.polyglot.Value;
public final class SLMain {
private static final String SL = "sl";
/**
* The main entry point.
*/
public static void main(String[] args) throws IOException {
Source source;
Map options = new HashMap<>();
String file = null;
boolean launcherOutput = true;
for (String arg : args) {
if (arg.equals("--disable-launcher-output")) {
launcherOutput = false;
} else if (parseOption(options, arg)) {
continue;
} else {
if (file == null) {
file = arg;
}
}
}
if (file == null) {
// @formatter:off
source = Source.newBuilder(SL, new InputStreamReader(System.in), "").interactive(!launcherOutput).build();
// @formatter:on
} else {
source = Source.newBuilder(SL, new File(file)).interactive(!launcherOutput).build();
}
System.exit(executeSource(source, System.in, System.out, options, launcherOutput));
}
private static int executeSource(Source source, InputStream in, PrintStream out, Map options, boolean launcherOutput) {
Context context;
PrintStream err = System.err;
try {
context = Context.newBuilder(SL).in(in).out(out).options(options).allowAllAccess(true).build();
} catch (IllegalArgumentException e) {
err.println(e.getMessage());
return 1;
}
if (launcherOutput) {
out.println("== running on " + context.getEngine());
}
try {
Value result = context.eval(source);
if (context.getBindings(SL).getMember("main") == null) {
err.println("No function main() defined in SL source file.");
return 1;
}
if (launcherOutput && !result.isNull()) {
out.println(result.toString());
}
return 0;
} catch (PolyglotException ex) {
if (ex.isInternalError()) {
// for internal errors we print the full stack trace
ex.printStackTrace();
} else {
err.println(ex.getMessage());
}
return 1;
} finally {
context.close();
}
}
private static boolean parseOption(Map options, String arg) {
if (arg.length() <= 2 || !arg.startsWith("--")) {
return false;
}
int eqIdx = arg.indexOf('=');
String key;
String value;
if (eqIdx < 0) {
key = arg.substring(2);
value = null;
} else {
key = arg.substring(2, eqIdx);
value = arg.substring(eqIdx + 1);
}
if (value == null) {
value = "true";
}
int index = key.indexOf('.');
String group = key;
if (index >= 0) {
group = group.substring(0, index);
}
options.put(key, value);
return true;
}
}