Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1399)

Unified Diff: sdk/lib/_internal/compiler/implementation/dart2js.dart

Issue 80793002: Check compiler exitCode. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/compiler/implementation/dart2js.dart
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
index 7869913ae7b2ade37f4be09a24e6dfb852bf0bef..ac2a86ca42597c7261a70706643807bf7fd56952 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -45,383 +45,439 @@ class OptionHandler {
OptionHandler(this.pattern, this.handle, {this.multipleArguments: false});
}
-/**
- * Extract the parameter of an option.
- *
- * For example, in ['--out=fisk.js'] and ['-ohest.js'], the parameters
- * are ['fisk.js'] and ['hest.js'], respectively.
- */
-String extractParameter(String argument) {
- // m[0] is the entire match (which will be equal to argument). m[1]
- // is something like "-o" or "--out=", and m[2] is the parameter.
- Match m = new RegExp('^(-[a-z]|--.+=)(.*)').firstMatch(argument);
- if (m == null) helpAndFail('Error: Unknown option "$argument".');
- return m[2];
-}
-
-String extractPath(String argument) {
- String path = nativeToUriPath(extractParameter(argument));
- return path.endsWith("/") ? path : "$path/";
-}
+class _Dart2Js {
ahe 2013/11/21 12:44:53 If you think it makes sense to create a class here
+ final exitFunc;
+ final compileFunc;
+
+ _Dart2Js(this.exitFunc, this.compileFunc);
+
+ /**
+ * Extract the parameter of an option.
+ *
+ * For example, in ['--out=fisk.js'] and ['-ohest.js'], the parameters
+ * are ['fisk.js'] and ['hest.js'], respectively.
+ */
+ String extractParameter(String argument) {
+ // m[0] is the entire match (which will be equal to argument). m[1]
+ // is something like "-o" or "--out=", and m[2] is the parameter.
+ Match m = new RegExp('^(-[a-z]|--.+=)(.*)').firstMatch(argument);
+ if (m == null) helpAndFail('Error: Unknown option "$argument".');
+ return m[2];
+ }
-void parseCommandLine(List<OptionHandler> handlers, List<String> argv) {
- // TODO(ahe): Use ../../args/args.dart for parsing options instead.
- var patterns = <String>[];
- for (OptionHandler handler in handlers) {
- patterns.add(handler.pattern);
+ String extractPath(String argument) {
+ String path = nativeToUriPath(extractParameter(argument));
+ return path.endsWith("/") ? path : "$path/";
}
- var pattern = new RegExp('^(${patterns.join(")\$|(")})\$');
-
- Iterator<String> arguments = argv.iterator;
- OUTER: while (arguments.moveNext()) {
- String argument = arguments.current;
- Match match = pattern.firstMatch(argument);
- assert(match.groupCount == handlers.length);
- for (int i = 0; i < handlers.length; i++) {
- if (match[i + 1] != null) {
- OptionHandler handler = handlers[i];
- if (handler.multipleArguments) {
- handler.handle(arguments);
- } else {
- handler.handle(argument);
+
+ void parseCommandLine(List<OptionHandler> handlers, List<String> argv) {
+ // TODO(ahe): Use ../../args/args.dart for parsing options instead.
+ var patterns = <String>[];
+ for (OptionHandler handler in handlers) {
+ patterns.add(handler.pattern);
+ }
+ var pattern = new RegExp('^(${patterns.join(")\$|(")})\$');
+
+ Iterator<String> arguments = argv.iterator;
+ OUTER: while (arguments.moveNext()) {
+ String argument = arguments.current;
+ Match match = pattern.firstMatch(argument);
+ assert(match.groupCount == handlers.length);
+ for (int i = 0; i < handlers.length; i++) {
+ if (match[i + 1] != null) {
+ OptionHandler handler = handlers[i];
+ if (handler.multipleArguments) {
+ handler.handle(arguments);
+ } else {
+ handler.handle(argument);
+ }
+ continue OUTER;
}
- continue OUTER;
}
+ throw 'Internal error: "$argument" did not match';
}
- throw 'Internal error: "$argument" did not match';
}
-}
-FormattingDiagnosticHandler diagnosticHandler;
-
-Future compile(List<String> argv) {
- bool isWindows = (Platform.operatingSystem == 'windows');
- stackTraceFilePrefix = '$currentDirectory';
- Uri libraryRoot = currentDirectory;
- Uri out = currentDirectory.resolve('out.js');
- Uri sourceMapOut = currentDirectory.resolve('out.js.map');
- Uri packageRoot = null;
- List<String> options = new List<String>();
- bool explicitOut = false;
- bool wantHelp = false;
- bool wantVersion = false;
- String outputLanguage = 'JavaScript';
- bool stripArgumentSet = false;
- bool analyzeOnly = false;
- bool hasDisallowUnsafeEval = false;
- // TODO(johnniwinther): Measure time for reading files.
- SourceFileProvider inputProvider = new CompilerSourceFileProvider();
- diagnosticHandler = new FormattingDiagnosticHandler(inputProvider);
- Map<String, dynamic> environment = new Map<String, dynamic>();
-
- passThrough(String argument) => options.add(argument);
-
- if (BUILD_ID != null) {
- passThrough("--build-id=$BUILD_ID");
- }
+ FormattingDiagnosticHandler diagnosticHandler;
+
+ Future compile(List<String> argv) {
+ bool isWindows = (Platform.operatingSystem == 'windows');
+ stackTraceFilePrefix = '$currentDirectory';
+ Uri libraryRoot = currentDirectory;
+ Uri out = currentDirectory.resolve('out.js');
+ Uri sourceMapOut = currentDirectory.resolve('out.js.map');
+ Uri packageRoot = null;
+ List<String> options = new List<String>();
+ bool explicitOut = false;
+ bool wantHelp = false;
+ bool wantVersion = false;
+ String outputLanguage = 'JavaScript';
+ bool stripArgumentSet = false;
+ bool analyzeOnly = false;
+ bool hasDisallowUnsafeEval = false;
+ // TODO(johnniwinther): Measure time for reading files.
+ SourceFileProvider inputProvider = new CompilerSourceFileProvider();
+ diagnosticHandler = new FormattingDiagnosticHandler(inputProvider);
+ Map<String, dynamic> environment = new Map<String, dynamic>();
+
+ passThrough(String argument) => options.add(argument);
+
+ if (BUILD_ID != null) {
+ passThrough("--build-id=$BUILD_ID");
+ }
- setLibraryRoot(String argument) {
- libraryRoot = currentDirectory.resolve(extractPath(argument));
- }
+ setLibraryRoot(String argument) {
+ libraryRoot = currentDirectory.resolve(extractPath(argument));
+ }
- setPackageRoot(String argument) {
- packageRoot = currentDirectory.resolve(extractPath(argument));
- }
+ setPackageRoot(String argument) {
+ packageRoot = currentDirectory.resolve(extractPath(argument));
+ }
- setOutput(Iterator<String> arguments) {
- String path;
- if (arguments.current == '-o') {
- if (!arguments.moveNext()) {
- helpAndFail('Error: Missing file after -o option.');
+ setOutput(Iterator<String> arguments) {
+ String path;
+ if (arguments.current == '-o') {
+ if (!arguments.moveNext()) {
+ helpAndFail('Error: Missing file after -o option.');
+ }
+ path = arguments.current;
+ } else {
+ path = extractParameter(arguments.current);
}
- path = arguments.current;
- } else {
- path = extractParameter(arguments.current);
+ explicitOut = true;
+ out = currentDirectory.resolve(nativeToUriPath(path));
+ sourceMapOut = Uri.parse('$out.map');
}
- explicitOut = true;
- out = currentDirectory.resolve(nativeToUriPath(path));
- sourceMapOut = Uri.parse('$out.map');
- }
- setOutputType(String argument) {
- if (argument == '--output-type=dart') {
- outputLanguage = OUTPUT_LANGUAGE_DART;
- if (!explicitOut) {
- out = currentDirectory.resolve('out.dart');
- sourceMapOut = currentDirectory.resolve('out.dart.map');
+ setOutputType(String argument) {
+ if (argument == '--output-type=dart') {
+ outputLanguage = OUTPUT_LANGUAGE_DART;
+ if (!explicitOut) {
+ out = currentDirectory.resolve('out.dart');
+ sourceMapOut = currentDirectory.resolve('out.dart.map');
+ }
}
+ passThrough(argument);
}
- passThrough(argument);
- }
- String getDepsOutput(Map<String, SourceFile> sourceFiles) {
- var filenames = new List.from(sourceFiles.keys);
- filenames.sort();
- return filenames.join("\n");
- }
+ String getDepsOutput(Map<String, SourceFile> sourceFiles) {
+ var filenames = new List.from(sourceFiles.keys);
+ filenames.sort();
+ return filenames.join("\n");
+ }
- setStrip(String argument) {
- stripArgumentSet = true;
- passThrough(argument);
- }
+ setStrip(String argument) {
+ stripArgumentSet = true;
+ passThrough(argument);
+ }
- setAnalyzeOnly(String argument) {
- analyzeOnly = true;
- passThrough(argument);
- }
+ setAnalyzeOnly(String argument) {
+ analyzeOnly = true;
+ passThrough(argument);
+ }
- setVerbose(_) {
- diagnosticHandler.verbose = true;
- passThrough('--verbose');
- }
+ setVerbose(_) {
+ diagnosticHandler.verbose = true;
+ passThrough('--verbose');
+ }
- addInEnvironment(String argument) {
- int eqIndex = argument.indexOf('=');
- String name = argument.substring(2, eqIndex);
- String value = argument.substring(eqIndex + 1);
- environment[name] = value;
- }
+ addInEnvironment(String argument) {
+ int eqIndex = argument.indexOf('=');
+ String name = argument.substring(2, eqIndex);
+ String value = argument.substring(eqIndex + 1);
+ environment[name] = value;
+ }
- setCategories(String argument) {
- List<String> categories = extractParameter(argument).split(',');
- Set<String> allowedCategories =
- LIBRARIES.values.map((x) => x.category).toSet();
- allowedCategories.remove('Shared');
- allowedCategories.remove('Internal');
- List<String> allowedCategoriesList =
- new List<String>.from(allowedCategories);
- allowedCategoriesList.sort();
- if (categories.contains('all')) {
- categories = allowedCategoriesList;
- } else {
- String allowedCategoriesString = allowedCategoriesList.join(', ');
- for (String category in categories) {
- if (!allowedCategories.contains(category)) {
- fail('Error: unsupported library category "$category", '
- 'supported categories are: $allowedCategoriesString');
+ setCategories(String argument) {
+ List<String> categories = extractParameter(argument).split(',');
+ Set<String> allowedCategories =
+ LIBRARIES.values.map((x) => x.category).toSet();
+ allowedCategories.remove('Shared');
+ allowedCategories.remove('Internal');
+ List<String> allowedCategoriesList =
+ new List<String>.from(allowedCategories);
+ allowedCategoriesList.sort();
+ if (categories.contains('all')) {
+ categories = allowedCategoriesList;
+ } else {
+ String allowedCategoriesString = allowedCategoriesList.join(', ');
+ for (String category in categories) {
+ if (!allowedCategories.contains(category)) {
+ fail('Error: unsupported library category "$category", '
+ 'supported categories are: $allowedCategoriesString');
+ }
}
}
+ passThrough('--categories=${categories.join(",")}');
}
- passThrough('--categories=${categories.join(",")}');
- }
- checkGlobalName(String argument) {
- String globalName = extractParameter(argument);
- if (!new RegExp(r'^\$[a-z]*$').hasMatch(globalName)) {
- fail('Error: "$globalName" must match "\\\$[a-z]*"');
+ checkGlobalName(String argument) {
+ String globalName = extractParameter(argument);
+ if (!new RegExp(r'^\$[a-z]*$').hasMatch(globalName)) {
+ fail('Error: "$globalName" must match "\\\$[a-z]*"');
+ }
+ passThrough(argument);
}
- passThrough(argument);
- }
- handleShortOptions(String argument) {
- var shortOptions = argument.substring(1).split("");
- for (var shortOption in shortOptions) {
- switch (shortOption) {
- case 'v':
- setVerbose(null);
- break;
- case 'h':
- case '?':
- wantHelp = true;
- break;
- case 'c':
- passThrough('--enable-checked-mode');
- break;
- default:
- throw 'Internal error: "$shortOption" did not match';
+ handleShortOptions(String argument) {
+ var shortOptions = argument.substring(1).split("");
+ for (var shortOption in shortOptions) {
+ switch (shortOption) {
+ case 'v':
+ setVerbose(null);
+ break;
+ case 'h':
+ case '?':
+ wantHelp = true;
+ break;
+ case 'c':
+ passThrough('--enable-checked-mode');
+ break;
+ default:
+ throw 'Internal error: "$shortOption" did not match';
+ }
}
}
- }
- Uri computePrecompiledUri() {
- String extension = 'precompiled.js';
- String outPath = out.path;
- if (outPath.endsWith('.js')) {
- outPath = outPath.substring(0, outPath.length - 3);
- return out.resolve('$outPath.$extension');
- } else {
- return out.resolve(extension);
+ Uri computePrecompiledUri() {
+ String extension = 'precompiled.js';
+ String outPath = out.path;
+ if (outPath.endsWith('.js')) {
+ outPath = outPath.substring(0, outPath.length - 3);
+ return out.resolve('$outPath.$extension');
+ } else {
+ return out.resolve(extension);
+ }
}
- }
- List<String> arguments = <String>[];
- List<OptionHandler> handlers = <OptionHandler>[
- new OptionHandler('-[chv?]+', handleShortOptions),
- new OptionHandler('--throw-on-error',
- (_) => diagnosticHandler.throwOnError = true),
- new OptionHandler('--suppress-warnings',
- (_) => diagnosticHandler.showWarnings = false),
- new OptionHandler('--suppress-hints',
- (_) => diagnosticHandler.showHints = false),
- new OptionHandler('--output-type=dart|--output-type=js', setOutputType),
- new OptionHandler('--verbose', setVerbose),
- new OptionHandler('--version', (_) => wantVersion = true),
- new OptionHandler('--library-root=.+', setLibraryRoot),
- new OptionHandler('--out=.+|-o.*', setOutput, multipleArguments: true),
- new OptionHandler('--allow-mock-compilation', passThrough),
- new OptionHandler('--minify', passThrough),
- new OptionHandler('--force-strip=.*', setStrip),
- new OptionHandler('--disable-diagnostic-colors',
- (_) => diagnosticHandler.enableColors = false),
- new OptionHandler('--enable-diagnostic-colors',
- (_) => diagnosticHandler.enableColors = true),
- new OptionHandler('--enable[_-]checked[_-]mode|--checked',
- (_) => passThrough('--enable-checked-mode')),
- new OptionHandler('--enable-concrete-type-inference',
- (_) => passThrough('--enable-concrete-type-inference')),
- new OptionHandler('--trust-type-annotations',
- (_) => passThrough('--trust-type-annotations')),
- new OptionHandler(r'--help|/\?|/h', (_) => wantHelp = true),
- new OptionHandler('--package-root=.+|-p.+', setPackageRoot),
- new OptionHandler('--analyze-all', passThrough),
- new OptionHandler('--analyze-only', setAnalyzeOnly),
- new OptionHandler('--analyze-signatures-only', passThrough),
- new OptionHandler('--disable-native-live-type-analysis', passThrough),
- new OptionHandler('--categories=.*', setCategories),
- new OptionHandler('--global-js-name=.*', checkGlobalName),
- new OptionHandler('--disable-type-inference', passThrough),
- new OptionHandler('--terse', passThrough),
- new OptionHandler('--disallow-unsafe-eval',
- (_) => hasDisallowUnsafeEval = true),
- new OptionHandler('-D.+=.*', addInEnvironment),
-
- // The following two options must come last.
- new OptionHandler('-.*', (String argument) {
- helpAndFail('Error: Unknown option "$argument".');
- }),
- new OptionHandler('.*', (String argument) {
- arguments.add(nativeToUriPath(argument));
- })
- ];
-
- parseCommandLine(handlers, argv);
- if (wantHelp || wantVersion) {
- helpAndExit(wantHelp, wantVersion, diagnosticHandler.verbose);
- }
+ List<String> arguments = <String>[];
+ List<OptionHandler> handlers = <OptionHandler>[
+ new OptionHandler('-[chv?]+', handleShortOptions),
+ new OptionHandler('--throw-on-error',
+ (_) => diagnosticHandler.throwOnError = true),
+ new OptionHandler('--suppress-warnings',
+ (_) => diagnosticHandler.showWarnings = false),
+ new OptionHandler('--suppress-hints',
+ (_) => diagnosticHandler.showHints = false),
+ new OptionHandler('--output-type=dart|--output-type=js', setOutputType),
+ new OptionHandler('--verbose', setVerbose),
+ new OptionHandler('--version', (_) => wantVersion = true),
+ new OptionHandler('--library-root=.+', setLibraryRoot),
+ new OptionHandler('--out=.+|-o.*', setOutput, multipleArguments: true),
+ new OptionHandler('--allow-mock-compilation', passThrough),
+ new OptionHandler('--minify', passThrough),
+ new OptionHandler('--force-strip=.*', setStrip),
+ new OptionHandler('--disable-diagnostic-colors',
+ (_) => diagnosticHandler.enableColors = false),
+ new OptionHandler('--enable-diagnostic-colors',
+ (_) => diagnosticHandler.enableColors = true),
+ new OptionHandler('--enable[_-]checked[_-]mode|--checked',
+ (_) => passThrough('--enable-checked-mode')),
+ new OptionHandler('--enable-concrete-type-inference',
+ (_) => passThrough('--enable-concrete-type-inference')),
+ new OptionHandler('--trust-type-annotations',
+ (_) => passThrough('--trust-type-annotations')),
+ new OptionHandler(r'--help|/\?|/h', (_) => wantHelp = true),
+ new OptionHandler('--package-root=.+|-p.+', setPackageRoot),
+ new OptionHandler('--analyze-all', passThrough),
+ new OptionHandler('--analyze-only', setAnalyzeOnly),
+ new OptionHandler('--analyze-signatures-only', passThrough),
+ new OptionHandler('--disable-native-live-type-analysis', passThrough),
+ new OptionHandler('--categories=.*', setCategories),
+ new OptionHandler('--global-js-name=.*', checkGlobalName),
+ new OptionHandler('--disable-type-inference', passThrough),
+ new OptionHandler('--terse', passThrough),
+ new OptionHandler('--disallow-unsafe-eval',
+ (_) => hasDisallowUnsafeEval = true),
+ new OptionHandler('-D.+=.*', addInEnvironment),
+
+ // The following two options must come last.
+ new OptionHandler('-.*', (String argument) {
+ helpAndFail('Error: Unknown option "$argument".');
+ }),
+ new OptionHandler('.*', (String argument) {
+ arguments.add(nativeToUriPath(argument));
+ })
+ ];
+
+ parseCommandLine(handlers, argv);
+ if (wantHelp || wantVersion) {
+ helpAndExit(wantHelp, wantVersion, diagnosticHandler.verbose);
+ }
- if (hasDisallowUnsafeEval) {
- String precompiledName =
- relativize(currentDirectory, computePrecompiledUri(), isWindows);
- helpAndFail("Error: option '--disallow-unsafe-eval' has been removed."
- " Instead, the compiler generates a file named"
- " '$precompiledName'.");
- }
+ if (hasDisallowUnsafeEval) {
+ String precompiledName =
+ relativize(currentDirectory, computePrecompiledUri(), isWindows);
+ helpAndFail("Error: option '--disallow-unsafe-eval' has been removed."
+ " Instead, the compiler generates a file named"
+ " '$precompiledName'.");
+ }
- if (outputLanguage != OUTPUT_LANGUAGE_DART && stripArgumentSet) {
- helpAndFail('Error: --force-strip may only be used with '
- '--output-type=dart');
- }
- if (arguments.isEmpty) {
- helpAndFail('Error: No Dart file specified.');
- }
- if (arguments.length > 1) {
- var extra = arguments.sublist(1);
- helpAndFail('Error: Extra arguments: ${extra.join(" ")}');
- }
+ if (outputLanguage != OUTPUT_LANGUAGE_DART && stripArgumentSet) {
+ helpAndFail('Error: --force-strip may only be used with '
+ '--output-type=dart');
+ }
+ if (arguments.isEmpty) {
+ helpAndFail('Error: No Dart file specified.');
+ }
+ if (arguments.length > 1) {
+ var extra = arguments.sublist(1);
+ helpAndFail('Error: Extra arguments: ${extra.join(" ")}');
+ }
- Uri uri = currentDirectory.resolve(arguments[0]);
- if (packageRoot == null) {
- packageRoot = uri.resolve('./packages/');
- }
+ Uri uri = currentDirectory.resolve(arguments[0]);
+ if (packageRoot == null) {
+ packageRoot = uri.resolve('./packages/');
+ }
- diagnosticHandler.info('package root is $packageRoot');
+ diagnosticHandler.info('package root is $packageRoot');
- int totalCharactersWritten = 0;
+ int totalCharactersWritten = 0;
- options.add('--source-map=$sourceMapOut');
+ options.add('--source-map=$sourceMapOut');
- compilationDone(String code) {
- if (analyzeOnly) return;
- if (code == null) {
- fail('Error: Compilation failed.');
- }
- writeString(Uri.parse('$out.deps'),
- getDepsOutput(inputProvider.sourceFiles));
- diagnosticHandler.info(
- 'compiled ${inputProvider.dartCharactersRead} characters Dart '
- '-> $totalCharactersWritten characters $outputLanguage '
- 'in ${relativize(currentDirectory, out, isWindows)}');
- if (!explicitOut) {
- String input = uriPathToNative(arguments[0]);
- String output = relativize(currentDirectory, out, isWindows);
- print('Dart file ($input) compiled to $outputLanguage: $output');
+ compilationDone(String code) {
+ if (analyzeOnly) return;
+ if (code == null) {
+ fail('Error: Compilation failed.');
+ }
+ writeString(Uri.parse('$out.deps'),
+ getDepsOutput(inputProvider.sourceFiles));
+ diagnosticHandler.info(
+ 'compiled ${inputProvider.dartCharactersRead} characters Dart '
+ '-> $totalCharactersWritten characters $outputLanguage '
+ 'in ${relativize(currentDirectory, out, isWindows)}');
+ if (!explicitOut) {
+ String input = uriPathToNative(arguments[0]);
+ String output = relativize(currentDirectory, out, isWindows);
+ print('Dart file ($input) compiled to $outputLanguage: $output');
+ }
}
- }
- EventSink<String> outputProvider(String name, String extension) {
- Uri uri;
- String sourceMapFileName;
- bool isPrimaryOutput = false;
- if (name == '') {
- if (extension == 'js' || extension == 'dart') {
- isPrimaryOutput = true;
- uri = out;
- sourceMapFileName =
- sourceMapOut.path.substring(sourceMapOut.path.lastIndexOf('/') + 1);
- } else if (extension == 'precompiled.js') {
- uri = computePrecompiledUri();
- diagnosticHandler.info(
- "File ($uri) is compatible with header"
- " \"Content-Security-Policy: script-src 'self'\"");
- } else if (extension == 'js.map' || extension == 'dart.map') {
- uri = sourceMapOut;
+ EventSink<String> outputProvider(String name, String extension) {
+ Uri uri;
+ String sourceMapFileName;
+ bool isPrimaryOutput = false;
+ if (name == '') {
+ if (extension == 'js' || extension == 'dart') {
+ isPrimaryOutput = true;
+ uri = out;
+ sourceMapFileName =
+ sourceMapOut.path.substring(sourceMapOut.path.lastIndexOf('/') + 1);
+ } else if (extension == 'precompiled.js') {
+ uri = computePrecompiledUri();
+ diagnosticHandler.info(
+ "File ($uri) is compatible with header"
+ " \"Content-Security-Policy: script-src 'self'\"");
+ } else if (extension == 'js.map' || extension == 'dart.map') {
+ uri = sourceMapOut;
+ } else {
+ fail('Error: Unknown extension: $extension');
+ }
} else {
- fail('Error: Unknown extension: $extension');
+ uri = out.resolve('$name.$extension');
}
- } else {
- uri = out.resolve('$name.$extension');
+
+ if (uri.scheme != 'file') {
+ fail('Error: Unhandled scheme ${uri.scheme} in $uri.');
+ }
+
+ RandomAccessFile output =
+ new File(uriPathToNative(uri.path)).openSync(mode: FileMode.WRITE);
+ int charactersWritten = 0;
+
+ writeStringSync(String data) {
+ // Write the data in chunks of 8kb, otherwise we risk running OOM
+ int chunkSize = 8*1024;
+
+ int offset = 0;
+ while (offset < data.length) {
+ output.writeStringSync(
+ data.substring(offset, math.min(offset + chunkSize, data.length)));
+ offset += chunkSize;
+ }
+ charactersWritten += data.length;
+ }
+
+ onDone() {
+ if (sourceMapFileName != null) {
+ // Using # is the new proposed standard. @ caused problems in Internet
+ // Explorer due to "Conditional Compilation Statements" in JScript,
+ // see:
+ // http://msdn.microsoft.com/en-us/library/7kx09ct1(v=vs.80).aspx
+ // About source maps, see:
+ // https://docs.google.com/a/google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
+ // TODO(http://dartbug.com/11914): Remove @ line.
+ String sourceMapTag = '''
+
+ //# sourceMappingURL=$sourceMapFileName
+ //@ sourceMappingURL=$sourceMapFileName
+ ''';
+ writeStringSync(sourceMapTag);
+ }
+ output.closeSync();
+ if (isPrimaryOutput) {
+ totalCharactersWritten += charactersWritten;
+ }
+ }
+
+ return new EventSinkWrapper(writeStringSync, onDone);
}
+ return compileFunc(uri, libraryRoot, packageRoot,
+ inputProvider, diagnosticHandler,
+ options, outputProvider, environment)
+ .then(compilationDone);
+ }
+
+ void writeString(Uri uri, String text) {
if (uri.scheme != 'file') {
- fail('Error: Unhandled scheme ${uri.scheme} in $uri.');
+ fail('Error: Unhandled scheme ${uri.scheme}.');
}
+ var file = new File(uriPathToNative(uri.path)).openSync(mode: FileMode.WRITE);
+ file.writeStringSync(text);
+ file.closeSync();
+ }
- RandomAccessFile output =
- new File(uriPathToNative(uri.path)).openSync(mode: FileMode.WRITE);
- int charactersWritten = 0;
+ void fail(String message) {
+ if (diagnosticHandler != null) {
+ diagnosticHandler.diagnosticHandler(
+ null, -1, -1, message, api.Diagnostic.ERROR);
+ } else {
+ print(message);
+ }
+ exitFunc(1);
+ }
- writeStringSync(String data) {
- // Write the data in chunks of 8kb, otherwise we risk running OOM
- int chunkSize = 8*1024;
+ Future compilerMain(List<String> arguments) {
+ var root = uriPathToNative("/$LIBRARY_ROOT");
+ arguments = <String>['--library-root=${Platform.script.toFilePath()}$root']
+ ..addAll(arguments);
+ return compile(arguments);
+ }
- int offset = 0;
- while (offset < data.length) {
- output.writeStringSync(
- data.substring(offset, math.min(offset + chunkSize, data.length)));
- offset += chunkSize;
- }
- charactersWritten += data.length;
+ void helpAndExit(bool wantHelp, bool wantVersion, bool verbose) {
+ if (wantVersion) {
+ var version = (BUILD_ID == null)
+ ? '<non-SDK build>'
+ : BUILD_ID;
+ print('Dart-to-JavaScript compiler (dart2js) version: $version');
}
-
- onDone() {
- if (sourceMapFileName != null) {
- // Using # is the new proposed standard. @ caused problems in Internet
- // Explorer due to "Conditional Compilation Statements" in JScript,
- // see:
- // http://msdn.microsoft.com/en-us/library/7kx09ct1(v=vs.80).aspx
- // About source maps, see:
- // https://docs.google.com/a/google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
- // TODO(http://dartbug.com/11914): Remove @ line.
- String sourceMapTag = '''
-
-//# sourceMappingURL=$sourceMapFileName
-//@ sourceMappingURL=$sourceMapFileName
-''';
- writeStringSync(sourceMapTag);
- }
- output.closeSync();
- if (isPrimaryOutput) {
- totalCharactersWritten += charactersWritten;
+ if (wantHelp) {
+ if (verbose) {
+ verboseHelp();
+ } else {
+ help();
}
}
-
- return new EventSinkWrapper(writeStringSync, onDone);
+ exitFunc(0);
}
- return api.compile(uri, libraryRoot, packageRoot,
- inputProvider, diagnosticHandler,
- options, outputProvider, environment)
- .then(compilationDone);
+ void helpAndFail(String message) {
+ help();
+ print('');
+ fail(message);
+ }
}
class EventSinkWrapper extends EventSink<String> {
@@ -442,32 +498,6 @@ class AbortLeg {
toString() => 'Aborted due to --throw-on-error: $message';
}
-void writeString(Uri uri, String text) {
- if (uri.scheme != 'file') {
- fail('Error: Unhandled scheme ${uri.scheme}.');
- }
- var file = new File(uriPathToNative(uri.path)).openSync(mode: FileMode.WRITE);
- file.writeStringSync(text);
- file.closeSync();
-}
-
-void fail(String message) {
- if (diagnosticHandler != null) {
- diagnosticHandler.diagnosticHandler(
- null, -1, -1, message, api.Diagnostic.ERROR);
- } else {
- print(message);
- }
- exit(1);
-}
-
-Future compilerMain(List<String> arguments) {
- var root = uriPathToNative("/$LIBRARY_ROOT");
- arguments = <String>['--library-root=${Platform.script.toFilePath()}$root']
- ..addAll(arguments);
- return compile(arguments);
-}
-
void help() {
// This message should be no longer than 20 lines. The default
// terminal size normally 80x24. Two lines are used for the prompts
@@ -578,43 +608,39 @@ be removed in a future version:
'''.trim());
}
-void helpAndExit(bool wantHelp, bool wantVersion, bool verbose) {
- if (wantVersion) {
- var version = (BUILD_ID == null)
- ? '<non-SDK build>'
- : BUILD_ID;
- print('Dart-to-JavaScript compiler (dart2js) version: $version');
- }
- if (wantHelp) {
- if (verbose) {
- verboseHelp();
+Future internalMain(Function exitFunc, Function compileFunc,
+ List<String> arguments) {
+ var dart2js = new _Dart2Js(exitFunc, compileFunc);
+
+ onError(exception, trace) {
+ if (exception is CompilerCrashedException) {
ahe 2013/11/21 12:44:53 This looks like a break down of the API to me. Co
+ // Error and stack trace already reported.
+ exitFunc(253); // 253 is recognized as a crash by our test scripts.
} else {
- help();
+ try {
+ print('Internal error: $exception');
+ } catch (ignored) {
+ print('Internal error: error while printing exception');
+ }
+
+ try {
+ if (trace != null) {
+ print(trace);
+ }
+ } finally {
+ exitFunc(253); // 253 is recognized as a crash by our test scripts.
+ }
}
}
- exit(0);
-}
-void helpAndFail(String message) {
- help();
- print('');
- fail(message);
+ try {
+ return dart2js.compilerMain(arguments).catchError(onError);
+ } catch (exception, trace) {
+ onError(exception, trace);
+ return new Future.value();
+ }
}
void main(List<String> arguments) {
- runZoned(() => compilerMain(arguments), onError: (exception, trace) {
- try {
- print('Internal error: $exception');
- } catch (ignored) {
- print('Internal error: error while printing exception');
- }
-
- try {
- if (trace != null) {
- print(trace);
- }
- } finally {
- exit(253); // 253 is recognized as a crash by our test scripts.
- }
- });
+ internalMain(exit, api.compile, arguments);
}
« no previous file with comments | « sdk/lib/_internal/compiler/implementation/compiler.dart ('k') | sdk/lib/_internal/compiler/implementation/util/util.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698