blob: 610fdb785acddc6ffd19bbc0a8d6e5f9086e3c86 [file] [log] [blame]
// Copyright (c) 2017, 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.
/// Utility to dump a truncated .dill file generated by the incremental kernel
/// generator or by the VM's kernel service.
import 'dart:io';
import 'package:kernel/kernel.dart';
import 'package:front_end/src/fasta/kernel/utils.dart';
main(List<String> args) {
if (args.length == 0) {
print('usage: pkg/front_end/tool/fasta dump_partial '
'partial.dill [extra1.dill] ... [extraN.dill]');
exitCode = 1;
return;
}
var component = _loadComponent(args);
writeComponentToText(component);
}
/// Creates a component that contains all of the context code marked as external,
/// and all libraries defined in partial.dill as they are written in that file.
Component _loadComponent(List<String> args) {
List<int> partialInput = new File(args[0]).readAsBytesSync();
var context = new Component();
for (var i = 1; i < args.length; i++) {
loadComponentFromBinary(args[i], context);
}
Set<Uri> libraries = _definedLibraries(partialInput, context);
// By default `package:kernel/binary/ast_from_binary.dart` merges the contents
// of libraries that are mentioned in more than one .dill file. In order to
// keep the contents of partial.dill intact, we build a new context that
// excludes those libraries defined in partial.dill.
List<int> contextBytes = serializeComponent(context,
filter: (l) => !libraries.contains(l.importUri));
var component = new Component();
loadComponentFromBytes(contextBytes, component);
_updateIsExternal(component, true);
loadComponentFromBytes(partialInput, component);
return component;
}
/// Compute the set of libraries defined in [partialDill].
///
/// The [context] component contains all other libraries that may be needed to
/// properly deserialize partialDill.
///
/// Note: This function will mutate [context] in place.
// TODO(sigmund): simplify and get rid of [context]. We could do that with a
// custom deserialization, but it will be easier to do once .dill has
// random-access support.
Set<Uri> _definedLibraries(List<int> partialDill, Component context) {
_updateIsExternal(context, true);
// This implicitly sets `isExternal = false` on all libraries defined in the
// partial.dill file.
loadComponentFromBytes(partialDill, context);
var result = context.libraries
.where((l) => !l.isExternal)
.map((l) => l.importUri)
.toSet();
_updateIsExternal(context, false);
return result;
}
void _updateIsExternal(Component component, bool toValue) {
component.libraries.forEach((lib) => lib.isExternal = toValue);
}