@@ -32,7 +32,7 @@ let isProfiling = true;
3232// TODO: individual render methods
3333
3434function getMarkName ( fiber ) {
35- return `react:${ fiber . _debugID } ` ;
35+ return `react:${ flushIndex } : ${ fiber . _debugID } ` ;
3636}
3737
3838function shouldIgnore ( fiber ) {
@@ -50,8 +50,12 @@ function shouldIgnore(fiber) {
5050}
5151
5252let bailedFibers = new Set ( ) ;
53+ let lastCompletedFiber = null ;
54+ let pausedFibers = [ ] ;
55+ let flushIndex = 0 ;
5356
5457function markBeginWork ( fiber ) {
58+ lastCompletedFiber = null ;
5559 if ( shouldIgnore ( fiber ) ) {
5660 return ;
5761 }
@@ -67,30 +71,63 @@ function markBailWork(fiber) {
6771}
6872
6973function markCompleteWork ( fiber ) {
74+ lastCompletedFiber = fiber ;
7075 if ( shouldIgnore ( fiber ) ) {
71- return ;
76+ return false ;
7277 }
7378 if ( bailedFibers . has ( fiber ) ) {
7479 bailedFibers . delete ( fiber ) ;
7580 } else {
7681 performance . measure ( getComponentName ( fiber ) , getMarkName ( fiber ) ) ;
7782 }
83+ return true ;
7884}
7985
8086function markWillCommit ( ) {
8187 performance . mark ( 'react:commit' ) ;
8288}
8389
8490function markDidCommit ( ) {
85- performance . measure ( 'Commit React Tree' , 'react:commit' ) ;
91+ performance . measure ( '( React) Commit Tree' , 'react:commit' ) ;
8692}
8793
8894function markWillReconcile ( ) {
95+ flushIndex ++ ;
8996 performance . mark ( 'react:reconcile' ) ;
97+ resumeStack ( ) ;
9098}
9199
92100function markDidReconcile ( ) {
93- performance . measure ( 'Reconcile React Tree' , 'react:reconcile' ) ;
101+ rewindStack ( ) ;
102+ performance . measure ( '(React) Reconcile Tree' , 'react:reconcile' ) ;
103+ }
104+
105+ function markReset ( ) {
106+ resetStack ( ) ;
107+ }
108+
109+ function rewindStack ( ) {
110+ while ( lastCompletedFiber ) {
111+ const parent = lastCompletedFiber . return ;
112+ if ( parent ) {
113+ if ( markCompleteWork ( parent ) ) {
114+ pausedFibers . unshift ( parent ) ;
115+ }
116+ }
117+ lastCompletedFiber = parent ;
118+ }
119+ }
120+
121+ function resumeStack ( ) {
122+ while ( pausedFibers . length ) {
123+ const parent = pausedFibers . shift ( ) ;
124+ markBeginWork ( parent ) ;
125+ }
126+ }
127+
128+ function resetStack ( ) {
129+ pausedFibers . length = 0 ;
130+ bailedFibers . clear ( ) ;
94131}
95132
96133exports . markBeginWork = markBeginWork ;
@@ -100,3 +137,4 @@ exports.markWillCommit = markWillCommit;
100137exports . markDidCommit = markDidCommit ;
101138exports . markWillReconcile = markWillReconcile ;
102139exports . markDidReconcile = markDidReconcile ;
140+ exports . markReset = markReset ;
0 commit comments