| // Copyright (c) 2024, 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:dart2bytecode/object_table.dart'; | |
| 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:expect/expect.dart'; | |
| main() { | |
| late Library lib1; | |
| late Library lib2; | |
| late CoreTypes coreTypes; | |
| late Supertype objectSupertype; | |
| late ObjectTable objectTable; | |
| Class addClass( | |
| Library lib, | |
| String name, [ | |
| List<TypeParameter> typeParameters = const [], | |
| ]) { | |
| final cls = Class( | |
| name: name, | |
| supertype: objectSupertype, | |
| typeParameters: TypeParameterList.from(typeParameters), | |
| fileUri: lib.fileUri, | |
| ); | |
| cls.parent = lib; | |
| lib.addClass(cls); | |
| return cls; | |
| } | |
| setUp(() { | |
| // Start with mock SDK libraries. | |
| final component = createMockSdkComponent(); | |
| coreTypes = CoreTypes(component); | |
| objectSupertype = coreTypes.objectClass.asThisSupertype; | |
| // Add test libraries. | |
| lib1 = Library( | |
| Uri.parse('org-dartlang:///test1.dart'), | |
| name: 'lib1', | |
| fileUri: Uri.parse('file:///test1.dart'), | |
| ); | |
| lib1.parent = component; | |
| component.libraries.add(lib1); | |
| lib2 = Library( | |
| Uri.parse('org-dartlang:///test2.dart'), | |
| name: 'lib2', | |
| fileUri: Uri.parse('file:///test2.dart'), | |
| ); | |
| lib2.parent = component; | |
| component.libraries.add(lib2); | |
| objectTable = ObjectTable(coreTypes); | |
| }); | |
| tearDown(() {}); | |
| test('libraries', () { | |
| final h1 = objectTable.getHandle(lib1)!; | |
| final h2 = objectTable.getHandle(lib2)!; | |
| Expect.notEquals(h1, h2); | |
| Expect.identical(h1, objectTable.getHandle(lib1)); | |
| Expect.identical(h2, objectTable.getHandle(lib2)); | |
| Expect.equals(true, h1.isCacheable); | |
| Expect.equals(true, h2.isCacheable); | |
| Expect.equals(false, h1.shouldBeIncludedIntoIndexTable); // 2 uses | |
| Expect.identical(h1, objectTable.getHandle(lib1)); | |
| Expect.equals(true, h1.shouldBeIncludedIntoIndexTable); // 3 uses | |
| }); | |
| test('classes', () { | |
| final Class c1 = addClass(lib1, 'A'); | |
| final Class c2 = addClass(lib1, 'B'); | |
| final Class c3 = addClass(lib2, 'A'); | |
| final h1 = objectTable.getHandle(c1)!; | |
| final h2 = objectTable.getHandle(c2)!; | |
| final h3 = objectTable.getHandle(c3)!; | |
| Expect.notEquals(h1, h2); | |
| Expect.notEquals(h1, h3); | |
| Expect.notEquals(h2, h3); | |
| Expect.identical(h1, objectTable.getHandle(c1)); | |
| Expect.identical(h2, objectTable.getHandle(c2)); | |
| Expect.identical(h3, objectTable.getHandle(c3)); | |
| Expect.equals(true, h1.isCacheable); | |
| Expect.equals(true, h2.isCacheable); | |
| Expect.equals(true, h3.isCacheable); | |
| final lib1h = objectTable.getHandle(lib1)!; | |
| final lib2h = objectTable.getHandle(lib2)!; | |
| Expect.equals(true, lib1h.shouldBeIncludedIntoIndexTable); // 3 uses | |
| Expect.equals(false, lib2h.shouldBeIncludedIntoIndexTable); // 2 uses | |
| }); | |
| test('simple-types', () { | |
| final h1a = objectTable.getHandle( | |
| InterfaceType(coreTypes.intClass, Nullability.nonNullable), | |
| )!; | |
| final h1b = objectTable.getHandle( | |
| InterfaceType(coreTypes.intClass, Nullability.nonNullable), | |
| )!; | |
| final h2a = objectTable.getHandle(const DynamicType())!; | |
| final h2b = objectTable.getHandle(DynamicType())!; | |
| Expect.identical(h1a, h1b); | |
| Expect.identical(h2a, h2b); | |
| Expect.notEquals(h1a, h2a); | |
| Expect.equals(true, h1a.isCacheable); | |
| Expect.equals(true, h2a.isCacheable); | |
| Expect.equals(false, h1a.shouldBeIncludedIntoIndexTable); // 2 uses | |
| objectTable.getHandle( | |
| InterfaceType( | |
| coreTypes.listClass, | |
| Nullability.nonNullable, | |
| DartTypeList( | |
| InterfaceType(coreTypes.intClass, Nullability.nonNullable), | |
| ), | |
| ), | |
| ); | |
| Expect.equals(true, h1a.shouldBeIncludedIntoIndexTable); // 3 uses | |
| }); | |
| } |