| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 part of dart2js; | 5 part of dart2js; | 
| 6 | 6 | 
| 7 /** | 7 /** | 
| 8  * If true, print a warning for each method that was resolved, but not | 8  * If true, print a warning for each method that was resolved, but not | 
| 9  * compiled. | 9  * compiled. | 
| 10  */ | 10  */ | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 51   bool isAnalyzed() => resolutionTree != null; | 51   bool isAnalyzed() => resolutionTree != null; | 
| 52 | 52 | 
| 53   void run(Compiler compiler, Enqueuer world) { | 53   void run(Compiler compiler, Enqueuer world) { | 
| 54     CodeBuffer codeBuffer = world.universe.generatedCode[element]; | 54     CodeBuffer codeBuffer = world.universe.generatedCode[element]; | 
| 55     if (codeBuffer != null) return; | 55     if (codeBuffer != null) return; | 
| 56     resolutionTree = compiler.analyze(this, world); | 56     resolutionTree = compiler.analyze(this, world); | 
| 57     compiler.codegen(this, world); | 57     compiler.codegen(this, world); | 
| 58   } | 58   } | 
| 59 } | 59 } | 
| 60 | 60 | 
|  | 61 class ReadingFilesTask extends CompilerTask { | 
|  | 62   ReadingFilesTask(Compiler compiler) : super(compiler); | 
|  | 63   String get name => 'Reading input files'; | 
|  | 64 } | 
|  | 65 | 
| 61 abstract class Backend { | 66 abstract class Backend { | 
| 62   final Compiler compiler; | 67   final Compiler compiler; | 
| 63   final ConstantSystem constantSystem; | 68   final ConstantSystem constantSystem; | 
| 64 | 69 | 
| 65   Backend(this.compiler, | 70   Backend(this.compiler, | 
| 66           [ConstantSystem constantSystem = DART_CONSTANT_SYSTEM]) | 71           [ConstantSystem constantSystem = DART_CONSTANT_SYSTEM]) | 
| 67       : this.constantSystem = constantSystem; | 72       : this.constantSystem = constantSystem; | 
| 68 | 73 | 
| 69   void enqueueAllTopLevelFunctions(LibraryElement lib, Enqueuer world) { | 74   void enqueueAllTopLevelFunctions(LibraryElement lib, Enqueuer world) { | 
| 70     lib.forEachExport((Element e) { | 75     lib.forEachExport((Element e) { | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 93   ItemCompilationContext createItemCompilationContext() { | 98   ItemCompilationContext createItemCompilationContext() { | 
| 94     return new ItemCompilationContext(); | 99     return new ItemCompilationContext(); | 
| 95   } | 100   } | 
| 96 | 101 | 
| 97   SourceString getCheckedModeHelper(DartType type) => null; | 102   SourceString getCheckedModeHelper(DartType type) => null; | 
| 98   void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {} | 103   void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {} | 
| 99 } | 104 } | 
| 100 | 105 | 
| 101 abstract class Compiler implements DiagnosticListener { | 106 abstract class Compiler implements DiagnosticListener { | 
| 102   final Map<String, LibraryElement> libraries; | 107   final Map<String, LibraryElement> libraries; | 
|  | 108   final Stopwatch totalCompileTime = new Stopwatch(); | 
| 103   int nextFreeClassId = 0; | 109   int nextFreeClassId = 0; | 
| 104   World world; | 110   World world; | 
| 105   String assembledCode; | 111   String assembledCode; | 
| 106   Types types; | 112   Types types; | 
| 107 | 113 | 
| 108   final bool enableMinification; | 114   final bool enableMinification; | 
| 109   final bool enableTypeAssertions; | 115   final bool enableTypeAssertions; | 
| 110   final bool enableUserAssertions; | 116   final bool enableUserAssertions; | 
| 111   final bool enableConcreteTypeInference; | 117   final bool enableConcreteTypeInference; | 
| 112   final bool analyzeAll; | 118   final bool analyzeAll; | 
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 183   PatchParserTask patchParser; | 189   PatchParserTask patchParser; | 
| 184   LibraryLoader libraryLoader; | 190   LibraryLoader libraryLoader; | 
| 185   TreeValidatorTask validator; | 191   TreeValidatorTask validator; | 
| 186   ResolverTask resolver; | 192   ResolverTask resolver; | 
| 187   closureMapping.ClosureTask closureToClassMapper; | 193   closureMapping.ClosureTask closureToClassMapper; | 
| 188   TypeCheckerTask checker; | 194   TypeCheckerTask checker; | 
| 189   ti.TypesTask typesTask; | 195   ti.TypesTask typesTask; | 
| 190   Backend backend; | 196   Backend backend; | 
| 191   ConstantHandler constantHandler; | 197   ConstantHandler constantHandler; | 
| 192   EnqueueTask enqueuer; | 198   EnqueueTask enqueuer; | 
|  | 199   CompilerTask fileReadingTask; | 
| 193 | 200 | 
| 194   static const SourceString MAIN = const SourceString('main'); | 201   static const SourceString MAIN = const SourceString('main'); | 
| 195   static const SourceString CALL_OPERATOR_NAME = const SourceString('call'); | 202   static const SourceString CALL_OPERATOR_NAME = const SourceString('call'); | 
| 196   static const SourceString NO_SUCH_METHOD = const SourceString('noSuchMethod'); | 203   static const SourceString NO_SUCH_METHOD = const SourceString('noSuchMethod'); | 
| 197   static const int NO_SUCH_METHOD_ARG_COUNT = 1; | 204   static const int NO_SUCH_METHOD_ARG_COUNT = 1; | 
| 198   static const SourceString INVOKE_ON = const SourceString('invokeOn'); | 205   static const SourceString INVOKE_ON = const SourceString('invokeOn'); | 
| 199   static const SourceString RUNTIME_TYPE = const SourceString('runtimeType'); | 206   static const SourceString RUNTIME_TYPE = const SourceString('runtimeType'); | 
| 200   static const SourceString START_ROOT_ISOLATE = | 207   static const SourceString START_ROOT_ISOLATE = | 
| 201       const SourceString('startRootIsolate'); | 208       const SourceString('startRootIsolate'); | 
| 202   bool enabledNoSuchMethod = false; | 209   bool enabledNoSuchMethod = false; | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 225             bool generateSourceMap: true, | 232             bool generateSourceMap: true, | 
| 226             bool disallowUnsafeEval: false, | 233             bool disallowUnsafeEval: false, | 
| 227             this.analyzeAll: false, | 234             this.analyzeAll: false, | 
| 228             this.rejectDeprecatedFeatures: false, | 235             this.rejectDeprecatedFeatures: false, | 
| 229             this.checkDeprecationInSdk: false, | 236             this.checkDeprecationInSdk: false, | 
| 230             List<String> strips: const []}) | 237             List<String> strips: const []}) | 
| 231       : libraries = new Map<String, LibraryElement>(), | 238       : libraries = new Map<String, LibraryElement>(), | 
| 232         progress = new Stopwatch() { | 239         progress = new Stopwatch() { | 
| 233     progress.start(); | 240     progress.start(); | 
| 234     world = new World(this); | 241     world = new World(this); | 
| 235     scanner = new ScannerTask(this); |  | 
| 236     dietParser = new DietParserTask(this); |  | 
| 237     parser = new ParserTask(this); |  | 
| 238     patchParser = new PatchParserTask(this); |  | 
| 239     libraryLoader = new LibraryLoaderTask(this); |  | 
| 240     validator = new TreeValidatorTask(this); |  | 
| 241     resolver = new ResolverTask(this); |  | 
| 242     closureToClassMapper = new closureMapping.ClosureTask(this); |  | 
| 243     checker = new TypeCheckerTask(this); |  | 
| 244     typesTask = new ti.TypesTask(this, enableConcreteTypeInference); |  | 
| 245     backend = emitJavaScript ? | 242     backend = emitJavaScript ? | 
| 246         new js_backend.JavaScriptBackend(this, | 243         new js_backend.JavaScriptBackend(this, | 
| 247                                          generateSourceMap, | 244                                          generateSourceMap, | 
| 248                                          disallowUnsafeEval) : | 245                                          disallowUnsafeEval) : | 
| 249         new dart_backend.DartBackend(this, strips); | 246         new dart_backend.DartBackend(this, strips); | 
| 250     constantHandler = new ConstantHandler(this, backend.constantSystem); | 247 | 
| 251     enqueuer = new EnqueueTask(this); | 248     // No-op in production mode. | 
| 252     tasks = [scanner, dietParser, parser, patchParser, libraryLoader, | 249     validator = new TreeValidatorTask(this); | 
| 253              resolver, closureToClassMapper, checker, typesTask, | 250 | 
| 254              constantHandler, enqueuer]; | 251     tasks = [ | 
|  | 252       fileReadingTask = new ReadingFilesTask(this), | 
|  | 253       libraryLoader = new LibraryLoaderTask(this), | 
|  | 254       scanner = new ScannerTask(this), | 
|  | 255       dietParser = new DietParserTask(this), | 
|  | 256       parser = new ParserTask(this), | 
|  | 257       patchParser = new PatchParserTask(this), | 
|  | 258       resolver = new ResolverTask(this), | 
|  | 259       closureToClassMapper = new closureMapping.ClosureTask(this), | 
|  | 260       checker = new TypeCheckerTask(this), | 
|  | 261       typesTask = new ti.TypesTask(this, enableConcreteTypeInference), | 
|  | 262       constantHandler = new ConstantHandler(this, backend.constantSystem), | 
|  | 263       enqueuer = new EnqueueTask(this)]; | 
|  | 264 | 
| 255     tasks.addAll(backend.tasks); | 265     tasks.addAll(backend.tasks); | 
| 256   } | 266   } | 
| 257 | 267 | 
| 258   Universe get resolverWorld => enqueuer.resolution.universe; | 268   Universe get resolverWorld => enqueuer.resolution.universe; | 
| 259   Universe get codegenWorld => enqueuer.codegen.universe; | 269   Universe get codegenWorld => enqueuer.codegen.universe; | 
| 260 | 270 | 
| 261   int getNextFreeClassId() => nextFreeClassId++; | 271   int getNextFreeClassId() => nextFreeClassId++; | 
| 262 | 272 | 
| 263   void ensure(bool condition) { | 273   void ensure(bool condition) { | 
| 264     if (!condition) cancel('failed assertion in leg'); | 274     if (!condition) cancel('failed assertion in leg'); | 
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 333       cancel(reason, node: node, token: token, instruction: instruction, | 343       cancel(reason, node: node, token: token, instruction: instruction, | 
| 334              element: element); | 344              element: element); | 
| 335     }); | 345     }); | 
| 336   } | 346   } | 
| 337 | 347 | 
| 338   void log(message) { | 348   void log(message) { | 
| 339     reportDiagnostic(null, message, api.Diagnostic.VERBOSE_INFO); | 349     reportDiagnostic(null, message, api.Diagnostic.VERBOSE_INFO); | 
| 340   } | 350   } | 
| 341 | 351 | 
| 342   bool run(Uri uri) { | 352   bool run(Uri uri) { | 
|  | 353     totalCompileTime.start(); | 
| 343     try { | 354     try { | 
| 344       runCompiler(uri); | 355       runCompiler(uri); | 
| 345     } on CompilerCancelledException catch (exception) { | 356     } on CompilerCancelledException catch (exception) { | 
| 346       log('Error: $exception'); | 357       log('Error: $exception'); | 
| 347       return false; | 358       return false; | 
|  | 359     } finally { | 
|  | 360       tracer.close(); | 
|  | 361       totalCompileTime.stop(); | 
| 348     } | 362     } | 
| 349     tracer.close(); |  | 
| 350     return true; | 363     return true; | 
| 351   } | 364   } | 
| 352 | 365 | 
| 353   void enableNoSuchMethod(Element element) { | 366   void enableNoSuchMethod(Element element) { | 
| 354     // TODO(ahe): Move this method to Enqueuer. | 367     // TODO(ahe): Move this method to Enqueuer. | 
| 355     if (enabledNoSuchMethod) return; | 368     if (enabledNoSuchMethod) return; | 
| 356     if (identical(element.getEnclosingClass(), objectClass)) { | 369     if (identical(element.getEnclosingClass(), objectClass)) { | 
| 357       enqueuer.resolution.registerDynamicInvocationOf(element); | 370       enqueuer.resolution.registerDynamicInvocationOf(element); | 
| 358       return; | 371       return; | 
| 359     } | 372     } | 
| (...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 856 class CompilerTask { | 869 class CompilerTask { | 
| 857   final Compiler compiler; | 870   final Compiler compiler; | 
| 858   final Stopwatch watch; | 871   final Stopwatch watch; | 
| 859 | 872 | 
| 860   CompilerTask(this.compiler) : watch = new Stopwatch(); | 873   CompilerTask(this.compiler) : watch = new Stopwatch(); | 
| 861 | 874 | 
| 862   String get name => 'Unknown task'; | 875   String get name => 'Unknown task'; | 
| 863   int get timing => watch.elapsedMilliseconds; | 876   int get timing => watch.elapsedMilliseconds; | 
| 864 | 877 | 
| 865   measure(Function action) { | 878   measure(Function action) { | 
| 866     // TODO(kasperl): Do we have to worry about exceptions here? |  | 
| 867     CompilerTask previous = compiler.measuredTask; | 879     CompilerTask previous = compiler.measuredTask; | 
|  | 880     if (identical(this, previous)) return action(); | 
| 868     compiler.measuredTask = this; | 881     compiler.measuredTask = this; | 
| 869     if (previous != null) previous.watch.stop(); | 882     if (previous != null) previous.watch.stop(); | 
| 870     watch.start(); | 883     watch.start(); | 
| 871     var result = action(); | 884     try { | 
| 872     watch.stop(); | 885       return action(); | 
| 873     if (previous != null) previous.watch.start(); | 886     } finally { | 
| 874     compiler.measuredTask = previous; | 887       watch.stop(); | 
| 875     return result; | 888       if (previous != null) previous.watch.start(); | 
|  | 889       compiler.measuredTask = previous; | 
|  | 890     } | 
| 876   } | 891   } | 
| 877 } | 892 } | 
| 878 | 893 | 
| 879 class CompilerCancelledException implements Exception { | 894 class CompilerCancelledException implements Exception { | 
| 880   final String reason; | 895   final String reason; | 
| 881   CompilerCancelledException(this.reason); | 896   CompilerCancelledException(this.reason); | 
| 882 | 897 | 
| 883   String toString() { | 898   String toString() { | 
| 884     String banner = 'compiler cancelled'; | 899     String banner = 'compiler cancelled'; | 
| 885     return (reason != null) ? '$banner: $reason' : '$banner'; | 900     return (reason != null) ? '$banner: $reason' : '$banner'; | 
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 938   // TODO(johnniwinther): Use [spannable] and [message] to provide better | 953   // TODO(johnniwinther): Use [spannable] and [message] to provide better | 
| 939   // information on assertion errors. | 954   // information on assertion errors. | 
| 940   if (condition is Function){ | 955   if (condition is Function){ | 
| 941     condition = condition(); | 956     condition = condition(); | 
| 942   } | 957   } | 
| 943   if (spannable == null || !condition) { | 958   if (spannable == null || !condition) { | 
| 944     throw new SpannableAssertionFailure(spannable, message); | 959     throw new SpannableAssertionFailure(spannable, message); | 
| 945   } | 960   } | 
| 946   return true; | 961   return true; | 
| 947 } | 962 } | 
| OLD | NEW | 
|---|