mirror of
https://github.com/dart-lang/sdk
synced 2024-10-06 16:00:45 +00:00
[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:
parent
cc3bf609f2
commit
8ee2b8b36b
|
@ -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);
|
||||
|
|
15
tests/web/regress/issue/51899_test.dart
Normal file
15
tests/web/regress/issue/51899_test.dart
Normal 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));
|
||||
}
|
Loading…
Reference in a new issue