| 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 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 import 'package:front_end/front_end.dart'; | 29 import 'package:front_end/front_end.dart'; |
| 30 import 'package:front_end/memory_file_system.dart'; | 30 import 'package:front_end/memory_file_system.dart'; |
| 31 import 'package:front_end/physical_file_system.dart'; | 31 import 'package:front_end/physical_file_system.dart'; |
| 32 import 'package:front_end/src/fasta/kernel/utils.dart'; | 32 import 'package:front_end/src/fasta/kernel/utils.dart'; |
| 33 import 'package:front_end/src/testing/hybrid_file_system.dart'; | 33 import 'package:front_end/src/testing/hybrid_file_system.dart'; |
| 34 import 'package:kernel/kernel.dart' show Program; | 34 import 'package:kernel/kernel.dart' show Program; |
| 35 import 'package:kernel/target/targets.dart' show TargetFlags; | 35 import 'package:kernel/target/targets.dart' show TargetFlags; |
| 36 import 'package:kernel/target/vm_fasta.dart' show VmFastaTarget; | 36 import 'package:kernel/target/vm_fasta.dart' show VmFastaTarget; |
| 37 | 37 |
| 38 const bool verbose = const bool.fromEnvironment('DFE_VERBOSE'); | 38 const bool verbose = const bool.fromEnvironment('DFE_VERBOSE'); |
| 39 | |
| 40 const bool strongMode = const bool.fromEnvironment('DFE_STRONG_MODE'); | 39 const bool strongMode = const bool.fromEnvironment('DFE_STRONG_MODE'); |
| 41 | 40 |
| 42 Future<CompilationResult> _parseScriptInFileSystem( | |
| 43 Uri script, FileSystem fileSystem, | |
| 44 {bool verbose: false, bool strongMode: false}) async { | |
| 45 final Uri packagesUri = (Platform.packageConfig != null) | |
| 46 ? Uri.parse(Platform.packageConfig) | |
| 47 : null; | |
| 48 | |
| 49 final Uri patchedSdk = Uri.base | |
| 50 .resolveUri(new Uri.file(Platform.resolvedExecutable)) | |
| 51 .resolveUri(new Uri.directory("patched_sdk")); | |
| 52 | |
| 53 if (verbose) { | |
| 54 print("""DFE: Requesting compilation { | |
| 55 scriptUri: ${script} | |
| 56 packagesUri: ${packagesUri} | |
| 57 patchedSdk: ${patchedSdk} | |
| 58 }"""); | |
| 59 } | |
| 60 | |
| 61 try { | |
| 62 var errors = <String>[]; | |
| 63 var options = new CompilerOptions() | |
| 64 ..strongMode = strongMode | |
| 65 ..fileSystem = fileSystem | |
| 66 ..target = new VmFastaTarget(new TargetFlags(strongMode: strongMode)) | |
| 67 ..packagesFileUri = packagesUri | |
| 68 // TODO(sigmund): use outline.dill when the mixin transformer is modular. | |
| 69 ..sdkSummary = patchedSdk.resolve('platform.dill') | |
| 70 ..verbose = verbose | |
| 71 ..onError = (CompilationError e) => errors.add(e.message); | |
| 72 | |
| 73 Program program = await kernelForProgram(script, options); | |
| 74 if (errors.isNotEmpty) return new CompilationResult.errors(errors); | |
| 75 | |
| 76 // We serialize the program excluding platform.dill because the VM has these | |
| 77 // sources built-in. Everything loaded as a summary in [kernelForProgram] is | |
| 78 // marked `external`, so we can use that bit to decide what to excluce. | |
| 79 // TODO(sigmund): remove the following line (Issue #30111) | |
| 80 program.libraries.forEach((e) => e.isExternal = false); | |
| 81 return new CompilationResult.ok( | |
| 82 serializeProgram(program, filter: (lib) => !lib.isExternal)); | |
| 83 } catch (err, stack) { | |
| 84 return new CompilationResult.crash(err, stack); | |
| 85 } | |
| 86 } | |
| 87 | |
| 88 Future<CompilationResult> _processLoadRequestImpl( | |
| 89 String inputFilePathOrUri, FileSystem fileSystem) { | |
| 90 Uri scriptUri = Uri.parse(inputFilePathOrUri); | |
| 91 | |
| 92 // Because we serve both Loader and bootstrapping requests we need to | |
| 93 // duplicate the logic from _resolveScriptUri(...) here and attempt to | |
| 94 // resolve schemaless uris using current working directory. | |
| 95 if (!scriptUri.hasScheme) { | |
| 96 // Script does not have a scheme, assume that it is a path, | |
| 97 // resolve it against the working directory. | |
| 98 scriptUri = Uri.base.resolveUri(new Uri.file(inputFilePathOrUri)); | |
| 99 } | |
| 100 | |
| 101 if (!scriptUri.isScheme('file')) { | |
| 102 // TODO(vegorov): Reuse loader code to support other schemes. | |
| 103 return new Future<CompilationResult>.value(new CompilationResult.errors( | |
| 104 ["Expected 'file' scheme for a script uri: got ${scriptUri.scheme}"])); | |
| 105 } | |
| 106 return _parseScriptInFileSystem(scriptUri, fileSystem, | |
| 107 verbose: verbose, strongMode: strongMode); | |
| 108 } | |
| 109 | |
| 110 // Process a request from the runtime. See KernelIsolate::CompileToKernel in | 41 // Process a request from the runtime. See KernelIsolate::CompileToKernel in |
| 111 // kernel_isolate.cc and Loader::SendKernelRequest in loader.cc. | 42 // kernel_isolate.cc and Loader::SendKernelRequest in loader.cc. |
| 112 Future _processLoadRequest(request) async { | 43 Future _processLoadRequest(request) async { |
| 113 if (verbose) { | 44 if (verbose) print("DFE: request: $request"); |
| 114 print("DFE: request: $request"); | |
| 115 print("DFE: Platform.packageConfig: ${Platform.packageConfig}"); | |
| 116 print("DFE: Platform.resolvedExecutable: ${Platform.resolvedExecutable}"); | |
| 117 } | |
| 118 | 45 |
| 119 int tag = request[0]; | 46 int tag = request[0]; |
| 120 final SendPort port = request[1]; | 47 final SendPort port = request[1]; |
| 121 final String inputFileUrl = request[2]; | 48 final String inputFileUri = request[2]; |
| 49 final Uri script = Uri.base.resolve(inputFileUri); |
| 50 |
| 122 FileSystem fileSystem = request.length > 3 | 51 FileSystem fileSystem = request.length > 3 |
| 123 ? _buildFileSystem(request[3]) | 52 ? _buildFileSystem(request[3]) |
| 124 : PhysicalFileSystem.instance; | 53 : PhysicalFileSystem.instance; |
| 125 | 54 |
| 55 Uri packagesUri = (Platform.packageConfig != null) |
| 56 ? Uri.parse(Platform.packageConfig) |
| 57 : null; |
| 58 |
| 59 Uri sdkSummary = Uri.base |
| 60 .resolveUri(new Uri.file(Platform.resolvedExecutable)) |
| 61 .resolveUri(new Uri.directory("patched_sdk")) |
| 62 // TODO(sigmund): use outline.dill when the mixin transformer is modular. |
| 63 .resolve('platform.dill'); |
| 64 |
| 65 if (verbose) { |
| 66 print("DFE: scriptUri: ${script}"); |
| 67 print("DFE: Platform.packageConfig: ${Platform.packageConfig}"); |
| 68 print("DFE: packagesUri: ${packagesUri}"); |
| 69 print("DFE: Platform.resolvedExecutable: ${Platform.resolvedExecutable}"); |
| 70 print("DFE: sdkSummary: ${sdkSummary}"); |
| 71 } |
| 72 |
| 73 var errors = <String>[]; |
| 74 var options = new CompilerOptions() |
| 75 ..strongMode = strongMode |
| 76 ..fileSystem = fileSystem |
| 77 ..target = new VmFastaTarget(new TargetFlags(strongMode: strongMode)) |
| 78 ..packagesFileUri = packagesUri |
| 79 ..sdkSummary = sdkSummary |
| 80 ..verbose = verbose |
| 81 ..onError = (CompilationError e) => errors.add(e.message); |
| 82 |
| 126 CompilationResult result; | 83 CompilationResult result; |
| 127 try { | 84 try { |
| 128 result = await _processLoadRequestImpl(inputFileUrl, fileSystem); | 85 Program program = await kernelForProgram(script, options); |
| 86 if (errors.isNotEmpty) { |
| 87 result = new CompilationResult.errors(errors); |
| 88 } else { |
| 89 // We serialize the program excluding platform.dill because the VM has |
| 90 // these sources built-in. Everything loaded as a summary in |
| 91 // [kernelForProgram] is marked `external`, so we can use that bit to |
| 92 // decide what to excluce. |
| 93 // TODO(sigmund): remove the following line (Issue #30111) |
| 94 program.libraries.forEach((e) => e.isExternal = false); |
| 95 result = new CompilationResult.ok( |
| 96 serializeProgram(program, filter: (lib) => !lib.isExternal)); |
| 97 } |
| 129 } catch (error, stack) { | 98 } catch (error, stack) { |
| 130 result = new CompilationResult.crash(error, stack); | 99 result = new CompilationResult.crash(error, stack); |
| 131 } | 100 } |
| 132 | 101 |
| 133 if (verbose) { | 102 if (verbose) print("DFE:> ${result}"); |
| 134 print("DFE:> ${result}"); | |
| 135 } | |
| 136 | 103 |
| 137 // Check whether this is a Loader request or a bootstrapping request from | 104 // Check whether this is a Loader request or a bootstrapping request from |
| 138 // KernelIsolate::CompileToKernel. | 105 // KernelIsolate::CompileToKernel. |
| 139 final isBootstrapRequest = tag == null; | 106 final isBootstrapRequest = tag == null; |
| 140 if (isBootstrapRequest) { | 107 if (isBootstrapRequest) { |
| 141 port.send(result.toResponse()); | 108 port.send(result.toResponse()); |
| 142 } else { | 109 } else { |
| 143 // See loader.cc for the code that handles these replies. | 110 // See loader.cc for the code that handles these replies. |
| 144 if (result.status != Status.ok) { | 111 if (result.status != Status.ok) { |
| 145 tag = -tag; | 112 tag = -tag; |
| 146 } | 113 } |
| 147 port.send([tag, inputFileUrl, inputFileUrl, null, result.payload]); | 114 port.send([tag, inputFileUri, inputFileUri, null, result.payload]); |
| 148 } | 115 } |
| 149 } | 116 } |
| 150 | 117 |
| 151 /// Creates a file system containing the files specified in [namedSources] and | 118 /// Creates a file system containing the files specified in [namedSources] and |
| 152 /// that delegates to the underlying file system for any other file request. | 119 /// that delegates to the underlying file system for any other file request. |
| 153 /// The [namedSources] list interleaves file name string and | 120 /// The [namedSources] list interleaves file name string and |
| 154 /// raw file content Uint8List. | 121 /// raw file content Uint8List. |
| 155 /// | 122 /// |
| 156 /// The result can be used instead of PhysicalFileSystem.instance by the | 123 /// The result can be used instead of PhysicalFileSystem.instance by the |
| 157 /// frontend. | 124 /// frontend. |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 _CompilationCrash(this.exception, this.stack); | 241 _CompilationCrash(this.exception, this.stack); |
| 275 | 242 |
| 276 @override | 243 @override |
| 277 Status get status => Status.crash; | 244 Status get status => Status.crash; |
| 278 | 245 |
| 279 @override | 246 @override |
| 280 String get errorString => "${exception}\n${stack}"; | 247 String get errorString => "${exception}\n${stack}"; |
| 281 | 248 |
| 282 String toString() => "_CompilationCrash(${errorString})"; | 249 String toString() => "_CompilationCrash(${errorString})"; |
| 283 } | 250 } |
| OLD | NEW |