Files
sdk/pkg/vm/test/bytecode/generics_test.dart
T
Alexander Markov 336969538c [vm/bytecode] Revise representation of types, constants and calls in bytecode
* Type arguments are moved to global object table (and de-duplicated).
* Finalize non-recursive generic types at bytecode generation time.
* Constants are moved to global object table (and de-duplicated).
* ICData creation is avoided for direct calls.
* Interface calls reference target member instead of selector name.

Size of a dilp files: 17868K => 15896K (-11%).

Change-Id: I0c9bf338137a0fae6ed90ab6b125ed2b24a1a8ad
Reviewed-on: https://dart-review.googlesource.com/c/91108
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Zach Anderson <zra@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2019-02-05 20:13:45 +00:00

114 lines
4.2 KiB
Dart

// Copyright (c) 2019, 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.
import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart' show CoreTypes;
import 'package:kernel/testing/mock_sdk_component.dart';
import 'package:test/test.dart';
import 'package:vm/bytecode/generics.dart';
main() {
Library lib;
Supertype objectSuper;
DartType intType;
Class base;
Class addClass(String name, List<TypeParameter> typeParameters) {
Class cls = new Class(
name: name, supertype: objectSuper, typeParameters: typeParameters);
lib.addClass(cls);
return cls;
}
setUp(() {
// Start with mock SDK libraries.
Component component = createMockSdkComponent();
CoreTypes coreTypes = new CoreTypes(component);
objectSuper = coreTypes.objectClass.asThisSupertype;
intType = new InterfaceType(coreTypes.intClass);
// Add the test library.
lib = new Library(Uri.parse('org-dartlang:///test.dart'), name: 'lib');
lib.parent = component;
component.libraries.add(lib);
// class Base<T>
base = addClass('Base', [new TypeParameter('T')]);
});
tearDown(() {});
test('isRecursiveAfterFlattening-00', () async {
// class Derived<T> extends Base<Derived<T>>
TypeParameter t = new TypeParameter('T');
Class derived = addClass('Derived', [t]);
DartType derivedOfT =
new InterfaceType(derived, [new TypeParameterType(t)]);
DartType derivedOfInt = new InterfaceType(derived, [intType]);
derived.supertype = new Supertype(base, [derivedOfT]);
expect(isRecursiveAfterFlattening(derivedOfT), isTrue);
expect(isRecursiveAfterFlattening(derivedOfInt), isTrue);
});
test('isRecursiveAfterFlattening-01', () async {
// class Derived<T> extends Base<Derived<Derived<int>>>
TypeParameter t = new TypeParameter('T');
Class derived = addClass('Derived', [t]);
DartType derivedOfT =
new InterfaceType(derived, [new TypeParameterType(t)]);
DartType derivedOfInt = new InterfaceType(derived, [intType]);
DartType derivedOfDerivedOfInt = new InterfaceType(derived, [derivedOfInt]);
derived.supertype = new Supertype(base, [derivedOfDerivedOfInt]);
expect(isRecursiveAfterFlattening(derivedOfT), isFalse);
expect(isRecursiveAfterFlattening(derivedOfInt), isTrue);
});
test('isRecursiveAfterFlattening-02', () async {
// class Derived<T> extends Base<Derived<Derived<T>>>
TypeParameter t = new TypeParameter('T');
Class derived = addClass('Derived', [t]);
DartType derivedOfT =
new InterfaceType(derived, [new TypeParameterType(t)]);
DartType derivedOfInt = new InterfaceType(derived, [intType]);
DartType derivedOfDerivedOfT = new InterfaceType(derived, [derivedOfT]);
derived.supertype = new Supertype(base, [derivedOfDerivedOfT]);
expect(isRecursiveAfterFlattening(derivedOfT), isTrue);
expect(isRecursiveAfterFlattening(derivedOfInt), isTrue);
});
test('isRecursiveAfterFlattening-03', () async {
// class Derived1<U> extends Base<Derived2<U>>
// class Derived2<V> extends Base<Derived1<V>>
TypeParameter u = new TypeParameter('U');
Class derived1 = addClass('Derived1', [u]);
TypeParameter v = new TypeParameter('V');
Class derived2 = addClass('Derived2', [v]);
DartType derived2OfU =
new InterfaceType(derived2, [new TypeParameterType(u)]);
derived1.supertype = new Supertype(base, [derived2OfU]);
DartType derived1OfV =
new InterfaceType(derived1, [new TypeParameterType(v)]);
derived2.supertype = new Supertype(base, [derived1OfV]);
DartType derived1OfU =
new InterfaceType(derived1, [new TypeParameterType(u)]);
DartType derived1OfInt = new InterfaceType(derived1, [intType]);
DartType derived2OfV =
new InterfaceType(derived2, [new TypeParameterType(v)]);
DartType derived2OfInt = new InterfaceType(derived2, [intType]);
expect(isRecursiveAfterFlattening(derived1OfU), isTrue);
expect(isRecursiveAfterFlattening(derived1OfInt), isTrue);
expect(isRecursiveAfterFlattening(derived2OfV), isTrue);
expect(isRecursiveAfterFlattening(derived2OfInt), isTrue);
});
}