| Index: utils/kernel-service/kernel-service.dart
|
| diff --git a/utils/kernel-service/kernel-service.dart b/utils/kernel-service/kernel-service.dart
|
| index cef18297350402cc30c15ecae58686aeec80320c..d8fdbd0885645ceeb19bc034d176df59a41c4d9c 100644
|
| --- a/utils/kernel-service/kernel-service.dart
|
| +++ b/utils/kernel-service/kernel-service.dart
|
| @@ -10,30 +10,13 @@
|
| /// This is either invoked as the root script of the Kernel isolate when used
|
| /// as a part of
|
| ///
|
| -/// dart --dfe=utils/kernel-service/kernel-service.dart ...
|
| +/// dart --dfe=utils/kernel-service/kernel-service.dart ...
|
| ///
|
| -/// invocation or it is invoked as a standalone script to perform batch mode
|
| -/// compilation requested via an HTTP interface
|
| +/// invocation or it is invoked as a standalone script to perform training for
|
| +/// the app-jit snapshot
|
| ///
|
| -/// dart utils/kernel-service/kernel-service.dart --batch
|
| +/// dart utils/kernel-service/kernel-service.dart --train <source-file>
|
| ///
|
| -/// The port for the batch mode worker is controlled by DFE_WORKER_PORT
|
| -/// environment declarations (set by -DDFE_WORKER_PORT=... command line flag).
|
| -/// When not set (or set to 0) an ephemeral port returned by the OS is used
|
| -/// instead.
|
| -///
|
| -/// When this script is used as a Kernel isolate root script and DFE_WORKER_PORT
|
| -/// is set to non-zero value then Kernel isolate will forward all compilation
|
| -/// requests it receives to the batch worker on the given port.
|
| -///
|
| -/// Set DFE_USE_FASTA environment declaration to true to use fasta front-end
|
| -/// instead of dartk. Note: we expect patched_sdk folder to contain
|
| -/// platform.dill file that contains patched SDK in the Kernel binary form.
|
| -/// This file can be created using the following command line:
|
| -///
|
| -/// export DART_AOT_SDK=<path-to-patched_sdk>
|
| -/// dart pkg/front_end/lib/src/fasta/bin/compile_platform.dart \
|
| -/// ${DART_AOT_SDK}/platform.dill
|
| ///
|
| library runtime.tools.kernel_service;
|
|
|
| @@ -43,7 +26,6 @@ import 'dart:io';
|
| import 'dart:isolate';
|
| import 'dart:typed_data';
|
|
|
| -import 'package:kernel/analyzer/loader.dart';
|
| import 'package:kernel/binary/ast_to_binary.dart';
|
| import 'package:kernel/kernel.dart';
|
| import 'package:kernel/target/targets.dart';
|
| @@ -57,8 +39,6 @@ import 'package:front_end/src/fasta/ast_kind.dart' show AstKind;
|
| import 'package:front_end/src/fasta/errors.dart' show InputError;
|
|
|
| const bool verbose = const bool.fromEnvironment('DFE_VERBOSE');
|
| -const int workerPort = const int.fromEnvironment('DFE_WORKER_PORT') ?? 0;
|
| -const bool useFasta = const bool.fromEnvironment('DFE_USE_FASTA');
|
|
|
| class DataSink implements Sink<List<int>> {
|
| final BytesBuilder builder = new BytesBuilder();
|
| @@ -93,19 +73,6 @@ class CompilationOk extends CompilationResult {
|
|
|
| abstract class CompilationFail extends CompilationResult {
|
| String get errorString;
|
| -
|
| - Map<String, dynamic> toJson();
|
| -
|
| - static CompilationFail fromJson(Map m) {
|
| - switch (m['status']) {
|
| - case STATUS_ERROR:
|
| - return new CompilationError(m['errors']);
|
| - case STATUS_CRASH:
|
| - return new CompilationCrash(m['exception'], m['stack']);
|
| - default:
|
| - throw "Can't deserialize CompilationFail from ${m}.";
|
| - }
|
| - }
|
| }
|
|
|
| class CompilationError extends CompilationFail {
|
| @@ -115,11 +82,6 @@ class CompilationError extends CompilationFail {
|
|
|
| List toResponse() => [STATUS_ERROR, errorString];
|
|
|
| - Map<String, dynamic> toJson() => {
|
| - "status": STATUS_ERROR,
|
| - "errors": errors,
|
| - };
|
| -
|
| String get errorString => errors.take(10).join('\n');
|
|
|
| String toString() => "CompilationError(${errorString})";
|
| @@ -133,18 +95,12 @@ class CompilationCrash extends CompilationFail {
|
|
|
| List toResponse() => [STATUS_CRASH, errorString];
|
|
|
| - Map<String, dynamic> toJson() => {
|
| - "status": STATUS_CRASH,
|
| - "exception": exception,
|
| - "stack": stack,
|
| - };
|
| -
|
| String get errorString => "${exception}\n${stack}";
|
|
|
| String toString() => "CompilationCrash(${errorString})";
|
| }
|
|
|
| -Future<CompilationResult> parseScriptImpl(DartLoaderBatch batch_loader,
|
| +Future<CompilationResult> parseScriptImpl(
|
| Uri fileName, String packageConfig, String sdkPath) async {
|
| if (!FileSystemEntity.isFileSync(fileName.path)) {
|
| throw "Input file '${fileName.path}' does not exist.";
|
| @@ -157,42 +113,24 @@ Future<CompilationResult> parseScriptImpl(DartLoaderBatch batch_loader,
|
| Target target = getTarget("vm", new TargetFlags(strongMode: false));
|
|
|
| Program program;
|
| - if (useFasta) {
|
| - final uriTranslator = await TranslateUri.parse(new Uri.file(packageConfig));
|
| - final Ticker ticker = new Ticker(isVerbose: verbose);
|
| - final DillTarget dillTarget = new DillTarget(ticker, uriTranslator);
|
| - dillTarget.read(new Uri.directory(sdkPath).resolve('platform.dill'));
|
| - final KernelTarget kernelTarget =
|
| - new KernelTarget(dillTarget, uriTranslator);
|
| - try {
|
| - kernelTarget.read(fileName);
|
| - await dillTarget.writeOutline(null);
|
| - program = await kernelTarget.writeOutline(null);
|
| - program = await kernelTarget.writeProgram(null, AstKind.Kernel);
|
| - if (kernelTarget.errors.isNotEmpty) {
|
| - return new CompilationError(kernelTarget.errors
|
| - .map((err) => err.toString())
|
| - .toList(growable: false));
|
| - }
|
| - } on InputError catch (e) {
|
| - return new CompilationError(<String>[e.format()]);
|
| - }
|
| - } else {
|
| - DartOptions dartOptions = new DartOptions(
|
| - strongMode: false,
|
| - strongModeSdk: false,
|
| - sdk: sdkPath,
|
| - packagePath: packageConfig,
|
| - customUriMappings: const {},
|
| - declaredVariables: const {});
|
| - program = new Program();
|
| - DartLoader loader =
|
| - await batch_loader.getLoader(program, dartOptions);
|
| - loader.loadProgram(fileName, target: target);
|
| -
|
| - if (loader.errors.isNotEmpty) {
|
| - return new CompilationError(loader.errors.toList(growable: false));
|
| + final uriTranslator = await TranslateUri.parse(new Uri.file(packageConfig));
|
| + final Ticker ticker = new Ticker(isVerbose: verbose);
|
| + final DillTarget dillTarget = new DillTarget(ticker, uriTranslator);
|
| + dillTarget.read(new Uri.directory(sdkPath).resolve('platform.dill'));
|
| + final KernelTarget kernelTarget =
|
| + new KernelTarget(dillTarget, uriTranslator);
|
| + try {
|
| + kernelTarget.read(fileName);
|
| + await dillTarget.writeOutline(null);
|
| + program = await kernelTarget.writeOutline(null);
|
| + program = await kernelTarget.writeProgram(null, AstKind.Kernel);
|
| + if (kernelTarget.errors.isNotEmpty) {
|
| + return new CompilationError(kernelTarget.errors
|
| + .map((err) => err.toString())
|
| + .toList(growable: false));
|
| }
|
| + } on InputError catch (e) {
|
| + return new CompilationError(<String>[e.format()]);
|
| }
|
|
|
| // Perform target-specific transformations.
|
| @@ -205,10 +143,10 @@ Future<CompilationResult> parseScriptImpl(DartLoaderBatch batch_loader,
|
| return new CompilationOk(sink.builder.takeBytes());
|
| }
|
|
|
| -Future<CompilationResult> parseScript(DartLoaderBatch loader, Uri fileName,
|
| - String packageConfig, String sdkPath) async {
|
| +Future<CompilationResult> parseScript(
|
| + Uri fileName, String packageConfig, String sdkPath) async {
|
| try {
|
| - return await parseScriptImpl(loader, fileName, packageConfig, sdkPath);
|
| + return await parseScriptImpl(fileName, packageConfig, sdkPath);
|
| } catch (err, stack) {
|
| return new CompilationCrash(err.toString(), stack.toString());
|
| }
|
| @@ -249,12 +187,7 @@ Future _processLoadRequestImpl(String inputFileUrl) async {
|
| }""");
|
| }
|
|
|
| - if (workerPort != 0) {
|
| - return await requestParse(scriptUri, packagesUri, patchedSdk);
|
| - } else {
|
| - return await parseScript(
|
| - new DartLoaderBatch(), scriptUri, packagesUri.path, patchedSdk.path);
|
| - }
|
| + return await parseScript(scriptUri, packagesUri.path, patchedSdk.path);
|
| }
|
|
|
| // Process a request from the runtime. See KernelIsolate::CompileToKernel in
|
| @@ -296,66 +229,6 @@ Future _processLoadRequest(request) async {
|
| }
|
| }
|
|
|
| -Future<CompilationResult> requestParse(
|
| - Uri scriptUri, Uri packagesUri, Uri patchedSdk) async {
|
| - if (verbose) {
|
| - print(
|
| - "DFE: forwarding request to worker at http://localhost:${workerPort}/");
|
| - }
|
| -
|
| - HttpClient client = new HttpClient();
|
| - final rq = await client
|
| - .postUrl(new Uri(host: 'localhost', port: workerPort, scheme: 'http'));
|
| - rq.headers.contentType = ContentType.JSON;
|
| - rq.write(JSON.encode({
|
| - "inputFileUrl": scriptUri.toString(),
|
| - "packagesUri": packagesUri.toString(),
|
| - "patchedSdk": patchedSdk.toString(),
|
| - }));
|
| - final rs = await rq.close();
|
| - try {
|
| - if (rs.statusCode == HttpStatus.OK) {
|
| - final BytesBuilder bb = new BytesBuilder();
|
| - await rs.forEach(bb.add);
|
| - return new CompilationOk(bb.takeBytes());
|
| - } else {
|
| - return CompilationFail.fromJson(JSON.decode(await UTF8.decodeStream(rs)));
|
| - }
|
| - } finally {
|
| - await client.close();
|
| - }
|
| -}
|
| -
|
| -void startBatchServer() {
|
| - final loader = new DartLoaderBatch();
|
| - HttpServer.bind('localhost', workerPort).then((server) {
|
| - print('READY ${server.port}');
|
| - server.listen((HttpRequest request) async {
|
| - final rq = JSON.decode(await UTF8.decodeStream(request));
|
| -
|
| - final Uri scriptUri = Uri.parse(rq['inputFileUrl']);
|
| - final Uri packagesUri = Uri.parse(rq['packagesUri']);
|
| - final Uri patchedSdk = Uri.parse(rq['patchedSdk']);
|
| -
|
| - final CompilationResult result = await parseScript(
|
| - loader, scriptUri, packagesUri.path, patchedSdk.path);
|
| -
|
| - if (result is CompilationOk) {
|
| - request.response.statusCode = HttpStatus.OK;
|
| - request.response.headers.contentType = ContentType.BINARY;
|
| - request.response.add(result.binary);
|
| - request.response.close();
|
| - } else {
|
| - request.response.statusCode = HttpStatus.INTERNAL_SERVER_ERROR;
|
| - request.response.headers.contentType = ContentType.TEXT;
|
| - request.response.write(JSON.encode(result));
|
| - request.response.close();
|
| - }
|
| - });
|
| - ProcessSignal.SIGTERM.watch().first.then((_) => server.close());
|
| - });
|
| -}
|
| -
|
| train(String scriptUri) {
|
| // TODO(28532): Enable on Windows.
|
| if (Platform.isWindows) return;
|
| @@ -378,9 +251,7 @@ train(String scriptUri) {
|
| }
|
|
|
| main([args]) {
|
| - if (args?.length == 1 && args[0] == '--batch') {
|
| - startBatchServer();
|
| - } else if (args?.length == 2 && args[0] == '--train') {
|
| + if (args?.length == 2 && args[0] == '--train') {
|
| // This entry point is used when creating an app snapshot. The argument
|
| // provides a script to compile to warm-up generated code.
|
| train(args[1]);
|
|
|