| Index: dart/sdk/lib/_internal/compiler/implementation/compiler.dart | 
| diff --git a/dart/sdk/lib/_internal/compiler/implementation/compiler.dart b/dart/sdk/lib/_internal/compiler/implementation/compiler.dart | 
| index e770cff2319056437c6eff12c693a9ed17a56240..5b8d2444bb5624c764f4eaa5c02c86636180f683 100644 | 
| --- a/dart/sdk/lib/_internal/compiler/implementation/compiler.dart | 
| +++ b/dart/sdk/lib/_internal/compiler/implementation/compiler.dart | 
| @@ -58,6 +58,11 @@ class WorkItem { | 
| } | 
| } | 
|  | 
| +class ReadingFilesTask extends CompilerTask { | 
| +  ReadingFilesTask(Compiler compiler) : super(compiler); | 
| +  String get name => 'Reading input files'; | 
| +} | 
| + | 
| abstract class Backend { | 
| final Compiler compiler; | 
| final ConstantSystem constantSystem; | 
| @@ -100,6 +105,7 @@ abstract class Backend { | 
|  | 
| abstract class Compiler implements DiagnosticListener { | 
| final Map<String, LibraryElement> libraries; | 
| +  final Stopwatch totalCompileTime = new Stopwatch(); | 
| int nextFreeClassId = 0; | 
| World world; | 
| String assembledCode; | 
| @@ -190,6 +196,7 @@ abstract class Compiler implements DiagnosticListener { | 
| Backend backend; | 
| ConstantHandler constantHandler; | 
| EnqueueTask enqueuer; | 
| +  CompilerTask fileReadingTask; | 
|  | 
| static const SourceString MAIN = const SourceString('main'); | 
| static const SourceString CALL_OPERATOR_NAME = const SourceString('call'); | 
| @@ -232,26 +239,29 @@ abstract class Compiler implements DiagnosticListener { | 
| progress = new Stopwatch() { | 
| progress.start(); | 
| world = new World(this); | 
| -    scanner = new ScannerTask(this); | 
| -    dietParser = new DietParserTask(this); | 
| -    parser = new ParserTask(this); | 
| -    patchParser = new PatchParserTask(this); | 
| -    libraryLoader = new LibraryLoaderTask(this); | 
| -    validator = new TreeValidatorTask(this); | 
| -    resolver = new ResolverTask(this); | 
| -    closureToClassMapper = new closureMapping.ClosureTask(this); | 
| -    checker = new TypeCheckerTask(this); | 
| -    typesTask = new ti.TypesTask(this, enableConcreteTypeInference); | 
| backend = emitJavaScript ? | 
| new js_backend.JavaScriptBackend(this, | 
| generateSourceMap, | 
| disallowUnsafeEval) : | 
| new dart_backend.DartBackend(this, strips); | 
| -    constantHandler = new ConstantHandler(this, backend.constantSystem); | 
| -    enqueuer = new EnqueueTask(this); | 
| -    tasks = [scanner, dietParser, parser, patchParser, libraryLoader, | 
| -             resolver, closureToClassMapper, checker, typesTask, | 
| -             constantHandler, enqueuer]; | 
| + | 
| +    // No-op in production mode. | 
| +    validator = new TreeValidatorTask(this); | 
| + | 
| +    tasks = [ | 
| +      fileReadingTask = new ReadingFilesTask(this), | 
| +      libraryLoader = new LibraryLoaderTask(this), | 
| +      scanner = new ScannerTask(this), | 
| +      dietParser = new DietParserTask(this), | 
| +      parser = new ParserTask(this), | 
| +      patchParser = new PatchParserTask(this), | 
| +      resolver = new ResolverTask(this), | 
| +      closureToClassMapper = new closureMapping.ClosureTask(this), | 
| +      checker = new TypeCheckerTask(this), | 
| +      typesTask = new ti.TypesTask(this, enableConcreteTypeInference), | 
| +      constantHandler = new ConstantHandler(this, backend.constantSystem), | 
| +      enqueuer = new EnqueueTask(this)]; | 
| + | 
| tasks.addAll(backend.tasks); | 
| } | 
|  | 
| @@ -340,13 +350,16 @@ abstract class Compiler implements DiagnosticListener { | 
| } | 
|  | 
| bool run(Uri uri) { | 
| +    totalCompileTime.start(); | 
| try { | 
| runCompiler(uri); | 
| } on CompilerCancelledException catch (exception) { | 
| log('Error: $exception'); | 
| return false; | 
| +    } finally { | 
| +      tracer.close(); | 
| +      totalCompileTime.stop(); | 
| } | 
| -    tracer.close(); | 
| return true; | 
| } | 
|  | 
| @@ -863,16 +876,18 @@ class CompilerTask { | 
| int get timing => watch.elapsedMilliseconds; | 
|  | 
| measure(Function action) { | 
| -    // TODO(kasperl): Do we have to worry about exceptions here? | 
| CompilerTask previous = compiler.measuredTask; | 
| +    if (identical(this, previous)) return action(); | 
| compiler.measuredTask = this; | 
| if (previous != null) previous.watch.stop(); | 
| watch.start(); | 
| -    var result = action(); | 
| -    watch.stop(); | 
| -    if (previous != null) previous.watch.start(); | 
| -    compiler.measuredTask = previous; | 
| -    return result; | 
| +    try { | 
| +      return action(); | 
| +    } finally { | 
| +      watch.stop(); | 
| +      if (previous != null) previous.watch.start(); | 
| +      compiler.measuredTask = previous; | 
| +    } | 
| } | 
| } | 
|  | 
|  |