4646
4747import java .io .File ;
4848import java .io .IOException ;
49+ import java .io .OutputStream ;
4950import java .io .PrintStream ;
5051import java .nio .charset .StandardCharsets ;
5152import java .nio .file .Files ;
6970
7071public class JSLauncher extends AbstractLanguageLauncher {
7172 static final String MODULE_MIME_TYPE = "application/javascript+module" ;
73+ private static final String WASM_LANGUAGE_ID = "wasm" ;
7274 private static final String PROMPT = "> " ;
7375
7476 public static void main (String [] args ) {
@@ -79,6 +81,7 @@ public static void main(String[] args) {
7981 private boolean fuzzilliREPRL = false ;
8082 private boolean allowExperimentalOptions = false ;
8183 private boolean useSharedEngine = false ;
84+ private boolean wasmEnabled = false ;
8285 private String [] programArgs ;
8386 private final List <UnparsedSource > unparsedSources = new LinkedList <>();
8487 private VersionAction versionAction = VersionAction .None ;
@@ -104,7 +107,11 @@ protected String getLanguageId() {
104107
105108 @ Override
106109 protected String [] getDefaultLanguages () {
107- return new String [0 ];
110+ if (wasmEnabled && isLanguageAvailable (WASM_LANGUAGE_ID )) {
111+ return new String []{getLanguageId (), WASM_LANGUAGE_ID };
112+ } else {
113+ return super .getDefaultLanguages ();
114+ }
108115 }
109116
110117 protected void preEval (@ SuppressWarnings ("unused" ) Context context ) {
@@ -146,7 +153,8 @@ protected List<String> preprocessArguments(List<String> arguments, Map<String, S
146153
147154 String value ;
148155 int equalsIndex = flag .indexOf ('=' );
149- if (equalsIndex > 0 ) {
156+ boolean hasEquals = equalsIndex > 0 ;
157+ if (hasEquals ) {
150158 value = flag .substring (equalsIndex + 1 );
151159 flag = flag .substring (0 , equalsIndex );
152160 } else if (iterator .hasNext ()) {
@@ -162,8 +170,12 @@ protected List<String> preprocessArguments(List<String> arguments, Map<String, S
162170 throw abort ("Missing argument for " + arg );
163171 }
164172
173+ if (flag .equals ("js.webassembly" ) || flag .equals ("webassembly" )) {
174+ wasmEnabled = !hasEquals || "true" .equals (value );
175+ }
176+
165177 unrecognizedOptions .add (arg );
166- if (equalsIndex < 0 && value != null ) {
178+ if (! hasEquals && value != null ) {
167179 iterator .previous ();
168180 }
169181 } else {
@@ -536,6 +548,16 @@ private static void printStackTraceSkipTrailingHost(PolyglotException e, StringB
536548 }
537549 }
538550
551+ private static boolean isLanguageAvailable (String languageId ) {
552+ try (Engine tempEngine = Engine .newBuilder ().useSystemProperties (false ).//
553+ out (OutputStream .nullOutputStream ()).//
554+ err (OutputStream .nullOutputStream ()).//
555+ option ("engine.WarnInterpreterOnly" , "false" ).//
556+ build ()) {
557+ return tempEngine .getLanguages ().containsKey (languageId );
558+ }
559+ }
560+
539561 private enum SourceType {
540562 FILE ,
541563 EVAL ,
0 commit comments