Skip to content

Commit 0df58fc

Browse files
mit-mitCommit Queue
authored and
Commit Queue
committed
Add new dart compile wasm command.
Marked as experimental, and only shown when verbose flag is passed: ``` $ dart help compile -v Compile Dart to various formats. Usage: dart [vm-options] compile <subcommand> [arguments] -h, --help Print this usage information. Available subcommands: aot-snapshot Compile Dart to an AOT snapshot. exe Compile Dart to a self-contained executable. jit-snapshot Compile Dart to a JIT snapshot. js Compile Dart to JavaScript. kernel Compile Dart to a kernel snapshot. wasm Compile Dart to a WebAssembly/WasmGC module (EXPERIMENTAL). ``` Change-Id: I6a0e65d4fbdd7b2782406b8b9969e14036bf0711 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/304860 Reviewed-by: Ben Konyi <[email protected]> Commit-Queue: Michael Thomsen <[email protected]> Reviewed-by: Aske Simon Christensen <[email protected]>
1 parent 7abab94 commit 0df58fc

File tree

10 files changed

+371
-86
lines changed

10 files changed

+371
-86
lines changed

pkg/dart2wasm/bin/dart2wasm.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'dart:io';
6+
57
import 'package:dart2wasm/dart2wasm.dart' as dart2wasm;
68

7-
Future<int> main(List<String> args) async => await dart2wasm.main(args);
9+
Future<void> main(List<String> args) async {
10+
exitCode = await dart2wasm.main(args);
11+
}

pkg/dart2wasm/lib/compile.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class CompilerOutput {
5858
/// Returns `null` if an error occurred during compilation. The
5959
/// [handleDiagnosticMessage] callback will have received an error message
6060
/// describing the error.
61-
Future<CompilerOutput?> compileToModule(compiler.CompilerOptions options,
61+
Future<CompilerOutput?> compileToModule(compiler.WasmCompilerOptions options,
6262
void Function(DiagnosticMessage) handleDiagnosticMessage) async {
6363
var succeeded = true;
6464
void diagnosticMessageHandler(DiagnosticMessage message) {

pkg/dart2wasm/lib/compiler_options.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'dart:io';
77
import 'package:dart2wasm/translator.dart';
88
import 'package:front_end/src/api_unstable/vm.dart' as fe;
99

10-
class CompilerOptions {
10+
class WasmCompilerOptions {
1111
final TranslatorOptions translatorOptions = TranslatorOptions();
1212

1313
Uri sdkPath = Platform.script.resolve("../../../sdk");
@@ -26,10 +26,10 @@ class CompilerOptions {
2626
String? dumpKernelBeforeTfa;
2727
String? dumpKernelAfterTfa;
2828

29-
factory CompilerOptions.defaultOptions() =>
30-
CompilerOptions(mainUri: Uri(), outputFile: '');
29+
factory WasmCompilerOptions.defaultOptions() =>
30+
WasmCompilerOptions(mainUri: Uri(), outputFile: '');
3131

32-
CompilerOptions({required this.mainUri, required this.outputFile});
32+
WasmCompilerOptions({required this.mainUri, required this.outputFile});
3333

3434
void validate() {
3535
if (translatorOptions.importSharedMemory &&

pkg/dart2wasm/lib/dart2wasm.dart

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55
import 'dart:io';
66

77
import 'package:args/args.dart' as args;
8-
import 'package:front_end/src/api_unstable/vm.dart'
9-
show printDiagnosticMessage, resolveInputUri;
8+
import 'package:front_end/src/api_unstable/vm.dart' show resolveInputUri;
109
import 'package:front_end/src/api_unstable/vm.dart' as fe;
1110

12-
import 'package:dart2wasm/compile.dart';
13-
import 'package:dart2wasm/compiler_options.dart';
11+
import 'package:dart2wasm/generate_wasm.dart';
1412
import 'package:dart2wasm/option.dart';
1513

1614
// Used to allow us to keep defaults on their respective option structs.
17-
final CompilerOptions _d = CompilerOptions.defaultOptions();
15+
// Note: When adding new options, consider if CLI options should be add
16+
// to `pkg/dartdev/lib/src/commands/compile.dart` too.
17+
final WasmCompilerOptions _d = WasmCompilerOptions.defaultOptions();
1818

1919
final List<Option> options = [
2020
Flag("help", (o, _) {}, abbr: "h", negatable: false, defaultsTo: false),
@@ -96,7 +96,7 @@ Map<String, String> processEnvironment(List<String> defines) =>
9696
return MapEntry<String, String>(keyAndValue[0], keyAndValue[1]);
9797
}));
9898

99-
CompilerOptions parseArguments(List<String> arguments) {
99+
WasmCompilerOptions parseArguments(List<String> arguments) {
100100
args.ArgParser parser = args.ArgParser();
101101
for (Option arg in options) {
102102
arg.applyToParser(parser);
@@ -124,8 +124,8 @@ CompilerOptions parseArguments(List<String> arguments) {
124124
if (rest.length != 2) {
125125
throw ArgumentError('Requires two positional file arguments');
126126
}
127-
CompilerOptions compilerOptions =
128-
CompilerOptions(mainUri: resolveInputUri(rest[0]), outputFile: rest[1]);
127+
WasmCompilerOptions compilerOptions = WasmCompilerOptions(
128+
mainUri: resolveInputUri(rest[0]), outputFile: rest[1]);
129129
for (Option arg in options) {
130130
if (results.wasParsed(arg.name)) {
131131
arg.applyToOptions(compilerOptions, results[arg.name]);
@@ -140,20 +140,6 @@ CompilerOptions parseArguments(List<String> arguments) {
140140
}
141141

142142
Future<int> main(List<String> args) async {
143-
CompilerOptions options = parseArguments(args);
144-
CompilerOutput? output = await compileToModule(
145-
options, (message) => printDiagnosticMessage(message, print));
146-
147-
if (output == null) {
148-
exitCode = 1;
149-
return exitCode;
150-
}
151-
152-
await File(options.outputFile).writeAsBytes(output.wasmModule);
153-
154-
final String outputJSRuntimeFile = options.outputJSRuntimeFile ??
155-
'${options.outputFile.substring(0, options.outputFile.lastIndexOf('.'))}.mjs';
156-
await File(outputJSRuntimeFile).writeAsString(output.jsRuntime);
157-
158-
return 0;
143+
WasmCompilerOptions options = parseArguments(args);
144+
return generateWasm(options);
159145
}

pkg/dart2wasm/lib/generate_wasm.dart

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import 'dart:io';
2+
import 'package:dart2wasm/compiler_options.dart';
3+
import 'package:dart2wasm/compile.dart';
4+
import 'package:front_end/src/api_unstable/vm.dart' show printDiagnosticMessage;
5+
export 'package:dart2wasm/compiler_options.dart';
6+
7+
typedef PrintError = void Function(String error);
8+
9+
Future<int> generateWasm(WasmCompilerOptions options,
10+
{bool verbose = false, PrintError errorPrinter = print}) async {
11+
if (verbose) {
12+
print('Running dart compile wasm...');
13+
print(' - input file name = ${options.mainUri}');
14+
print(' - output file name = ${options.outputFile}');
15+
print(' - sdkPath = ${options.sdkPath}');
16+
print(' - librariesSpecPath = ${options.librariesSpecPath}');
17+
print(' - packagesPath file = ${options.packagesPath}');
18+
print(' - platformPath file = ${options.platformPath}');
19+
}
20+
21+
CompilerOutput? output = await compileToModule(
22+
options, (message) => printDiagnosticMessage(message, errorPrinter));
23+
24+
if (output == null) {
25+
return 1;
26+
}
27+
28+
final File outFile = File(options.outputFile);
29+
outFile.parent.createSync(recursive: true);
30+
await outFile.writeAsBytes(output.wasmModule);
31+
32+
final jsFile = options.outputJSRuntimeFile ??
33+
'${options.outputFile.substring(0, options.outputFile.lastIndexOf('.'))}.mjs';
34+
await File(jsFile).writeAsString(output.jsRuntime);
35+
36+
return 0;
37+
}

pkg/dart2wasm/lib/option.dart

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@ import 'package:dart2wasm/compiler_options.dart';
1111
class Option<T> {
1212
final String name;
1313
final void Function(ArgParser a) applyToParser;
14-
final void Function(CompilerOptions o, T v) _applyToOptions;
14+
final void Function(WasmCompilerOptions o, T v) _applyToOptions;
1515
final T Function(dynamic v) converter;
1616

17-
void applyToOptions(CompilerOptions o, dynamic v) =>
17+
void applyToOptions(WasmCompilerOptions o, dynamic v) =>
1818
_applyToOptions(o, converter(v));
1919

2020
Option(this.name, this.applyToParser, this._applyToOptions, this.converter);
2121
}
2222

2323
class Flag extends Option<bool> {
24-
Flag(String name, void applyToOptions(CompilerOptions o, bool v),
24+
Flag(String name, void applyToOptions(WasmCompilerOptions o, bool v),
2525
{String? abbr,
2626
String? help,
2727
bool? defaultsTo = false,
@@ -38,31 +38,28 @@ class Flag extends Option<bool> {
3838
}
3939

4040
class ValueOption<T> extends Option<T> {
41-
ValueOption(String name, void applyToOptions(CompilerOptions o, T v),
41+
ValueOption(String name, void applyToOptions(WasmCompilerOptions o, T v),
4242
T converter(dynamic v), {String? defaultsTo, bool hide = false})
43-
: super(
44-
name,
45-
(a) => a.addOption(name, defaultsTo: defaultsTo, hide: hide),
46-
applyToOptions,
47-
converter);
43+
: super(name, (a) => a.addOption(name, defaultsTo: defaultsTo),
44+
applyToOptions, converter);
4845
}
4946

5047
class IntOption extends ValueOption<int> {
51-
IntOption(String name, void applyToOptions(CompilerOptions o, int v),
48+
IntOption(String name, void applyToOptions(WasmCompilerOptions o, int v),
5249
{String? defaultsTo})
5350
: super(name, applyToOptions, (v) => int.parse(v),
5451
defaultsTo: defaultsTo);
5552
}
5653

5754
class StringOption extends ValueOption<String> {
58-
StringOption(String name, void applyToOptions(CompilerOptions o, String v),
55+
StringOption(
56+
String name, void applyToOptions(WasmCompilerOptions o, String v),
5957
{String? defaultsTo, bool hide = false})
60-
: super(name, applyToOptions, (v) => v,
61-
defaultsTo: defaultsTo, hide: hide);
58+
: super(name, applyToOptions, (v) => v, defaultsTo: defaultsTo);
6259
}
6360

6461
class UriOption extends ValueOption<Uri> {
65-
UriOption(String name, void applyToOptions(CompilerOptions o, Uri v),
62+
UriOption(String name, void applyToOptions(WasmCompilerOptions o, Uri v),
6663
{String? defaultsTo})
6764
: super(name, applyToOptions, (v) => Uri.file(Directory(v).absolute.path),
6865
defaultsTo: defaultsTo);
@@ -71,7 +68,7 @@ class UriOption extends ValueOption<Uri> {
7168
class MultiValueOption<T> extends Option<List<T>> {
7269
MultiValueOption(
7370
String name,
74-
void Function(CompilerOptions o, List<T> v) applyToOptions,
71+
void Function(WasmCompilerOptions o, List<T> v) applyToOptions,
7572
T converter(dynamic v),
7673
{Iterable<String>? defaultsTo,
7774
String? abbr})
@@ -83,22 +80,22 @@ class MultiValueOption<T> extends Option<List<T>> {
8380
}
8481

8582
class IntMultiOption extends MultiValueOption<int> {
86-
IntMultiOption(name, void applyToOptions(CompilerOptions o, List<int> v),
83+
IntMultiOption(name, void applyToOptions(WasmCompilerOptions o, List<int> v),
8784
{Iterable<String>? defaultsTo})
8885
: super(name, applyToOptions, (v) => int.parse(v),
8986
defaultsTo: defaultsTo);
9087
}
9188

9289
class StringMultiOption extends MultiValueOption<String> {
9390
StringMultiOption(
94-
name, void applyToOptions(CompilerOptions o, List<String> v),
91+
name, void applyToOptions(WasmCompilerOptions o, List<String> v),
9592
{String? abbr, Iterable<String>? defaultsTo})
9693
: super(name, applyToOptions, (v) => v,
9794
abbr: abbr, defaultsTo: defaultsTo);
9895
}
9996

10097
class UriMultiOption extends MultiValueOption<Uri> {
101-
UriMultiOption(name, void applyToOptions(CompilerOptions o, List<Uri> v),
98+
UriMultiOption(name, void applyToOptions(WasmCompilerOptions o, List<Uri> v),
10299
{Iterable<String>? defaultsTo})
103100
: super(name, applyToOptions, (v) => Uri.file(Directory(v).absolute.path),
104101
defaultsTo: defaultsTo);

0 commit comments

Comments
 (0)