diff --git a/crates/c-api/include/wasmtime/trap.h b/crates/c-api/include/wasmtime/trap.h index 6346cf443b..2d2e20407c 100644 --- a/crates/c-api/include/wasmtime/trap.h +++ b/crates/c-api/include/wasmtime/trap.h @@ -46,6 +46,8 @@ enum wasmtime_trap_code_enum { WASMTIME_TRAP_CODE_UNREACHABLE_CODE_REACHED, /// Execution has potentially run too long and may be interrupted. WASMTIME_TRAP_CODE_INTERRUPT, + /// Execution has run out of the configured fuel amount. + WASMTIME_TRAP_CODE_OUT_OF_FUEL, }; /** diff --git a/crates/c-api/src/trap.rs b/crates/c-api/src/trap.rs index 479f30f430..44b9dfb604 100644 --- a/crates/c-api/src/trap.rs +++ b/crates/c-api/src/trap.rs @@ -133,6 +133,8 @@ pub extern "C" fn wasmtime_trap_code(raw: &wasm_trap_t, code: &mut u8) -> bool { Trap::BadConversionToInteger => 8, Trap::UnreachableCodeReached => 9, Trap::Interrupt => 10, + Trap::OutOfFuel => 11, + Trap::AlwaysTrapAdapter => unreachable!("component model not supported"), _ => unreachable!(), }; true diff --git a/examples/fuel.c b/examples/fuel.c index 9d0fb3bc46..9b0eaa6b09 100644 --- a/examples/fuel.c +++ b/examples/fuel.c @@ -100,6 +100,11 @@ int main() { wasmtime_val_t results[1]; error = wasmtime_func_call(context, &fib.of.func, params, 1, results, 1, &trap); if (error != NULL || trap != NULL) { + if (trap != NULL) { + wasmtime_trap_code_t code; + assert(wasmtime_trap_code(trap, &code)); + assert(code == WASMTIME_TRAP_CODE_OUT_OF_FUEL); + } printf("Exhausted fuel computing fib(%d)\n", n); break; } diff --git a/examples/fuel.rs b/examples/fuel.rs index f47a7a16d4..acca9f2d96 100644 --- a/examples/fuel.rs +++ b/examples/fuel.rs @@ -20,7 +20,8 @@ fn main() -> Result<()> { let fuel_before = store.fuel_consumed().unwrap(); let output = match fibonacci.call(&mut store, n) { Ok(v) => v, - Err(_) => { + Err(e) => { + assert_eq!(e.downcast::()?, Trap::OutOfFuel); println!("Exhausted fuel computing fib({})", n); break; }