@@ -157,6 +157,9 @@ class Scope {
157
157
158
158
Scope _parentScope;
159
159
160
+ _FunctionChain _domReadHead, _domReadTail;
161
+ _FunctionChain _domWriteHead, _domWriteTail;
162
+
160
163
Scope get parentScope => _parentScope;
161
164
162
165
final ScopeStats _stats;
@@ -445,6 +448,72 @@ class Scope {
445
448
}
446
449
return counts;
447
450
}
451
+
452
+ /**
453
+ * Internal. Use [View.domWrite] instead.
454
+ */
455
+ void domWrite (fn ()) {
456
+ var chain = new _FunctionChain (fn);
457
+ if (_domWriteHead == null ) {
458
+ _domWriteHead = _domWriteTail = chain;
459
+ } else {
460
+ _domWriteTail = _domWriteTail._next = chain;
461
+ }
462
+ rootScope._domWriteCounter ++ ;
463
+ }
464
+
465
+ /**
466
+ * Internal. Use [View.domRead] instead.
467
+ */
468
+ void domRead (fn ()) {
469
+ var chain = new _FunctionChain (fn);
470
+ if (_domReadHead == null ) {
471
+ _domReadHead = _domReadTail = chain;
472
+ } else {
473
+ _domReadTail = _domReadTail._next = chain;
474
+ }
475
+ rootScope._domReadCounter ++ ;
476
+ }
477
+
478
+ void _runDomWrites () {
479
+ Scope child = _childHead;
480
+ while (child != null ) {
481
+ child._runDomWrites ();
482
+ child = child._next;
483
+ }
484
+
485
+ while (_domWriteHead != null ) {
486
+ try {
487
+ _domWriteHead.fn ();
488
+ } catch (e, s) {
489
+ _exceptionHandler (e, s);
490
+ }
491
+ rootScope._domWriteCounter -- ;
492
+ _domWriteHead = _domWriteHead._next;
493
+ }
494
+ _domWriteTail = null ;
495
+ }
496
+
497
+ void _runDomReads () {
498
+ Scope child = _childHead;
499
+ while (child != null ) {
500
+ child._runDomReads ();
501
+ child = child._next;
502
+ }
503
+
504
+ while (_domReadHead != null ) {
505
+ try {
506
+ _domReadHead.fn ();
507
+ } catch (e, s) {
508
+ _exceptionHandler (e, s);
509
+ }
510
+ rootScope._domReadCounter -- ;
511
+ _domReadHead = _domReadHead._next;
512
+ }
513
+ }
514
+
515
+
516
+ ExceptionHandler get _exceptionHandler => rootScope._exceptionHandler;
448
517
}
449
518
450
519
_mapEqual (Map a, Map b) => a.length == b.length &&
@@ -619,10 +688,10 @@ class RootScope extends Scope {
619
688
final Map <String , AST > astCache = new HashMap <String , AST >();
620
689
621
690
_FunctionChain _runAsyncHead, _runAsyncTail;
622
- _FunctionChain _domWriteHead, _domWriteTail;
623
- _FunctionChain _domReadHead, _domReadTail;
624
691
625
692
final ScopeStats _scopeStats;
693
+ int _domWriteCounter = 0 ;
694
+ int _domReadCounter = 0 ;
626
695
627
696
String _state;
628
697
var _state_wtf_scope;
@@ -767,41 +836,29 @@ class RootScope extends Scope {
767
836
bool runObservers = true ;
768
837
try {
769
838
do {
770
- if (_domWriteHead != null ) _stats.domWriteStart ();
771
- var s = traceEnter (Scope_domWrite );
772
- while (_domWriteHead != null ) {
773
- try {
774
- _domWriteHead.fn ();
775
- } catch (e, s) {
776
- _exceptionHandler (e, s);
777
- }
778
- _domWriteHead = _domWriteHead._next;
779
- if (_domWriteHead == null ) _stats.domWriteEnd ();
839
+ if (_domWriteCounter > 0 ) {
840
+ _stats.domWriteStart ();
841
+ var s = traceEnter (Scope_domWrite );
842
+ _runDomWrites ();
843
+ traceLeave (s);
844
+ _stats.domWriteEnd ();
780
845
}
781
- traceLeave (s);
782
- _domWriteTail = null ;
783
846
if (runObservers) {
784
847
runObservers = false ;
785
848
readOnlyGroup.detectChanges (exceptionHandler: _exceptionHandler,
786
849
fieldStopwatch: _scopeStats.fieldStopwatch,
787
850
evalStopwatch: _scopeStats.evalStopwatch,
788
851
processStopwatch: _scopeStats.processStopwatch);
789
852
}
790
- if (_domReadHead != null ) _stats.domReadStart ();
791
- s = traceEnter (Scope_domRead );
792
- while (_domReadHead != null ) {
793
- try {
794
- _domReadHead.fn ();
795
- } catch (e, s) {
796
- _exceptionHandler (e, s);
797
- }
798
- _domReadHead = _domReadHead._next;
799
- if (_domReadHead == null ) _stats.domReadEnd ();
853
+ if (_domReadCounter > 0 ) {
854
+ _stats.domReadStart ();
855
+ var s = traceEnter (Scope_domRead );
856
+ _runDomReads ();
857
+ traceLeave (s);
858
+ _stats.domReadEnd ();
800
859
}
801
- _domReadTail = null ;
802
- traceLeave (s);
803
860
_runAsyncFns ();
804
- } while (_domWriteHead != null || _domReadHead != null || _runAsyncHead != null );
861
+ } while (_domWriteCounter > 0 || _domReadCounter > 0 || _runAsyncHead != null );
805
862
_stats.flushEnd ();
806
863
assert ((() {
807
864
_stats.flushAssertStart ();
@@ -861,24 +918,6 @@ class RootScope extends Scope {
861
918
return count;
862
919
}
863
920
864
- void domWrite (fn ()) {
865
- var chain = new _FunctionChain (fn);
866
- if (_domWriteHead == null ) {
867
- _domWriteHead = _domWriteTail = chain;
868
- } else {
869
- _domWriteTail = _domWriteTail._next = chain;
870
- }
871
- }
872
-
873
- void domRead (fn ()) {
874
- var chain = new _FunctionChain (fn);
875
- if (_domReadHead == null ) {
876
- _domReadHead = _domReadTail = chain;
877
- } else {
878
- _domReadTail = _domReadTail._next = chain;
879
- }
880
- }
881
-
882
921
void destroy () {}
883
922
884
923
void _transitionState (String from, String to) {
0 commit comments