Adjust fuel consumption to be empty when fuel is 0 (#5013)
Co-authored-by: Jamey Sharp <jsharp@fastly.com> Co-authored-by: Jamey Sharp <jsharp@fastly.com>
This commit is contained in:
@@ -787,7 +787,8 @@ impl Drop for SignalOnDrop {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_fuel<T>(store: &mut Store<T>, fuel: u64) {
|
/// Set the amount of fuel in a store to a given value
|
||||||
|
pub fn set_fuel<T>(store: &mut Store<T>, fuel: u64) {
|
||||||
// Determine the amount of fuel already within the store, if any, and
|
// Determine the amount of fuel already within the store, if any, and
|
||||||
// add/consume as appropriate to set the remaining amount to` fuel`.
|
// add/consume as appropriate to set the remaining amount to` fuel`.
|
||||||
let remaining = store.consume_fuel(0).unwrap();
|
let remaining = store.consume_fuel(0).unwrap();
|
||||||
|
|||||||
@@ -1434,7 +1434,7 @@ impl StoreOpaque {
|
|||||||
.ok()
|
.ok()
|
||||||
.and_then(|fuel| consumed_ptr.checked_add(fuel))
|
.and_then(|fuel| consumed_ptr.checked_add(fuel))
|
||||||
{
|
{
|
||||||
Some(consumed) if consumed < 0 => {
|
Some(consumed) if consumed <= 0 => {
|
||||||
*consumed_ptr = consumed;
|
*consumed_ptr = consumed;
|
||||||
Ok(u64::try_from(-consumed).unwrap())
|
Ok(u64::try_from(-consumed).unwrap())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -138,10 +138,10 @@ fn manual_fuel() {
|
|||||||
assert_eq!(store.consume_fuel(999).unwrap(), 9_000);
|
assert_eq!(store.consume_fuel(999).unwrap(), 9_000);
|
||||||
assert!(store.consume_fuel(10_000).is_err());
|
assert!(store.consume_fuel(10_000).is_err());
|
||||||
assert_eq!(store.consume_fuel(8998).unwrap(), 2);
|
assert_eq!(store.consume_fuel(8998).unwrap(), 2);
|
||||||
assert!(store.consume_fuel(2).is_err());
|
assert!(store.consume_fuel(3).is_err());
|
||||||
assert_eq!(store.consume_fuel(1).unwrap(), 1);
|
assert_eq!(store.consume_fuel(1).unwrap(), 1);
|
||||||
assert!(store.consume_fuel(1).is_err());
|
assert_eq!(store.consume_fuel(1).unwrap(), 0);
|
||||||
assert_eq!(store.consume_fuel(0).unwrap(), 1);
|
assert_eq!(store.consume_fuel(0).unwrap(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -186,7 +186,6 @@ fn manual_edge_cases() {
|
|||||||
store.add_fuel(u64::MAX).unwrap();
|
store.add_fuel(u64::MAX).unwrap();
|
||||||
assert_eq!(store.fuel_consumed(), Some(0));
|
assert_eq!(store.fuel_consumed(), Some(0));
|
||||||
assert!(store.consume_fuel(u64::MAX).is_err());
|
assert!(store.consume_fuel(u64::MAX).is_err());
|
||||||
assert!(store.consume_fuel(i64::MAX as u64).is_err());
|
|
||||||
assert!(store.consume_fuel(i64::MAX as u64 + 1).is_err());
|
assert!(store.consume_fuel(i64::MAX as u64 + 1).is_err());
|
||||||
assert_eq!(store.consume_fuel(i64::MAX as u64 - 1).unwrap(), 1);
|
assert_eq!(store.consume_fuel(i64::MAX as u64).unwrap(), 0);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user