| OLD | NEW | 
|    1 // Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file |    1 // Copyright (c) 2016, 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 /// This is an interface to the Dart Kernel parser and Kernel binary generator. |    5 /// This is an interface to the Dart Kernel parser and Kernel binary generator. | 
|    6 /// |    6 /// | 
|    7 /// It is used by the kernel-isolate to load Dart source code and generate |    7 /// It is used by the kernel-isolate to load Dart source code and generate | 
|    8 /// Kernel binary format. |    8 /// Kernel binary format. | 
|    9 /// |    9 /// | 
|   10 /// This is either invoked as the root script of the Kernel isolate when used |   10 /// This is either invoked as the root script of the Kernel isolate when used | 
|   11 /// as a part of |   11 /// as a part of | 
|   12 /// |   12 /// | 
|   13 ///         dart --dfe=utils/kernel-service/kernel-service.dart ... |   13 ///         dart --dfe=utils/kernel-service/kernel-service.dart ... | 
|   14 /// |   14 /// | 
|   15 /// invocation or it is invoked as a standalone script to perform training for |   15 /// invocation or it is invoked as a standalone script to perform training for | 
|   16 /// the app-jit snapshot |   16 /// the app-jit snapshot | 
|   17 /// |   17 /// | 
|   18 ///         dart utils/kernel-service/kernel-service.dart --train <source-file> |   18 ///         dart utils/kernel-service/kernel-service.dart --train <source-file> | 
|   19 /// |   19 /// | 
|   20 /// |   20 /// | 
|   21 library runtime.tools.kernel_service; |   21 library runtime.tools.kernel_service; | 
|   22  |   22  | 
|   23 import 'dart:async'; |   23 import 'dart:async'; | 
|   24 import 'dart:io'; |   24 import 'dart:io'; | 
|   25 import 'dart:isolate'; |   25 import 'dart:isolate'; | 
|   26  |   26  | 
 |   27 import 'package:front_end/memory_file_system.dart'; | 
 |   28 import 'package:front_end/physical_file_system.dart'; | 
|   27 import 'package:front_end/src/fasta/vm.dart' |   29 import 'package:front_end/src/fasta/vm.dart' | 
|   28     show CompilationResult, Status, parseScript; |   30     show CompilationResult, Status, parseScriptInFileSystem; | 
|   29  |   31  | 
|   30 const bool verbose = const bool.fromEnvironment('DFE_VERBOSE'); |   32 const bool verbose = const bool.fromEnvironment('DFE_VERBOSE'); | 
|   31  |   33  | 
|   32 const bool strongMode = const bool.fromEnvironment('DFE_STRONG_MODE'); |   34 const bool strongMode = const bool.fromEnvironment('DFE_STRONG_MODE'); | 
|   33  |   35  | 
|   34 Future<CompilationResult> _processLoadRequestImpl(String inputFilePathOrUri) { |   36 Future<CompilationResult> _processLoadRequestImpl( | 
 |   37     String inputFilePathOrUri, FileSystem fileSystem) { | 
|   35   Uri scriptUri = Uri.parse(inputFilePathOrUri); |   38   Uri scriptUri = Uri.parse(inputFilePathOrUri); | 
|   36  |   39  | 
|   37   // Because we serve both Loader and bootstrapping requests we need to |   40   // Because we serve both Loader and bootstrapping requests we need to | 
|   38   // duplicate the logic from _resolveScriptUri(...) here and attempt to |   41   // duplicate the logic from _resolveScriptUri(...) here and attempt to | 
|   39   // resolve schemaless uris using current working directory. |   42   // resolve schemaless uris using current working directory. | 
|   40   if (!scriptUri.hasScheme) { |   43   if (!scriptUri.hasScheme) { | 
|   41     // Script does not have a scheme, assume that it is a path, |   44     // Script does not have a scheme, assume that it is a path, | 
|   42     // resolve it against the working directory. |   45     // resolve it against the working directory. | 
|   43     scriptUri = Uri.base.resolveUri(new Uri.file(inputFilePathOrUri)); |   46     scriptUri = Uri.base.resolveUri(new Uri.file(inputFilePathOrUri)); | 
|   44   } |   47   } | 
|   45  |   48  | 
|   46   if (!scriptUri.isScheme('file')) { |   49   if (!scriptUri.isScheme('file')) { | 
|   47     // TODO(vegorov): Reuse loader code to support other schemes. |   50     // TODO(vegorov): Reuse loader code to support other schemes. | 
|   48     return new Future<CompilationResult>.value(new CompilationResult.error( |   51     return new Future<CompilationResult>.value(new CompilationResult.error( | 
|   49         "Expected 'file' scheme for a script uri: got ${scriptUri.scheme}")); |   52         "Expected 'file' scheme for a script uri: got ${scriptUri.scheme}")); | 
|   50   } |   53   } | 
|   51  |   54   return parseScriptInFileSystem(scriptUri, fileSystem, | 
|   52   return parseScript(scriptUri, verbose: verbose, strongMode: strongMode); |   55       verbose: verbose, strongMode: strongMode); | 
|   53 } |   56 } | 
|   54  |   57  | 
|   55 // Process a request from the runtime. See KernelIsolate::CompileToKernel in |   58 // Process a request from the runtime. See KernelIsolate::CompileToKernel in | 
|   56 // kernel_isolate.cc and Loader::SendKernelRequest in loader.cc. |   59 // kernel_isolate.cc and Loader::SendKernelRequest in loader.cc. | 
|   57 Future _processLoadRequest(request) async { |   60 Future _processLoadRequest(request) async { | 
|   58   if (verbose) { |   61   if (verbose) { | 
|   59     print("DFE: request: $request"); |   62     print("DFE: request: $request"); | 
|   60     print("DFE: Platform.packageConfig: ${Platform.packageConfig}"); |   63     print("DFE: Platform.packageConfig: ${Platform.packageConfig}"); | 
|   61     print("DFE: Platform.resolvedExecutable: ${Platform.resolvedExecutable}"); |   64     print("DFE: Platform.resolvedExecutable: ${Platform.resolvedExecutable}"); | 
|   62   } |   65   } | 
|   63  |   66  | 
|   64   int tag = request[0]; |   67   int tag = request[0]; | 
|   65   final SendPort port = request[1]; |   68   final SendPort port = request[1]; | 
|   66   final String inputFileUrl = request[2]; |   69   final String inputFileUrl = request[2]; | 
 |   70   FileSystem fileSystem = request.length > 3 | 
 |   71       ? _buildMemoryFileSystem(request[3]) | 
 |   72       : PhysicalFileSystem.instance; | 
|   67  |   73  | 
|   68   CompilationResult result; |   74   CompilationResult result; | 
|   69   try { |   75   try { | 
|   70     result = await _processLoadRequestImpl(inputFileUrl); |   76     result = await _processLoadRequestImpl(inputFileUrl, fileSystem); | 
|   71   } catch (error, stack) { |   77   } catch (error, stack) { | 
|   72     result = new CompilationResult.crash(error, stack); |   78     result = new CompilationResult.crash(error, stack); | 
|   73   } |   79   } | 
|   74  |   80  | 
|   75   if (verbose) { |   81   if (verbose) { | 
|   76     print("DFE:> ${result}"); |   82     print("DFE:> ${result}"); | 
|   77   } |   83   } | 
|   78  |   84  | 
|   79   // Check whether this is a Loader request or a bootstrapping request from |   85   // Check whether this is a Loader request or a bootstrapping request from | 
|   80   // KernelIsolate::CompileToKernel. |   86   // KernelIsolate::CompileToKernel. | 
|   81   final isBootstrapRequest = tag == null; |   87   final isBootstrapRequest = tag == null; | 
|   82   if (isBootstrapRequest) { |   88   if (isBootstrapRequest) { | 
|   83     port.send(result.toResponse()); |   89     port.send(result.toResponse()); | 
|   84   } else { |   90   } else { | 
|   85     // See loader.cc for the code that handles these replies. |   91     // See loader.cc for the code that handles these replies. | 
|   86     if (result.status != Status.ok) { |   92     if (result.status != Status.ok) { | 
|   87       tag = -tag; |   93       tag = -tag; | 
|   88     } |   94     } | 
|   89     port.send([tag, inputFileUrl, inputFileUrl, null, result.payload]); |   95     port.send([tag, inputFileUrl, inputFileUrl, null, result.payload]); | 
|   90   } |   96   } | 
|   91 } |   97 } | 
|   92  |   98  | 
 |   99 // Given namedSources list of interleaved file name string and | 
 |  100 // raw file content Uint8List this function builds up and returns | 
 |  101 // MemoryFileSystem instance that can be used instead of | 
 |  102 // PhysicalFileSystem.instance by the frontend. | 
 |  103 FileSystem _buildMemoryFileSystem(List namedSources) { | 
 |  104   FileSystem fileSystem = new MemoryFileSystem(Uri.parse('file:///')); | 
 |  105   for (int i = 0; i < namedSources.length ~/ 2; i++) { | 
 |  106     fileSystem | 
 |  107         .entityForUri(Uri.parse(namedSources[i * 2])) | 
 |  108         .writeAsBytesSync(namedSources[i * 2 + 1]); | 
 |  109   } | 
 |  110   return fileSystem; | 
 |  111 } | 
 |  112  | 
|   93 train(String scriptUri) { |  113 train(String scriptUri) { | 
|   94   // TODO(28532): Enable on Windows. |  114   // TODO(28532): Enable on Windows. | 
|   95   if (Platform.isWindows) return; |  115   if (Platform.isWindows) return; | 
|   96  |  116  | 
|   97   var tag = 1; |  117   var tag = 1; | 
|   98   var responsePort = new RawReceivePort(); |  118   var responsePort = new RawReceivePort(); | 
|   99   responsePort.handler = (response) { |  119   responsePort.handler = (response) { | 
|  100     if (response[0] == tag) { |  120     if (response[0] == tag) { | 
|  101       // Success. |  121       // Success. | 
|  102       responsePort.close(); |  122       responsePort.close(); | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|  114 main([args]) { |  134 main([args]) { | 
|  115   if (args?.length == 2 && args[0] == '--train') { |  135   if (args?.length == 2 && args[0] == '--train') { | 
|  116     // This entry point is used when creating an app snapshot. The argument |  136     // This entry point is used when creating an app snapshot. The argument | 
|  117     // provides a script to compile to warm-up generated code. |  137     // provides a script to compile to warm-up generated code. | 
|  118     train(args[1]); |  138     train(args[1]); | 
|  119   } else { |  139   } else { | 
|  120     // Entry point for the Kernel isolate. |  140     // Entry point for the Kernel isolate. | 
|  121     return new RawReceivePort()..handler = _processLoadRequest; |  141     return new RawReceivePort()..handler = _processLoadRequest; | 
|  122   } |  142   } | 
|  123 } |  143 } | 
| OLD | NEW |