Skip to content

Commit a720ef8

Browse files
authored
refactor(turbopack): Make invalidator flag explicit (#80414)
### What? Make `#[turbo_tasks::function(invalidator)]` a thing. It's a preparation for the automatic (runtime) detection of statically-analyzable immutable turbo task. ### Why? We need it for an advanced optimization
1 parent 51092ee commit a720ef8

12 files changed

Lines changed: 61 additions & 14 deletions

File tree

crates/next-api/src/project.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ impl ProjectContainer {
423423

424424
#[turbo_tasks::value_impl]
425425
impl ProjectContainer {
426-
#[turbo_tasks::function]
426+
#[turbo_tasks::function(invalidator)]
427427
pub async fn project(&self) -> Result<Vc<Project>> {
428428
let env_map: Vc<EnvMap>;
429429
let next_config;

turbopack/crates/turbo-tasks-fs/src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ impl Debug for DiskFileSystem {
551551

552552
#[turbo_tasks::value_impl]
553553
impl FileSystem for DiskFileSystem {
554-
#[turbo_tasks::function(fs)]
554+
#[turbo_tasks::function(fs, invalidator)]
555555
async fn read(&self, fs_path: Vc<FileSystemPath>) -> Result<Vc<FileContent>> {
556556
mark_session_dependent();
557557
let full_path = self.to_sys_path(fs_path).await?;
@@ -577,7 +577,7 @@ impl FileSystem for DiskFileSystem {
577577
Ok(content.cell())
578578
}
579579

580-
#[turbo_tasks::function(fs)]
580+
#[turbo_tasks::function(fs, invalidator)]
581581
async fn raw_read_dir(&self, fs_path: Vc<FileSystemPath>) -> Result<Vc<RawDirectoryContent>> {
582582
mark_session_dependent();
583583
let full_path = self.to_sys_path(fs_path).await?;
@@ -632,7 +632,7 @@ impl FileSystem for DiskFileSystem {
632632
Ok(RawDirectoryContent::new(entries))
633633
}
634634

635-
#[turbo_tasks::function(fs)]
635+
#[turbo_tasks::function(fs, invalidator)]
636636
async fn read_link(&self, fs_path: Vc<FileSystemPath>) -> Result<Vc<LinkContent>> {
637637
mark_session_dependent();
638638
let full_path = self.to_sys_path(fs_path).await?;
@@ -718,7 +718,7 @@ impl FileSystem for DiskFileSystem {
718718
.cell())
719719
}
720720

721-
#[turbo_tasks::function(fs)]
721+
#[turbo_tasks::function(fs, invalidator)]
722722
async fn write(&self, fs_path: Vc<FileSystemPath>, content: Vc<FileContent>) -> Result<()> {
723723
mark_session_dependent();
724724
let full_path = self.to_sys_path(fs_path).await?;
@@ -843,7 +843,7 @@ impl FileSystem for DiskFileSystem {
843843
Ok(())
844844
}
845845

846-
#[turbo_tasks::function(fs)]
846+
#[turbo_tasks::function(fs, invalidator)]
847847
async fn write_link(&self, fs_path: Vc<FileSystemPath>, target: Vc<LinkContent>) -> Result<()> {
848848
mark_session_dependent();
849849
let full_path = self.to_sys_path(fs_path).await?;
@@ -962,7 +962,7 @@ impl FileSystem for DiskFileSystem {
962962
Ok(())
963963
}
964964

965-
#[turbo_tasks::function(fs)]
965+
#[turbo_tasks::function(fs, invalidator)]
966966
async fn metadata(&self, fs_path: Vc<FileSystemPath>) -> Result<Vc<FileMeta>> {
967967
mark_session_dependent();
968968
let full_path = self.to_sys_path(fs_path).await?;

turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
error: unexpected token, expected one of: "fs", "network", "operation", "local"
1+
error: unexpected token, expected one of: "fs", "network", "operation", "local", "invalidator"
22
--> tests/function/fail_attribute_invalid_args.rs:9:25
33
|
44
9 | #[turbo_tasks::function(invalid_argument)]

turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
error: unexpected token, expected one of: "fs", "network", "operation", "local"
1+
error: unexpected token, expected one of: "fs", "network", "operation", "local", "invalidator"
22
--> tests/function/fail_attribute_invalid_args_inherent_impl.rs:14:29
33
|
44
14 | #[turbo_tasks::function(invalid_argument)]

turbopack/crates/turbo-tasks-macros/src/func.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,9 @@ pub struct FunctionArguments {
733733
/// task-local state. The function call itself will not be cached, but cells will be created on
734734
/// the parent task.
735735
pub local: Option<Span>,
736+
/// If true, the function will be allowed to call `get_invalidator` . If this is false, the
737+
/// `get_invalidator` function will panic on calls.
738+
pub invalidator: Option<Span>,
736739
}
737740

738741
impl Parse for FunctionArguments {
@@ -760,11 +763,14 @@ impl Parse for FunctionArguments {
760763
("local", Meta::Path(_)) => {
761764
parsed_args.local = Some(meta.span());
762765
}
766+
("invalidator", Meta::Path(_)) => {
767+
parsed_args.invalidator = Some(meta.span());
768+
}
763769
(_, meta) => {
764770
return Err(syn::Error::new_spanned(
765771
meta,
766772
"unexpected token, expected one of: \"fs\", \"network\", \"operation\", \
767-
\"local\"",
773+
\"local\", \"invalidator\"",
768774
));
769775
}
770776
}
@@ -1092,6 +1098,7 @@ pub struct NativeFn {
10921098
pub is_self_used: bool,
10931099
pub filter_trait_call_args: Option<FilterTraitCallArgsTokens>,
10941100
pub local: bool,
1101+
pub invalidator: bool,
10951102
}
10961103

10971104
impl NativeFn {
@@ -1107,6 +1114,7 @@ impl NativeFn {
11071114
is_self_used,
11081115
filter_trait_call_args,
11091116
local,
1117+
invalidator,
11101118
} = self;
11111119

11121120
if *is_method {
@@ -1133,6 +1141,7 @@ impl NativeFn {
11331141
#function_path_string.to_owned(),
11341142
turbo_tasks::macro_helpers::FunctionMeta {
11351143
local: #local,
1144+
invalidator: #invalidator,
11361145
},
11371146
#arg_filter,
11381147
#function_path,
@@ -1147,6 +1156,7 @@ impl NativeFn {
11471156
#function_path_string.to_owned(),
11481157
turbo_tasks::macro_helpers::FunctionMeta {
11491158
local: #local,
1159+
invalidator: #invalidator,
11501160
},
11511161
#arg_filter,
11521162
#function_path,
@@ -1162,6 +1172,7 @@ impl NativeFn {
11621172
#function_path_string.to_owned(),
11631173
turbo_tasks::macro_helpers::FunctionMeta {
11641174
local: #local,
1175+
invalidator: #invalidator,
11651176
},
11661177
#function_path,
11671178
)

turbopack/crates/turbo-tasks-macros/src/function_macro.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ pub fn function(args: TokenStream, input: TokenStream) -> TokenStream {
4242
.inspect_err(|err| errors.push(err.to_compile_error()))
4343
.unwrap_or_default();
4444
let local = args.local.is_some();
45+
let invalidator = args.invalidator.is_some();
4546
let is_self_used = args.operation.is_some() || is_self_used(&block);
4647

4748
let Some(turbo_fn) = TurboFn::new(&sig, DefinitionContext::NakedFn, args) else {
@@ -65,6 +66,7 @@ pub fn function(args: TokenStream, input: TokenStream) -> TokenStream {
6566
is_self_used,
6667
filter_trait_call_args: None, // not a trait method
6768
local,
69+
invalidator,
6870
};
6971
let native_function_ident = get_native_function_ident(ident);
7072
let native_function_ty = native_fn.ty();

turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream {
8484
continue;
8585
};
8686
let local = func_args.local.is_some();
87+
let invalidator = func_args.invalidator.is_some();
8788
let is_self_used = func_args.operation.is_some() || is_self_used(block);
8889

8990
let Some(turbo_fn) =
@@ -106,6 +107,7 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream {
106107
is_self_used,
107108
filter_trait_call_args: None, // not a trait method
108109
local,
110+
invalidator,
109111
};
110112

111113
let native_function_ident = get_inherent_impl_function_ident(ty_ident, ident);
@@ -191,6 +193,7 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream {
191193
};
192194

193195
let local = func_args.local.is_some();
196+
let invalidator = func_args.invalidator.is_some();
194197
let is_self_used = func_args.operation.is_some() || is_self_used(block);
195198

196199
let Some(turbo_fn) =
@@ -223,6 +226,7 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream {
223226
is_self_used,
224227
filter_trait_call_args: turbo_fn.filter_trait_call_args(),
225228
local,
229+
invalidator,
226230
};
227231

228232
let native_function_ident =

turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream {
139139
// argument. (This could be fixed)
140140
// - This only makes sense when a default implementation is present.
141141
local: false,
142+
invalidator: func_args.invalidator.is_some(),
142143
};
143144

144145
let native_function_ident = get_trait_default_impl_function_ident(trait_ident, ident);

turbopack/crates/turbo-tasks-testing/tests/read_ref_cell.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ impl Counter {
7070

7171
#[turbo_tasks::value_impl]
7272
impl Counter {
73-
#[turbo_tasks::function]
73+
#[turbo_tasks::function(invalidator)]
7474
async fn get_value(&self) -> Result<Vc<CounterValue>> {
7575
let mut lock = self.value.lock().unwrap();
7676
lock.1 = Some(get_invalidator());

turbopack/crates/turbo-tasks-testing/tests/trait_ref_cell.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ trait CounterTrait {
8585

8686
#[turbo_tasks::value_impl]
8787
impl CounterTrait for Counter {
88-
#[turbo_tasks::function]
88+
#[turbo_tasks::function(invalidator)]
8989
async fn get_value(&self) -> Result<Vc<CounterValue>> {
9090
let mut lock = self.value.lock().unwrap();
9191
lock.1 = Some(get_invalidator());

0 commit comments

Comments
 (0)