[VM/kernel] Clean up garbage in batch mode of gen_kernel

Kernel has a global variable globalDebuggingNames which contains
NameSystem. NameSystem permanently holds certain kernel AST objects
(via various Namers). Calling toString() on a kernel AST object may
permanently add it to a global NameSystem, leaking memory.

It becomes a problem when gen_kernel is used in batch mode by
test tool. In such case, resident gen_kernel process is reused
to perform multiple compilations, and globalDebuggingNames
accumulates garbage kernel AST objects from finished compilations.

In this CL, globalDebuggingNames is reset after each compilation
in batch mode of gen_kernel.

Change-Id: Ie05635750fb149bb0e32415f03802e0c66f06a27
Reviewed-on: https://dart-review.googlesource.com/39883
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
This commit is contained in:
Alexander Markov 2018-02-08 21:38:03 +00:00 committed by commit-bot@chromium.org
parent 307177ff9c
commit 357f457059

View file

@ -12,6 +12,8 @@ import 'package:kernel/kernel.dart' show Program;
import 'package:kernel/src/tool/batch_util.dart' as batch_util;
import 'package:kernel/target/targets.dart' show TargetFlags;
import 'package:kernel/target/vm.dart' show VmTarget;
import 'package:kernel/text/ast_to_text.dart'
show globalDebuggingNames, NameSystem;
import 'package:vm/kernel_front_end.dart' show compileToKernel, ErrorDetector;
final ArgParser _argParser = new ArgParser(allowTrailingOptions: true)
@ -109,6 +111,10 @@ Future runBatchModeCompiler() async {
// report the compilation result accordingly.
//
final exitCode = await compile(arguments);
// Re-create global NameSystem to avoid accumulating garbage.
globalDebuggingNames = new NameSystem();
switch (exitCode) {
case 0:
return batch_util.CompilerOutcome.Ok;