From ccf5d641c5c4cf8817010d295a42917a424ec04b Mon Sep 17 00:00:00 2001 From: Dan Field Date: Tue, 4 Feb 2020 14:23:03 -0800 Subject: [PATCH] Fix stack filtering (#49956) --- .../lib/src/foundation/assertions.dart | 5 ++++- .../test/foundation/assertions_test.dart | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/foundation/assertions.dart b/packages/flutter/lib/src/foundation/assertions.dart index cb55da20f6..3e9c676446 100644 --- a/packages/flutter/lib/src/foundation/assertions.dart +++ b/packages/flutter/lib/src/foundation/assertions.dart @@ -126,7 +126,7 @@ class RepetitiveStackFrameFilter extends StackFilter { @override void filter(List stackFrames, List reasons) { - for (int index = 0; index < stackFrames.length; index += 1) { + for (int index = 0; index < stackFrames.length - numFrames; index += 1) { if (_matchesFrames(stackFrames.skip(index).take(numFrames).toList())) { reasons.setRange(index, index + numFrames, _replacements); index += numFrames - 1; @@ -135,6 +135,9 @@ class RepetitiveStackFrameFilter extends StackFilter { } bool _matchesFrames(List stackFrames) { + if (stackFrames.length < numFrames) { + return false; + } for (int index = 0; index < stackFrames.length; index++) { if (!frames[index].matches(stackFrames[index])) { return false; diff --git a/packages/flutter/test/foundation/assertions_test.dart b/packages/flutter/test/foundation/assertions_test.dart index 05b7272138..e0780fffb6 100644 --- a/packages/flutter/test/foundation/assertions_test.dart +++ b/packages/flutter/test/foundation/assertions_test.dart @@ -428,4 +428,24 @@ void main() { expect(trace, isNotNull); expect(trace.value, stack); }); + + test('RepetitiveStackFrameFilter does not go out of range', () { + const RepetitiveStackFrameFilter filter = RepetitiveStackFrameFilter( + frames: [ + PartialStackFrame(className: 'TestClass', method: 'test1', package: 'package:test/blah.dart'), + PartialStackFrame(className: 'TestClass', method: 'test2', package: 'package:test/blah.dart'), + PartialStackFrame(className: 'TestClass', method: 'test3', package: 'package:test/blah.dart'), + ], + replacement: 'test', + ); + final List reasons = List(2); + filter.filter( + const [ + StackFrame(className: 'TestClass', method: 'test1', packageScheme: 'package', package: 'test', packagePath: 'blah.dart', line: 1, column: 1, number: 0, source: ''), + StackFrame(className: 'TestClass', method: 'test2', packageScheme: 'package', package: 'test', packagePath: 'blah.dart', line: 1, column: 1, number: 0, source: ''), + ], + reasons, + ); + expect(reasons, List(2)); + }); }