fc158b1616
Change-Id: I2351571a665c8ffff8e9d57649fbf42b483e747b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142983 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Mayank Patke <fishythefish@google.com>
122 lines
3.4 KiB
Dart
122 lines
3.4 KiB
Dart
// Copyright (c) 2014, 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.
|
|
|
|
// @dart = 2.7
|
|
|
|
// Test that the additional runtime type support is output to the right
|
|
// Files when using deferred loading.
|
|
|
|
import 'package:async_helper/async_helper.dart';
|
|
import 'constant_emission_test_helper.dart';
|
|
|
|
void main() {
|
|
runTest() async {
|
|
Map<String, Set<String>> expectedOutputUnits = {
|
|
// Test that the deferred constants are not inlined into the main file.
|
|
'DeferredGlobalConstant(IntConstant(1010))': {'lib1'},
|
|
'DeferredGlobalConstant(StringConstant("string1"))': {'lib1'},
|
|
'DeferredGlobalConstant(StringConstant("string2"))': {'lib1'},
|
|
// "string4" is shared between lib1 and lib2, but it can be inlined.
|
|
'DeferredGlobalConstant(StringConstant("string4"))': {},
|
|
// C(1) is shared between main, lib1 and lib2. Test that lib1 and lib2
|
|
// each has a reference to it. It is defined in the main output file.
|
|
'ConstructedConstant(C(p=IntConstant(1)))': {'main'},
|
|
'DeferredGlobalConstant(ConstructedConstant(C(p=IntConstant(1))))':
|
|
// With CFE constants, the references are inlined, so the constant
|
|
// only occurs in main.
|
|
{},
|
|
// C(2) is shared between lib1 and lib2, each of them has their own
|
|
// reference to it.
|
|
'ConstructedConstant(C(p=IntConstant(2)))': {'lib12'},
|
|
'DeferredGlobalConstant(ConstructedConstant(C(p=IntConstant(2))))':
|
|
// With CFE constants, the references are inlined, so the constant
|
|
// occurs in lib12.
|
|
{'lib12'},
|
|
// Test that the non-deferred constant is inlined.
|
|
'ConstructedConstant(C(p=IntConstant(5)))': {'main'},
|
|
};
|
|
await run(
|
|
MEMORY_SOURCE_FILES,
|
|
const [
|
|
OutputUnitDescriptor('memory:lib1.dart', 'foo', 'lib1'),
|
|
OutputUnitDescriptor('memory:lib2.dart', 'foo', 'lib2'),
|
|
OutputUnitDescriptor('memory:main.dart', 'foo', 'lib12')
|
|
],
|
|
expectedOutputUnits);
|
|
}
|
|
|
|
asyncTest(() async {
|
|
print('--test from kernel------------------------------------------------');
|
|
await runTest();
|
|
});
|
|
}
|
|
|
|
// Make sure that deferred constants are not inlined into the main hunk.
|
|
const Map<String, String> MEMORY_SOURCE_FILES = const {
|
|
"main.dart": r"""
|
|
import "dart:async";
|
|
|
|
import 'lib1.dart' deferred as lib1;
|
|
import 'lib2.dart' deferred as lib2;
|
|
|
|
const c = "string3";
|
|
|
|
class C {
|
|
final p;
|
|
const C(this.p);
|
|
|
|
String toString() => 'C($p)';
|
|
}
|
|
|
|
foo() => print("main");
|
|
|
|
void main() {
|
|
lib1.loadLibrary().then((_) {
|
|
lib2.loadLibrary().then((_) {
|
|
lib1.foo();
|
|
lib2.foo();
|
|
print(lib1.C1);
|
|
print(lib1.C2);
|
|
print(lib1.C.C3);
|
|
print(c);
|
|
print(lib1.C4);
|
|
print(lib2.C4);
|
|
print(lib1.C5);
|
|
print(lib2.C5);
|
|
print(lib1.C6);
|
|
print(lib2.C6);
|
|
print("string4");
|
|
print(const C(5));
|
|
print(const C(1));
|
|
});
|
|
});
|
|
}
|
|
""",
|
|
"lib1.dart": """
|
|
import "main.dart" as main;
|
|
const C1 = "string1";
|
|
const C2 = 1010;
|
|
class C {
|
|
static const C3 = "string2";
|
|
}
|
|
const C4 = "string4";
|
|
const C5 = const main.C(1);
|
|
const C6 = const main.C(2);
|
|
foo() {
|
|
print("lib1");
|
|
main.foo();
|
|
}
|
|
""",
|
|
"lib2.dart": """
|
|
import "main.dart" as main;
|
|
const C4 = "string4";
|
|
const C5 = const main.C(1);
|
|
const C6 = const main.C(2);
|
|
foo() {
|
|
print("lib2");
|
|
main.foo();
|
|
}
|
|
"""
|
|
};
|