@samitouri / QOS-React-2 / commits / 65b9ad94aa

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,