Skip to content

Commit d19d26f

Browse files
authored
Prevent accidentally re-creating ResolvedVc via deref by using a deprecated fn (#73428)
1 parent 8756f7a commit d19d26f

File tree

25 files changed

+67
-118
lines changed

25 files changed

+67
-118
lines changed

crates/next-api/src/app.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,7 +1155,7 @@ impl AppEndpoint {
11551155
)
11561156
.await?;
11571157
server_assets.insert(server_action_manifest.manifest);
1158-
Some(server_action_manifest.loader.to_resolved().await?)
1158+
Some(server_action_manifest.loader)
11591159
} else {
11601160
None
11611161
};
@@ -1340,7 +1340,7 @@ impl AppEndpoint {
13401340
}
13411341

13421342
AppEndpointOutput::Edge {
1343-
files: app_entry_chunks.to_resolved().await?,
1343+
files: *app_entry_chunks,
13441344
server_assets: ResolvedVc::cell(
13451345
server_assets.iter().cloned().collect::<Vec<_>>(),
13461346
),

crates/next-api/src/dynamic_imports.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ async fn get_next_dynamic_edges(
236236
.iter()
237237
.map(|&referenced_module| async move {
238238
Ok(NextDynamicVisitEntry::Module(
239-
referenced_module.to_resolved().await?,
239+
referenced_module,
240240
referenced_module.ident().to_string().await?,
241241
))
242242
})
@@ -247,7 +247,7 @@ async fn get_next_dynamic_edges(
247247
if let Some(dynamic_imports_map) = *dynamic_imports_map.await? {
248248
edges.reserve_exact(1);
249249
edges.push(NextDynamicVisitEntry::DynamicImportsMap(
250-
dynamic_imports_map.to_resolved().await?,
250+
dynamic_imports_map,
251251
));
252252
}
253253
Ok(Vc::cell(edges))

crates/next-api/src/nft_json.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ impl Asset for NftJsonAsset {
168168
let this = &*self.await?;
169169
let mut result = BTreeSet::new();
170170

171-
let chunk = this.chunk.to_resolved().await?;
171+
let chunk = this.chunk;
172172
let entries = this
173173
.additional_assets
174174
.iter()
@@ -180,7 +180,7 @@ impl Asset for NftJsonAsset {
180180
continue;
181181
}
182182

183-
if chunk == referenced_chunk.to_resolved().await? {
183+
if chunk.eq(referenced_chunk) {
184184
continue;
185185
}
186186

crates/next-api/src/versioned_content_map.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,7 @@ impl VersionedContentMap {
171171
};
172172

173173
if let Some(generate_source_map) =
174-
Vc::try_resolve_sidecast::<Box<dyn GenerateSourceMap>>(*asset.to_resolved().await?)
175-
.await?
174+
ResolvedVc::try_sidecast::<Box<dyn GenerateSourceMap>>(*asset).await?
176175
{
177176
Ok(if let Some(section) = section {
178177
generate_source_map.by_section(section)

crates/next-core/src/app_structure.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,7 +1145,7 @@ async fn directory_tree_to_entrypoints_internal_untraced(
11451145
// Pass down layouts from each tree to apply segment config when adding route.
11461146
let root_layouts = if let Some(layout) = modules.layout {
11471147
let mut layouts = root_layouts.await?.clone_value();
1148-
layouts.push(layout.to_resolved().await?);
1148+
layouts.push(layout);
11491149
ResolvedVc::cell(layouts)
11501150
} else {
11511151
root_layouts
@@ -1168,10 +1168,7 @@ async fn directory_tree_to_entrypoints_internal_untraced(
11681168
app_dir,
11691169
&mut result,
11701170
app_page.complete(PageType::Page)?,
1171-
loader_tree
1172-
.context("loader tree should be created for a page/default")?
1173-
.to_resolved()
1174-
.await?,
1171+
loader_tree.context("loader tree should be created for a page/default")?,
11751172
);
11761173
}
11771174

@@ -1180,7 +1177,7 @@ async fn directory_tree_to_entrypoints_internal_untraced(
11801177
app_dir,
11811178
&mut result,
11821179
app_page.complete(PageType::Route)?,
1183-
route.to_resolved().await?,
1180+
route,
11841181
root_layouts,
11851182
);
11861183
}
@@ -1352,9 +1349,7 @@ async fn directory_tree_to_entrypoints_internal_untraced(
13521349
&mut result,
13531350
page.clone(),
13541351
loader_tree
1355-
.context("loader tree should be created for a page/default")?
1356-
.to_resolved()
1357-
.await?,
1352+
.context("loader tree should be created for a page/default")?,
13581353
);
13591354
}
13601355
}

crates/next-core/src/next_app/app_client_references_chunks.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ pub async fn get_app_client_references_chunks(
142142
}
143143
for client_reference in app_client_references.client_references.iter() {
144144
if let Some(server_component) = client_reference.server_component() {
145-
let server_component = server_component.to_resolved().await?;
146145
client_references_by_server_component
147146
.entry(server_component)
148147
.or_default()
@@ -268,8 +267,7 @@ pub async fn get_app_client_references_chunks(
268267
current_client_chunks = client_chunks;
269268
}
270269

271-
layout_segment_client_chunks
272-
.insert(server_component.to_resolved().await?, client_chunks);
270+
layout_segment_client_chunks.insert(server_component, client_chunks);
273271

274272
for &client_reference_ty in client_reference_types.iter() {
275273
if let ClientReferenceType::EcmascriptClientReference { .. } =

crates/next-core/src/next_client_reference/visit_client_reference.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -354,9 +354,9 @@ impl Visit<VisitClientReferenceNode> for VisitClientReference {
354354
let referenced_modules = primary_referenced_modules(*parent_module).await?;
355355

356356
let referenced_modules = referenced_modules.iter().map(|module| async move {
357-
let module = module.to_resolved().await?;
358357
if let Some(client_reference_module) =
359-
ResolvedVc::try_downcast_type::<EcmascriptClientReferenceModule>(module).await?
358+
ResolvedVc::try_downcast_type::<EcmascriptClientReferenceModule>(*module)
359+
.await?
360360
{
361361
return Ok(VisitClientReferenceNode {
362362
state: node.state,
@@ -385,7 +385,7 @@ impl Visit<VisitClientReferenceNode> for VisitClientReference {
385385
}
386386

387387
if let Some(css_client_reference_asset) =
388-
ResolvedVc::try_downcast_type::<CssModuleAsset>(module).await?
388+
ResolvedVc::try_downcast_type::<CssModuleAsset>(*module).await?
389389
{
390390
return Ok(VisitClientReferenceNode {
391391
state: node.state,
@@ -407,7 +407,7 @@ impl Visit<VisitClientReferenceNode> for VisitClientReference {
407407
}
408408

409409
if let Some(server_component_asset) =
410-
ResolvedVc::try_downcast_type::<NextServerComponentModule>(module).await?
410+
ResolvedVc::try_downcast_type::<NextServerComponentModule>(*module).await?
411411
{
412412
return Ok(VisitClientReferenceNode {
413413
state: VisitClientReferenceNodeState::InServerComponent {
@@ -425,7 +425,7 @@ impl Visit<VisitClientReferenceNode> for VisitClientReference {
425425
return Ok(VisitClientReferenceNode {
426426
state: VisitClientReferenceNodeState::InServerUtil,
427427
ty: VisitClientReferenceNodeType::ServerUtilEntry(
428-
module,
428+
*module,
429429
module.ident().to_string().await?,
430430
),
431431
});
@@ -435,7 +435,7 @@ impl Visit<VisitClientReferenceNode> for VisitClientReference {
435435
Ok(VisitClientReferenceNode {
436436
state: node.state,
437437
ty: VisitClientReferenceNodeType::Internal(
438-
module,
438+
*module,
439439
module.ident().to_string().await?,
440440
),
441441
})

crates/next-core/src/next_dynamic/visit_dynamic.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,7 @@ impl NextDynamicEntries {
3030
.iter()
3131
.copied()
3232
.map(|m| async move {
33-
Ok(VisitDynamicNode::Internal(
34-
m.to_resolved().await?,
35-
m.ident().to_string().await?,
36-
))
33+
Ok(VisitDynamicNode::Internal(m, m.ident().to_string().await?))
3734
})
3835
.try_join()
3936
.await?,
@@ -96,9 +93,8 @@ impl Visit<VisitDynamicNode> for VisitDynamic {
9693
let referenced_modules = primary_referenced_modules(*module).await?;
9794

9895
let referenced_modules = referenced_modules.iter().map(|module| async move {
99-
let module = module.to_resolved().await?;
10096
if let Some(next_dynamic_module) =
101-
ResolvedVc::try_downcast_type::<NextDynamicEntryModule>(module).await?
97+
ResolvedVc::try_downcast_type::<NextDynamicEntryModule>(*module).await?
10298
{
10399
return Ok(VisitDynamicNode::Dynamic(
104100
next_dynamic_module,
@@ -107,7 +103,7 @@ impl Visit<VisitDynamicNode> for VisitDynamic {
107103
}
108104

109105
Ok(VisitDynamicNode::Internal(
110-
module,
106+
*module,
111107
module.ident().to_string().await?,
112108
))
113109
});

turbopack/crates/turbo-tasks/src/vc/resolved.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use std::{
1818
time::Duration,
1919
};
2020

21+
use anyhow::Result;
2122
use auto_hash_map::{AutoMap, AutoSet};
2223
use indexmap::{IndexMap, IndexSet};
2324
use serde::{Deserialize, Serialize};
@@ -40,6 +41,16 @@ where
4041
pub(crate) node: Vc<T>,
4142
}
4243

44+
impl<T> ResolvedVc<T> {
45+
/// This function exists to intercept calls to Vc::to_resolved through dereferencing
46+
/// a ResolvedVc. Converting to Vc and re-resolving it puts unnecessary stress on
47+
/// the turbo tasks engine.
48+
#[deprecated(note = "No point in resolving a vc that is already resolved")]
49+
pub async fn to_resolved(self) -> Result<Self> {
50+
Ok(self)
51+
}
52+
}
53+
4354
impl<T> Copy for ResolvedVc<T> where T: ?Sized {}
4455

4556
impl<T> Clone for ResolvedVc<T>

turbopack/crates/turbopack-browser/src/ecmascript/update.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ pub(super) async fn update_ecmascript_chunk(
4040
for (id, from_hash) in &from.entries_hashes {
4141
if let Some(entry) = entries.get(id) {
4242
if *entry.hash.await? != *from_hash {
43-
let resolved_code = entry.code.to_resolved().await?;
44-
modified.insert(id.clone(), resolved_code);
43+
modified.insert(id.clone(), entry.code);
4544
}
4645
} else {
4746
deleted.insert(id.clone(), *from_hash);
@@ -51,10 +50,7 @@ pub(super) async fn update_ecmascript_chunk(
5150
// Remaining entries are added
5251
for (id, entry) in entries.iter() {
5352
if !from.entries_hashes.contains_key(id) {
54-
added.insert(
55-
id.clone(),
56-
(*entry.hash.await?, entry.code.to_resolved().await?),
57-
);
53+
added.insert(id.clone(), (*entry.hash.await?, entry.code));
5854
}
5955
}
6056

0 commit comments

Comments
 (0)