Files
sdk/pkg/vm/testcases/bytecode/instance_creation.dart
T
Alexander Markov feff33b892 [vm/kernel/bytecode] Implement overlapping of type arguments in bytecode
Instantiator type arguments are sometimes reused instead of doing
instantiation at run time. VM has a bunch of assertions to verify
that this optimization happened. In case of bytecode pipeline, decision
to reuse instantiator type arguments is done while generating bytecode.

For this optimization to correctly happen, bytecode generator
should be able to construct instantiator type arguments the same way
as VM does at run time. Besides flattening of type arguments of
superclasses, VM shrinks them by overlapping type parameters with
type arguments of a superclass (if they match). This CL implements
such overlapping in bytecode generator.

Also, --overlap_type_arguments VM option is removed, as disabling
of type arguments overlapping would break bytecode pipeline.

Change-Id: Ib276c0e688e0e86b44278d88a5c0af09dd342798
Reviewed-on: https://dart-review.googlesource.com/70060
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2018-08-14 21:51:17 +00:00

87 lines
1.4 KiB
Dart

// Copyright (c) 2018, 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.
// ignore_for_file: native_function_body_in_non_sdk_code
class Base<T1, T2> {
T1 t1;
T2 t2;
Base() {
print('Base: $T1, $T2');
}
}
class A extends Base<int, String> {
A(String s);
}
class B<T> extends Base<List<T>, String> {
B() {
print('B: $T');
}
}
class C {
C(String s) {
print('C: $s');
}
}
foo1() => new C('hello');
void foo2() {
new A('hi');
new B<int>();
}
void foo3<T>() {
new B<List<T>>();
}
class E<K, V> {
test_reuse1() => new Map<K, V>();
}
class F<K, V> extends E<String, List<V>> {
test_reuse2() => new Map<String, List<V>>();
}
class G<K, V> {
G();
factory G.test_factory() => new H<String, K, V>();
}
class H<P1, P2, P3> extends G<P2, P3> {}
void foo4() {
new G<int, List<String>>.test_factory();
}
class I {
I(param);
factory I.test_factory2({param}) => new I(param);
}
void foo5() {
new I.test_factory2();
new I.test_factory2(param: 42);
}
class J {
factory J() native "agent_J";
}
abstract class K<A, B> {
factory K() => new TestTypeArgReuse<A, B>();
}
class TestTypeArgReuse<P, Q> extends Base<P, Q> implements K<P, Q> {}
main() {
foo1();
foo2();
foo3<String>();
}