Chromium Code Reviews| Index: pkg/front_end/lib/src/incremental_kernel_generator_impl.dart |
| diff --git a/pkg/front_end/lib/src/incremental_kernel_generator_impl.dart b/pkg/front_end/lib/src/incremental_kernel_generator_impl.dart |
| index 43c016a0cae0bad16cfeb8a40d1e64bded16e650..c81a6f8bec89fc787f6bb9df4332214e4eeb2c18 100644 |
| --- a/pkg/front_end/lib/src/incremental_kernel_generator_impl.dart |
| +++ b/pkg/front_end/lib/src/incremental_kernel_generator_impl.dart |
| @@ -4,6 +4,7 @@ |
| import 'dart:async'; |
| import 'dart:io'; |
| +import 'dart:typed_data'; |
| import 'package:front_end/file_system.dart'; |
| import 'package:front_end/incremental_kernel_generator.dart'; |
| @@ -45,6 +46,9 @@ class ByteSink implements Sink<List<int>> { |
| /// used to obtain resolved ASTs, and these are fed into kernel code generation |
| /// logic. |
| class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator { |
| + /// The version of data format, should be incremented on every format change. |
| + static const int DATA_VERSION = 1; |
| + |
| /// The compiler options, such as the [FileSystem], the SDK dill location, |
| /// etc. |
| final ProcessedOptions _options; |
| @@ -64,8 +68,11 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator { |
| /// The URI of the program entry point. |
| final Uri _entryPoint; |
| + /// The salt to mix into all hashes used as keys for serialized data. |
| + final Uint8List _salt = new Uint8List(16); |
| + |
| /// Latest compilation signatures produced by [computeDelta] for libraries. |
| - final Map<Uri, String> _uriToLatestSignature = {}; |
| + final Map<Uri, String> _latestSignature = {}; |
| /// The set of absolute file URIs that were reported through [invalidate] |
| /// and not checked for actual changes yet. |
| @@ -75,7 +82,9 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator { |
| this._options, this._uriTranslator, this._entryPoint) |
| : _logger = _options.logger, |
| _fsState = new FileSystemState(_options.fileSystem, _uriTranslator), |
| - _byteStore = _options.byteStore; |
| + _byteStore = _options.byteStore { |
| + _fillSalt(); |
| + } |
| @override |
| Future<DeltaProgram> computeDelta( |
| @@ -111,8 +120,8 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator { |
| for (_LibraryCycleResult result in results) { |
| for (Library library in result.kernelLibraries) { |
| Uri uri = library.importUri; |
| - if (_uriToLatestSignature[uri] != result.signature) { |
| - _uriToLatestSignature[uri] = result.signature; |
| + if (_latestSignature[uri] != result.signature) { |
| + _latestSignature[uri] = result.signature; |
| program.libraries.add(library); |
| } |
| } |
| @@ -141,8 +150,7 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator { |
| String signature; |
| { |
| var signatureBuilder = new ApiSignature(); |
| - // TODO(scheglov) add salt |
| - // signature.addUint32List(_fsState._salt); |
| + signatureBuilder.addBytes(_salt); |
| Set<FileState> transitiveFiles = cycle.libraries |
| .map((library) => library.transitiveFiles) |
| .expand((files) => files) |
| @@ -253,6 +261,15 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator { |
| } while (wasChanged); |
| } |
| + /// Fill [_salt] with data. |
| + void _fillSalt() { |
| + var saltBuilder = new ApiSignature(); |
| + saltBuilder.addInt(DATA_VERSION); |
| + saltBuilder.addBool(_options.strongMode); |
| + var saltBytes = saltBuilder.toByteList(); |
| + _salt.setRange(0, 16, saltBytes); |
|
Paul Berry
2017/05/17 22:25:06
This doesn't seem safe. If saltBytes has fewer th
scheglov
2017/05/17 22:38:09
Hm... I think toByteList() returns exactly 16 byte
Paul Berry
2017/05/18 02:57:15
Oops, you're right. I forgot about that.
|
| + } |
| + |
| /// Refresh all the invalidated files and update dependencies. |
| Future<Null> _refreshInvalidatedFiles() async { |
| await _logger.runAsync('Refresh invalidated files', () async { |