Skip to content

Commit

Permalink
Merge df18cf4 into 5038d1e
Browse files Browse the repository at this point in the history
  • Loading branch information
sokra authored Mar 10, 2023
2 parents 5038d1e + df18cf4 commit 2583041
Show file tree
Hide file tree
Showing 61 changed files with 2,501 additions and 427 deletions.
48 changes: 41 additions & 7 deletions crates/turbopack-ecmascript/js/src/runtime.js
Original file line number Diff line number Diff line change
Expand Up @@ -311,9 +311,10 @@ const SourceType = {
* @param {ModuleId} id
* @param {SourceType} sourceType
* @param {ModuleId} [sourceId]
* @param {ModuleId[]} [parents]
* @returns {Module}
*/
function instantiateModule(id, sourceType, sourceId) {
function instantiateModule(id, sourceType, sourceId, parents) {
const moduleFactory = moduleFactories[id];
if (typeof moduleFactory !== "function") {
// This can happen if modules incorrectly handle HMR disposes/updates,
Expand Down Expand Up @@ -344,7 +345,7 @@ function instantiateModule(id, sourceType, sourceId) {
exports: {},
loaded: false,
id,
parents: [],
parents: parents || [],
children: [],
interopNamespace: undefined,
hot,
Expand Down Expand Up @@ -618,6 +619,7 @@ function updateChunksPhase(chunksAddedModules, chunksDeletedModules) {
/**
* @param {Iterable<ModuleId>} outdatedModules
* @param {Set<ModuleId>} disposedModules
* @return {{ outdatedModuleParents: Map<ModuleId, Array<ModuleId>> }}
*/
function disposePhase(outdatedModules, disposedModules) {
for (const moduleId of outdatedModules) {
Expand All @@ -628,8 +630,17 @@ function disposePhase(outdatedModules, disposedModules) {
disposeModule(moduleId, "clear");
}

const outdatedModuleParents = new Map();
for (const moduleId of outdatedModules) {
const oldModule = moduleCache[moduleId];
outdatedModuleParents.set(moduleId, oldModule?.parents);
delete moduleCache[moduleId];
}

// TODO(alexkirsz) Dependencies: remove outdated dependency from module
// children.

return { outdatedModuleParents };
}

/**
Expand Down Expand Up @@ -660,7 +671,6 @@ function disposeModule(moduleId, mode) {
// module is still importing other modules.
module.hot.active = false;

delete moduleCache[module.id];
moduleHotState.delete(module);

// TODO(alexkirsz) Dependencies: delete the module from outdated deps.
Expand All @@ -682,6 +692,7 @@ function disposeModule(moduleId, mode) {

switch (mode) {
case "clear":
delete moduleCache[module.id];
moduleHotData.delete(module.id);
break;
case "replace":
Expand All @@ -696,8 +707,13 @@ function disposeModule(moduleId, mode) {
*
* @param {{ moduleId: ModuleId, errorHandler: true | Function }[]} outdatedSelfAcceptedModules
* @param {Map<ModuleId, ModuleFactory>} newModuleFactories
* @param {Map<ModuleId, Array<ModuleId>>} outdatedModuleParents
*/
function applyPhase(outdatedSelfAcceptedModules, newModuleFactories) {
function applyPhase(
outdatedSelfAcceptedModules,
newModuleFactories,
outdatedModuleParents
) {
// Update module factories.
for (const [moduleId, factory] of newModuleFactories.entries()) {
moduleFactories[moduleId] = factory;
Expand All @@ -710,7 +726,12 @@ function applyPhase(outdatedSelfAcceptedModules, newModuleFactories) {
// Re-instantiate all outdated self-accepted modules.
for (const { moduleId, errorHandler } of outdatedSelfAcceptedModules) {
try {
instantiateModule(moduleId, SourceType.Update);
instantiateModule(
moduleId,
SourceType.Update,
undefined,
outdatedModuleParents.get(moduleId)
);
} catch (err) {
if (typeof errorHandler === "function") {
try {
Expand Down Expand Up @@ -811,8 +832,15 @@ function applyEcmascriptMergedUpdate(chunkPath, update) {
const outdatedSelfAcceptedModules =
computeOutdatedSelfAcceptedModules(outdatedModules);
const { disposedModules } = updateChunksPhase(chunksAdded, chunksDeleted);
disposePhase(outdatedModules, disposedModules);
applyPhase(outdatedSelfAcceptedModules, newModuleFactories);
const { outdatedModuleParents } = disposePhase(
outdatedModules,
disposedModules
);
applyPhase(
outdatedSelfAcceptedModules,
newModuleFactories,
outdatedModuleParents
);
}

/**
Expand Down Expand Up @@ -1213,6 +1241,8 @@ function disposeChunk(chunkPath) {
}
chunkModules.delete(chunkPath);

const disposedModules = [];

for (const moduleId of chunkModules) {
const moduleChunks = moduleChunksMap.get(moduleId);
moduleChunks.delete(chunkPath);
Expand All @@ -1221,8 +1251,12 @@ function disposeChunk(chunkPath) {
if (noRemainingChunks) {
moduleChunksMap.delete(moduleId);
disposeModule(moduleId, "clear");
disposedModules.push(moduleId);
}
}
for (const moduleId of disposedModules) {
delete moduleCache[moduleId];
}

return true;
}
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 2583041

Please sign in to comment.