| Index: pkg/compiler/lib/src/apiimpl.dart
|
| diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
|
| index e802bd449fd4fb5b5066cc1d2abbe8d68e421d76..631d29b3d22f1cdf7704182ec1c6153f681f0a81 100644
|
| --- a/pkg/compiler/lib/src/apiimpl.dart
|
| +++ b/pkg/compiler/lib/src/apiimpl.dart
|
| @@ -26,6 +26,7 @@ import 'options.dart' show CompilerOptions;
|
| import 'platform_configuration.dart' as platform_configuration;
|
| import 'resolved_uri_translator.dart';
|
| import 'script.dart';
|
| +import 'serialization/system.dart';
|
|
|
| /// Implements the [Compiler] using a [api.CompilerInput] for supplying the
|
| /// sources.
|
| @@ -112,17 +113,8 @@ class CompilerImpl extends Compiler {
|
| // TODO(johnniwinther): Wrap the result from [provider] in a specialized
|
| // [Future] to ensure that we never execute an asynchronous action without
|
| // setting up the current element of the compiler.
|
| - return new Future.sync(() => callUserProvider(resourceUri)).then((data) {
|
| - SourceFile sourceFile;
|
| - if (data is List<int>) {
|
| - sourceFile = new Utf8BytesSourceFile(resourceUri, data);
|
| - } else if (data is String) {
|
| - sourceFile = new StringSourceFile.fromUri(resourceUri, data);
|
| - } else {
|
| - String message = "Expected a 'String' or a 'List<int>' from the input "
|
| - "provider, but got: ${Error.safeToString(data)}.";
|
| - reportReadError(message);
|
| - }
|
| + return new Future.sync(() => callUserProvider(resourceUri))
|
| + .then((SourceFile sourceFile) {
|
| // We use [readableUri] as the URI for the script since need to preserve
|
| // the scheme in the script because [Script.uri] is used for resolving
|
| // relative URIs mentioned in the script. See the comment on
|
| @@ -182,10 +174,9 @@ class CompilerImpl extends Compiler {
|
| // and we can't depend on 'dart:io' classes.
|
| packages = new NonFilePackagesDirectoryPackages(options.packageRoot);
|
| } else if (options.packageConfig != null) {
|
| - return callUserProvider(options.packageConfig).then((configContents) {
|
| - if (configContents is String) {
|
| - configContents = UTF8.encode(configContents);
|
| - }
|
| + return callUserProvider(options.packageConfig)
|
| + .then((SourceFile sourceFile) {
|
| + List<int> configContents = sourceFile.slowUtf8ZeroTerminatedBytes();
|
| // The input provider may put a trailing 0 byte when it reads a source
|
| // file, which confuses the package config parser.
|
| if (configContents.length > 0 && configContents.last == 0) {
|
| @@ -213,18 +204,27 @@ class CompilerImpl extends Compiler {
|
| }
|
|
|
| Future<Null> setupSdk() {
|
| + Future future = new Future.value(null);
|
| + if (options.resolutionInput != null) {
|
| + reporter.log('Reading serialized data from ${options.resolutionInput}');
|
| + future = callUserProvider(options.resolutionInput)
|
| + .then((SourceFile sourceFile) {
|
| + serialization.deserializeFromText(sourceFile.slowText());
|
| + });
|
| + }
|
| if (resolvedUriTranslator.isNotSet) {
|
| - return platform_configuration
|
| - .load(options.platformConfigUri, provider)
|
| - .then((Map<String, Uri> mapping) {
|
| - resolvedUriTranslator.resolvedUriTranslator =
|
| - new ResolvedUriTranslator(mapping, reporter);
|
| + future = future.then((_) {
|
| + return platform_configuration
|
| + .load(options.platformConfigUri, provider)
|
| + .then((Map<String, Uri> mapping) {
|
| + resolvedUriTranslator.resolvedUriTranslator =
|
| + new ResolvedUriTranslator(mapping, reporter);
|
| + });
|
| });
|
| - } else {
|
| - // The incremental compiler sets up the sdk before run.
|
| - // Therefore this will be called a second time.
|
| - return new Future.value(null);
|
| }
|
| + // The incremental compiler sets up the sdk before run.
|
| + // Therefore this will be called a second time.
|
| + return future;
|
| }
|
|
|
| Future<bool> run(Uri uri) {
|
| @@ -316,9 +316,22 @@ class CompilerImpl extends Compiler {
|
| }
|
| }
|
|
|
| - Future callUserProvider(Uri uri) {
|
| + Future<SourceFile> callUserProvider(Uri uri) {
|
| try {
|
| - return userProviderTask.measureIo(() => provider.readFromUri(uri));
|
| + return userProviderTask
|
| + .measureIo(() => provider.readFromUri(uri))
|
| + .then((data) {
|
| + SourceFile sourceFile;
|
| + if (data is List<int>) {
|
| + sourceFile = new Utf8BytesSourceFile(uri, data);
|
| + } else if (data is String) {
|
| + sourceFile = new StringSourceFile.fromUri(uri, data);
|
| + } else {
|
| + throw "Expected a 'String' or a 'List<int>' from the input "
|
| + "provider, but got: ${Error.safeToString(data)}.";
|
| + }
|
| + return sourceFile;
|
| + });
|
| } catch (ex, s) {
|
| reportCrashInUserCode('Uncaught exception in input provider', ex, s);
|
| rethrow;
|
|
|