From e2a00dd49daa9cf43de088df8f86c8481d4db329 Mon Sep 17 00:00:00 2001 From: Eric Seidel Date: Fri, 6 Mar 2015 10:42:49 -0800 Subject: [PATCH] Add an assert that we don't schedule a render during render In production I added an early return. I don't bother to log in production since no one is looking at the log anyway. Unfortunately this currently only fires when using a debug build we should fix our Release build to have a checked-mode option or consider hacks like having all localhost urls enable checked mode, etc. R=ianh@google.com, rafaelw@chromium.org BUG= Review URL: https://codereview.chromium.org/983973005 --- framework/fn.dart | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/framework/fn.dart b/framework/fn.dart index c481aee5f..e3d39eb1f 100644 --- a/framework/fn.dart +++ b/framework/fn.dart @@ -503,24 +503,34 @@ class Anchor extends Element { List _dirtyComponents = new List(); bool _renderScheduled = false; +bool _inRenderDirtyComponents = false; void _renderDirtyComponents() { - Stopwatch sw = new Stopwatch()..start(); + try { + _inRenderDirtyComponents = true; + Stopwatch sw = new Stopwatch()..start(); - _dirtyComponents.sort((a, b) => a._order - b._order); - for (var comp in _dirtyComponents) { - comp._renderIfDirty(); - } + _dirtyComponents.sort((a, b) => a._order - b._order); + for (var comp in _dirtyComponents) { + comp._renderIfDirty(); + } - _dirtyComponents.clear(); - _renderScheduled = false; + _dirtyComponents.clear(); + _renderScheduled = false; - sw.stop(); - if (_shouldLogRenderDuration) - print("Render took ${sw.elapsedMicroseconds} microseconds"); + sw.stop(); + if (_shouldLogRenderDuration) + print("Render took ${sw.elapsedMicroseconds} microseconds"); + } finally { + _inRenderDirtyComponents = false; + } } void _scheduleComponentForRender(Component c) { + assert(!_inRenderDirtyComponents); + if (_inRenderDirtyComponents) + return; + _dirtyComponents.add(c); if (!_renderScheduled) { -- GitLab