mirror of
https://github.com/dart-lang/sdk
synced 2024-09-18 21:11:19 +00:00
85cb56dd20
This changes the pattern matching lowering to avoid using late final variables (or lowerings thereof) and instead inline the initializer where used. This avoids generating closures that are hard for backends to reason about and optimize. Closes #52805 Closes #53804 Change-Id: Ia887446dd4d4475d05cf852c812bfe4b851de261 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338860 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Jens Johansen <jensj@google.com>
128 lines
9.7 KiB
Plaintext
128 lines
9.7 KiB
Plaintext
library;
|
|
//
|
|
// Problems in library:
|
|
//
|
|
// pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:31:4: Error: Can't assign to the final variable 'initializedFinal'.
|
|
// (initializedFinal, // Error
|
|
// ^^^^^^^^^^^^^^^^
|
|
//
|
|
// pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:32:7: Error: Can't assign to the final variable '#initializedLateFinal'.
|
|
// initializedLateFinal, // Error
|
|
// ^^^^^^^^^^^^^^^^^^^^^
|
|
//
|
|
// pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:35:5: Error: Final variable 'definitelyAssignedFinal' might already be assigned at this point.
|
|
// definitelyAssignedFinal] = y; // Error
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^
|
|
//
|
|
// pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:36:17: Error: Late final variable '#definitelyAssignedLateFinal' definitely assigned.
|
|
// Class(field1: definitelyAssignedLateFinal, // Error
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
//
|
|
// pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point.
|
|
// field2: [[notDefinitelyAssignedFinal, _], // Error
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
//
|
|
import self as self;
|
|
import "dart:core" as core;
|
|
import "dart:_internal" as _in;
|
|
|
|
class Class extends core::Object {
|
|
field dynamic field1 = null;
|
|
field dynamic field2 = null;
|
|
synthetic constructor •() → self::Class
|
|
: super core::Object::•()
|
|
;
|
|
}
|
|
static method method(dynamic x, dynamic y, dynamic z) → dynamic {
|
|
final core::int initializedFinal = 5;
|
|
lowered final has-declared-initializer core::int? #initializedLateFinal;
|
|
lowered core::bool #initializedLateFinal#isSet = false;
|
|
function #initializedLateFinal#get() → core::int {
|
|
if(!#initializedLateFinal#isSet) {
|
|
final core::int #t1 = 5;
|
|
if(#initializedLateFinal#isSet)
|
|
throw new _in::LateError::localADI("initializedLateFinal");
|
|
#initializedLateFinal = #t1;
|
|
#initializedLateFinal#isSet = true;
|
|
}
|
|
return #initializedLateFinal{core::int};
|
|
}
|
|
final dynamic definitelyUnassignedFinal;
|
|
lowered final core::int? #definitelyUnassignedLateFinal;
|
|
lowered core::bool #definitelyUnassignedLateFinal#isSet = false;
|
|
function #definitelyUnassignedLateFinal#get() → core::int
|
|
return #definitelyUnassignedLateFinal#isSet ?{core::int} #definitelyUnassignedLateFinal{core::int} : throw new _in::LateError::localNI("definitelyUnassignedLateFinal");
|
|
function #definitelyUnassignedLateFinal#set(core::int definitelyUnassignedLateFinal#param) → dynamic
|
|
if(#definitelyUnassignedLateFinal#isSet)
|
|
throw new _in::LateError::localAI("definitelyUnassignedLateFinal");
|
|
else {
|
|
#definitelyUnassignedLateFinal#isSet = true;
|
|
return #definitelyUnassignedLateFinal = definitelyUnassignedLateFinal#param;
|
|
}
|
|
final dynamic definitelyAssignedFinal;
|
|
lowered final dynamic #definitelyAssignedLateFinal;
|
|
lowered core::bool #definitelyAssignedLateFinal#isSet = false;
|
|
function #definitelyAssignedLateFinal#get() → dynamic
|
|
return #definitelyAssignedLateFinal#isSet ?{dynamic} #definitelyAssignedLateFinal : throw new _in::LateError::localNI("definitelyAssignedLateFinal");
|
|
function #definitelyAssignedLateFinal#set(dynamic definitelyAssignedLateFinal#param) → dynamic
|
|
if(#definitelyAssignedLateFinal#isSet)
|
|
throw new _in::LateError::localAI("definitelyAssignedLateFinal");
|
|
else {
|
|
#definitelyAssignedLateFinal#isSet = true;
|
|
return #definitelyAssignedLateFinal = definitelyAssignedLateFinal#param;
|
|
}
|
|
final core::int notDefinitelyAssignedFinal;
|
|
lowered final core::int? #notDefinitelyAssignedLateFinal;
|
|
lowered core::bool #notDefinitelyAssignedLateFinal#isSet = false;
|
|
function #notDefinitelyAssignedLateFinal#get() → core::int
|
|
return #notDefinitelyAssignedLateFinal#isSet ?{core::int} #notDefinitelyAssignedLateFinal{core::int} : throw new _in::LateError::localNI("notDefinitelyAssignedLateFinal");
|
|
function #notDefinitelyAssignedLateFinal#set(core::int notDefinitelyAssignedLateFinal#param) → dynamic
|
|
if(#notDefinitelyAssignedLateFinal#isSet)
|
|
throw new _in::LateError::localAI("notDefinitelyAssignedLateFinal");
|
|
else {
|
|
#notDefinitelyAssignedLateFinal#isSet = true;
|
|
return #notDefinitelyAssignedLateFinal = notDefinitelyAssignedLateFinal#param;
|
|
}
|
|
if(x =={core::Object::==}{(core::Object) → core::bool} 5) {
|
|
notDefinitelyAssignedFinal = 5;
|
|
#notDefinitelyAssignedLateFinal#set(15){(core::int) → dynamic};
|
|
}
|
|
definitelyAssignedFinal = 10;
|
|
#definitelyAssignedLateFinal#set(20){(dynamic) → dynamic};
|
|
{
|
|
final synthesized dynamic #0#0 = x as{TypeError,ForDynamic} (core::int, core::int, dynamic);
|
|
if(!(#0#0 is (core::Object?, core::Object?, core::Object?) && invalid-expression "pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:31:4: Error: Can't assign to the final variable 'initializedFinal'.
|
|
(initializedFinal, // Error
|
|
^^^^^^^^^^^^^^^^" && invalid-expression "pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:32:7: Error: Can't assign to the final variable '#initializedLateFinal'.
|
|
initializedLateFinal, // Error
|
|
^^^^^^^^^^^^^^^^^^^^^" && (let final core::Object? #t2 = definitelyUnassignedFinal = #0#0{(core::Object?, core::Object?, core::Object?)}.$3{core::Object?} in true)))
|
|
throw new core::StateError::•("Pattern matching error");
|
|
}
|
|
{
|
|
final synthesized dynamic #1#0 = y as{TypeError,ForDynamic} core::List<core::int>;
|
|
if(!(#1#0 is core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t3 = #definitelyUnassignedLateFinal#set(#1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} as core::int?){(core::int) → dynamic} in true) && invalid-expression "pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:35:5: Error: Final variable 'definitelyAssignedFinal' might already be assigned at this point.
|
|
definitelyAssignedFinal] = y; // Error
|
|
^^^^^^^^^^^^^^^^^^^^^^^"))
|
|
throw new core::StateError::•("Pattern matching error");
|
|
}
|
|
{
|
|
final synthesized dynamic #2#0 = z as{TypeError,ForDynamic} self::Class;
|
|
synthesized dynamic #2#3;
|
|
synthesized core::bool #2#3#isSet = false;
|
|
synthesized dynamic #2#9;
|
|
synthesized core::bool #2#9#isSet = false;
|
|
synthesized dynamic #2#16;
|
|
synthesized core::bool #2#16#isSet = false;
|
|
if(!(#2#0 is self::Class && (let final dynamic #t4 = #2#0{self::Class}.{self::Class::field1}{dynamic} in invalid-expression "pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:36:17: Error: Late final variable '#definitelyAssignedLateFinal' definitely assigned.
|
|
Class(field1: definitelyAssignedLateFinal, // Error
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^") && ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final core::bool* #t5 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) is core::List<dynamic> && ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final core::bool* #t6 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && ((#2#9#isSet ?{dynamic} #2#9{dynamic} : let final core::bool* #t7 = #2#9#isSet = true in #2#9 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final core::bool* #t8 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(0){(core::int) → dynamic}) is core::List<dynamic> && ((#2#9#isSet ?{dynamic} #2#9{dynamic} : let final core::bool* #t9 = #2#9#isSet = true in #2#9 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final core::bool* #t10 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(0){(core::int) → dynamic}) as{Unchecked} core::List<dynamic>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && invalid-expression "pkg/front_end/testcases/late_lowering/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point.
|
|
field2: [[notDefinitelyAssignedFinal, _], // Error
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^") && ((#2#16#isSet ?{dynamic} #2#16{dynamic} : let final core::bool* #t11 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final core::bool* #t12 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(1){(core::int) → dynamic}) is core::List<dynamic> && ((#2#16#isSet ?{dynamic} #2#16{dynamic} : let final core::bool* #t13 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final core::bool* #t14 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(1){(core::int) → dynamic}) as{Unchecked} core::List<dynamic>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t15 = #notDefinitelyAssignedLateFinal#set(((#2#16#isSet ?{dynamic} #2#16{dynamic} : let final core::bool* #t16 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final core::bool* #t17 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(1){(core::int) → dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(1){(core::int) → dynamic} as core::int?){(core::int) → dynamic} in true)))))
|
|
throw new core::StateError::•("Pattern matching error");
|
|
}
|
|
}
|
|
|
|
constants {
|
|
#C1 = 2
|
|
}
|