Move all data for collection for testing behind one flag

- to ensure that we don't retain unneeded data in production

Change-Id: I2f702e040ed99cb8540a5b60efcf88a2c6b33af0
Reviewed-on: https://dart-review.googlesource.com/72720
Reviewed-by: Stephen Adams <sra@google.com>
This commit is contained in:
Johnni Winther 2018-09-10 14:44:02 +00:00 committed by commit-bot@chromium.org
parent 1cd9cae45e
commit e311e12bc4
26 changed files with 88 additions and 143 deletions

View file

@ -18,3 +18,5 @@ export 'diagnostics/spannable.dart'
Spannable,
SpannableAssertionFailure;
export 'helpers/helpers.dart';
bool retainDataForTesting = false;

View file

@ -10,8 +10,7 @@ import 'package:front_end/src/fasta/scanner.dart' show StringToken;
import '../compiler_new.dart' as api;
import 'backend_strategy.dart';
import 'common/names.dart' show Selectors;
import 'common/names.dart' show Uris;
import 'common/names.dart' show Selectors, Uris;
import 'common/tasks.dart' show CompilerTask, GenericTask, Measurer;
import 'common/work.dart' show WorkItem;
import 'common.dart';
@ -332,7 +331,9 @@ abstract class Compiler {
assert(mainFunction != null);
JClosedWorld closedWorld = closeResolution(mainFunction);
backendClosedWorldForTesting = closedWorld;
if (retainDataForTesting) {
backendClosedWorldForTesting = closedWorld;
}
return closedWorld;
}
@ -917,15 +918,13 @@ class _MapImpactCacheDeleter implements ImpactCacheDeleter {
final Map<Entity, WorldImpact> _impactCache;
_MapImpactCacheDeleter(this._impactCache);
bool retainCachesForTesting = false;
void uncacheWorldImpact(Entity element) {
if (retainCachesForTesting) return;
if (retainDataForTesting) return;
_impactCache.remove(element);
}
void emptyCache() {
if (retainCachesForTesting) return;
if (retainDataForTesting) return;
_impactCache.clear();
}
}

View file

@ -290,7 +290,7 @@ class ElementInfoCollector {
String inferredReturnType = '${_resultOfMember(function).returnType}';
String sideEffects =
'${compiler.globalInference.resultsForTesting.inferredData.getSideEffectsOfElement(function)}';
'${_globalInferenceResults.inferredData.getSideEffectsOfElement(function)}';
int inlinedCount = compiler.dumpInfoTask.inlineCount[function];
if (inlinedCount == null) inlinedCount = 0;

View file

@ -63,9 +63,13 @@ class EnqueueTask extends CompilerTask {
Enqueuer createCodegenEnqueuer(JClosedWorld closedWorld,
GlobalTypeInferenceResults globalInferenceResults) {
return codegenEnqueuerForTesting = compiler.backend.createCodegenEnqueuer(
Enqueuer enqueuer = compiler.backend.createCodegenEnqueuer(
this, compiler, closedWorld, globalInferenceResults)
..onEmptyForTesting = compiler.onCodegenQueueEmptyForTesting;
if (retainDataForTesting) {
codegenEnqueuerForTesting = enqueuer;
}
return enqueuer;
}
}

View file

@ -127,8 +127,6 @@ abstract class FrontendStrategyBase implements FrontendStrategy {
/// Class that deletes the contents of an [WorldImpact] cache.
// TODO(redemption): this can be deleted when we sunset the old front end.
abstract class ImpactCacheDeleter {
static bool retainCachesForTesting = false;
/// Removes the [WorldImpact] for [element] from the resolution cache. Later
/// calls to [getWorldImpact] or [computeWorldImpact] returns an empty impact.
void uncacheWorldImpact(Entity element);

View file

@ -251,8 +251,6 @@ abstract class InferrerEngine {
}
class InferrerEngineImpl extends InferrerEngine {
static bool retainDataForTesting = false;
final Map<Local, TypeInformation> defaultTypeOfParameter =
new Map<Local, TypeInformation>();
final WorkQueue workQueue = new WorkQueue();

View file

@ -666,7 +666,6 @@ class JavaScriptBackend {
nativeCodegenEnqueuer));
}
static bool cacheCodegenImpactForTesting = false;
Map<MemberEntity, WorldImpact> codegenImpactsForTesting;
WorldImpact codegen(CodegenWorkItem work, JClosedWorld closedWorld,
@ -700,7 +699,7 @@ class JavaScriptBackend {
}
generatedCode[element] = function;
}
if (cacheCodegenImpactForTesting) {
if (retainDataForTesting) {
codegenImpactsForTesting ??= <MemberEntity, WorldImpact>{};
codegenImpactsForTesting[element] = work.registry.worldImpact;
}

View file

@ -4,6 +4,7 @@
library js_backend.runtime_types;
import '../common.dart';
import '../common/names.dart' show Identifiers;
import '../common_elements.dart' show CommonElements, ElementEnvironment;
import '../elements/entities.dart';
@ -22,8 +23,6 @@ import 'backend_usage.dart';
import 'namer.dart';
import 'native_data.dart';
bool cacheRtiDataForTesting = false;
/// For each class, stores the possible class subtype tests that could succeed.
abstract class TypeChecks {
/// Get the set of checks required for class [element].
@ -1737,7 +1736,7 @@ class RuntimeTypesNeedBuilderImpl extends _RuntimeTypesBase
if (methodsNeedingTypeArguments.contains(target) ||
localFunctionsNeedingTypeArguments.contains(target)) {
selectorsNeedingTypeArguments.add(selector);
if (cacheRtiDataForTesting) {
if (retainDataForTesting) {
selectorsNeedingTypeArgumentsForTesting ??=
<Selector, Set<Entity>>{};
selectorsNeedingTypeArgumentsForTesting
@ -1759,7 +1758,7 @@ class RuntimeTypesNeedBuilderImpl extends _RuntimeTypesBase
// expression.
instantiationsNeedingTypeArguments
.add(instantiation.typeArguments.length);
if (cacheRtiDataForTesting) {
if (retainDataForTesting) {
instantiationsNeedingTypeArgumentsForTesting ??=
<GenericInstantiation, Set<Entity>>{};
instantiationsNeedingTypeArgumentsForTesting
@ -1772,7 +1771,7 @@ class RuntimeTypesNeedBuilderImpl extends _RuntimeTypesBase
}
});
if (cacheRtiDataForTesting) {
if (retainDataForTesting) {
typeVariableTestsForTesting = typeVariableTests;
}
@ -1890,7 +1889,7 @@ class RuntimeTypesImpl extends _RuntimeTypesBase
Set<DartType> implicitIsChecks = typeVariableTests.implicitIsChecks;
Map<ClassEntity, ClassUse> classUseMap = <ClassEntity, ClassUse>{};
if (cacheRtiDataForTesting) {
if (retainDataForTesting) {
classUseMapForTesting = classUseMap;
}

View file

@ -12,9 +12,9 @@ import 'package:js_runtime/shared/embedded_names.dart'
import '../../../compiler_new.dart';
import '../../common.dart';
import '../../common_elements.dart' show CommonElements, ElementEnvironment;
import '../../compiler.dart' show Compiler;
import '../../constants/values.dart';
import '../../common_elements.dart' show CommonElements, ElementEnvironment;
import '../../deferred_load.dart' show OutputUnit, OutputUnitData;
import '../../elements/entities.dart';
import '../../hash/sha1.dart' show Hasher;
@ -1351,8 +1351,11 @@ class Emitter extends js_emitter.EmitterBase {
}
int emitProgram(ProgramBuilder programBuilder) {
Program program = programForTesting =
Program program =
programBuilder.buildProgram(storeFunctionTypesInMetadata: true);
if (retainDataForTesting) {
programForTesting = program;
}
outputStaticNonFinalFieldLists =
programBuilder.collector.outputStaticNonFinalFieldLists;

View file

@ -61,7 +61,10 @@ class Emitter extends emitterTask.EmitterBase {
@override
int emitProgram(ProgramBuilder programBuilder) {
Program program = programForTesting = programBuilder.buildProgram();
Program program = programBuilder.buildProgram();
if (retainDataForTesting) {
programForTesting = program;
}
return _emitter.emitProgram(program);
}

View file

@ -2126,32 +2126,6 @@ class KClosedWorldImpl extends ClosedWorldRtiNeedMixin implements KClosedWorld {
}
}
// Interface for testing equivalence of Kernel-based entities.
class WorldDeconstructionForTesting {
final KernelToElementMapBase elementMap;
WorldDeconstructionForTesting(this.elementMap);
IndexedClass getSuperclassForClass(IndexedClass cls) {
ClassEnv env = elementMap._classes.getEnv(cls);
ir.Supertype supertype = env.cls.supertype;
if (supertype == null) return null;
return elementMap.getClass(supertype.classNode);
}
bool isUnnamedMixinApplication(IndexedClass cls) {
return elementMap._isUnnamedMixinApplication(cls);
}
InterfaceType getMixinTypeForClass(IndexedClass cls) {
ClassEnv env = elementMap._classes.getEnv(cls);
ir.Supertype mixedInType = env.cls.mixedInType;
if (mixedInType == null) return null;
return elementMap.createInterfaceType(
mixedInType.classNode, mixedInType.typeArguments);
}
}
class KernelNativeMemberResolver extends NativeMemberResolverBase {
final KernelToElementMapForImpactImpl elementMap;
final NativeBasicData nativeBasicData;

View file

@ -5,7 +5,7 @@
library types;
import 'package:kernel/ast.dart' as ir;
import '../common.dart' show failedAt;
import '../common.dart' show failedAt, retainDataForTesting;
import '../common/names.dart';
import '../common/tasks.dart' show CompilerTask;
import '../compiler.dart' show Compiler;
@ -149,7 +149,9 @@ class GlobalTypeInferenceTask extends CompilerTask {
results = typesInferrerInternal.analyzeMain(mainElement);
}
closedWorld.noSuchMethodData.categorizeComplexImplementations(results);
resultsForTesting = results;
if (retainDataForTesting) {
resultsForTesting = results;
}
return results;
});
}

View file

@ -985,7 +985,7 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
"ClassHierarchyNode/ClassSet mismatch: "
"${_classHierarchyBuilder.classHierarchyNodes} vs "
"${_classHierarchyBuilder.classSets}");
return _closedWorldCache = new KClosedWorldImpl(_elementMap,
KClosedWorld closedWorld = new KClosedWorldImpl(_elementMap,
options: _options,
elementEnvironment: _elementEnvironment,
dartTypes: _dartTypes,
@ -1006,6 +1006,10 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
typesImplementedBySubclasses: typesImplementedBySubclasses,
classHierarchyNodes: _classHierarchyBuilder.classHierarchyNodes,
classSets: _classHierarchyBuilder.classSets);
if (retainDataForTesting) {
_closedWorldCache = closedWorld;
}
return closedWorld;
}
@override

View file

@ -4,14 +4,14 @@
// Test that dart2js gvns dynamic getters that don't have side
// effects.
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';
import 'package:compiler/compiler_new.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/names.dart';
import 'package:compiler/src/universe/selector.dart' show Selector;
import 'package:compiler/src/world.dart';
import 'package:expect/expect.dart';
import '../helpers/compiler_helper.dart';
import '../helpers/memory_compiler.dart';
const String TEST = r"""

View file

@ -12,42 +12,39 @@ import 'package:expect/expect.dart';
import '../helpers/memory_compiler.dart';
void main() {
deferredTest1();
deferredTest2();
}
void deferredTest1() {
asyncTest(() async {
CompilationResult result = await runCompiler(memorySourceFiles: TEST1);
Compiler compiler = result.compiler;
var outputUnitForMember =
compiler.backend.outputUnitData.outputUnitForMember;
var mainOutputUnit = compiler.backend.outputUnitData.mainOutputUnit;
var env = compiler.backendClosedWorldForTesting.elementEnvironment;
lookupLibrary(name) => env.lookupLibrary(Uri.parse(name));
dynamic lib1 = lookupLibrary("memory:lib1.dart");
dynamic lib2 = lookupLibrary("memory:lib2.dart");
env.lookupLibraryMember(lib1, "foo1");
var foo2 = env.lookupLibraryMember(lib2, "foo2");
Expect.notEquals(mainOutputUnit, outputUnitForMember(foo2));
await deferredTest1();
await deferredTest2();
});
}
void deferredTest2() {
asyncTest(() async {
CompilationResult result = await runCompiler(memorySourceFiles: TEST2);
Compiler compiler = result.compiler;
var outputUnitForClass = compiler.backend.outputUnitData.outputUnitForClass;
deferredTest1() async {
CompilationResult result = await runCompiler(memorySourceFiles: TEST1);
Compiler compiler = result.compiler;
var outputUnitForMember = compiler.backend.outputUnitData.outputUnitForMember;
var mainOutputUnit = compiler.backend.outputUnitData.mainOutputUnit;
var env = compiler.backendClosedWorldForTesting.elementEnvironment;
lookupLibrary(name) => env.lookupLibrary(Uri.parse(name));
dynamic lib1 = lookupLibrary("memory:lib1.dart");
dynamic lib2 = lookupLibrary("memory:lib2.dart");
env.lookupLibraryMember(lib1, "foo1");
var foo2 = env.lookupLibraryMember(lib2, "foo2");
var mainOutputUnit = compiler.backend.outputUnitData.mainOutputUnit;
var env = compiler.backendClosedWorldForTesting.elementEnvironment;
lookupLibrary(name) => env.lookupLibrary(Uri.parse(name));
dynamic shared = lookupLibrary("memory:shared.dart");
var a = env.lookupClass(shared, "A");
Expect.notEquals(mainOutputUnit, outputUnitForMember(foo2));
}
Expect.equals(mainOutputUnit, outputUnitForClass(a));
});
deferredTest2() async {
CompilationResult result = await runCompiler(memorySourceFiles: TEST2);
Compiler compiler = result.compiler;
var outputUnitForClass = compiler.backend.outputUnitData.outputUnitForClass;
var mainOutputUnit = compiler.backend.outputUnitData.mainOutputUnit;
var env = compiler.backendClosedWorldForTesting.elementEnvironment;
lookupLibrary(name) => env.lookupLibrary(Uri.parse(name));
dynamic shared = lookupLibrary("memory:shared.dart");
var a = env.lookupClass(shared, "A");
Expect.equals(mainOutputUnit, outputUnitForClass(a));
}
// lib1 imports lib2 deferred. But mainlib never uses DeferredLibrary.

View file

@ -5,32 +5,22 @@
library compiler_helper;
import 'dart:async';
import "package:expect/expect.dart";
import 'package:compiler/compiler_new.dart';
import 'package:compiler/src/common_elements.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/js_backend/js_backend.dart' as js;
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/world.dart';
import 'package:compiler/src/compiler.dart' show Compiler;
import 'package:expect/expect.dart';
import 'package:front_end/src/fasta/util/link.dart' show Link;
import 'memory_compiler.dart';
import 'output_collector.dart';
export 'package:compiler/src/diagnostics/messages.dart';
export 'package:compiler/src/diagnostics/source_span.dart';
export 'package:compiler/src/diagnostics/spannable.dart';
export 'package:compiler/src/util/util.dart';
import 'package:compiler/src/world.dart';
import 'package:compiler/src/compiler.dart' show Compiler;
import 'package:front_end/src/fasta/util/link.dart' show Link;
import 'memory_compiler.dart';
import 'output_collector.dart';
export 'output_collector.dart';
/// Compile [code] and returns either the code for [methodName] or, if

View file

@ -10,6 +10,7 @@ import 'dart:async';
import 'dart:io';
import 'package:compiler/compiler_new.dart';
import 'package:compiler/src/common.dart';
import 'package:compiler/src/dart2js.dart' as dart2js;
import 'package:compiler/src/filenames.dart';
import 'package:expect/expect.dart';
@ -38,6 +39,7 @@ Future<D8Result> runWithD8(
String expectedOutput,
bool printJs: false,
bool printSteps: false}) async {
retainDataForTesting = true;
entryPoint ??= Uri.parse('memory:main.dart');
Uri mainFile =
await createTemp(entryPoint, memorySourceFiles, printSteps: printSteps);

View file

@ -14,6 +14,7 @@ import 'package:compiler/compiler_new.dart'
CompilerOutput,
Diagnostic,
PackagesDiscoveryProvider;
import 'package:compiler/src/common.dart';
import 'package:compiler/src/diagnostics/messages.dart' show Message;
import 'package:compiler/src/null_compiler_output.dart' show NullCompilerOutput;
import 'package:compiler/src/options.dart' show CompilerOptions;
@ -113,6 +114,7 @@ CompilerImpl compilerFor(
Uri packageRoot,
Uri packageConfig,
PackagesDiscoveryProvider packagesDiscoveryProvider}) {
retainDataForTesting = true;
Uri libraryRoot = Uri.base.resolve('sdk/');
Uri platformBinaries = computePlatformBinariesLocation();

View file

@ -8,10 +8,10 @@ import 'dart:async';
import 'package:expect/expect.dart';
import 'package:compiler/src/common_elements.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/types.dart';
import 'package:compiler/src/compiler.dart' show Compiler;
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/frontend_strategy.dart';
import 'package:compiler/src/kernel/kernel_strategy.dart';
import 'package:compiler/src/world.dart' show JClosedWorld, KClosedWorld;
import 'memory_compiler.dart' as memory;
@ -30,21 +30,17 @@ class TypeEnvironment {
bool testBackendWorld: false,
List<String> options: const <String>[],
Map<String, String> fieldTypeMap: const <String, String>{}}) async {
Uri uri;
Compiler compiler;
memory.DiagnosticCollector collector;
collector = new memory.DiagnosticCollector();
uri = Uri.parse('memory:main.dart');
memory.DiagnosticCollector collector = new memory.DiagnosticCollector();
Uri uri = Uri.parse('memory:main.dart');
memory.CompilationResult result = await memory.runCompiler(
entryPoint: uri,
memorySourceFiles: {'main.dart': source},
options: [Flags.disableTypeInference]..addAll(options),
diagnosticHandler: collector,
beforeRun: (compiler) {
ImpactCacheDeleter.retainCachesForTesting = true;
compiler.stopAfterTypeInference = true;
});
compiler = result.compiler;
Compiler compiler = result.compiler;
if (expectNoErrors || expectNoWarningsOrErrors) {
var errors = collector.errors;
Expect.isTrue(errors.isEmpty, 'Unexpected errors: ${errors}');

View file

@ -7,7 +7,6 @@ import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/common/resolution.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/frontend_strategy.dart';
import 'package:compiler/src/kernel/element_map.dart';
import 'package:compiler/src/kernel/kernel_strategy.dart';
import 'package:compiler/src/universe/feature.dart';
@ -35,11 +34,6 @@ class Tags {
class ImpactDataComputer extends DataComputer {
const ImpactDataComputer();
@override
void setup() {
ImpactCacheDeleter.retainCachesForTesting = true;
}
@override
void computeMemberData(
Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,

View file

@ -9,7 +9,6 @@ import 'package:compiler/src/common.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/inferrer/inferrer_engine.dart';
import 'package:compiler/src/inferrer/type_graph_inferrer.dart';
import 'package:compiler/src/kernel/element_map.dart';
import 'package:compiler/src/kernel/kernel_backend_strategy.dart';
@ -29,11 +28,6 @@ main(List<String> args) {
class CallersDataComputer extends DataComputer {
const CallersDataComputer();
@override
void setup() {
InferrerEngineImpl.retainDataForTesting = true;
}
@override
void computeMemberData(
Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,

View file

@ -3,12 +3,12 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import 'package:compiler/src/inferrer/typemasks/masks.dart';
import 'package:compiler/src/common.dart';
import 'package:compiler/src/common_elements.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/inferrer/typemasks/masks.dart';
import 'package:compiler/src/world.dart';
import 'package:expect/expect.dart';
import '../helpers/memory_compiler.dart';
const String CODE = """
@ -22,6 +22,8 @@ main() {
""";
main() {
retainDataForTesting = true;
runTests() async {
CompilationResult result =
await runCompiler(memorySourceFiles: {'main.dart': CODE});

View file

@ -29,11 +29,6 @@ main(List<String> args) {
class InliningDataComputer extends DataComputer {
const InliningDataComputer();
@override
void setup() {
JavaScriptBackend.cacheCodegenImpactForTesting = true;
}
/// Compute type inference data for [member] from kernel based inference.
///
/// Fills [actualMap] with the data.

View file

@ -4,10 +4,10 @@
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/common.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/common_elements.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/frontend_strategy.dart';
import 'package:compiler/src/world.dart';
import 'package:compiler/src/universe/use.dart';
import 'package:compiler/src/universe/world_impact.dart';
@ -71,7 +71,7 @@ main() {
'method13': new Impact(implicitCasts: ['int'], parameterChecks: ['String']),
};
ImpactCacheDeleter.retainCachesForTesting = true;
retainDataForTesting = true;
CompilationResult result =
await runCompiler(memorySourceFiles: {'main.dart': source});
Expect.isTrue(result.isSuccess);

View file

@ -20,7 +20,6 @@ import '../helpers/program_lookup.dart';
main(List<String> args) {
asyncTest(() async {
cacheRtiDataForTesting = true;
Directory dataDir =
new Directory.fromUri(Platform.script.resolve('emission'));
await checkTests(dataDir, const RtiEmissionDataComputer(),
@ -90,11 +89,6 @@ abstract class ComputeValueMixin {
class RtiEmissionDataComputer extends DataComputer {
const RtiEmissionDataComputer();
@override
void setup() {
cacheRtiDataForTesting = true;
}
@override
bool get computesClassData => true;

View file

@ -28,7 +28,6 @@ main(List<String> args) {
}
runTests(List<String> args, [int shardIndex]) {
cacheRtiDataForTesting = true;
asyncTest(() async {
Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
await checkTests(dataDir, const RtiNeedDataComputer(),
@ -232,11 +231,6 @@ class FindTypeVisitor extends BaseDartTypeVisitor<bool, Null> {
class RtiNeedDataComputer extends DataComputer {
const RtiNeedDataComputer();
@override
void setup() {
cacheRtiDataForTesting = true;
}
@override
bool get computesClassData => true;