| // Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'dart:io' show File, Platform; | |
| import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart' | |
| show IncrementalCompilerResult; | |
| import 'package:front_end/src/base/compiler_context.dart' show CompilerContext; | |
| import 'package:front_end/src/base/incremental_compiler.dart' | |
| show IncrementalCompiler; | |
| import 'package:front_end/src/base/processed_options.dart' | |
| show ProcessedOptions; | |
| import 'package:kernel/ast.dart' show Component; | |
| import 'incremental_suite.dart' show getOptions; | |
| Future<void> main() async { | |
| Uri compileTarget = Platform.script.resolve("binary_md_dill_reader.dart"); | |
| if (!(new File.fromUri(compileTarget)).existsSync()) { | |
| throw "$compileTarget doesn't exist"; | |
| } | |
| List<Future> futures = []; | |
| List<int> compilesLeft = new List<int>.filled(5, 8); | |
| for (int i = 0; i < compilesLeft.length; i++) { | |
| Future<Component?> compileAgain() async { | |
| print("$i has ${compilesLeft[i]} left."); | |
| if (compilesLeft[i] > 0) { | |
| compilesLeft[i]--; | |
| return compile(i, compileTarget).then((value) => compileAgain()); | |
| } | |
| return null; | |
| } | |
| print("Starting first compile for $i"); | |
| futures.add(compile(i, compileTarget).then((value) => compileAgain())); | |
| } | |
| await Future.wait(futures); | |
| print( | |
| "Checkpoint #1: Can compiles several at once " | |
| "(with different compilers!)", | |
| ); | |
| for (int i = 0; i < 5; i++) { | |
| futures.clear(); | |
| for (int j = 0; j < 10; j++) { | |
| futures.add(compile(0, compileTarget)); | |
| } | |
| await Future.wait(futures); | |
| } | |
| print( | |
| "Checkpoint #2: Can compiles several at once " | |
| "(with the same compiler) (without crashing)", | |
| ); | |
| } | |
| List<IncrementalCompiler?> compilers = []; | |
| Future<Component> compile(int compilerNum, Uri uri) async { | |
| if (compilers.length <= compilerNum) { | |
| compilers.length = compilerNum + 1; | |
| } | |
| IncrementalCompiler? compiler = compilers[compilerNum]; | |
| if (compiler == null) { | |
| var options = getOptions(); | |
| compiler = new IncrementalCompiler( | |
| new CompilerContext( | |
| new ProcessedOptions(options: options, inputs: [uri]), | |
| ), | |
| ); | |
| compilers[compilerNum] = compiler; | |
| } else { | |
| compiler.invalidateAllSources(); | |
| } | |
| IncrementalCompilerResult compilerResult = await compiler.computeDelta(); | |
| Component result = compilerResult.component; | |
| print("Now compile is done!"); | |
| return result; | |
| } |