Fix context memory leak (#10680)
* Fix context memory leak * Fix Flow
Dan Abramov committed
Sep 12, 2017 at 21:47 UTC
65b9ad94aaf62eb61b7b3888362c2e7c0b06697a
3 files changed
+16
-6
src/renderers/shared/fiber/ReactFiberBeginWork.js
+5
-4
@@ -305,7 +305,7 @@ module.exports = function<T, P, I, TI, PI, C, CX, PL>(
305
return workInProgress.child;
306
}
307
308
- function updateHostRoot(current, workInProgress, priorityLevel) {
308
+ function pushHostRootContext(workInProgress) {
309
const root = (workInProgress.stateNode: FiberRoot);
310
if (root.pendingContext) {
311
pushTopLevelContextObject(
@@ -317,9 +317,11 @@ module.exports = function<T, P, I, TI, PI, C, CX, PL>(
317
// Should always be set
318
pushTopLevelContextObject(workInProgress, root.context, false);
319
}
320
-
320
pushHostContainer(workInProgress, root.containerInfo);
321
+ }
322
323
+ function updateHostRoot(current, workInProgress, priorityLevel) {
324
+ pushHostRootContext(workInProgress);
325
const updateQueue = workInProgress.updateQueue;
326
if (updateQueue !== null) {
327
const prevState = workInProgress.memoizedState;
@@ -777,8 +779,7 @@ module.exports = function<T, P, I, TI, PI, C, CX, PL>(
779
pushContextProvider(workInProgress);
780
break;
781
case HostRoot:
780
- const root: FiberRoot = workInProgress.stateNode;
781
- pushHostContainer(workInProgress, root.containerInfo);
782
+ pushHostRootContext(workInProgress);
783
break;
784
default:
785
invariant(
src/renderers/shared/fiber/ReactFiberCompleteWork.js
+6
-2
@@ -21,7 +21,10 @@ import type {FiberRoot} from 'ReactFiberRoot';
21
import type {HostConfig} from 'ReactFiberReconciler';
22
23
var {reconcileChildFibers} = require('ReactChildFiber');
24
-var {popContextProvider} = require('ReactFiberContext');
24
+var {
25
+ popContextProvider,
26
+ popTopLevelContextObject,
27
+} = require('ReactFiberContext');
28
var ReactTypeOfWork = require('ReactTypeOfWork');
29
var ReactTypeOfSideEffect = require('ReactTypeOfSideEffect');
30
var ReactPriorityLevel = require('ReactPriorityLevel');
@@ -211,7 +214,8 @@ module.exports = function<T, P, I, TI, PI, C, CX, PL>(
214
return null;
215
}
216
case HostRoot: {
214
- // TODO: Pop the host container after #8607 lands.
217
+ popHostContainer(workInProgress);
218
+ popTopLevelContextObject(workInProgress);
219
const fiberRoot = (workInProgress.stateNode: FiberRoot);
220
if (fiberRoot.pendingContext) {
221
fiberRoot.context = fiberRoot.pendingContext;
src/renderers/shared/fiber/ReactFiberContext.js
+5
@@ -135,6 +135,11 @@ function popContextProvider(fiber: Fiber): void {
135
}
136
exports.popContextProvider = popContextProvider;
137
138
+exports.popTopLevelContextObject = function(fiber: Fiber) {
139
+ pop(didPerformWorkStackCursor, fiber);
140
+ pop(contextStackCursor, fiber);
141
+};
142
+
143
exports.pushTopLevelContextObject = function(
144
fiber: Fiber,
145
context: Object,