Skip to content

Commit dc7f6c7

Browse files
committed
add len check
1 parent b567639 commit dc7f6c7

File tree

2 files changed

+18
-19
lines changed

2 files changed

+18
-19
lines changed

crates/pico/src/memo_ref.rs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,12 @@ impl<T: 'static> Deref for MemoRef<T> {
127127
NodeKind::Derived(self.derived_node_id),
128128
revision.time_updated,
129129
);
130-
let mut any_ref: &dyn Any = value;
130+
if self.projectors_len == 0 {
131+
return value
132+
.downcast_ref::<T>()
133+
.expect("MemoRef: projector chain produced unexpected type");
134+
}
135+
let mut any_ref = value;
131136
let len = self.projectors_len as usize;
132137
for step in &self.projectors[..len] {
133138
any_ref = (step)(any_ref);
@@ -146,12 +151,11 @@ impl<T: 'static, E: 'static + Clone> MemoRef<Result<T, E>> {
146151
db: self.db,
147152
derived_node_id: self.derived_node_id,
148153
projectors: self.projectors,
149-
projectors_len: self.projectors_len,
154+
projectors_len: self.projectors_len + 1,
150155
phantom: PhantomData,
151156
};
152-
let idx = next.projectors_len as usize;
157+
let idx = self.projectors_len as usize;
153158
next.projectors[idx] = step_result_ok::<T, E>;
154-
next.projectors_len += 1;
155159
Ok(next)
156160
}
157161
Err(err) => Err(err.clone()),
@@ -167,12 +171,11 @@ impl<T: 'static> MemoRef<Option<T>> {
167171
db: self.db,
168172
derived_node_id: self.derived_node_id,
169173
projectors: self.projectors,
170-
projectors_len: self.projectors_len,
174+
projectors_len: self.projectors_len + 1,
171175
phantom: PhantomData,
172176
};
173-
let idx = next.projectors_len as usize;
177+
let idx = self.projectors_len as usize;
174178
next.projectors[idx] = step_option_some::<T>;
175-
next.projectors_len += 1;
176179
Some(next)
177180
}
178181
None => None,
@@ -186,23 +189,21 @@ impl<T0: 'static, T1: 'static> MemoRef<(T0, T1)> {
186189
db: self.db,
187190
derived_node_id: self.derived_node_id,
188191
projectors: self.projectors,
189-
projectors_len: self.projectors_len,
192+
projectors_len: self.projectors_len + 1,
190193
phantom: PhantomData,
191194
};
192-
let idx = left.projectors_len as usize;
195+
let idx = self.projectors_len as usize;
193196
left.projectors[idx] = step_tuple_0::<T0, T1>;
194-
left.projectors_len += 1;
195197

196198
let mut right = MemoRef::<T1> {
197199
db: self.db,
198200
derived_node_id: self.derived_node_id,
199201
projectors: self.projectors,
200-
projectors_len: self.projectors_len,
202+
projectors_len: self.projectors_len + 1,
201203
phantom: PhantomData,
202204
};
203-
let idx = right.projectors_len as usize;
205+
let idx = self.projectors_len as usize;
204206
right.projectors[idx] = step_tuple_1::<T0, T1>;
205-
right.projectors_len += 1;
206207

207208
(left, right)
208209
}

crates/pico/tests/try_some.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ fn try_some_projects_some_value() {
1515
value: "asdf".to_string(),
1616
});
1717

18-
let Some(result) = maybe_first_letter(&db, id).try_some() else {
19-
panic!("expected Some")
20-
};
18+
let result = maybe_first_letter(&db, id)
19+
.try_some()
20+
.expect("expected Some");
2121
assert_eq!(*result, 'a');
2222
}
2323

@@ -50,9 +50,7 @@ fn try_some_never_clones_value() {
5050
let db = TestDatabase::default();
5151

5252
let some_ref = some_value(&db);
53-
let Some(inner) = some_ref.try_some() else {
54-
panic!("expected Some")
55-
};
53+
let inner = some_ref.try_some().expect("expected Some");
5654
let _ = &*inner;
5755

5856
assert!(none_value(&db).try_some().is_none());

0 commit comments

Comments
 (0)