1use anyhow::{bail, Result};
4
5pub fn const_expr_with_func_delta(
6 const_expr: wasmparser::ConstExpr,
7 func_delta: u32,
8) -> Result<wasm_encoder::ConstExpr> {
9 let mut ops = const_expr.get_operators_reader().into_iter();
10
11 let result = match ops.next() {
12 Some(Ok(wasmparser::Operator::I32Const { value })) => {
13 wasm_encoder::ConstExpr::i32_const(value)
14 }
15 Some(Ok(wasmparser::Operator::I64Const { value })) => {
16 wasm_encoder::ConstExpr::i64_const(value)
17 }
18 Some(Ok(wasmparser::Operator::F32Const { value })) => {
19 wasm_encoder::ConstExpr::f32_const(value.bits() as _)
20 }
21 Some(Ok(wasmparser::Operator::F64Const { value })) => {
22 wasm_encoder::ConstExpr::f64_const(value.bits() as _)
23 }
24 Some(Ok(wasmparser::Operator::V128Const { value })) => {
25 wasm_encoder::ConstExpr::v128_const(i128::from_le_bytes(*value.bytes()))
26 }
27 Some(Ok(wasmparser::Operator::RefNull { hty })) => {
28 wasm_encoder::ConstExpr::ref_null(hty.into())
29 }
30 Some(Ok(wasmparser::Operator::RefFunc { function_index })) => {
31 wasm_encoder::ConstExpr::ref_func(function_index + func_delta)
32 }
33 Some(Ok(wasmparser::Operator::GlobalGet { global_index })) => {
34 wasm_encoder::ConstExpr::global_get(global_index)
35 }
36
37 Some(Ok(op)) => bail!("invalid const expression: {op:?}"),
39
40 Some(Err(e)) => return Err(e.into()),
41 None => bail!("empty const expression is invalid"),
42 };
43
44 match (ops.next(), ops.next()) {
45 (Some(Ok(wasmparser::Operator::End)), None) => Ok(result),
46 _ => bail!("invalid const expression"),
47 }
48}