Skip to content

Commit e08ec1a

Browse files
authored
Remove unnecessary backdate field macros (#1069)
1 parent ee70ab6 commit e08ec1a

10 files changed

Lines changed: 52 additions & 109 deletions

File tree

components/salsa-macro-rules/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
1515
mod gate_accumulated;
1616
mod macro_if;
17-
mod maybe_backdate;
1817
mod maybe_default;
1918
mod return_mode;
2019
#[cfg(feature = "accumulator")]

components/salsa-macro-rules/src/maybe_backdate.rs

Lines changed: 0 additions & 35 deletions
This file was deleted.

components/salsa-macro-rules/src/maybe_default.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
#[macro_export]
55
macro_rules! maybe_default {
66
(
7-
($return_mode:ident, $maybe_backdate:ident, default),
7+
($return_mode:ident, default),
88
$field_ty:ty,
99
$field_ref_expr:expr,
1010
) => {
1111
<$field_ty>::default()
1212
};
1313

1414
(
15-
($return_mode:ident, $maybe_backdate:ident, required),
15+
($return_mode:ident, required),
1616
$field_ty:ty,
1717
$field_ref_expr:expr,
1818
) => {
@@ -22,11 +22,11 @@ macro_rules! maybe_default {
2222

2323
#[macro_export]
2424
macro_rules! maybe_default_tt {
25-
(($return_mode:ident, $maybe_backdate:ident, default) => $($t:tt)*) => {
25+
(($return_mode:ident, default) => $($t:tt)*) => {
2626
$($t)*
2727
};
2828

29-
(($return_mode:ident, $maybe_backdate:ident, required) => $($t:tt)*) => {
29+
(($return_mode:ident, required) => $($t:tt)*) => {
3030

3131
};
3232
}

components/salsa-macro-rules/src/return_mode.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,47 +4,47 @@
44
#[macro_export]
55
macro_rules! return_mode_expression {
66
(
7-
(copy, $maybe_backdate:ident, $maybe_default:ident),
7+
(copy, $maybe_default:ident),
88
$field_ty:ty,
99
$field_ref_expr:expr,
1010
) => {
1111
*$field_ref_expr
1212
};
1313

1414
(
15-
(clone, $maybe_backdate:ident, $maybe_default:ident),
15+
(clone, $maybe_default:ident),
1616
$field_ty:ty,
1717
$field_ref_expr:expr,
1818
) => {
1919
::core::clone::Clone::clone($field_ref_expr)
2020
};
2121

2222
(
23-
(ref, $maybe_backdate:ident, $maybe_default:ident),
23+
(ref, $maybe_default:ident),
2424
$field_ty:ty,
2525
$field_ref_expr:expr,
2626
) => {
2727
$field_ref_expr
2828
};
2929

3030
(
31-
(deref, $maybe_backdate:ident, $maybe_default:ident),
31+
(deref, $maybe_default:ident),
3232
$field_ty:ty,
3333
$field_ref_expr:expr,
3434
) => {
3535
::core::ops::Deref::deref($field_ref_expr)
3636
};
3737

3838
(
39-
(as_ref, $maybe_backdate:ident, $maybe_default:ident),
39+
(as_ref, $maybe_default:ident),
4040
$field_ty:ty,
4141
$field_ref_expr:expr,
4242
) => {
4343
::salsa::SalsaAsRef::as_ref($field_ref_expr)
4444
};
4545

4646
(
47-
(as_deref, $maybe_backdate:ident, $maybe_default:ident),
47+
(as_deref, $maybe_default:ident),
4848
$field_ty:ty,
4949
$field_ref_expr:expr,
5050
) => {
@@ -55,47 +55,47 @@ macro_rules! return_mode_expression {
5555
#[macro_export]
5656
macro_rules! return_mode_ty {
5757
(
58-
(copy, $maybe_backdate:ident, $maybe_default:ident),
58+
(copy, $maybe_default:ident),
5959
$db_lt:lifetime,
6060
$field_ty:ty
6161
) => {
6262
$field_ty
6363
};
6464

6565
(
66-
(clone, $maybe_backdate:ident, $maybe_default:ident),
66+
(clone, $maybe_default:ident),
6767
$db_lt:lifetime,
6868
$field_ty:ty
6969
) => {
7070
$field_ty
7171
};
7272

7373
(
74-
(ref, $maybe_backdate:ident, $maybe_default:ident),
74+
(ref, $maybe_default:ident),
7575
$db_lt:lifetime,
7676
$field_ty:ty
7777
) => {
7878
& $db_lt $field_ty
7979
};
8080

8181
(
82-
(deref, $maybe_backdate:ident, $maybe_default:ident),
82+
(deref, $maybe_default:ident),
8383
$db_lt:lifetime,
8484
$field_ty:ty
8585
) => {
8686
& $db_lt <$field_ty as ::core::ops::Deref>::Target
8787
};
8888

8989
(
90-
(as_ref, $maybe_backdate:ident, $maybe_default:ident),
90+
(as_ref, $maybe_default:ident),
9191
$db_lt:lifetime,
9292
$field_ty:ty
9393
) => {
9494
<$field_ty as ::salsa::SalsaAsRef>::AsRef<$db_lt>
9595
};
9696

9797
(
98-
(as_deref, $maybe_backdate:ident, $maybe_default:ident),
98+
(as_deref, $maybe_default:ident),
9999
$db_lt:lifetime,
100100
$field_ty:ty
101101
) => {

components/salsa-macro-rules/src/setup_tracked_fn.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ macro_rules! setup_tracked_fn {
9292
$vis fn $fn_name<$db_lt>(
9393
$db: &$db_lt dyn $Db,
9494
$($input_id: $input_ty,)*
95-
) -> ::salsa::plumbing::return_mode_ty!(($return_mode, __, __), $db_lt, $output_ty) {
95+
) -> ::salsa::plumbing::return_mode_ty!(($return_mode, __), $db_lt, $output_ty) {
9696
use ::salsa::plumbing as $zalsa;
9797

9898
struct $Configuration;
@@ -483,7 +483,7 @@ macro_rules! setup_tracked_fn {
483483
}
484484
};
485485

486-
$zalsa::return_mode_expression!(($return_mode, __, __), $output_ty, result,)
486+
$zalsa::return_mode_expression!(($return_mode, __), $output_ty, result,)
487487
})
488488
}
489489

components/salsa-macro-rules/src/setup_tracked_struct.rs

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -58,24 +58,17 @@ macro_rules! setup_tracked_struct {
5858

5959
// A set of "field options" for each tracked field.
6060
//
61-
// Each field option is a tuple `(return_mode, maybe_backdate)` where:
61+
// Each field option is a tuple `(return_mode, maybe_default)` where:
6262
//
6363
// * `return_mode` is an identifier as specified in `salsa_macros::options::Option::returns`
64-
// * `maybe_backdate` is either the identifier `backdate` or `no_backdate`
64+
// * `maybe_default` is either the identifier `default` or `required`
6565
//
6666
// These are used to drive conditional logic for each field via recursive macro invocation
6767
// (see e.g. @return_mode below).
6868
tracked_options: [$($tracked_option:tt),*],
6969

7070
// A set of "field options" for each untracked field.
71-
//
72-
// Each field option is a tuple `(return_mode, maybe_backdate)` where:
73-
//
74-
// * `return_mode` is an identifier as specified in `salsa_macros::options::Option::returns`
75-
// * `maybe_backdate` is either the identifier `backdate` or `no_backdate`
76-
//
77-
// These are used to drive conditional logic for each field via recursive macro invocation
78-
// (see e.g. @return_mode below).
71+
// (see docs for `tracked_options`).
7972
untracked_options: [$($untracked_option:tt),*],
8073

8174
// Attrs for each field.
@@ -177,15 +170,9 @@ macro_rules! setup_tracked_struct {
177170
use $zalsa::UpdateFallback as _;
178171
unsafe {
179172
$(
180-
$crate::maybe_backdate!(
181-
$tracked_option,
182-
$tracked_maybe_update,
183-
(*old_fields).$absolute_tracked_index,
184-
new_fields.$absolute_tracked_index,
185-
revisions[$relative_tracked_index],
186-
current_revision,
187-
$zalsa,
188-
);
173+
if $tracked_maybe_update(std::ptr::addr_of_mut!((*old_fields).$absolute_tracked_index), new_fields.$absolute_tracked_index) {
174+
revisions[$relative_tracked_index].store(current_revision);
175+
}
189176
)*;
190177

191178
// If any untracked field has changed, return `true`, indicating that the tracked struct

components/salsa-macros/src/salsa_struct.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -521,18 +521,12 @@ impl<'s> SalsaField<'s> {
521521
fn options(&self) -> TokenStream {
522522
let returns = &self.returns;
523523

524-
let backdate_ident = if self.has_no_eq_attr {
525-
syn::Ident::new("no_backdate", Span::call_site())
526-
} else {
527-
syn::Ident::new("backdate", Span::call_site())
528-
};
529-
530524
let default_ident = if self.has_default_attr {
531525
syn::Ident::new("default", Span::call_site())
532526
} else {
533527
syn::Ident::new("required", Span::call_site())
534528
};
535529

536-
quote!((#returns, #backdate_ident, #default_ident))
530+
quote!((#returns, #default_ident))
537531
}
538532
}

components/salsa-macros/src/tracked_struct.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use syn::spanned::Spanned;
44
use crate::db_lifetime;
55
use crate::hygiene::Hygiene;
66
use crate::options::{AllowedOptions, AllowedPersistOptions, Options};
7-
use crate::salsa_struct::{SalsaStruct, SalsaStructAllowedOptions};
7+
use crate::salsa_struct::{SalsaField, SalsaStruct, SalsaStructAllowedOptions};
88

99
/// For an entity struct `Foo` with fields `f1: T1, ..., fN: TN`, we generate...
1010
///
@@ -126,22 +126,23 @@ impl Macro {
126126
let tracked_field_unused_attrs = salsa_struct.tracked_field_attrs();
127127
let untracked_field_unused_attrs = salsa_struct.untracked_field_attrs();
128128

129-
let tracked_maybe_update = salsa_struct.tracked_fields_iter().map(|(_, field)| {
129+
let field_to_maybe_update = |(_, field): (usize, &SalsaField<'_>)| {
130130
let field_ty = &field.field.ty;
131-
if let Some((with_token, maybe_update)) = &field.maybe_update_attr {
131+
if field.has_no_eq_attr {
132+
quote! {(#zalsa::always_update::<#field_ty>)}
133+
} else if let Some((with_token, maybe_update)) = &field.maybe_update_attr {
132134
quote_spanned! { with_token.span() => ({ let maybe_update: unsafe fn(*mut #field_ty, #field_ty) -> bool = #maybe_update; maybe_update }) }
133135
} else {
134136
quote! {(#zalsa::UpdateDispatch::<#field_ty>::maybe_update)}
135137
}
136-
});
137-
let untracked_maybe_update = salsa_struct.untracked_fields_iter().map(|(_, field)| {
138-
let field_ty = &field.field.ty;
139-
if let Some((with_token, maybe_update)) = &field.maybe_update_attr {
140-
quote_spanned! { with_token.span() => ({ let maybe_update: unsafe fn(*mut #field_ty, #field_ty) -> bool = #maybe_update; maybe_update }) }
141-
} else {
142-
quote! {(#zalsa::UpdateDispatch::<#field_ty>::maybe_update)}
143-
}
144-
});
138+
};
139+
140+
let tracked_maybe_update = salsa_struct
141+
.tracked_fields_iter()
142+
.map(field_to_maybe_update);
143+
let untracked_maybe_update = salsa_struct
144+
.untracked_fields_iter()
145+
.map(field_to_maybe_update);
145146

146147
let persist = self.args.persist();
147148
let serialize_fn = salsa_struct.serialize_fn();

src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,10 @@ pub mod plumbing {
8585
#[cfg(feature = "accumulator")]
8686
pub use salsa_macro_rules::setup_accumulator_impl;
8787
pub use salsa_macro_rules::{
88-
gate_accumulated, macro_if, maybe_backdate, maybe_default, maybe_default_tt,
89-
return_mode_expression, return_mode_ty, setup_input_struct, setup_interned_struct,
90-
setup_tracked_assoc_fn_body, setup_tracked_fn, setup_tracked_method_body,
91-
setup_tracked_struct, unexpected_cycle_initial, unexpected_cycle_recovery,
88+
gate_accumulated, macro_if, maybe_default, maybe_default_tt, return_mode_expression,
89+
return_mode_ty, setup_input_struct, setup_interned_struct, setup_tracked_assoc_fn_body,
90+
setup_tracked_fn, setup_tracked_method_body, setup_tracked_struct,
91+
unexpected_cycle_initial, unexpected_cycle_recovery,
9292
};
9393

9494
#[cfg(feature = "accumulator")]

src/update.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ use std::path::PathBuf;
88
#[cfg(feature = "rayon")]
99
use rayon::iter::Either;
1010

11-
use crate::revision::AtomicRevision;
1211
use crate::sync::Arc;
13-
use crate::Revision;
1412

1513
/// This is used by the macro generated code.
1614
/// If possible, uses `Update` trait, but else requires `'static`.
@@ -101,17 +99,16 @@ where
10199
}
102100
}
103101

104-
/// Helper for generated code. Updates `*old_pointer` with `new_value`
105-
/// and updates `*old_revision` with `new_revision.` Used for fields
106-
/// tagged with `#[no_eq]`
107-
pub fn always_update<T>(
108-
old_revision: &AtomicRevision,
109-
new_revision: Revision,
110-
old_pointer: &mut T,
111-
new_value: T,
112-
) {
113-
old_revision.store(new_revision);
114-
*old_pointer = new_value;
102+
/// Helper for generated code. Updates `*old_pointer` with `new_value`.
103+
/// Used for fields tagged with `#[no_eq]`
104+
///
105+
/// # Safety
106+
///
107+
/// See `Update::maybe_update`
108+
pub unsafe fn always_update<T>(old_pointer: *mut T, new_value: T) -> bool {
109+
unsafe { *old_pointer = new_value };
110+
111+
true
115112
}
116113

117114
/// # Safety

0 commit comments

Comments
 (0)