@@ -8,6 +8,7 @@ use crate::{
8
8
plumbing:: MemoIngredientMap ,
9
9
salsa_struct:: SalsaStructInDb ,
10
10
table:: Table ,
11
+ views:: DatabaseDownCaster ,
11
12
zalsa:: { IngredientIndex , MemoIngredientIndex , Zalsa } ,
12
13
zalsa_local:: QueryOrigin ,
13
14
Cycle , Database , Id , Revision ,
@@ -105,6 +106,14 @@ pub struct IngredientImpl<C: Configuration> {
105
106
/// Used to find memos to throw out when we have too many memoized values.
106
107
lru : lru:: Lru ,
107
108
109
+ /// A downcaster from `dyn Database` to `C::DbView`.
110
+ ///
111
+ /// # Safety
112
+ ///
113
+ /// The supplied database must be be the same as the database used to construct the [`Views`]
114
+ /// instances that this downcaster was derived from.
115
+ view_caster : DatabaseDownCaster < C :: DbView > ,
116
+
108
117
/// When `fetch` and friends executes, they return a reference to the
109
118
/// value stored in the memo that is extended to live as long as the `&self`
110
119
/// reference we start with. This means that whenever we remove something
@@ -135,12 +144,14 @@ where
135
144
index : IngredientIndex ,
136
145
memo_ingredient_indices : <C :: SalsaStruct < ' static > as SalsaStructInDb >:: MemoIngredientMap ,
137
146
lru : usize ,
147
+ view_caster : DatabaseDownCaster < C :: DbView > ,
138
148
) -> Self {
139
149
Self {
140
150
index,
141
151
memo_ingredient_indices,
142
152
lru : lru:: Lru :: new ( lru) ,
143
153
deleted_entries : Default :: default ( ) ,
154
+ view_caster,
144
155
}
145
156
}
146
157
@@ -213,13 +224,14 @@ where
213
224
self . index
214
225
}
215
226
216
- fn maybe_changed_after (
227
+ unsafe fn maybe_changed_after (
217
228
& self ,
218
229
db : & dyn Database ,
219
230
input : Id ,
220
231
revision : Revision ,
221
232
) -> MaybeChangedAfter {
222
- let db = db. as_view :: < C :: DbView > ( ) ;
233
+ // SAFETY: The `db` belongs to the ingredient as per caller invariant
234
+ let db = unsafe { self . view_caster . downcast_unchecked ( db) } ;
223
235
self . maybe_changed_after ( db, input, revision)
224
236
}
225
237
@@ -279,7 +291,7 @@ where
279
291
db : & ' db dyn Database ,
280
292
key_index : Id ,
281
293
) -> ( Option < & ' db AccumulatedMap > , InputAccumulatedValues ) {
282
- let db = db . as_view :: < C :: DbView > ( ) ;
294
+ let db = self . view_caster . downcast ( db ) ;
283
295
self . accumulated_map ( db, key_index)
284
296
}
285
297
}
0 commit comments