Skip to content

Commit

Permalink
[GR-56805] Include wasm in js standalone.
Browse files Browse the repository at this point in the history
PullRequest: js/3316
  • Loading branch information
woess authored and elkorchi committed Nov 21, 2024
2 parents 2ce4ba6 + 65cfdad commit b213e33
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 12 deletions.
4 changes: 3 additions & 1 deletion graal-js/ci.jsonnet
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ local ci = import '../ci.jsonnet';
},

local nativeImageSmokeTest = checkoutJsBenchmarks + {
suiteimports+:: ['vm', 'substratevm'],
suiteimports+:: ['vm', 'substratevm', 'wasm'],
nativeimages+:: ['lib:jsvm', 'lib:jvmcicompiler'],
extraimagebuilderarguments+:: ['-H:+ReportExceptionStackTraces'],
run+: [
Expand All @@ -49,9 +49,11 @@ local ci = import '../ci.jsonnet';
['set-export', 'STANDALONE_HOME', ['mx', '--quiet', 'standalone-home', 'js', '--type=native']],
['${STANDALONE_HOME}/bin/js', '--native', '-e', "print('hello:' + Array.from(new Array(10), (x,i) => i*i ).join('|'))"],
['${STANDALONE_HOME}/bin/js', '--native', '../../js-benchmarks/harness.js', '--', '../../js-benchmarks/octane-richards.js', '--show-warmup'],
['${STANDALONE_HOME}/bin/js', '--experimental-options', '--js.webassembly', '-e', 'new WebAssembly.Module(new Uint8Array([0x00,0x61,0x73,0x6d,0x01,0x00,0x00,0x00]))'],
['set-export', 'STANDALONE_HOME', ['mx', '--quiet', 'standalone-home', 'js', '--type=jvm']],
['${STANDALONE_HOME}/bin/js', '--jvm', '-e', "print('hello:' + Array.from(new Array(10), (x,i) => i*i ).join('|'))"],
['${STANDALONE_HOME}/bin/js', '--jvm', '../../js-benchmarks/harness.js', '--', '../../js-benchmarks/octane-richards.js', '--show-warmup'],
['${STANDALONE_HOME}/bin/js', '--experimental-options', '--js.webassembly', '-e', 'new WebAssembly.Module(new Uint8Array([0x00,0x61,0x73,0x6d,0x01,0x00,0x00,0x00]))'],
# maven-downloader smoke test
['VERBOSE_GRAALVM_LAUNCHERS=true', '${STANDALONE_HOME}/bin/js-polyglot-get', '-o', 'maven downloader output', '-a', 'wasm', '-v', '23.1.3'],
],
Expand Down
11 changes: 9 additions & 2 deletions graal-js/mx.graal-js/mx_graal_js.py
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,9 @@ def mx_register_dynamic_suite_constituents(register_project, register_distributi
'src', meta_pom.name, meta_pom.maven_group_id(), meta_pom.theLicense,
isolate_build_options=isolate_build_options)

def is_wasm_available():
return any(wasm_suite in mx.get_dynamic_imports() for wasm_suite in [('wasm', True), ('wasm-enterprise', True)])


mx_sdk.register_graalvm_component(mx_sdk.GraalVmLanguage(
suite=_suite,
Expand All @@ -506,21 +509,25 @@ def mx_register_dynamic_suite_constituents(register_project, register_distributi
truffle_jars=[
'graal-js:GRAALJS',
'sdk:MAVEN_DOWNLOADER',
*(['wasm:WASM'] if is_wasm_available() else []),
],
support_distributions=[
'graal-js:GRAALJS_GRAALVM_SUPPORT',
],
library_configs=[
mx_sdk.LanguageLibraryConfig(
launchers=['bin/<exe:js>'],
jar_distributions=['graal-js:GRAALJS_LAUNCHER'],
jar_distributions=[
'graal-js:GRAALJS_LAUNCHER',
*(['wasm:WASM'] if is_wasm_available() else [])
],
main_class='com.oracle.truffle.js.shell.JSLauncher',
build_args=[],
build_args_enterprise=[
'-H:+AuxiliaryEngineCache',
'-H:ReservedAuxiliaryImageBytes=2145482548',
] if not mx.is_windows() else [],
language='js'
language='js',
)
],
boot_jars=[],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
Expand All @@ -69,6 +70,7 @@

public class JSLauncher extends AbstractLanguageLauncher {
static final String MODULE_MIME_TYPE = "application/javascript+module";
private static final String WASM_LANGUAGE_ID = "wasm";
private static final String PROMPT = "> ";

public static void main(String[] args) {
Expand All @@ -79,6 +81,7 @@ public static void main(String[] args) {
private boolean fuzzilliREPRL = false;
private boolean allowExperimentalOptions = false;
private boolean useSharedEngine = false;
private boolean wasmEnabled = false;
private String[] programArgs;
private final List<UnparsedSource> unparsedSources = new LinkedList<>();
private VersionAction versionAction = VersionAction.None;
Expand All @@ -102,6 +105,15 @@ protected String getLanguageId() {
return "js";
}

@Override
protected String[] getDefaultLanguages() {
if (wasmEnabled && isLanguageAvailable(WASM_LANGUAGE_ID)) {
return new String[]{getLanguageId(), WASM_LANGUAGE_ID};
} else {
return super.getDefaultLanguages();
}
}

protected void preEval(@SuppressWarnings("unused") Context context) {
}

Expand Down Expand Up @@ -141,7 +153,8 @@ protected List<String> preprocessArguments(List<String> arguments, Map<String, S

String value;
int equalsIndex = flag.indexOf('=');
if (equalsIndex > 0) {
boolean hasEquals = equalsIndex > 0;
if (hasEquals) {
value = flag.substring(equalsIndex + 1);
flag = flag.substring(0, equalsIndex);
} else if (iterator.hasNext()) {
Expand All @@ -157,8 +170,12 @@ protected List<String> preprocessArguments(List<String> arguments, Map<String, S
throw abort("Missing argument for " + arg);
}

if (flag.equals("js.webassembly") || flag.equals("webassembly")) {
wasmEnabled = !hasEquals || "true".equals(value);
}

unrecognizedOptions.add(arg);
if (equalsIndex < 0 && value != null) {
if (!hasEquals && value != null) {
iterator.previous();
}
} else {
Expand Down Expand Up @@ -531,6 +548,16 @@ private static void printStackTraceSkipTrailingHost(PolyglotException e, StringB
}
}

private static boolean isLanguageAvailable(String languageId) {
try (Engine tempEngine = Engine.newBuilder().useSystemProperties(false).//
out(OutputStream.nullOutputStream()).//
err(OutputStream.nullOutputStream()).//
option("engine.WarnInterpreterOnly", "false").//
build()) {
return tempEngine.getLanguages().containsKey(languageId);
}
}

private enum SourceType {
FILE,
EVAL,
Expand Down
11 changes: 4 additions & 7 deletions graal-nodejs/mx.graal-nodejs/mx_graal_nodejs.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
from mx_gate import Task
from argparse import ArgumentParser
from os.path import exists, join, isdir, pathsep, sep
from mx_graal_js import get_jdk
from mx_graal_js import get_jdk, is_wasm_available

_suite = mx.suite('graal-nodejs')
_current_os = mx.get_os()
Expand Down Expand Up @@ -616,9 +616,6 @@ def _prepare_svm_env():
def mx_post_parse_cmd_line(args):
mx_graal_nodejs_benchmark.register_nodejs_vms()

def _is_wasm_available():
return any(wasm_suite in mx.get_dynamic_imports() for wasm_suite in [('wasm', True), ('wasm-enterprise', True)])

mx_sdk.register_graalvm_component(mx_sdk.GraalVmLanguage(
suite=_suite,
name='Graal.nodejs',
Expand All @@ -633,7 +630,7 @@ def _is_wasm_available():
truffle_jars=[
'graal-nodejs:TRUFFLENODE',
'sdk:MAVEN_DOWNLOADER',
*(['wasm:WASM'] if _is_wasm_available() else []),
*(['wasm:WASM'] if is_wasm_available() else []),
],
support_distributions=[
'graal-nodejs:TRUFFLENODE_GRAALVM_SUPPORT',
Expand All @@ -651,13 +648,13 @@ def _is_wasm_available():
destination='lib/<lib:graal-nodejs>',
jar_distributions=[
'graal-nodejs:TRUFFLENODE',
*(['wasm:WASM'] if _is_wasm_available() else []),
*(['wasm:WASM'] if is_wasm_available() else []),
],
build_args=[
'--tool:all',
'--language:nodejs',
'-Dgraalvm.libpolyglot=true', # `lib:graal-nodejs` should be initialized like `lib:polyglot` (GR-10038)
*(['--language:wasm'] if _is_wasm_available() else []),
*(['--language:wasm'] if is_wasm_available() else []),
],
build_args_enterprise=[
'-H:+AuxiliaryEngineCache',
Expand Down

0 comments on commit b213e33

Please sign in to comment.