[dart2js] Convert recordTypes after closureData

Fixed #51899
Change-Id: Id9108e6cf13aee409b127fe6cd007bef8f0fe609
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/298460
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Mayank Patke <fishythefish@google.com>
Commit-Queue: Stephen Adams <sra@google.com>
This commit is contained in:
Stephen Adams 2023-04-26 03:57:07 +00:00 committed by Commit Queue
parent cc3bf609f2
commit 8ee2b8b36b
2 changed files with 21 additions and 8 deletions

View file

@ -146,9 +146,6 @@ class JClosedWorldBuilder {
ClosureData closureData;
RecordData recordData;
final recordTypes = Set<RecordType>.from(
map.toBackendTypeSet(closedWorld.instantiatedRecordTypes));
if (_options.disableRtiOptimization) {
rtiNeed = TrivialRuntimeTypesNeed(_elementMap.elementEnvironment);
closureData = _closureDataBuilder.createClosureEntities(
@ -156,7 +153,6 @@ class JClosedWorldBuilder {
map.toBackendMemberMap(closureModels, identity),
const TrivialClosureRtiNeed(),
callMethods);
recordData = _recordDataBuilder.createRecordData(this, recordTypes);
} else {
RuntimeTypesNeedImpl kernelRtiNeed =
closedWorld.rtiNeed as RuntimeTypesNeedImpl;
@ -184,8 +180,6 @@ class JClosedWorldBuilder {
localFunctionsNodesNeedingSignature),
callMethods);
recordData = _recordDataBuilder.createRecordData(this, recordTypes);
List<FunctionEntity> callMethodsNeedingSignature = <FunctionEntity>[];
for (ir.LocalFunction node in localFunctionsNodesNeedingSignature) {
callMethodsNeedingSignature
@ -204,7 +198,9 @@ class JClosedWorldBuilder {
}
(map as JsToFrontendMapImpl)._registerClosureData(closureData);
//(map as JsToFrontendMapImpl)._registerRecordData(recordData);
final recordTypes = Set<RecordType>.from(
map.toBackendTypeSet(closedWorld.instantiatedRecordTypes));
recordData = _recordDataBuilder.createRecordData(this, recordTypes);
BackendUsage backendUsage =
_convertBackendUsage(map, closedWorld.backendUsage as BackendUsageImpl);
@ -584,7 +580,9 @@ class JsToFrontendMapImpl extends JsToFrontendMap {
if (typeVariable is KLocalTypeVariable) {
if (_closureData == null) {
failedAt(
typeVariable, "Local function type variables are not supported.");
typeVariable,
'ClosureData needs to be registered before converting type variable'
' $typeVariable');
}
ClosureRepresentationInfo info =
_closureData!.getClosureInfo(typeVariable.typeDeclaration.node);

View file

@ -0,0 +1,15 @@
// Copyright (c) 2023, 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.
// This test uses a record with a static type dependent on a local function type
// variable.
import 'package:expect/expect.dart';
void main() {
Object? foo<T>(T value) => (0, value);
// ^ static type is (int, T)
Expect.isTrue(foo<Pattern>('hi') is (int, String));
}