Skip to content

Commit 6a4947a

Browse files
johnniwintherCommit Queue
authored and
Commit Queue
committed
[cfe] Preserve offsets for uncached expression
The changes the MatchingCache to always create a new CacheExpression. When the expression is cached the first CacheExpression is used (the current behavior) but when the expression is not cached, each individual CacheExpression is used. This ensures the file offsets match the source location for the uncached expression. In the updated VM test this shows up as the is-tests using all for lines in the switch case and not just the first two. In response to #51812 Change-Id: I2d7bdb54e11f212cd809899a50d827284c4f6657 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/292082 Reviewed-by: Chloe Stefantsova <[email protected]> Reviewed-by: Alexander Markov <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 7a51360 commit 6a4947a

8 files changed

+27
-19
lines changed

pkg/front_end/lib/src/fasta/type_inference/matching_cache.dart

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -886,7 +886,7 @@ class CacheExpression implements CacheableExpression {
886886
@override
887887
Expression createExpression(TypeEnvironment typeEnvironment,
888888
[List<Expression>? effects]) {
889-
return _cache.createExpression(typeEnvironment, accessKey);
889+
return _cache.createExpression(typeEnvironment, accessKey, this);
890890
}
891891

892892
@override
@@ -968,8 +968,13 @@ class Cache {
968968
/// The file offset used for synthesized AST nodes.
969969
final int _fileOffset;
970970

971-
/// Map from [AccessKey] to the corresponding [CacheExpression] that creates
971+
/// Map from [AccessKey] to a corresponding [CacheExpression] that creates
972972
/// the expression value.
973+
///
974+
/// If the expression needs a cache, the associated [CacheExpression] will be
975+
/// used to create the expression. Otherwise, each expression will be created
976+
/// through its own [CacheExpression]. This ensures that uncached expressions
977+
/// will have their own offsets.
973978
Map<AccessKey, CacheExpression> _accesses = {};
974979

975980
Cache(this.cacheKey, this._matchingCache, this._name,
@@ -992,19 +997,20 @@ class Cache {
992997
/// Returns a [CacheableExpression] for the [expression].
993998
CacheableExpression registerAccess(
994999
AccessKey accessKey, DelayedExpression expression) {
995-
return _accesses[accessKey] ??=
1000+
CacheExpression cacheExpression =
9961001
new CacheExpression(cacheKey, accessKey, this, expression);
1002+
_accesses[accessKey] ??= cacheExpression;
1003+
return cacheExpression;
9971004
}
9981005

9991006
/// Creates an [Expression] for the cacheable value for the given accessKey].
10001007
///
10011008
/// If cached, the value is accessed through a caching variable, otherwise
10021009
/// a fresh [Expression] is created.
1003-
Expression createExpression(
1004-
TypeEnvironment typeEnvironment, AccessKey accessKey) {
1010+
Expression createExpression(TypeEnvironment typeEnvironment,
1011+
AccessKey accessKey, CacheExpression cacheExpression) {
10051012
assert(_useCount >= 1);
10061013
assert(_accesses.isNotEmpty);
1007-
CacheExpression cacheableExpression = _accesses[accessKey]!;
10081014
_hasBeenCreated = true;
10091015
bool createCache;
10101016
if (_isLate) {
@@ -1018,8 +1024,9 @@ class Cache {
10181024
}
10191025
Expression result;
10201026
if (!createCache) {
1021-
result = cacheableExpression.expression.createExpression(typeEnvironment);
1027+
result = cacheExpression.expression.createExpression(typeEnvironment);
10221028
} else {
1029+
CacheExpression cacheableExpression = _accesses[accessKey]!;
10231030
if (_accesses.length == 1) {
10241031
VariableDeclaration? variable = _variable;
10251032
VariableDeclaration? isSetVariable = _isSetVariable;

pkg/front_end/test/spell_checking_list_code.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,6 +1609,7 @@ unaligned
16091609
unaltered
16101610
unavailable
16111611
unbound
1612+
uncached
16121613
uncategorized
16131614
uncomment
16141615
uncommon

pkg/front_end/testcases/offsets/step_through_patterns.dart.strong.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,14 @@ import "dart:core" as core;
4545
}
4646
[631] {
4747
[617] [617] hoisted core::double l;
48-
[631] if([627] [627] [598] [598] [493] [493] [478] [478] #0#0 is{ForNonNullableByDefault} self::Square && [617]([617] let [617] final dynamic #t4 = [617] [617] l = [506] [506] #0#2 in [617] [617] true) && [627] [627] [625] [625] l.{core::num::<}[627]([629] 0){(core::num) → core::bool}) {
48+
[631] if([627] [627] [598] [598] [598] [598] [478] [478] #0#0 is{ForNonNullableByDefault} self::Square && [617]([617] let [617] final dynamic #t4 = [617] [617] l = [506] [506] #0#2 in [617] [617] true) && [627] [627] [625] [625] l.{core::num::<}[627]([629] 0){(core::num) → core::bool}) {
4949
[470] [470] [470] #t1 = [634] [634] -1.0;
5050
[631] break #L1;
5151
}
5252
}
5353
[677] {
5454
[663] [663] hoisted core::double r;
55-
[677] if([673] [673] [644] [644] [543] [543] [478] [478] #0#0 is{ForNonNullableByDefault} self::Circle && [663]([663] let [663] final dynamic #t5 = [663] [663] r = [556] [556] #0#4 in [663] [663] true) && [673] [673] [671] [671] r.{core::num::<}[673]([675] 0){(core::num) → core::bool}) {
55+
[677] if([673] [673] [644] [644] [644] [644] [478] [478] #0#0 is{ForNonNullableByDefault} self::Circle && [663]([663] let [663] final dynamic #t5 = [663] [663] r = [556] [556] #0#4 in [663] [663] true) && [673] [673] [671] [671] r.{core::num::<}[673]([675] 0){(core::num) → core::bool}) {
5656
[470] [470] [470] #t1 = [680] [680] -1.0;
5757
[677] break #L1;
5858
}

pkg/front_end/testcases/offsets/step_through_patterns.dart.strong.transformed.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,14 @@ import "dart:core" as core;
4949
}
5050
[631] {
5151
[617] [617] hoisted core::double l;
52-
[631] if([627] [627] [598] [598] [493] [493] [478] [478] #0#0 is{ForNonNullableByDefault} self::Square && [617]([617] let [617] final core::double #t4 = [617] [617] l = [506] [506] #0#2 in [617] [617] true) && [627] [627] [625] [625] l.{core::num::<}[627]([629] 0){(core::num) → core::bool}) {
52+
[631] if([627] [627] [598] [598] [598] [598] [478] [478] #0#0 is{ForNonNullableByDefault} self::Square && [617]([617] let [617] final core::double #t4 = [617] [617] l = [506] [506] #0#2 in [617] [617] true) && [627] [627] [625] [625] l.{core::num::<}[627]([629] 0){(core::num) → core::bool}) {
5353
[470] [470] [470] #t1 = [634] [634] -1.0;
5454
[631] break #L1;
5555
}
5656
}
5757
[677] {
5858
[663] [663] hoisted core::double r;
59-
[677] if([673] [673] [644] [644] [543] [543] [478] [478] #0#0 is{ForNonNullableByDefault} self::Circle && [663]([663] let [663] final core::double #t5 = [663] [663] r = [556] [556] #0#4 in [663] [663] true) && [673] [673] [671] [671] r.{core::num::<}[673]([675] 0){(core::num) → core::bool}) {
59+
[677] if([673] [673] [644] [644] [644] [644] [478] [478] #0#0 is{ForNonNullableByDefault} self::Circle && [663]([663] let [663] final core::double #t5 = [663] [663] r = [556] [556] #0#4 in [663] [663] true) && [673] [673] [671] [671] r.{core::num::<}[673]([675] 0){(core::num) → core::bool}) {
6060
[470] [470] [470] #t1 = [680] [680] -1.0;
6161
[677] break #L1;
6262
}

pkg/front_end/testcases/offsets/step_through_patterns.dart.weak.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ import "dart:_internal" as _in;
4646
}
4747
[631] {
4848
[617] [617] hoisted core::double l;
49-
[631] if([627] [627] [598] [598] [493] [493] [478] [478] #0#0 is{ForNonNullableByDefault} self::Square && [617]([617] let [617] final dynamic #t4 = [617] [617] l = [506] [506] #0#2 in [617] [617] true) && [627] [627] [625] [625] l.{core::num::<}[627]([629] 0){(core::num) → core::bool}) {
49+
[631] if([627] [627] [598] [598] [598] [598] [478] [478] #0#0 is{ForNonNullableByDefault} self::Square && [617]([617] let [617] final dynamic #t4 = [617] [617] l = [506] [506] #0#2 in [617] [617] true) && [627] [627] [625] [625] l.{core::num::<}[627]([629] 0){(core::num) → core::bool}) {
5050
[470] [470] [470] #t1 = [634] [634] -1.0;
5151
[631] break #L1;
5252
}
5353
}
5454
[677] {
5555
[663] [663] hoisted core::double r;
56-
[677] if([673] [673] [644] [644] [543] [543] [478] [478] #0#0 is{ForNonNullableByDefault} self::Circle && [663]([663] let [663] final dynamic #t5 = [663] [663] r = [556] [556] #0#4 in [663] [663] true) && [673] [673] [671] [671] r.{core::num::<}[673]([675] 0){(core::num) → core::bool}) {
56+
[677] if([673] [673] [644] [644] [644] [644] [478] [478] #0#0 is{ForNonNullableByDefault} self::Circle && [663]([663] let [663] final dynamic #t5 = [663] [663] r = [556] [556] #0#4 in [663] [663] true) && [673] [673] [671] [671] r.{core::num::<}[673]([675] 0){(core::num) → core::bool}) {
5757
[470] [470] [470] #t1 = [680] [680] -1.0;
5858
[677] break #L1;
5959
}

pkg/front_end/testcases/offsets/step_through_patterns.dart.weak.modular.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ import "dart:_internal" as _in;
4646
}
4747
[631] {
4848
[617] [617] hoisted core::double l;
49-
[631] if([627] [627] [598] [598] [493] [493] [478] [478] #0#0 is{ForNonNullableByDefault} self::Square && [617]([617] let [617] final dynamic #t4 = [617] [617] l = [506] [506] #0#2 in [617] [617] true) && [627] [627] [625] [625] l.{core::num::<}[627]([629] 0){(core::num) → core::bool}) {
49+
[631] if([627] [627] [598] [598] [598] [598] [478] [478] #0#0 is{ForNonNullableByDefault} self::Square && [617]([617] let [617] final dynamic #t4 = [617] [617] l = [506] [506] #0#2 in [617] [617] true) && [627] [627] [625] [625] l.{core::num::<}[627]([629] 0){(core::num) → core::bool}) {
5050
[470] [470] [470] #t1 = [634] [634] -1.0;
5151
[631] break #L1;
5252
}
5353
}
5454
[677] {
5555
[663] [663] hoisted core::double r;
56-
[677] if([673] [673] [644] [644] [543] [543] [478] [478] #0#0 is{ForNonNullableByDefault} self::Circle && [663]([663] let [663] final dynamic #t5 = [663] [663] r = [556] [556] #0#4 in [663] [663] true) && [673] [673] [671] [671] r.{core::num::<}[673]([675] 0){(core::num) → core::bool}) {
56+
[677] if([673] [673] [644] [644] [644] [644] [478] [478] #0#0 is{ForNonNullableByDefault} self::Circle && [663]([663] let [663] final dynamic #t5 = [663] [663] r = [556] [556] #0#4 in [663] [663] true) && [673] [673] [671] [671] r.{core::num::<}[673]([675] 0){(core::num) → core::bool}) {
5757
[470] [470] [470] #t1 = [680] [680] -1.0;
5858
[677] break #L1;
5959
}

pkg/front_end/testcases/offsets/step_through_patterns.dart.weak.transformed.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,14 @@ import "dart:_internal" as _in;
5050
}
5151
[631] {
5252
[617] [617] hoisted core::double l;
53-
[631] if([627] [627] [598] [598] [493] [493] [478] [478] #0#0 is{ForNonNullableByDefault} self::Square && [617]([617] let [617] final core::double #t4 = [617] [617] l = [506] [506] #0#2 in [617] [617] true) && [627] [627] [625] [625] l.{core::num::<}[627]([629] 0){(core::num) → core::bool}) {
53+
[631] if([627] [627] [598] [598] [598] [598] [478] [478] #0#0 is{ForNonNullableByDefault} self::Square && [617]([617] let [617] final core::double #t4 = [617] [617] l = [506] [506] #0#2 in [617] [617] true) && [627] [627] [625] [625] l.{core::num::<}[627]([629] 0){(core::num) → core::bool}) {
5454
[470] [470] [470] #t1 = [634] [634] -1.0;
5555
[631] break #L1;
5656
}
5757
}
5858
[677] {
5959
[663] [663] hoisted core::double r;
60-
[677] if([673] [673] [644] [644] [543] [543] [478] [478] #0#0 is{ForNonNullableByDefault} self::Circle && [663]([663] let [663] final core::double #t5 = [663] [663] r = [556] [556] #0#4 in [663] [663] true) && [673] [673] [671] [671] r.{core::num::<}[673]([675] 0){(core::num) → core::bool}) {
60+
[677] if([673] [673] [644] [644] [644] [644] [478] [478] #0#0 is{ForNonNullableByDefault} self::Circle && [663]([663] let [663] final core::double #t5 = [663] [663] r = [556] [556] #0#4 in [663] [663] true) && [673] [673] [671] [671] r.{core::num::<}[673]([675] 0){(core::num) → core::bool}) {
6161
[470] [470] [470] #t1 = [680] [680] -1.0;
6262
[677] break #L1;
6363
}

pkg/vm_service/test/step_through_patterns_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ List<String> expected = [
4747
"$FILE:${LINE + 2}:7", // on 'Circle'
4848
"$FILE:${LINE + 2}:26", // on 'r' right after 'var'
4949
"$FILE:${LINE + 2}:36", // on '>='
50-
"$FILE:${LINE + 1}:7", // on 'Square'
51-
"$FILE:${LINE + 2}:7", // on 'Circle'
50+
"$FILE:${LINE + 3}:7", // on 'Square'
51+
"$FILE:${LINE + 4}:7", // on 'Circle'
5252
"$FILE:${LINE + 4}:26", // on 'r' right after 'var'
5353
"$FILE:${LINE + 4}:36", // on '<'
5454
"$FILE:${LINE + 0}:38", // on 'switch'

0 commit comments

Comments
 (0)