Coverage Report

Created: 2026-08-28 08:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wasm-tools/crates/wasmparser/src/binary_reader.rs
Line
Count
Source
1
/* Copyright 2018 Mozilla Foundation
2
 *
3
 * Licensed under the Apache License, Version 2.0 (the "License");
4
 * you may not use this file except in compliance with the License.
5
 * You may obtain a copy of the License at
6
 *
7
 *     http://www.apache.org/licenses/LICENSE-2.0
8
 *
9
 * Unless required by applicable law or agreed to in writing, software
10
 * distributed under the License is distributed on an "AS IS" BASIS,
11
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
 * See the License for the specific language governing permissions and
13
 * limitations under the License.
14
 */
15
16
use crate::offsets::*;
17
use crate::prelude::*;
18
use crate::{limits::*, *};
19
use core::marker;
20
use core::ops::Range;
21
use core::str;
22
23
pub(crate) const WASM_MAGIC_NUMBER: &[u8; 4] = b"\0asm";
24
25
/// A binary reader of the WebAssembly structures and types.
26
#[derive(Clone, Debug, Hash)]
27
pub struct BinaryReader<'a> {
28
    buffer: &'a [u8],
29
    position: usize,
30
    original_offset: u64,
31
32
    // When the `features` feature is disabled then the `WasmFeatures` type
33
    // still exists but this field is still omitted. When `features` is
34
    // disabled then the only constructor of this type is `BinaryReader::new`
35
    // which documents all known features being active. All known features
36
    // being active isn't represented by `WasmFeatures` when the feature is
37
    // disabled so the field is omitted here to prevent accidentally using the
38
    // wrong listing of features.
39
    //
40
    // Feature accessors are defined by `foreach_wasm_feature!` below with a
41
    // method-per-feature on `BinaryReader` which when the `features` feature
42
    // is disabled returns `true` by default.
43
    #[cfg(feature = "features")]
44
    features: WasmFeatures,
45
}
46
47
impl<'a> BinaryReader<'a> {
48
    /// Creates a new binary reader which will parse the `data` provided.
49
    ///
50
    /// The `original_offset` provided is used for byte offsets in errors that
51
    /// are generated. That offset is added to the current position in `data`.
52
    /// This can be helpful when `data` is just a window of a view into a larger
53
    /// wasm binary perhaps not even entirely stored locally.
54
    ///
55
    /// The returned binary reader will have all features known to this crate
56
    /// enabled. To reject binaries that aren't valid unless a certain feature
57
    /// is enabled use the [`BinaryReader::new_features`] constructor instead.
58
    ///
59
    /// # Panics
60
    ///
61
    /// If the data slice is too large, such that `original_offset + data.len()`
62
    /// would overflow in `u64` arithmetic, this panics.
63
    /// Use [`Self::max_data_len`] if you need to check the length limit.
64
1.07M
    pub fn new(data: &[u8], original_offset: u64) -> BinaryReader<'_> {
65
1.07M
        let max_len = Self::max_data_len(original_offset);
66
1.07M
        if max_len < data.len() {
67
0
            panic_too_many_bytes(original_offset, data.len(), max_len);
68
1.07M
        }
69
1.07M
        BinaryReader {
70
1.07M
            buffer: data,
71
1.07M
            position: 0,
72
1.07M
            original_offset,
73
1.07M
            #[cfg(feature = "features")]
74
1.07M
            features: WasmFeatures::all(),
75
1.07M
        }
76
1.07M
    }
77
78
    /// Creates a new binary reader which will parse the `data` provided.
79
    ///
80
    /// The `original_offset` provided is used for byte offsets in errors that
81
    /// are generated. That offset is added to the current position in `data`.
82
    /// This can be helpful when `data` is just a window of a view into a larger
83
    /// wasm binary perhaps not even entirely stored locally.
84
    ///
85
    /// The `features` argument provided controls which WebAssembly features are
86
    /// active when parsing this data. Wasm features typically don't affect
87
    /// parsing too much and are generally more applicable during
88
    /// validation, but features and proposals will often reinterpret
89
    /// previously-invalid constructs as now-valid things meaning something
90
    /// slightly different. This means that invalid bytes before a feature may
91
    /// now be interpreted differently after a feature is implemented. This
92
    /// means that the set of activated features can affect what errors are
93
    /// generated and when they are generated.
94
    ///
95
    /// In general it's safe to pass `WasmFeatures::all()` here. There's no
96
    /// downside to enabling all features while parsing and only enabling a
97
    /// subset of features during validation.
98
    ///
99
    /// Note that the activated set of features does not guarantee that
100
    /// `BinaryReader` will return an error for disabled features. For example
101
    /// if SIMD is disabled then SIMD instructions will still be parsed via
102
    /// [`BinaryReader::visit_operator`]. Validation must still be performed to
103
    /// provide a strict guarantee that if a feature is disabled that a binary
104
    /// doesn't leverage the feature. The activated set of features here instead
105
    /// only affects locations where preexisting bytes are reinterpreted in
106
    /// different ways with future proposals, such as the `memarg` moving from a
107
    /// 32-bit offset to a 64-bit offset with the `memory64` proposal.
108
    ///
109
    /// # Panics
110
    ///
111
    /// If the data slice is too large, such that `original_offset + data.len()`
112
    /// would overflow in `u64` arithmetic, this panics.
113
    /// Use [`Self::max_data_len`] if you need to check the length limit.
114
    #[cfg(feature = "features")]
115
0
    pub fn new_features(
116
0
        data: &[u8],
117
0
        original_offset: u64,
118
0
        features: WasmFeatures,
119
0
    ) -> BinaryReader<'_> {
120
0
        let max_len = max_data_len(original_offset, u64::MAX);
121
0
        if max_len < data.len() {
122
0
            panic_too_many_bytes(original_offset, data.len(), max_len);
123
0
        }
124
0
        BinaryReader {
125
0
            buffer: data,
126
0
            position: 0,
127
0
            original_offset,
128
0
            features,
129
0
        }
130
0
    }
131
132
    /// Returns the maximum length of a slice of data that can be passed when
133
    /// constructing a new binary reader without panicking.
134
1.07M
    pub fn max_data_len(original_offset: u64) -> usize {
135
1.07M
        max_data_len(original_offset, u64::MAX)
136
1.07M
    }
137
138
    /// "Shrinks" this binary reader to retain only the buffer left-to-parse.
139
    ///
140
    /// The primary purpose of this method is to change the return value of the
141
    /// `range()` method. That method returns the range of the original buffer
142
    /// within the wasm binary so calling `range()` on the returned
143
    /// `BinaryReader` will return a smaller range than if `range()` is called
144
    /// on `self`.
145
    ///
146
    /// Otherwise parsing values from either `self` or the return value should
147
    /// return the same thing.
148
593
    pub(crate) fn shrink(&self) -> BinaryReader<'a> {
149
593
        let buffer = &self.buffer[self.position..];
150
593
        let original_offset = self.original_position();
151
593
        BinaryReader {
152
593
            buffer,
153
593
            position: 0,
154
593
            original_offset,
155
593
            #[cfg(feature = "features")]
156
593
            features: self.features,
157
593
        }
158
593
    }
159
160
    /// Gets the original position of the binary reader.
161
    #[inline]
162
164M
    pub fn original_position(&self) -> u64 {
163
164M
        self.original_offset + self.position as u64
164
164M
    }
<wasmparser::binary_reader::BinaryReader>::original_position
Line
Count
Source
162
6.36M
    pub fn original_position(&self) -> u64 {
163
6.36M
        self.original_offset + self.position as u64
164
6.36M
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::original_position
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::original_position
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::original_position
<wasmparser::binary_reader::BinaryReader>::original_position
Line
Count
Source
162
157M
    pub fn original_position(&self) -> u64 {
163
157M
        self.original_offset + self.position as u64
164
157M
    }
165
166
    /// Returns the currently active set of wasm features that this reader is
167
    /// using while parsing.
168
    ///
169
    /// For more information see [`BinaryReader::new`].
170
    #[cfg(feature = "features")]
171
4.21k
    pub fn features(&self) -> WasmFeatures {
172
4.21k
        self.features
173
4.21k
    }
174
175
    /// Sets the wasm features active while parsing to the `features` specified.
176
    ///
177
    /// For more information see [`BinaryReader::new`].
178
    #[cfg(feature = "features")]
179
1.38M
    pub fn set_features(&mut self, features: WasmFeatures) {
180
1.38M
        self.features = features;
181
1.38M
    }
182
183
    /// Returns a range from the starting offset to the end of the buffer.
184
1.22M
    pub fn range(&self) -> Range<u64> {
185
1.22M
        self.original_offset..(self.original_offset + self.max_position() as u64)
186
1.22M
    }
187
188
8.54M
    pub(crate) fn remaining_buffer(&self) -> &'a [u8] {
189
8.54M
        &self.buffer[self.position..]
190
8.54M
    }
191
192
    /// Returns a range from the current position to the end of the buffer.
193
0
    pub fn remaining_range(&self) -> Range<u64> {
194
0
        self.original_position()..(self.original_offset + self.max_position() as u64)
195
0
    }
196
197
113M
    fn max_position(&self) -> usize {
198
        // constructor enforces:
199
        // self.buffer.len() <= max_memory_offset(u64::MAX - self.original_offset, self.buffer.len())
200
113M
        self.buffer.len()
201
113M
    }
202
203
34.9M
    fn ensure_has_byte(&self) -> Result<()> {
204
34.9M
        if self.position < self.max_position() {
205
34.9M
            Ok(())
206
        } else {
207
0
            Err(self.eof_err(1))
208
        }
209
34.9M
    }
210
211
    /// Returns the offset past `len` bytes on success
212
13.0M
    pub(crate) fn ensure_has_bytes(&self, len: usize) -> Result<usize> {
213
13.0M
        let remaining = self.bytes_remaining();
214
13.0M
        match len <= remaining {
215
12.6M
            true => Ok(self.position + len),
216
407k
            false => Err(self.eof_err(len - remaining)),
217
        }
218
13.0M
    }
219
220
    /// Reads a value of type `T` from this binary reader, advancing the
221
    /// internal position in this reader forward as data is read.
222
    #[inline]
223
59.2M
    pub fn read<T>(&mut self) -> Result<T>
224
59.2M
    where
225
59.2M
        T: FromReader<'a>,
226
    {
227
59.2M
        T::from_reader(self)
228
59.2M
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::branch_hinting::BranchHintFunction>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::names::IndirectNaming>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::names::Naming>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::producers::ProducersField>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::producers::ProducersFieldValue>
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::code::FunctionBody>
Line
Count
Source
223
292k
    pub fn read<T>(&mut self) -> Result<T>
224
292k
    where
225
292k
        T: FromReader<'a>,
226
    {
227
292k
        T::from_reader(self)
228
292k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::names::IndirectNaming>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::names::Naming>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::names::IndirectNaming>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::names::Naming>
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::producers::ProducersField>
Line
Count
Source
223
593
    pub fn read<T>(&mut self) -> Result<T>
224
593
    where
225
593
        T: FromReader<'a>,
226
    {
227
593
        T::from_reader(self)
228
593
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::producers::ProducersFieldValue>
Line
Count
Source
223
593
    pub fn read<T>(&mut self) -> Result<T>
224
593
    where
225
593
        T: FromReader<'a>,
226
    {
227
593
        T::from_reader(self)
228
593
    }
<wasmparser::binary_reader::BinaryReader>::read::<core::option::Option<wasmparser::readers::component::types::ComponentValType>>
Line
Count
Source
223
90.4k
    pub fn read<T>(&mut self) -> Result<T>
224
90.4k
    where
225
90.4k
        T: FromReader<'a>,
226
    {
227
90.4k
        T::from_reader(self)
228
90.4k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::branch_hinting::BranchHint>
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::data::Data>
Line
Count
Source
223
55.7k
    pub fn read<T>(&mut self) -> Result<T>
224
55.7k
    where
225
55.7k
        T: FromReader<'a>,
226
    {
227
55.7k
        T::from_reader(self)
228
55.7k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::init::ConstExpr>
Line
Count
Source
223
1.12M
    pub fn read<T>(&mut self) -> Result<T>
224
1.12M
    where
225
1.12M
        T: FromReader<'a>,
226
    {
227
1.12M
        T::from_reader(self)
228
1.12M
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::GlobalType>
Line
Count
Source
223
416k
    pub fn read<T>(&mut self) -> Result<T>
224
416k
    where
225
416k
        T: FromReader<'a>,
226
    {
227
416k
        T::from_reader(self)
228
416k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::MemoryType>
Line
Count
Source
223
59.6k
    pub fn read<T>(&mut self) -> Result<T>
224
59.6k
    where
225
59.6k
        T: FromReader<'a>,
226
    {
227
59.6k
        T::from_reader(self)
228
59.6k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::StructType>
Line
Count
Source
223
88.9k
    pub fn read<T>(&mut self) -> Result<T>
224
88.9k
    where
225
88.9k
        T: FromReader<'a>,
226
    {
227
88.9k
        T::from_reader(self)
228
88.9k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::StorageType>
Line
Count
Source
223
995k
    pub fn read<T>(&mut self) -> Result<T>
224
995k
    where
225
995k
        T: FromReader<'a>,
226
    {
227
995k
        T::from_reader(self)
228
995k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::AbstractHeapType>
Line
Count
Source
223
5.21M
    pub fn read<T>(&mut self) -> Result<T>
224
5.21M
    where
225
5.21M
        T: FromReader<'a>,
226
    {
227
5.21M
        T::from_reader(self)
228
5.21M
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::RefType>
Line
Count
Source
223
3.24M
    pub fn read<T>(&mut self) -> Result<T>
224
3.24M
    where
225
3.24M
        T: FromReader<'a>,
226
    {
227
3.24M
        T::from_reader(self)
228
3.24M
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::SubType>
Line
Count
Source
223
703k
    pub fn read<T>(&mut self) -> Result<T>
224
703k
    where
225
703k
        T: FromReader<'a>,
226
    {
227
703k
        T::from_reader(self)
228
703k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::TagType>
Line
Count
Source
223
51.2k
    pub fn read<T>(&mut self) -> Result<T>
224
51.2k
    where
225
51.2k
        T: FromReader<'a>,
226
    {
227
51.2k
        T::from_reader(self)
228
51.2k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::ValType>
Line
Count
Source
223
18.6M
    pub fn read<T>(&mut self) -> Result<T>
224
18.6M
    where
225
18.6M
        T: FromReader<'a>,
226
    {
227
18.6M
        T::from_reader(self)
228
18.6M
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::ContType>
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::FuncType>
Line
Count
Source
223
290k
    pub fn read<T>(&mut self) -> Result<T>
224
290k
    where
225
290k
        T: FromReader<'a>,
226
    {
227
290k
        T::from_reader(self)
228
290k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::HeapType>
Line
Count
Source
223
2.91M
    pub fn read<T>(&mut self) -> Result<T>
224
2.91M
    where
225
2.91M
        T: FromReader<'a>,
226
    {
227
2.91M
        T::from_reader(self)
228
2.91M
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::RecGroup>
Line
Count
Source
223
456k
    pub fn read<T>(&mut self) -> Result<T>
224
456k
    where
225
456k
        T: FromReader<'a>,
226
    {
227
456k
        T::from_reader(self)
228
456k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::ArrayType>
Line
Count
Source
223
323k
    pub fn read<T>(&mut self) -> Result<T>
224
323k
    where
225
323k
        T: FromReader<'a>,
226
    {
227
323k
        T::from_reader(self)
228
323k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::FieldType>
Line
Count
Source
223
671k
    pub fn read<T>(&mut self) -> Result<T>
224
671k
    where
225
671k
        T: FromReader<'a>,
226
    {
227
671k
        T::from_reader(self)
228
671k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::TableType>
Line
Count
Source
223
51.4k
    pub fn read<T>(&mut self) -> Result<T>
224
51.4k
    where
225
51.4k
        T: FromReader<'a>,
226
    {
227
51.4k
        T::from_reader(self)
228
51.4k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::tables::Table>
Line
Count
Source
223
34.5k
    pub fn read<T>(&mut self) -> Result<T>
224
34.5k
    where
225
34.5k
        T: FromReader<'a>,
226
    {
227
34.5k
        T::from_reader(self)
228
34.5k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::exports::ExternalKind>
Line
Count
Source
223
386k
    pub fn read<T>(&mut self) -> Result<T>
224
386k
    where
225
386k
        T: FromReader<'a>,
226
    {
227
386k
        T::from_reader(self)
228
386k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::exports::Export>
Line
Count
Source
223
154k
    pub fn read<T>(&mut self) -> Result<T>
224
154k
    where
225
154k
        T: FromReader<'a>,
226
    {
227
154k
        T::from_reader(self)
228
154k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::globals::Global>
Line
Count
Source
223
334k
    pub fn read<T>(&mut self) -> Result<T>
224
334k
    where
225
334k
        T: FromReader<'a>,
226
    {
227
334k
        T::from_reader(self)
228
334k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::imports::ImportItemCompact>
Line
Count
Source
223
73.1k
    pub fn read<T>(&mut self) -> Result<T>
224
73.1k
    where
225
73.1k
        T: FromReader<'a>,
226
    {
227
73.1k
        T::from_reader(self)
228
73.1k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::imports::Import>
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::imports::Imports>
Line
Count
Source
223
76.4k
    pub fn read<T>(&mut self) -> Result<T>
224
76.4k
    where
225
76.4k
        T: FromReader<'a>,
226
    {
227
76.4k
        T::from_reader(self)
228
76.4k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::imports::TypeRef>
Line
Count
Source
223
220k
    pub fn read<T>(&mut self) -> Result<T>
224
220k
    where
225
220k
        T: FromReader<'a>,
226
    {
227
220k
        T::from_reader(self)
228
220k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::linking::SymbolFlags>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::linking::ComdatSymbol>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::linking::SegmentFlags>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::linking::ComdatSymbolKind>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::linking::DefinedDataSymbol>
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::elements::Element>
Line
Count
Source
223
69.4k
    pub fn read<T>(&mut self) -> Result<T>
224
69.4k
    where
225
69.4k
        T: FromReader<'a>,
226
    {
227
69.4k
        T::from_reader(self)
228
69.4k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::operators::ResumeTable>
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::operators::Catch>
Line
Count
Source
223
5.41M
    pub fn read<T>(&mut self) -> Result<T>
224
5.41M
    where
225
5.41M
        T: FromReader<'a>,
226
    {
227
5.41M
        T::from_reader(self)
228
5.41M
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::operators::Handle>
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::operators::TryTable>
Line
Count
Source
223
1.51M
    pub fn read<T>(&mut self) -> Result<T>
224
1.51M
    where
225
1.51M
        T: FromReader<'a>,
226
    {
227
1.51M
        T::from_reader(self)
228
1.51M
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::canonicals::CanonicalOption>
Line
Count
Source
223
10.8k
    pub fn read<T>(&mut self) -> Result<T>
224
10.8k
    where
225
10.8k
        T: FromReader<'a>,
226
    {
227
10.8k
        T::from_reader(self)
228
10.8k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::canonicals::CanonicalFunction>
Line
Count
Source
223
20.0k
    pub fn read<T>(&mut self) -> Result<T>
224
20.0k
    where
225
20.0k
        T: FromReader<'a>,
226
    {
227
20.0k
        T::from_reader(self)
228
20.0k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::start::ComponentStartFunction>
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::VariantCase>
Line
Count
Source
223
27.1k
    pub fn read<T>(&mut self) -> Result<T>
224
27.1k
    where
225
27.1k
        T: FromReader<'a>,
226
    {
227
27.1k
        T::from_reader(self)
228
27.1k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::ComponentType>
Line
Count
Source
223
202k
    pub fn read<T>(&mut self) -> Result<T>
224
202k
    where
225
202k
        T: FromReader<'a>,
226
    {
227
202k
        T::from_reader(self)
228
202k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::ComponentValType>
Line
Count
Source
223
320k
    pub fn read<T>(&mut self) -> Result<T>
224
320k
    where
225
320k
        T: FromReader<'a>,
226
    {
227
320k
        T::from_reader(self)
228
320k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::ModuleTypeDeclaration>
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::InstanceTypeDeclaration>
Line
Count
Source
223
213k
    pub fn read<T>(&mut self) -> Result<T>
224
213k
    where
225
213k
        T: FromReader<'a>,
226
    {
227
213k
        T::from_reader(self)
228
213k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::ComponentTypeDeclaration>
Line
Count
Source
223
53.9k
    pub fn read<T>(&mut self) -> Result<T>
224
53.9k
    where
225
53.9k
        T: FromReader<'a>,
226
    {
227
53.9k
        T::from_reader(self)
228
53.9k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::CoreType>
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::aliases::ComponentAlias>
Line
Count
Source
223
30.8k
    pub fn read<T>(&mut self) -> Result<T>
224
30.8k
    where
225
30.8k
        T: FromReader<'a>,
226
    {
227
30.8k
        T::from_reader(self)
228
30.8k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::exports::ComponentExport>
Line
Count
Source
223
40.7k
    pub fn read<T>(&mut self) -> Result<T>
224
40.7k
    where
225
40.7k
        T: FromReader<'a>,
226
    {
227
40.7k
        T::from_reader(self)
228
40.7k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::exports::ComponentExternalKind>
Line
Count
Source
223
157k
    pub fn read<T>(&mut self) -> Result<T>
224
157k
    where
225
157k
        T: FromReader<'a>,
226
    {
227
157k
        T::from_reader(self)
228
157k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::TypeBounds>
Line
Count
Source
223
62.8k
    pub fn read<T>(&mut self) -> Result<T>
224
62.8k
    where
225
62.8k
        T: FromReader<'a>,
226
    {
227
62.8k
        T::from_reader(self)
228
62.8k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::ComponentImport>
Line
Count
Source
223
19.3k
    pub fn read<T>(&mut self) -> Result<T>
224
19.3k
    where
225
19.3k
        T: FromReader<'a>,
226
    {
227
19.3k
        T::from_reader(self)
228
19.3k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::ComponentNameOpt>
Line
Count
Source
223
111k
    pub fn read<T>(&mut self) -> Result<T>
224
111k
    where
225
111k
        T: FromReader<'a>,
226
    {
227
111k
        T::from_reader(self)
228
111k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::ComponentTypeRef>
Line
Count
Source
223
110k
    pub fn read<T>(&mut self) -> Result<T>
224
110k
    where
225
110k
        T: FromReader<'a>,
226
    {
227
110k
        T::from_reader(self)
228
110k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::ComponentExternName>
Line
Count
Source
223
144k
    pub fn read<T>(&mut self) -> Result<T>
224
144k
    where
225
144k
        T: FromReader<'a>,
226
    {
227
144k
        T::from_reader(self)
228
144k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::InstantiationArg>
Line
Count
Source
223
5.30k
    pub fn read<T>(&mut self) -> Result<T>
224
5.30k
    where
225
5.30k
        T: FromReader<'a>,
226
    {
227
5.30k
        T::from_reader(self)
228
5.30k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::ComponentInstance>
Line
Count
Source
223
3.41k
    pub fn read<T>(&mut self) -> Result<T>
224
3.41k
    where
225
3.41k
        T: FromReader<'a>,
226
    {
227
3.41k
        T::from_reader(self)
228
3.41k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::InstantiationArgKind>
Line
Count
Source
223
5.30k
    pub fn read<T>(&mut self) -> Result<T>
224
5.30k
    where
225
5.30k
        T: FromReader<'a>,
226
    {
227
5.30k
        T::from_reader(self)
228
5.30k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::ComponentInstantiationArg>
Line
Count
Source
223
6.67k
    pub fn read<T>(&mut self) -> Result<T>
224
6.67k
    where
225
6.67k
        T: FromReader<'a>,
226
    {
227
6.67k
        T::from_reader(self)
228
6.67k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::Instance>
Line
Count
Source
223
7.08k
    pub fn read<T>(&mut self) -> Result<T>
224
7.08k
    where
225
7.08k
        T: FromReader<'a>,
226
    {
227
7.08k
        T::from_reader(self)
228
7.08k
    }
<wasmparser::binary_reader::BinaryReader>::read::<&str>
Line
Count
Source
223
765k
    pub fn read<T>(&mut self) -> Result<T>
224
765k
    where
225
765k
        T: FromReader<'a>,
226
    {
227
765k
        T::from_reader(self)
228
765k
    }
<wasmparser::binary_reader::BinaryReader>::read::<(&str, wasmparser::readers::component::types::ComponentValType)>
Line
Count
Source
223
58.5k
    pub fn read<T>(&mut self) -> Result<T>
224
58.5k
    where
225
58.5k
        T: FromReader<'a>,
226
    {
227
58.5k
        T::from_reader(self)
228
58.5k
    }
<wasmparser::binary_reader::BinaryReader>::read::<bool>
Line
Count
Source
223
2.74k
    pub fn read<T>(&mut self) -> Result<T>
224
2.74k
    where
225
2.74k
        T: FromReader<'a>,
226
    {
227
2.74k
        T::from_reader(self)
228
2.74k
    }
<wasmparser::binary_reader::BinaryReader>::read::<u32>
Line
Count
Source
223
12.9M
    pub fn read<T>(&mut self) -> Result<T>
224
12.9M
    where
225
12.9M
        T: FromReader<'a>,
226
    {
227
12.9M
        T::from_reader(self)
228
12.9M
    }
229
230
0
    pub(crate) fn read_u7(&mut self) -> Result<u8> {
231
0
        let b = self.read_u8()?;
232
0
        if (b & 0x80) != 0 {
233
0
            return Err(Error::new("invalid u7", self.original_position() - 1));
234
0
        }
235
0
        Ok(b)
236
0
    }
237
238
403k
    pub(crate) fn external_kind_from_byte(byte: u8, offset: u64) -> Result<ExternalKind> {
239
403k
        match byte {
240
173k
            0x00 => Ok(ExternalKind::Func),
241
52.1k
            0x01 => Ok(ExternalKind::Table),
242
28.7k
            0x02 => Ok(ExternalKind::Memory),
243
128k
            0x03 => Ok(ExternalKind::Global),
244
20.3k
            0x04 => Ok(ExternalKind::Tag),
245
0
            0x20 => Ok(ExternalKind::FuncExact),
246
0
            x => Err(Self::invalid_leading_byte_error(x, "external kind", offset)),
247
        }
248
403k
    }
249
250
    /// Reads a variable-length 32-bit size from the byte stream while checking
251
    /// against a limit.
252
2.75M
    pub fn read_size(&mut self, limit: usize, desc: &str) -> Result<usize> {
253
2.75M
        let pos = self.original_position();
254
2.75M
        let size = self.read_var_u32()? as usize;
255
2.75M
        if size > limit {
256
0
            bail!(pos, "{desc} size is out of bounds");
257
2.75M
        }
258
2.75M
        Ok(size)
259
2.75M
    }
260
261
    /// Reads a variable-length 32-bit size from the byte stream while checking
262
    /// against a limit.
263
    ///
264
    /// Then reads that many values of type `T` and returns them as an iterator.
265
    ///
266
    /// Note that regardless of how many items are read from the returned
267
    /// iterator the items will still be parsed from this reader.
268
2.74M
    pub fn read_iter<'me, T>(
269
2.74M
        &'me mut self,
270
2.74M
        limit: usize,
271
2.74M
        desc: &str,
272
2.74M
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
2.74M
    where
274
2.74M
        T: FromReader<'a>,
275
    {
276
2.74M
        let size = self.read_size(limit, desc)?;
277
2.74M
        Ok(BinaryReaderIter {
278
2.74M
            remaining: size,
279
2.74M
            reader: self,
280
2.74M
            _marker: marker::PhantomData,
281
2.74M
        })
282
2.74M
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::types::SubType>
Line
Count
Source
268
290k
    pub fn read_iter<'me, T>(
269
290k
        &'me mut self,
270
290k
        limit: usize,
271
290k
        desc: &str,
272
290k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
290k
    where
274
290k
        T: FromReader<'a>,
275
    {
276
290k
        let size = self.read_size(limit, desc)?;
277
290k
        Ok(BinaryReaderIter {
278
290k
            remaining: size,
279
290k
            reader: self,
280
290k
            _marker: marker::PhantomData,
281
290k
        })
282
290k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::types::ValType>
Line
Count
Source
268
581k
    pub fn read_iter<'me, T>(
269
581k
        &'me mut self,
270
581k
        limit: usize,
271
581k
        desc: &str,
272
581k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
581k
    where
274
581k
        T: FromReader<'a>,
275
    {
276
581k
        let size = self.read_size(limit, desc)?;
277
581k
        Ok(BinaryReaderIter {
278
581k
            remaining: size,
279
581k
            reader: self,
280
581k
            _marker: marker::PhantomData,
281
581k
        })
282
581k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::types::FieldType>
Line
Count
Source
268
88.9k
    pub fn read_iter<'me, T>(
269
88.9k
        &'me mut self,
270
88.9k
        limit: usize,
271
88.9k
        desc: &str,
272
88.9k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
88.9k
    where
274
88.9k
        T: FromReader<'a>,
275
    {
276
88.9k
        let size = self.read_size(limit, desc)?;
277
88.9k
        Ok(BinaryReaderIter {
278
88.9k
            remaining: size,
279
88.9k
            reader: self,
280
88.9k
            _marker: marker::PhantomData,
281
88.9k
        })
282
88.9k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::exports::Export>
Line
Count
Source
268
2.80k
    pub fn read_iter<'me, T>(
269
2.80k
        &'me mut self,
270
2.80k
        limit: usize,
271
2.80k
        desc: &str,
272
2.80k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
2.80k
    where
274
2.80k
        T: FromReader<'a>,
275
    {
276
2.80k
        let size = self.read_size(limit, desc)?;
277
2.80k
        Ok(BinaryReaderIter {
278
2.80k
            remaining: size,
279
2.80k
            reader: self,
280
2.80k
            _marker: marker::PhantomData,
281
2.80k
        })
282
2.80k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::operators::Catch>
Line
Count
Source
268
1.51M
    pub fn read_iter<'me, T>(
269
1.51M
        &'me mut self,
270
1.51M
        limit: usize,
271
1.51M
        desc: &str,
272
1.51M
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
1.51M
    where
274
1.51M
        T: FromReader<'a>,
275
    {
276
1.51M
        let size = self.read_size(limit, desc)?;
277
1.51M
        Ok(BinaryReaderIter {
278
1.51M
            remaining: size,
279
1.51M
            reader: self,
280
1.51M
            _marker: marker::PhantomData,
281
1.51M
        })
282
1.51M
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::operators::Handle>
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::canonicals::CanonicalOption>
Line
Count
Source
268
10.5k
    pub fn read_iter<'me, T>(
269
10.5k
        &'me mut self,
270
10.5k
        limit: usize,
271
10.5k
        desc: &str,
272
10.5k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
10.5k
    where
274
10.5k
        T: FromReader<'a>,
275
    {
276
10.5k
        let size = self.read_size(limit, desc)?;
277
10.5k
        Ok(BinaryReaderIter {
278
10.5k
            remaining: size,
279
10.5k
            reader: self,
280
10.5k
            _marker: marker::PhantomData,
281
10.5k
        })
282
10.5k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::types::VariantCase>
Line
Count
Source
268
5.67k
    pub fn read_iter<'me, T>(
269
5.67k
        &'me mut self,
270
5.67k
        limit: usize,
271
5.67k
        desc: &str,
272
5.67k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
5.67k
    where
274
5.67k
        T: FromReader<'a>,
275
    {
276
5.67k
        let size = self.read_size(limit, desc)?;
277
5.67k
        Ok(BinaryReaderIter {
278
5.67k
            remaining: size,
279
5.67k
            reader: self,
280
5.67k
            _marker: marker::PhantomData,
281
5.67k
        })
282
5.67k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::types::ComponentValType>
Line
Count
Source
268
38.5k
    pub fn read_iter<'me, T>(
269
38.5k
        &'me mut self,
270
38.5k
        limit: usize,
271
38.5k
        desc: &str,
272
38.5k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
38.5k
    where
274
38.5k
        T: FromReader<'a>,
275
    {
276
38.5k
        let size = self.read_size(limit, desc)?;
277
38.5k
        Ok(BinaryReaderIter {
278
38.5k
            remaining: size,
279
38.5k
            reader: self,
280
38.5k
            _marker: marker::PhantomData,
281
38.5k
        })
282
38.5k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::types::ModuleTypeDeclaration>
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::types::InstanceTypeDeclaration>
Line
Count
Source
268
14.8k
    pub fn read_iter<'me, T>(
269
14.8k
        &'me mut self,
270
14.8k
        limit: usize,
271
14.8k
        desc: &str,
272
14.8k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
14.8k
    where
274
14.8k
        T: FromReader<'a>,
275
    {
276
14.8k
        let size = self.read_size(limit, desc)?;
277
14.8k
        Ok(BinaryReaderIter {
278
14.8k
            remaining: size,
279
14.8k
            reader: self,
280
14.8k
            _marker: marker::PhantomData,
281
14.8k
        })
282
14.8k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::types::ComponentTypeDeclaration>
Line
Count
Source
268
10.4k
    pub fn read_iter<'me, T>(
269
10.4k
        &'me mut self,
270
10.4k
        limit: usize,
271
10.4k
        desc: &str,
272
10.4k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
10.4k
    where
274
10.4k
        T: FromReader<'a>,
275
    {
276
10.4k
        let size = self.read_size(limit, desc)?;
277
10.4k
        Ok(BinaryReaderIter {
278
10.4k
            remaining: size,
279
10.4k
            reader: self,
280
10.4k
            _marker: marker::PhantomData,
281
10.4k
        })
282
10.4k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::instances::InstantiationArg>
Line
Count
Source
268
4.27k
    pub fn read_iter<'me, T>(
269
4.27k
        &'me mut self,
270
4.27k
        limit: usize,
271
4.27k
        desc: &str,
272
4.27k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
4.27k
    where
274
4.27k
        T: FromReader<'a>,
275
    {
276
4.27k
        let size = self.read_size(limit, desc)?;
277
4.27k
        Ok(BinaryReaderIter {
278
4.27k
            remaining: size,
279
4.27k
            reader: self,
280
4.27k
            _marker: marker::PhantomData,
281
4.27k
        })
282
4.27k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::instances::ComponentInstantiationArg>
Line
Count
Source
268
3.41k
    pub fn read_iter<'me, T>(
269
3.41k
        &'me mut self,
270
3.41k
        limit: usize,
271
3.41k
        desc: &str,
272
3.41k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
3.41k
    where
274
3.41k
        T: FromReader<'a>,
275
    {
276
3.41k
        let size = self.read_size(limit, desc)?;
277
3.41k
        Ok(BinaryReaderIter {
278
3.41k
            remaining: size,
279
3.41k
            reader: self,
280
3.41k
            _marker: marker::PhantomData,
281
3.41k
        })
282
3.41k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<&str>
Line
Count
Source
268
57.4k
    pub fn read_iter<'me, T>(
269
57.4k
        &'me mut self,
270
57.4k
        limit: usize,
271
57.4k
        desc: &str,
272
57.4k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
57.4k
    where
274
57.4k
        T: FromReader<'a>,
275
    {
276
57.4k
        let size = self.read_size(limit, desc)?;
277
57.4k
        Ok(BinaryReaderIter {
278
57.4k
            remaining: size,
279
57.4k
            reader: self,
280
57.4k
            _marker: marker::PhantomData,
281
57.4k
        })
282
57.4k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<(&str, wasmparser::readers::component::types::ComponentValType)>
Line
Count
Source
268
22.9k
    pub fn read_iter<'me, T>(
269
22.9k
        &'me mut self,
270
22.9k
        limit: usize,
271
22.9k
        desc: &str,
272
22.9k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
22.9k
    where
274
22.9k
        T: FromReader<'a>,
275
    {
276
22.9k
        let size = self.read_size(limit, desc)?;
277
22.9k
        Ok(BinaryReaderIter {
278
22.9k
            remaining: size,
279
22.9k
            reader: self,
280
22.9k
            _marker: marker::PhantomData,
281
22.9k
        })
282
22.9k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<u32>
Line
Count
Source
268
99.4k
    pub fn read_iter<'me, T>(
269
99.4k
        &'me mut self,
270
99.4k
        limit: usize,
271
99.4k
        desc: &str,
272
99.4k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
99.4k
    where
274
99.4k
        T: FromReader<'a>,
275
    {
276
99.4k
        let size = self.read_size(limit, desc)?;
277
99.4k
        Ok(BinaryReaderIter {
278
99.4k
            remaining: size,
279
99.4k
            reader: self,
280
99.4k
            _marker: marker::PhantomData,
281
99.4k
        })
282
99.4k
    }
283
284
    /// Returns whether the `BinaryReader` has reached the end of the file.
285
    #[inline]
286
64.5M
    pub fn eof(&self) -> bool {
287
64.5M
        self.position >= self.max_position()
288
64.5M
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::eof
<wasmparser::binary_reader::BinaryReader>::eof
Line
Count
Source
286
2.40k
    pub fn eof(&self) -> bool {
287
2.40k
        self.position >= self.max_position()
288
2.40k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::eof
<wasmparser::binary_reader::BinaryReader>::eof
Line
Count
Source
286
1.18k
    pub fn eof(&self) -> bool {
287
1.18k
        self.position >= self.max_position()
288
1.18k
    }
<wasmparser::binary_reader::BinaryReader>::eof
Line
Count
Source
286
64.5M
    pub fn eof(&self) -> bool {
287
64.5M
        self.position >= self.max_position()
288
64.5M
    }
289
290
    /// Returns the `BinaryReader`'s current position.
291
    #[inline]
292
745k
    pub fn current_position(&self) -> usize {
293
745k
        self.position
294
745k
    }
295
296
    /// Returns the number of bytes remaining in the `BinaryReader`.
297
    #[inline]
298
13.2M
    pub fn bytes_remaining(&self) -> usize {
299
13.2M
        self.max_position() - self.position
300
13.2M
    }
301
302
    /// Advances the `BinaryReader` `size` bytes, and returns a slice from the
303
    /// current position of `size` length.
304
    ///
305
    /// # Errors
306
    /// If `size` exceeds the remaining length in `BinaryReader`.
307
12.3M
    pub fn read_bytes(&mut self, size: usize) -> Result<&'a [u8]> {
308
12.3M
        let start = self.position;
309
12.3M
        let end = self.ensure_has_bytes(size)?;
310
12.1M
        self.position = end;
311
12.1M
        Ok(&self.buffer[start..end])
312
12.3M
    }
313
314
    /// Reads a length-prefixed list of bytes from this reader and returns a
315
    /// new `BinaryReader` to read that list of bytes.
316
821k
    pub fn read_reader(&mut self) -> Result<BinaryReader<'a>> {
317
821k
        let size = self.read_var_u32()? as usize;
318
808k
        self.skip(|reader| {
319
808k
            reader.read_bytes(size)?;
320
795k
            Ok(())
321
808k
        })
322
821k
    }
323
324
    /// Advances the `BinaryReader` four bytes and returns a `u32`.
325
    /// # Errors
326
    /// If `BinaryReader` has less than four bytes remaining.
327
7.12M
    pub fn read_u32(&mut self) -> Result<u32> {
328
7.12M
        let chunk = self.read_bytes(4)?;
329
7.12M
        let word = u32::from_le_bytes(chunk.try_into().unwrap());
330
7.12M
        Ok(word)
331
7.12M
    }
332
333
    /// Advances the `BinaryReader` eight bytes and returns a `u64`.
334
    /// # Errors
335
    /// If `BinaryReader` has less than eight bytes remaining.
336
2.54M
    pub fn read_u64(&mut self) -> Result<u64> {
337
2.54M
        let chunk = self.read_bytes(8)?;
338
2.54M
        let word = u64::from_le_bytes(chunk.try_into().unwrap());
339
2.54M
        Ok(word)
340
2.54M
    }
341
342
    /// Advances the `BinaryReader` a single byte.
343
    ///
344
    /// # Errors
345
    ///
346
    /// If `BinaryReader` has no bytes remaining.
347
    #[inline]
348
208M
    pub fn read_u8(&mut self) -> Result<u8> {
349
208M
        let b = match self.buffer.get(self.position) {
350
208M
            Some(b) => *b,
351
212k
            None => return Err(self.eof_err(1)),
352
        };
353
208M
        self.position += 1;
354
208M
        Ok(b)
355
208M
    }
<wasmparser::binary_reader::BinaryReader>::read_u8
Line
Count
Source
348
8.83M
    pub fn read_u8(&mut self) -> Result<u8> {
349
8.83M
        let b = match self.buffer.get(self.position) {
350
8.83M
            Some(b) => *b,
351
1
            None => return Err(self.eof_err(1)),
352
        };
353
8.83M
        self.position += 1;
354
8.83M
        Ok(b)
355
8.83M
    }
<wasmparser::binary_reader::BinaryReader>::read_u8
Line
Count
Source
348
2.44k
    pub fn read_u8(&mut self) -> Result<u8> {
349
2.44k
        let b = match self.buffer.get(self.position) {
350
2.44k
            Some(b) => *b,
351
0
            None => return Err(self.eof_err(1)),
352
        };
353
2.44k
        self.position += 1;
354
2.44k
        Ok(b)
355
2.44k
    }
<wasmparser::binary_reader::BinaryReader>::read_u8
Line
Count
Source
348
593
    pub fn read_u8(&mut self) -> Result<u8> {
349
593
        let b = match self.buffer.get(self.position) {
350
593
            Some(b) => *b,
351
0
            None => return Err(self.eof_err(1)),
352
        };
353
593
        self.position += 1;
354
593
        Ok(b)
355
593
    }
<wasmparser::binary_reader::BinaryReader>::read_u8
Line
Count
Source
348
199M
    pub fn read_u8(&mut self) -> Result<u8> {
349
199M
        let b = match self.buffer.get(self.position) {
350
199M
            Some(b) => *b,
351
212k
            None => return Err(self.eof_err(1)),
352
        };
353
199M
        self.position += 1;
354
199M
        Ok(b)
355
199M
    }
356
357
    #[cold]
358
620k
    fn eof_err(&self, hint: usize) -> Error {
359
620k
        Error::eof(self.original_position(), hint)
360
620k
    }
361
362
    /// Advances the `BinaryReader` up to four bytes to parse a variable
363
    /// length integer as a `u32`.
364
    ///
365
    /// # Errors
366
    ///
367
    /// If `BinaryReader` has less than one or up to four bytes remaining, or
368
    /// the integer is larger than 32 bits.
369
    #[inline]
370
50.1M
    pub fn read_var_u32(&mut self) -> Result<u32> {
371
        // Optimization for single byte i32.
372
50.1M
        let byte = self.read_u8()?;
373
50.0M
        if (byte & 0x80) == 0 {
374
36.2M
            Ok(u32::from(byte))
375
        } else {
376
13.7M
            self.read_var_u32_big(byte)
377
        }
378
50.1M
    }
<wasmparser::binary_reader::BinaryReader>::read_var_u32
Line
Count
Source
370
2.51M
    pub fn read_var_u32(&mut self) -> Result<u32> {
371
        // Optimization for single byte i32.
372
2.51M
        let byte = self.read_u8()?;
373
2.51M
        if (byte & 0x80) == 0 {
374
2.33M
            Ok(u32::from(byte))
375
        } else {
376
176k
            self.read_var_u32_big(byte)
377
        }
378
2.51M
    }
<wasmparser::binary_reader::BinaryReader>::read_var_u32
Line
Count
Source
370
2.44k
    pub fn read_var_u32(&mut self) -> Result<u32> {
371
        // Optimization for single byte i32.
372
2.44k
        let byte = self.read_u8()?;
373
2.44k
        if (byte & 0x80) == 0 {
374
2.07k
            Ok(u32::from(byte))
375
        } else {
376
368
            self.read_var_u32_big(byte)
377
        }
378
2.44k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read_var_u32
<wasmparser::binary_reader::BinaryReader>::read_var_u32
Line
Count
Source
370
47.5M
    pub fn read_var_u32(&mut self) -> Result<u32> {
371
        // Optimization for single byte i32.
372
47.5M
        let byte = self.read_u8()?;
373
47.4M
        if (byte & 0x80) == 0 {
374
33.8M
            Ok(u32::from(byte))
375
        } else {
376
13.5M
            self.read_var_u32_big(byte)
377
        }
378
47.5M
    }
379
380
13.7M
    fn read_var_u32_big(&mut self, byte: u8) -> Result<u32> {
381
13.7M
        let mut result = (byte & 0x7F) as u32;
382
13.7M
        let mut shift = 7;
383
        loop {
384
13.7M
            let byte = self.read_u8()?;
385
13.7M
            result |= ((byte & 0x7F) as u32) << shift;
386
13.7M
            if shift >= 25 && (byte >> (32 - shift)) != 0 {
387
3
                let msg = if byte & 0x80 != 0 {
388
3
                    "invalid var_u32: integer representation too long"
389
                } else {
390
0
                    "invalid var_u32: integer too large"
391
                };
392
                // The continuation bit or unused bits are set.
393
3
                return Err(Error::new(msg, self.original_position() - 1));
394
13.7M
            }
395
13.7M
            shift += 7;
396
13.7M
            if (byte & 0x80) == 0 {
397
13.7M
                break;
398
9.67k
            }
399
        }
400
13.7M
        Ok(result)
401
13.7M
    }
402
403
    /// Advances the `BinaryReader` up to four bytes to parse a variable
404
    /// length integer as a `u64`.
405
    ///
406
    /// # Errors
407
    ///
408
    /// If `BinaryReader` has less than one or up to eight bytes remaining, or
409
    /// the integer is larger than 64 bits.
410
    #[inline]
411
485k
    pub fn read_var_u64(&mut self) -> Result<u64> {
412
        // Optimization for single byte u64.
413
485k
        let byte = u64::from(self.read_u8()?);
414
485k
        if (byte & 0x80) == 0 {
415
79.3k
            Ok(byte)
416
        } else {
417
405k
            self.read_var_u64_big(byte)
418
        }
419
485k
    }
420
421
405k
    fn read_var_u64_big(&mut self, byte: u64) -> Result<u64> {
422
405k
        let mut result = byte & 0x7F;
423
405k
        let mut shift = 7;
424
        loop {
425
1.67M
            let byte = u64::from(self.read_u8()?);
426
1.67M
            result |= (byte & 0x7F) << shift;
427
1.67M
            if shift >= 57 && (byte >> (64 - shift)) != 0 {
428
0
                let msg = if byte & 0x80 != 0 {
429
0
                    "invalid var_u64: integer representation too long"
430
                } else {
431
0
                    "invalid var_u64: integer too large"
432
                };
433
                // The continuation bit or unused bits are set.
434
0
                return Err(Error::new(msg, self.original_position() - 1));
435
1.67M
            }
436
1.67M
            shift += 7;
437
1.67M
            if (byte & 0x80) == 0 {
438
405k
                break;
439
1.26M
            }
440
        }
441
405k
        Ok(result)
442
405k
    }
443
444
    /// Executes `f` to skip some data in this binary reader and then returns a
445
    /// reader which will read the skipped data.
446
2.32M
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
2.32M
        let start_offset = self.original_position();
448
2.32M
        let start = self.position;
449
2.32M
        f(self)?;
450
2.22M
        let mut ret = self.clone();
451
2.22M
        ret.buffer = &self.buffer[start..self.position];
452
2.22M
        ret.original_offset = start_offset;
453
2.22M
        ret.position = 0;
454
2.22M
        Ok(ret)
455
2.32M
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::single_item<wasmparser::readers::component::start::ComponentStartFunction>::{closure#0}>
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::single_item<u32>::{closure#0}>
Line
Count
Source
446
6.45k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
6.45k
        let start_offset = self.original_position();
448
6.45k
        let start = self.position;
449
6.45k
        f(self)?;
450
5.26k
        let mut ret = self.clone();
451
5.26k
        ret.buffer = &self.buffer[start..self.position];
452
5.26k
        ret.original_offset = start_offset;
453
5.26k
        ret.position = 0;
454
5.26k
        Ok(ret)
455
6.45k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::data::Data>>::{closure#0}>
Line
Count
Source
446
5.01k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
5.01k
        let start_offset = self.original_position();
448
5.01k
        let start = self.position;
449
5.01k
        f(self)?;
450
5.01k
        let mut ret = self.clone();
451
5.01k
        ret.buffer = &self.buffer[start..self.position];
452
5.01k
        ret.original_offset = start_offset;
453
5.01k
        ret.position = 0;
454
5.01k
        Ok(ret)
455
5.01k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::types::MemoryType>>::{closure#0}>
Line
Count
Source
446
11.9k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
11.9k
        let start_offset = self.original_position();
448
11.9k
        let start = self.position;
449
11.9k
        f(self)?;
450
10.7k
        let mut ret = self.clone();
451
10.7k
        ret.buffer = &self.buffer[start..self.position];
452
10.7k
        ret.original_offset = start_offset;
453
10.7k
        ret.position = 0;
454
10.7k
        Ok(ret)
455
11.9k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::types::TagType>>::{closure#0}>
Line
Count
Source
446
1.44k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
1.44k
        let start_offset = self.original_position();
448
1.44k
        let start = self.position;
449
1.44k
        f(self)?;
450
1.44k
        let mut ret = self.clone();
451
1.44k
        ret.buffer = &self.buffer[start..self.position];
452
1.44k
        ret.original_offset = start_offset;
453
1.44k
        ret.position = 0;
454
1.44k
        Ok(ret)
455
1.44k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::types::RecGroup>>::{closure#0}>
Line
Count
Source
446
20.9k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
20.9k
        let start_offset = self.original_position();
448
20.9k
        let start = self.position;
449
20.9k
        f(self)?;
450
18.0k
        let mut ret = self.clone();
451
18.0k
        ret.buffer = &self.buffer[start..self.position];
452
18.0k
        ret.original_offset = start_offset;
453
18.0k
        ret.position = 0;
454
18.0k
        Ok(ret)
455
20.9k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::tables::Table>>::{closure#0}>
Line
Count
Source
446
7.02k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
7.02k
        let start_offset = self.original_position();
448
7.02k
        let start = self.position;
449
7.02k
        f(self)?;
450
6.79k
        let mut ret = self.clone();
451
6.79k
        ret.buffer = &self.buffer[start..self.position];
452
6.79k
        ret.original_offset = start_offset;
453
6.79k
        ret.position = 0;
454
6.79k
        Ok(ret)
455
7.02k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::exports::Export>>::{closure#0}>
Line
Count
Source
446
13.8k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
13.8k
        let start_offset = self.original_position();
448
13.8k
        let start = self.position;
449
13.8k
        f(self)?;
450
12.2k
        let mut ret = self.clone();
451
12.2k
        ret.buffer = &self.buffer[start..self.position];
452
12.2k
        ret.original_offset = start_offset;
453
12.2k
        ret.position = 0;
454
12.2k
        Ok(ret)
455
13.8k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::globals::Global>>::{closure#0}>
Line
Count
Source
446
11.4k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
11.4k
        let start_offset = self.original_position();
448
11.4k
        let start = self.position;
449
11.4k
        f(self)?;
450
11.1k
        let mut ret = self.clone();
451
11.1k
        ret.buffer = &self.buffer[start..self.position];
452
11.1k
        ret.original_offset = start_offset;
453
11.1k
        ret.position = 0;
454
11.1k
        Ok(ret)
455
11.4k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::imports::Imports>>::{closure#0}>
Line
Count
Source
446
14.3k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
14.3k
        let start_offset = self.original_position();
448
14.3k
        let start = self.position;
449
14.3k
        f(self)?;
450
12.5k
        let mut ret = self.clone();
451
12.5k
        ret.buffer = &self.buffer[start..self.position];
452
12.5k
        ret.original_offset = start_offset;
453
12.5k
        ret.position = 0;
454
12.5k
        Ok(ret)
455
14.3k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::elements::Element>>::{closure#0}>
Line
Count
Source
446
6.20k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
6.20k
        let start_offset = self.original_position();
448
6.20k
        let start = self.position;
449
6.20k
        f(self)?;
450
5.72k
        let mut ret = self.clone();
451
5.72k
        ret.buffer = &self.buffer[start..self.position];
452
5.72k
        ret.original_offset = start_offset;
453
5.72k
        ret.position = 0;
454
5.72k
        Ok(ret)
455
6.20k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::canonicals::CanonicalFunction>>::{closure#0}>
Line
Count
Source
446
18.2k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
18.2k
        let start_offset = self.original_position();
448
18.2k
        let start = self.position;
449
18.2k
        f(self)?;
450
10.9k
        let mut ret = self.clone();
451
10.9k
        ret.buffer = &self.buffer[start..self.position];
452
10.9k
        ret.original_offset = start_offset;
453
10.9k
        ret.position = 0;
454
10.9k
        Ok(ret)
455
18.2k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::types::ComponentType>>::{closure#0}>
Line
Count
Source
446
60.9k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
60.9k
        let start_offset = self.original_position();
448
60.9k
        let start = self.position;
449
60.9k
        f(self)?;
450
37.7k
        let mut ret = self.clone();
451
37.7k
        ret.buffer = &self.buffer[start..self.position];
452
37.7k
        ret.original_offset = start_offset;
453
37.7k
        ret.position = 0;
454
37.7k
        Ok(ret)
455
60.9k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::types::CoreType>>::{closure#0}>
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::aliases::ComponentAlias>>::{closure#0}>
Line
Count
Source
446
18.4k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
18.4k
        let start_offset = self.original_position();
448
18.4k
        let start = self.position;
449
18.4k
        f(self)?;
450
11.0k
        let mut ret = self.clone();
451
11.0k
        ret.buffer = &self.buffer[start..self.position];
452
11.0k
        ret.original_offset = start_offset;
453
11.0k
        ret.position = 0;
454
11.0k
        Ok(ret)
455
18.4k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::exports::ComponentExport>>::{closure#0}>
Line
Count
Source
446
51.5k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
51.5k
        let start_offset = self.original_position();
448
51.5k
        let start = self.position;
449
51.5k
        f(self)?;
450
32.0k
        let mut ret = self.clone();
451
32.0k
        ret.buffer = &self.buffer[start..self.position];
452
32.0k
        ret.original_offset = start_offset;
453
32.0k
        ret.position = 0;
454
32.0k
        Ok(ret)
455
51.5k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::imports::ComponentImport>>::{closure#0}>
Line
Count
Source
446
11.0k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
11.0k
        let start_offset = self.original_position();
448
11.0k
        let start = self.position;
449
11.0k
        f(self)?;
450
6.63k
        let mut ret = self.clone();
451
6.63k
        ret.buffer = &self.buffer[start..self.position];
452
6.63k
        ret.original_offset = start_offset;
453
6.63k
        ret.position = 0;
454
6.63k
        Ok(ret)
455
11.0k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::instances::ComponentInstance>>::{closure#0}>
Line
Count
Source
446
5.68k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
5.68k
        let start_offset = self.original_position();
448
5.68k
        let start = self.position;
449
5.68k
        f(self)?;
450
3.41k
        let mut ret = self.clone();
451
3.41k
        ret.buffer = &self.buffer[start..self.position];
452
3.41k
        ret.original_offset = start_offset;
453
3.41k
        ret.position = 0;
454
3.41k
        Ok(ret)
455
5.68k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::instances::Instance>>::{closure#0}>
Line
Count
Source
446
9.09k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
9.09k
        let start_offset = self.original_position();
448
9.09k
        let start = self.position;
449
9.09k
        f(self)?;
450
5.45k
        let mut ret = self.clone();
451
5.45k
        ret.buffer = &self.buffer[start..self.position];
452
5.45k
        ret.original_offset = start_offset;
453
5.45k
        ret.position = 0;
454
5.45k
        Ok(ret)
455
9.09k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<u32>>::{closure#0}>
Line
Count
Source
446
15.3k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
15.3k
        let start_offset = self.original_position();
448
15.3k
        let start = self.position;
449
15.3k
        f(self)?;
450
13.4k
        let mut ret = self.clone();
451
13.4k
        ret.buffer = &self.buffer[start..self.position];
452
13.4k
        ret.original_offset = start_offset;
453
13.4k
        ret.position = 0;
454
13.4k
        Ok(ret)
455
15.3k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::core::custom::CustomSectionReader>::{closure#0}>
Line
Count
Source
446
23.0k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
23.0k
        let start_offset = self.original_position();
448
23.0k
        let start = self.position;
449
23.0k
        f(self)?;
450
15.9k
        let mut ret = self.clone();
451
15.9k
        ret.buffer = &self.buffer[start..self.position];
452
15.9k
        ret.original_offset = start_offset;
453
15.9k
        ret.position = 0;
454
15.9k
        Ok(ret)
455
23.0k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::binary_reader::BinaryReader>::read_reader::{closure#0}>
Line
Count
Source
446
808k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
808k
        let start_offset = self.original_position();
448
808k
        let start = self.position;
449
808k
        f(self)?;
450
795k
        let mut ret = self.clone();
451
795k
        ret.buffer = &self.buffer[start..self.position];
452
795k
        ret.original_offset = start_offset;
453
795k
        ret.position = 0;
454
795k
        Ok(ret)
455
808k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::binary_reader::BinaryReader>::read_br_table::{closure#0}>
Line
Count
Source
446
8.69k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
8.69k
        let start_offset = self.original_position();
448
8.69k
        let start = self.position;
449
8.69k
        f(self)?;
450
8.69k
        let mut ret = self.clone();
451
8.69k
        ret.buffer = &self.buffer[start..self.position];
452
8.69k
        ret.original_offset = start_offset;
453
8.69k
        ret.position = 0;
454
8.69k
        Ok(ret)
455
8.69k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::branch_hinting::BranchHintFunction as wasmparser::readers::FromReader>::from_reader::{closure#0}>
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::imports::Imports as wasmparser::readers::FromReader>::from_reader::{closure#0}>
Line
Count
Source
446
1.75k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
1.75k
        let start_offset = self.original_position();
448
1.75k
        let start = self.position;
449
1.75k
        f(self)?;
450
1.75k
        let mut ret = self.clone();
451
1.75k
        ret.buffer = &self.buffer[start..self.position];
452
1.75k
        ret.original_offset = start_offset;
453
1.75k
        ret.position = 0;
454
1.75k
        Ok(ret)
455
1.75k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::imports::Imports as wasmparser::readers::FromReader>::from_reader::{closure#1}>
Line
Count
Source
446
2.46k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
2.46k
        let start_offset = self.original_position();
448
2.46k
        let start = self.position;
449
2.46k
        f(self)?;
450
2.46k
        let mut ret = self.clone();
451
2.46k
        ret.buffer = &self.buffer[start..self.position];
452
2.46k
        ret.original_offset = start_offset;
453
2.46k
        ret.position = 0;
454
2.46k
        Ok(ret)
455
2.46k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::elements::Element as wasmparser::readers::FromReader>::from_reader::{closure#0}>
Line
Count
Source
446
69.4k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
69.4k
        let start_offset = self.original_position();
448
69.4k
        let start = self.position;
449
69.4k
        f(self)?;
450
69.4k
        let mut ret = self.clone();
451
69.4k
        ret.buffer = &self.buffer[start..self.position];
452
69.4k
        ret.original_offset = start_offset;
453
69.4k
        ret.position = 0;
454
69.4k
        Ok(ret)
455
69.4k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::producers::ProducersField as wasmparser::readers::FromReader>::from_reader::{closure#0}>
Line
Count
Source
446
593
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
593
        let start_offset = self.original_position();
448
593
        let start = self.position;
449
593
        f(self)?;
450
593
        let mut ret = self.clone();
451
593
        ret.buffer = &self.buffer[start..self.position];
452
593
        ret.original_offset = start_offset;
453
593
        ret.position = 0;
454
593
        Ok(ret)
455
593
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::init::ConstExpr as wasmparser::readers::FromReader>::from_reader::{closure#0}>
Line
Count
Source
446
1.12M
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
1.12M
        let start_offset = self.original_position();
448
1.12M
        let start = self.position;
449
1.12M
        f(self)?;
450
1.12M
        let mut ret = self.clone();
451
1.12M
        ret.buffer = &self.buffer[start..self.position];
452
1.12M
        ret.original_offset = start_offset;
453
1.12M
        ret.position = 0;
454
1.12M
        Ok(ret)
455
1.12M
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::linking::Comdat as wasmparser::readers::FromReader>::from_reader::{closure#0}>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::names::IndirectNaming as wasmparser::readers::FromReader>::from_reader::{closure#0}>
456
457
    /// Advances the `BinaryReader` past a WebAssembly string. This method does
458
    /// not perform any utf-8 validation.
459
    /// # Errors
460
    /// If `BinaryReader` has less than four bytes, the string's length exceeds
461
    /// the remaining bytes, or the string length
462
    /// exceeds `limits::MAX_WASM_STRING_SIZE`.
463
142k
    pub fn skip_string(&mut self) -> Result<()> {
464
142k
        let len = self.read_var_u32()? as usize;
465
142k
        if len > MAX_WASM_STRING_SIZE {
466
0
            return Err(Error::new(
467
0
                "string size out of bounds",
468
0
                self.original_position() - 1,
469
0
            ));
470
142k
        }
471
142k
        self.ensure_has_bytes(len)?;
472
142k
        self.position += len;
473
142k
        Ok(())
474
142k
    }
475
476
    /// Advances the `BinaryReader` up to four bytes to parse a variable
477
    /// length integer as a `i32`.
478
    /// # Errors
479
    /// If `BinaryReader` has less than one or up to four bytes remaining, or
480
    /// the integer is larger than 32 bits.
481
    #[inline]
482
1.74M
    pub fn read_var_i32(&mut self) -> Result<i32> {
483
        // Optimization for single byte i32.
484
1.74M
        let byte = self.read_u8()?;
485
1.74M
        if (byte & 0x80) == 0 {
486
690k
            Ok(((byte as i32) << 25) >> 25)
487
        } else {
488
1.05M
            self.read_var_i32_big(byte)
489
        }
490
1.74M
    }
<wasmparser::binary_reader::BinaryReader>::read_var_i32
Line
Count
Source
482
247k
    pub fn read_var_i32(&mut self) -> Result<i32> {
483
        // Optimization for single byte i32.
484
247k
        let byte = self.read_u8()?;
485
247k
        if (byte & 0x80) == 0 {
486
87.2k
            Ok(((byte as i32) << 25) >> 25)
487
        } else {
488
159k
            self.read_var_i32_big(byte)
489
        }
490
247k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read_var_i32
<wasmparser::binary_reader::BinaryReader>::read_var_i32
Line
Count
Source
482
1.50M
    pub fn read_var_i32(&mut self) -> Result<i32> {
483
        // Optimization for single byte i32.
484
1.50M
        let byte = self.read_u8()?;
485
1.50M
        if (byte & 0x80) == 0 {
486
603k
            Ok(((byte as i32) << 25) >> 25)
487
        } else {
488
899k
            self.read_var_i32_big(byte)
489
        }
490
1.50M
    }
491
492
1.05M
    fn read_var_i32_big(&mut self, byte: u8) -> Result<i32> {
493
1.05M
        let mut result = (byte & 0x7F) as i32;
494
1.05M
        let mut shift = 7;
495
        loop {
496
3.64M
            let byte = self.read_u8()?;
497
3.64M
            result |= ((byte & 0x7F) as i32) << shift;
498
3.64M
            if shift >= 25 {
499
667k
                let continuation_bit = (byte & 0x80) != 0;
500
667k
                let sign_and_unused_bit = (byte << 1) as i8 >> (32 - shift);
501
667k
                if continuation_bit || (sign_and_unused_bit != 0 && sign_and_unused_bit != -1) {
502
0
                    let msg = if continuation_bit {
503
0
                        "invalid var_i32: integer representation too long"
504
                    } else {
505
0
                        "invalid var_i32: integer too large"
506
                    };
507
0
                    return Err(Error::new(msg, self.original_position() - 1));
508
667k
                }
509
667k
                return Ok(result);
510
2.97M
            }
511
2.97M
            shift += 7;
512
2.97M
            if (byte & 0x80) == 0 {
513
391k
                break;
514
2.58M
            }
515
        }
516
391k
        let ashift = 32 - shift;
517
391k
        Ok((result << ashift) >> ashift)
518
1.05M
    }
519
520
    /// Advances the `BinaryReader` up to four bytes to parse a variable
521
    /// length integer as a signed 33 bit integer, returned as a `i64`.
522
    /// # Errors
523
    /// If `BinaryReader` has less than one or up to five bytes remaining, or
524
    /// the integer is larger than 33 bits.
525
3.11M
    pub fn read_var_s33(&mut self) -> Result<i64> {
526
        // Optimization for single byte.
527
3.11M
        let byte = self.read_u8()?;
528
3.11M
        if (byte & 0x80) == 0 {
529
2.90M
            return Ok(((byte as i8) << 1) as i64 >> 1);
530
207k
        }
531
532
207k
        let mut result = (byte & 0x7F) as i64;
533
207k
        let mut shift = 7;
534
        loop {
535
207k
            let byte = self.read_u8()?;
536
207k
            result |= ((byte & 0x7F) as i64) << shift;
537
207k
            if shift >= 25 {
538
1
                let continuation_bit = (byte & 0x80) != 0;
539
1
                let sign_and_unused_bit = (byte << 1) as i8 >> (33 - shift);
540
1
                if continuation_bit || (sign_and_unused_bit != 0 && sign_and_unused_bit != -1) {
541
1
                    return Err(Error::new(
542
1
                        "invalid var_s33: integer representation too long",
543
1
                        self.original_position() - 1,
544
1
                    ));
545
0
                }
546
0
                return Ok(result);
547
207k
            }
548
207k
            shift += 7;
549
207k
            if (byte & 0x80) == 0 {
550
207k
                break;
551
3
            }
552
        }
553
207k
        let ashift = 64 - shift;
554
207k
        Ok((result << ashift) >> ashift)
555
3.11M
    }
556
557
    /// Advances the `BinaryReader` up to eight bytes to parse a variable
558
    /// length integer as a 64 bit integer, returned as a `i64`.
559
    /// # Errors
560
    /// If `BinaryReader` has less than one or up to eight bytes remaining, or
561
    /// the integer is larger than 64 bits.
562
4.77M
    pub fn read_var_i64(&mut self) -> Result<i64> {
563
4.77M
        let mut result: i64 = 0;
564
4.77M
        let mut shift = 0;
565
        loop {
566
27.4M
            let byte = self.read_u8()?;
567
27.4M
            result |= i64::from(byte & 0x7F) << shift;
568
27.4M
            if shift >= 57 {
569
369k
                let continuation_bit = (byte & 0x80) != 0;
570
369k
                let sign_and_unused_bit = ((byte << 1) as i8) >> (64 - shift);
571
369k
                if continuation_bit || (sign_and_unused_bit != 0 && sign_and_unused_bit != -1) {
572
0
                    let msg = if continuation_bit {
573
0
                        "invalid var_i64: integer representation too long"
574
                    } else {
575
0
                        "invalid var_i64: integer too large"
576
                    };
577
0
                    return Err(Error::new(msg, self.original_position() - 1));
578
369k
                }
579
369k
                return Ok(result);
580
27.1M
            }
581
27.1M
            shift += 7;
582
27.1M
            if (byte & 0x80) == 0 {
583
4.40M
                break;
584
22.7M
            }
585
        }
586
4.40M
        let ashift = 64 - shift;
587
4.40M
        Ok((result << ashift) >> ashift)
588
4.77M
    }
589
590
    /// Advances the `BinaryReader` four bytes to parse a 32 bit floating point
591
    /// number, returned as `Ieee32`.
592
    /// # Errors
593
    /// If `BinaryReader` has less than four bytes remaining.
594
7.09M
    pub fn read_f32(&mut self) -> Result<Ieee32> {
595
7.09M
        let value = self.read_u32()?;
596
7.09M
        Ok(Ieee32(value))
597
7.09M
    }
598
599
    /// Advances the `BinaryReader` eight bytes to parse a 64 bit floating point
600
    /// number, returned as `Ieee64`.
601
    /// # Errors
602
    /// If `BinaryReader` has less than eight bytes remaining.
603
2.54M
    pub fn read_f64(&mut self) -> Result<Ieee64> {
604
2.54M
        let value = self.read_u64()?;
605
2.54M
        Ok(Ieee64(value))
606
2.54M
    }
607
608
    /// (internal) Reads a fixed-size WebAssembly string from the module.
609
1.25M
    fn internal_read_string(&mut self, len: usize) -> Result<&'a str> {
610
1.25M
        let bytes = self.read_bytes(len)?;
611
1.25M
        str::from_utf8(bytes)
612
1.25M
            .map_err(|_| Error::new("malformed UTF-8 encoding", self.original_position() - 1))
613
1.25M
    }
614
615
    /// Reads a WebAssembly string from the module.
616
    ///
617
    /// # Errors
618
    ///
619
    /// If `BinaryReader` has less than up to four bytes remaining, the string's
620
    /// length exceeds the remaining bytes, the string's length exceeds
621
    /// `limits::MAX_WASM_STRING_SIZE`, or the string contains invalid utf-8.
622
1.25M
    pub fn read_string(&mut self) -> Result<&'a str> {
623
1.25M
        let len = self.read_var_u32()? as usize;
624
1.25M
        if len > MAX_WASM_STRING_SIZE {
625
0
            return Err(Error::new(
626
0
                "string size out of bounds",
627
0
                self.original_position() - 1,
628
0
            ));
629
1.25M
        }
630
1.25M
        return self.internal_read_string(len);
631
1.25M
    }
632
633
    /// Reads a unlimited WebAssembly string from the module.
634
    ///
635
    /// Note that this is similar to [`BinaryReader::read_string`] except that
636
    /// it will not limit the size of the returned string by
637
    /// `limits::MAX_WASM_STRING_SIZE`.
638
1.77k
    pub fn read_unlimited_string(&mut self) -> Result<&'a str> {
639
1.77k
        let len = self.read_var_u32()? as usize;
640
1.77k
        return self.internal_read_string(len);
641
1.77k
    }
642
643
    #[cold]
644
0
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
645
0
        Err(Self::invalid_leading_byte_error(
646
0
            byte,
647
0
            desc,
648
0
            self.original_position() - 1,
649
0
        ))
650
0
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<core::option::Option<wasmparser::readers::component::types::ComponentValType>>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::core::types::CompositeType>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::core::operators::Catch>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::core::operators::Handle>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::canonicals::CanonicalOption>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::canonicals::CanonicalFunction>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::types::VariantCase>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::types::ComponentType>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::types::ComponentDefinedType>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::types::ModuleTypeDeclaration>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::types::InstanceTypeDeclaration>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::types::CoreType>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::aliases::ComponentAlias>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::imports::TypeBounds>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::imports::ComponentNameOpt>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::imports::ComponentExternName>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::instances::ComponentInstance>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::instances::InstantiationArgKind>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::instances::Instance>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<bool>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<()>
651
652
0
    pub(crate) fn invalid_leading_byte_error(byte: u8, desc: &str, offset: u64) -> Error {
653
0
        format_err!(offset, "invalid leading byte (0x{byte:x}) for {desc}")
654
0
    }
655
656
34.9M
    pub(crate) fn peek(&self) -> Result<u8> {
657
34.9M
        self.ensure_has_byte()?;
658
34.9M
        Ok(self.buffer[self.position])
659
34.9M
    }
660
661
609k
    pub(crate) fn peek_bytes(&self, len: usize) -> Result<&[u8]> {
662
609k
        let start = self.position;
663
609k
        let end = self.ensure_has_bytes(len)?;
664
314k
        Ok(&self.buffer[start..end])
665
609k
    }
666
667
5.97M
    pub(crate) fn read_block_type(&mut self) -> Result<BlockType> {
668
5.97M
        let b = self.peek()?;
669
670
        // Block types are encoded as either 0x40, a `valtype`, or `s33`. All
671
        // current `valtype` encodings are negative numbers when encoded with
672
        // sleb128, but it's also required that valtype encodings are in their
673
        // canonical form. For example an overlong encoding of -1 as `0xff 0x7f`
674
        // is not valid and it is required to be `0x7f`. This means that we
675
        // can't simply match on the `s33` that pops out below since reading the
676
        // whole `s33` might read an overlong encoding.
677
        //
678
        // To test for this the first byte `b` is inspected. The highest bit,
679
        // the continuation bit in LEB128 encoding, must be clear. The next bit,
680
        // the sign bit, must be set to indicate that the number is negative. If
681
        // these two conditions hold then we're guaranteed that this is a
682
        // negative number.
683
        //
684
        // After this a value type is read directly instead of looking for an
685
        // indexed value type.
686
5.97M
        if b & 0x80 == 0 && b & 0x40 != 0 {
687
5.89M
            if b == 0x40 {
688
3.87M
                self.position += 1;
689
3.87M
                return Ok(BlockType::Empty);
690
2.01M
            }
691
2.01M
            return Ok(BlockType::Type(self.read()?));
692
81.2k
        }
693
694
        // Not empty or a singular type, so read the function type index
695
81.2k
        let idx = self.read_var_s33()?;
696
81.2k
        match u32::try_from(idx) {
697
81.2k
            Ok(idx) => Ok(BlockType::FuncType(idx)),
698
            Err(_) => {
699
0
                return Err(Error::new(
700
0
                    "invalid function type",
701
0
                    self.original_position(),
702
0
                ));
703
            }
704
        }
705
5.97M
    }
706
707
    /// Returns whether there is an `end` opcode followed by eof remaining in
708
    /// this reader.
709
8.24M
    pub fn is_end_then_eof(&self) -> bool {
710
8.24M
        self.remaining_buffer() == &[0x0b]
711
8.24M
    }
712
713
38.5k
    pub(crate) fn read_header_version(&mut self) -> Result<u32> {
714
38.5k
        let magic_number = self.read_bytes(4)?;
715
31.7k
        if magic_number != WASM_MAGIC_NUMBER {
716
11
            return Err(Error::new(
717
11
                format!(
718
11
                    "magic header not detected: bad magic number - expected={WASM_MAGIC_NUMBER:#x?} actual={magic_number:#x?}"
719
11
                ),
720
11
                self.original_position() - 4,
721
11
            ));
722
31.6k
        }
723
31.6k
        self.read_u32()
724
38.5k
    }
725
}
726
727
// See documentation on `BinaryReader::features` for more on what's going on
728
// here.
729
macro_rules! define_feature_accessor {
730
    ($feature:ident = $default:expr) => {
731
        impl BinaryReader<'_> {
732
            #[inline]
733
            #[allow(dead_code)]
734
1.36M
            pub(crate) fn $feature(&self) -> bool {
735
                #[cfg(feature = "features")]
736
                {
737
1.36M
                    self.features.$feature()
738
                }
739
                #[cfg(not(feature = "features"))]
740
                {
741
                    true
742
                }
743
1.36M
            }
<wasmparser::binary_reader::BinaryReader>::call_indirect_overlong
Line
Count
Source
734
978
            pub(crate) fn $feature(&self) -> bool {
735
                #[cfg(feature = "features")]
736
                {
737
978
                    self.features.$feature()
738
                }
739
                #[cfg(not(feature = "features"))]
740
                {
741
                    true
742
                }
743
978
            }
<wasmparser::binary_reader::BinaryReader>::cm_implements
Line
Count
Source
734
101k
            pub(crate) fn $feature(&self) -> bool {
735
                #[cfg(feature = "features")]
736
                {
737
101k
                    self.features.$feature()
738
                }
739
                #[cfg(not(feature = "features"))]
740
                {
741
                    true
742
                }
743
101k
            }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_canon_names
<wasmparser::binary_reader::BinaryReader>::multi_memory
Line
Count
Source
734
767k
            pub(crate) fn $feature(&self) -> bool {
735
                #[cfg(feature = "features")]
736
                {
737
767k
                    self.features.$feature()
738
                }
739
                #[cfg(not(feature = "features"))]
740
                {
741
                    true
742
                }
743
767k
            }
<wasmparser::binary_reader::BinaryReader>::memory64
Line
Count
Source
734
494k
            pub(crate) fn $feature(&self) -> bool {
735
                #[cfg(feature = "features")]
736
                {
737
494k
                    self.features.$feature()
738
                }
739
                #[cfg(not(feature = "features"))]
740
                {
741
                    true
742
                }
743
494k
            }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::mutable_global
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::saturating_float_to_int
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::sign_extension
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::reference_types
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::multi_value
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_error_context
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_fixed_length_lists
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_gc
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::bulk_memory_opt
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::custom_descriptors
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::compact_imports
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_map
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm64
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::bulk_memory
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::simd
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::relaxed_simd
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::threads
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::shared_everything_threads
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::tail_call
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::floats
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::exceptions
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::extended_const
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::component_model
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::function_references
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::memory_control
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::gc
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::custom_page_sizes
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::legacy_exceptions
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::gc_types
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::stack_switching
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::wide_arithmetic
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_values
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_nested_names
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_async
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_async_stackful
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_more_async_builtins
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_threading
744
        }
745
    };
746
}
747
748
super::features::foreach_wasm_feature!(define_feature_accessor);
749
750
/// Iterator returned from [`BinaryReader::read_iter`].
751
pub struct BinaryReaderIter<'a, 'me, T: FromReader<'a>> {
752
    remaining: usize,
753
    pub(crate) reader: &'me mut BinaryReader<'a>,
754
    _marker: marker::PhantomData<T>,
755
}
756
757
impl<'a, T> Iterator for BinaryReaderIter<'a, '_, T>
758
where
759
    T: FromReader<'a>,
760
{
761
    type Item = Result<T>;
762
763
18.5M
    fn next(&mut self) -> Option<Result<T>> {
764
18.5M
        if self.remaining == 0 {
765
5.48M
            None
766
        } else {
767
13.1M
            let ret = self.reader.read::<T>();
768
13.1M
            if ret.is_err() {
769
0
                self.remaining = 0;
770
13.1M
            } else {
771
13.1M
                self.remaining -= 1;
772
13.1M
            }
773
13.1M
            Some(ret)
774
        }
775
18.5M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::SubType> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
1.11M
    fn next(&mut self) -> Option<Result<T>> {
764
1.11M
        if self.remaining == 0 {
765
581k
            None
766
        } else {
767
537k
            let ret = self.reader.read::<T>();
768
537k
            if ret.is_err() {
769
0
                self.remaining = 0;
770
537k
            } else {
771
537k
                self.remaining -= 1;
772
537k
            }
773
537k
            Some(ret)
774
        }
775
1.11M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::ValType> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
6.70M
    fn next(&mut self) -> Option<Result<T>> {
764
6.70M
        if self.remaining == 0 {
765
1.16M
            None
766
        } else {
767
5.53M
            let ret = self.reader.read::<T>();
768
5.53M
            if ret.is_err() {
769
0
                self.remaining = 0;
770
5.53M
            } else {
771
5.53M
                self.remaining -= 1;
772
5.53M
            }
773
5.53M
            Some(ret)
774
        }
775
6.70M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::FieldType> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
849k
    fn next(&mut self) -> Option<Result<T>> {
764
849k
        if self.remaining == 0 {
765
177k
            None
766
        } else {
767
671k
            let ret = self.reader.read::<T>();
768
671k
            if ret.is_err() {
769
0
                self.remaining = 0;
770
671k
            } else {
771
671k
                self.remaining -= 1;
772
671k
            }
773
671k
            Some(ret)
774
        }
775
849k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::exports::Export> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
21.8k
    fn next(&mut self) -> Option<Result<T>> {
764
21.8k
        if self.remaining == 0 {
765
5.61k
            None
766
        } else {
767
16.2k
            let ret = self.reader.read::<T>();
768
16.2k
            if ret.is_err() {
769
0
                self.remaining = 0;
770
16.2k
            } else {
771
16.2k
                self.remaining -= 1;
772
16.2k
            }
773
16.2k
            Some(ret)
774
        }
775
21.8k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Catch> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
8.43M
    fn next(&mut self) -> Option<Result<T>> {
764
8.43M
        if self.remaining == 0 {
765
3.02M
            None
766
        } else {
767
5.41M
            let ret = self.reader.read::<T>();
768
5.41M
            if ret.is_err() {
769
0
                self.remaining = 0;
770
5.41M
            } else {
771
5.41M
                self.remaining -= 1;
772
5.41M
            }
773
5.41M
            Some(ret)
774
        }
775
8.43M
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Handle> as core::iter::traits::iterator::Iterator>::next
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::canonicals::CanonicalOption> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
31.8k
    fn next(&mut self) -> Option<Result<T>> {
764
31.8k
        if self.remaining == 0 {
765
21.0k
            None
766
        } else {
767
10.8k
            let ret = self.reader.read::<T>();
768
10.8k
            if ret.is_err() {
769
0
                self.remaining = 0;
770
10.8k
            } else {
771
10.8k
                self.remaining -= 1;
772
10.8k
            }
773
10.8k
            Some(ret)
774
        }
775
31.8k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::VariantCase> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
38.5k
    fn next(&mut self) -> Option<Result<T>> {
764
38.5k
        if self.remaining == 0 {
765
11.3k
            None
766
        } else {
767
27.1k
            let ret = self.reader.read::<T>();
768
27.1k
            if ret.is_err() {
769
0
                self.remaining = 0;
770
27.1k
            } else {
771
27.1k
                self.remaining -= 1;
772
27.1k
            }
773
27.1k
            Some(ret)
774
        }
775
38.5k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ComponentValType> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
218k
    fn next(&mut self) -> Option<Result<T>> {
764
218k
        if self.remaining == 0 {
765
77.0k
            None
766
        } else {
767
140k
            let ret = self.reader.read::<T>();
768
140k
            if ret.is_err() {
769
0
                self.remaining = 0;
770
140k
            } else {
771
140k
                self.remaining -= 1;
772
140k
            }
773
140k
            Some(ret)
774
        }
775
218k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ModuleTypeDeclaration> as core::iter::traits::iterator::Iterator>::next
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::InstanceTypeDeclaration> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
197k
    fn next(&mut self) -> Option<Result<T>> {
764
197k
        if self.remaining == 0 {
765
29.6k
            None
766
        } else {
767
167k
            let ret = self.reader.read::<T>();
768
167k
            if ret.is_err() {
769
0
                self.remaining = 0;
770
167k
            } else {
771
167k
                self.remaining -= 1;
772
167k
            }
773
167k
            Some(ret)
774
        }
775
197k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ComponentTypeDeclaration> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
74.7k
    fn next(&mut self) -> Option<Result<T>> {
764
74.7k
        if self.remaining == 0 {
765
20.8k
            None
766
        } else {
767
53.9k
            let ret = self.reader.read::<T>();
768
53.9k
            if ret.is_err() {
769
0
                self.remaining = 0;
770
53.9k
            } else {
771
53.9k
                self.remaining -= 1;
772
53.9k
            }
773
53.9k
            Some(ret)
774
        }
775
74.7k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::InstantiationArg> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
13.8k
    fn next(&mut self) -> Option<Result<T>> {
764
13.8k
        if self.remaining == 0 {
765
8.54k
            None
766
        } else {
767
5.30k
            let ret = self.reader.read::<T>();
768
5.30k
            if ret.is_err() {
769
0
                self.remaining = 0;
770
5.30k
            } else {
771
5.30k
                self.remaining -= 1;
772
5.30k
            }
773
5.30k
            Some(ret)
774
        }
775
13.8k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::ComponentInstantiationArg> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
13.5k
    fn next(&mut self) -> Option<Result<T>> {
764
13.5k
        if self.remaining == 0 {
765
6.82k
            None
766
        } else {
767
6.67k
            let ret = self.reader.read::<T>();
768
6.67k
            if ret.is_err() {
769
0
                self.remaining = 0;
770
6.67k
            } else {
771
6.67k
                self.remaining -= 1;
772
6.67k
            }
773
6.67k
            Some(ret)
774
        }
775
13.5k
    }
<wasmparser::binary_reader::BinaryReaderIter<&str> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
530k
    fn next(&mut self) -> Option<Result<T>> {
764
530k
        if self.remaining == 0 {
765
114k
            None
766
        } else {
767
415k
            let ret = self.reader.read::<T>();
768
415k
            if ret.is_err() {
769
0
                self.remaining = 0;
770
415k
            } else {
771
415k
                self.remaining -= 1;
772
415k
            }
773
415k
            Some(ret)
774
        }
775
530k
    }
<wasmparser::binary_reader::BinaryReaderIter<(&str, wasmparser::readers::component::types::ComponentValType)> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
104k
    fn next(&mut self) -> Option<Result<T>> {
764
104k
        if self.remaining == 0 {
765
45.9k
            None
766
        } else {
767
58.5k
            let ret = self.reader.read::<T>();
768
58.5k
            if ret.is_err() {
769
0
                self.remaining = 0;
770
58.5k
            } else {
771
58.5k
                self.remaining -= 1;
772
58.5k
            }
773
58.5k
            Some(ret)
774
        }
775
104k
    }
<wasmparser::binary_reader::BinaryReaderIter<u32> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
763
237k
    fn next(&mut self) -> Option<Result<T>> {
764
237k
        if self.remaining == 0 {
765
198k
            None
766
        } else {
767
39.0k
            let ret = self.reader.read::<T>();
768
39.0k
            if ret.is_err() {
769
0
                self.remaining = 0;
770
39.0k
            } else {
771
39.0k
                self.remaining -= 1;
772
39.0k
            }
773
39.0k
            Some(ret)
774
        }
775
237k
    }
776
777
3.75M
    fn size_hint(&self) -> (usize, Option<usize>) {
778
3.75M
        (self.remaining, Some(self.remaining))
779
3.75M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::SubType> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
290k
    fn size_hint(&self) -> (usize, Option<usize>) {
778
290k
        (self.remaining, Some(self.remaining))
779
290k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::ValType> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
1.15M
    fn size_hint(&self) -> (usize, Option<usize>) {
778
1.15M
        (self.remaining, Some(self.remaining))
779
1.15M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::FieldType> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
189k
    fn size_hint(&self) -> (usize, Option<usize>) {
778
189k
        (self.remaining, Some(self.remaining))
779
189k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::exports::Export> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
4.74k
    fn size_hint(&self) -> (usize, Option<usize>) {
778
4.74k
        (self.remaining, Some(self.remaining))
779
4.74k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Catch> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
1.81M
    fn size_hint(&self) -> (usize, Option<usize>) {
778
1.81M
        (self.remaining, Some(self.remaining))
779
1.81M
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Handle> as core::iter::traits::iterator::Iterator>::size_hint
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::canonicals::CanonicalOption> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
6.88k
    fn size_hint(&self) -> (usize, Option<usize>) {
778
6.88k
        (self.remaining, Some(self.remaining))
779
6.88k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::VariantCase> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
9.12k
    fn size_hint(&self) -> (usize, Option<usize>) {
778
9.12k
        (self.remaining, Some(self.remaining))
779
9.12k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ComponentValType> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
54.6k
    fn size_hint(&self) -> (usize, Option<usize>) {
778
54.6k
        (self.remaining, Some(self.remaining))
779
54.6k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ModuleTypeDeclaration> as core::iter::traits::iterator::Iterator>::size_hint
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::InstanceTypeDeclaration> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
29.9k
    fn size_hint(&self) -> (usize, Option<usize>) {
778
29.9k
        (self.remaining, Some(self.remaining))
779
29.9k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ComponentTypeDeclaration> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
14.8k
    fn size_hint(&self) -> (usize, Option<usize>) {
778
14.8k
        (self.remaining, Some(self.remaining))
779
14.8k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::InstantiationArg> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
2.74k
    fn size_hint(&self) -> (usize, Option<usize>) {
778
2.74k
        (self.remaining, Some(self.remaining))
779
2.74k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::ComponentInstantiationArg> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
2.22k
    fn size_hint(&self) -> (usize, Option<usize>) {
778
2.22k
        (self.remaining, Some(self.remaining))
779
2.22k
    }
<wasmparser::binary_reader::BinaryReaderIter<&str> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
125k
    fn size_hint(&self) -> (usize, Option<usize>) {
778
125k
        (self.remaining, Some(self.remaining))
779
125k
    }
<wasmparser::binary_reader::BinaryReaderIter<(&str, wasmparser::readers::component::types::ComponentValType)> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
25.5k
    fn size_hint(&self) -> (usize, Option<usize>) {
778
25.5k
        (self.remaining, Some(self.remaining))
779
25.5k
    }
<wasmparser::binary_reader::BinaryReaderIter<u32> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
777
39.0k
    fn size_hint(&self) -> (usize, Option<usize>) {
778
39.0k
        (self.remaining, Some(self.remaining))
779
39.0k
    }
780
}
781
782
impl<'a, T> Drop for BinaryReaderIter<'a, '_, T>
783
where
784
    T: FromReader<'a>,
785
{
786
2.74M
    fn drop(&mut self) {
787
2.74M
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
2.74M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::SubType> as core::ops::drop::Drop>::drop
Line
Count
Source
786
290k
    fn drop(&mut self) {
787
290k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
290k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::ValType> as core::ops::drop::Drop>::drop
Line
Count
Source
786
581k
    fn drop(&mut self) {
787
581k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
581k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::FieldType> as core::ops::drop::Drop>::drop
Line
Count
Source
786
88.9k
    fn drop(&mut self) {
787
88.9k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
88.9k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::exports::Export> as core::ops::drop::Drop>::drop
Line
Count
Source
786
2.80k
    fn drop(&mut self) {
787
2.80k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
2.80k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Catch> as core::ops::drop::Drop>::drop
Line
Count
Source
786
1.51M
    fn drop(&mut self) {
787
1.51M
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
1.51M
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Handle> as core::ops::drop::Drop>::drop
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::canonicals::CanonicalOption> as core::ops::drop::Drop>::drop
Line
Count
Source
786
10.5k
    fn drop(&mut self) {
787
10.5k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
10.5k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::VariantCase> as core::ops::drop::Drop>::drop
Line
Count
Source
786
5.67k
    fn drop(&mut self) {
787
5.67k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
5.67k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ComponentValType> as core::ops::drop::Drop>::drop
Line
Count
Source
786
38.5k
    fn drop(&mut self) {
787
38.5k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
38.5k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ModuleTypeDeclaration> as core::ops::drop::Drop>::drop
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::InstanceTypeDeclaration> as core::ops::drop::Drop>::drop
Line
Count
Source
786
14.8k
    fn drop(&mut self) {
787
14.8k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
14.8k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ComponentTypeDeclaration> as core::ops::drop::Drop>::drop
Line
Count
Source
786
10.4k
    fn drop(&mut self) {
787
10.4k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
10.4k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::InstantiationArg> as core::ops::drop::Drop>::drop
Line
Count
Source
786
4.27k
    fn drop(&mut self) {
787
4.27k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
4.27k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::ComponentInstantiationArg> as core::ops::drop::Drop>::drop
Line
Count
Source
786
3.41k
    fn drop(&mut self) {
787
3.41k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
3.41k
    }
<wasmparser::binary_reader::BinaryReaderIter<&str> as core::ops::drop::Drop>::drop
Line
Count
Source
786
57.4k
    fn drop(&mut self) {
787
57.4k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
57.4k
    }
<wasmparser::binary_reader::BinaryReaderIter<(&str, wasmparser::readers::component::types::ComponentValType)> as core::ops::drop::Drop>::drop
Line
Count
Source
786
22.9k
    fn drop(&mut self) {
787
22.9k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
22.9k
    }
<wasmparser::binary_reader::BinaryReaderIter<u32> as core::ops::drop::Drop>::drop
Line
Count
Source
786
99.4k
    fn drop(&mut self) {
787
99.4k
        while self.next().is_some() {
788
0
            // ...
789
0
        }
790
99.4k
    }
791
}
792
793
impl<'a> BinaryReader<'a> {
794
    /// Function that must be called after the last opcode in an expression (instruction sequence)
795
    /// has been processed. Returns an error if there is extra data after the operators.
796
753k
    pub fn finish_expression(&self, stack: &impl FrameStack) -> Result<()> {
797
753k
        if stack.current_frame().is_some() {
798
6
            bail!(
799
6
                self.original_position(),
800
                "control frames remain at end of function body or expression"
801
            );
802
753k
        }
803
753k
        if !self.eof() {
804
0
            bail!(
805
0
                self.original_position(),
806
                "unexpected data at the end of operators"
807
            );
808
753k
        }
809
753k
        Ok(())
810
753k
    }
<wasmparser::binary_reader::BinaryReader>::finish_expression::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>
Line
Count
Source
796
312k
    pub fn finish_expression(&self, stack: &impl FrameStack) -> Result<()> {
797
312k
        if stack.current_frame().is_some() {
798
0
            bail!(
799
0
                self.original_position(),
800
                "control frames remain at end of function body or expression"
801
            );
802
312k
        }
803
312k
        if !self.eof() {
804
0
            bail!(
805
0
                self.original_position(),
806
                "unexpected data at the end of operators"
807
            );
808
312k
        }
809
312k
        Ok(())
810
312k
    }
<wasmparser::binary_reader::BinaryReader>::finish_expression::<wasmparser::readers::core::operators::OperatorsReader>
Line
Count
Source
796
440k
    pub fn finish_expression(&self, stack: &impl FrameStack) -> Result<()> {
797
440k
        if stack.current_frame().is_some() {
798
6
            bail!(
799
6
                self.original_position(),
800
                "control frames remain at end of function body or expression"
801
            );
802
440k
        }
803
440k
        if !self.eof() {
804
0
            bail!(
805
0
                self.original_position(),
806
                "unexpected data at the end of operators"
807
            );
808
440k
        }
809
440k
        Ok(())
810
440k
    }
811
812
    #[inline]
813
17.7k
    fn expect_frame(&mut self, stack: &impl FrameStack, k: FrameKind, found: &str) -> Result<()> {
814
17.7k
        if stack.current_frame() == Some(k) {
815
17.7k
            return Ok(());
816
1
        }
817
1
        bail!(
818
1
            self.original_position(),
819
            "`{}` found outside `{:?}` block",
820
            found,
821
            k
822
        );
823
17.7k
    }
<wasmparser::binary_reader::BinaryReader>::expect_frame::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>
Line
Count
Source
813
3.80k
    fn expect_frame(&mut self, stack: &impl FrameStack, k: FrameKind, found: &str) -> Result<()> {
814
3.80k
        if stack.current_frame() == Some(k) {
815
3.80k
            return Ok(());
816
1
        }
817
1
        bail!(
818
1
            self.original_position(),
819
            "`{}` found outside `{:?}` block",
820
            found,
821
            k
822
        );
823
3.80k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::expect_frame::<wasmparser::readers::core::operators::FrameStackAdapter<wit_component::gc::Module>>
<wasmparser::binary_reader::BinaryReader>::expect_frame::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>
Line
Count
Source
813
10.4k
    fn expect_frame(&mut self, stack: &impl FrameStack, k: FrameKind, found: &str) -> Result<()> {
814
10.4k
        if stack.current_frame() == Some(k) {
815
10.4k
            return Ok(());
816
0
        }
817
0
        bail!(
818
0
            self.original_position(),
819
            "`{}` found outside `{:?}` block",
820
            found,
821
            k
822
        );
823
10.4k
    }
<wasmparser::binary_reader::BinaryReader>::expect_frame::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
813
3.53k
    fn expect_frame(&mut self, stack: &impl FrameStack, k: FrameKind, found: &str) -> Result<()> {
814
3.53k
        if stack.current_frame() == Some(k) {
815
3.53k
            return Ok(());
816
0
        }
817
0
        bail!(
818
0
            self.original_position(),
819
            "`{}` found outside `{:?}` block",
820
            found,
821
            k
822
        );
823
3.53k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::expect_frame::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
824
825
    /// Visit the next available operator with the specified [`VisitOperator`] instance
826
    /// that is also a [`FrameStack`].
827
    ///
828
    /// See the documentation for [`OperatorsReader::visit_operator`] for a version that
829
    /// does not require the visitor to implement [`FrameStack`].
830
73.9M
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
831
73.9M
    where
832
73.9M
        T: VisitOperator<'a> + FrameStack,
833
    {
834
73.9M
        if visitor.current_frame().is_none() {
835
0
            bail!(
836
0
                self.original_position(),
837
                "operators remaining after end of function body or expression"
838
            );
839
73.9M
        }
840
73.9M
        let pos = self.original_position();
841
73.9M
        let code = self.read_u8()?;
842
73.9M
        Ok(match code {
843
54.3k
            0x00 => visitor.visit_unreachable(),
844
139k
            0x01 => visitor.visit_nop(),
845
843k
            0x02 => visitor.visit_block(self.read_block_type()?),
846
373k
            0x03 => visitor.visit_loop(self.read_block_type()?),
847
3.25M
            0x04 => visitor.visit_if(self.read_block_type()?),
848
            0x05 => {
849
17.7k
                self.expect_frame(visitor, FrameKind::If, "else")?;
850
17.7k
                visitor.visit_else()
851
            }
852
            0x06 => {
853
                #[cfg(feature = "features")]
854
0
                require_feature::legacy_exceptions(
855
0
                    self.features,
856
                    "legacy_exceptions feature required for try instruction",
857
0
                    pos,
858
0
                )?;
859
0
                visitor.visit_try(self.read_block_type()?)
860
            }
861
            0x07 => {
862
                #[cfg(feature = "features")]
863
0
                require_feature::legacy_exceptions(
864
0
                    self.features,
865
                    "legacy_exceptions feature required for catch instruction",
866
0
                    pos,
867
0
                )?;
868
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
869
0
                    Ok(()) => (),
870
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
871
                }
872
0
                visitor.visit_catch(self.read_var_u32()?)
873
            }
874
1.86k
            0x08 => visitor.visit_throw(self.read_var_u32()?),
875
1
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
876
205k
            0x0a => visitor.visit_throw_ref(),
877
9.07M
            0x0b => visitor.visit_end(),
878
1.12M
            0x0c => visitor.visit_br(self.read_var_u32()?),
879
292k
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
880
8.69k
            0x0e => visitor.visit_br_table(self.read_br_table()?),
881
3.39k
            0x0f => visitor.visit_return(),
882
92.8k
            0x10 => visitor.visit_call(self.read_var_u32()?),
883
            0x11 => {
884
978
                let index = self.read_var_u32()?;
885
978
                let table = self.read_call_indirect_table_immediate()?;
886
978
                visitor.visit_call_indirect(index, table)
887
            }
888
20.1k
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
889
94
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
890
0
            0x14 => visitor.visit_call_ref(self.read()?),
891
299
            0x15 => visitor.visit_return_call_ref(self.read()?),
892
            0x18 => {
893
0
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
894
0
                visitor.visit_delegate(self.read_var_u32()?)
895
            }
896
            0x19 => {
897
                #[cfg(feature = "features")]
898
0
                require_feature::legacy_exceptions(
899
0
                    self.features,
900
                    "legacy_exceptions feature required for catch_all instruction",
901
0
                    pos,
902
0
                )?;
903
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch_all") {
904
0
                    Ok(()) => (),
905
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch_all")?,
906
                }
907
0
                visitor.visit_catch_all()
908
            }
909
1.07M
            0x1a => visitor.visit_drop(),
910
276k
            0x1b => visitor.visit_select(),
911
            0x1c => {
912
62
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
913
62
                if result_count == 1 {
914
62
                    visitor.visit_typed_select(self.read()?)
915
                } else {
916
0
                    let mut results = Vec::new();
917
0
                    results.reserve_exact(result_count);
918
0
                    for _ in 0..result_count {
919
0
                        results.push(self.read()?);
920
                    }
921
0
                    visitor.visit_typed_select_multi(results)
922
                }
923
            }
924
1.51M
            0x1f => visitor.visit_try_table(self.read()?),
925
926
7.76M
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
927
3.72M
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
928
1.57M
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
929
1.85M
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
930
1.68M
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
931
592
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
932
22
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
933
934
84.4k
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
935
18.8k
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
936
13.9k
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
937
7.13k
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
938
12.1k
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
939
8.83k
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
940
17.7k
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
941
8.62k
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
942
10.2k
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
943
8.31k
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
944
10.3k
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
945
8.41k
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
946
10.7k
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
947
10.9k
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
948
646
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
949
796
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
950
239
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
951
345
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
952
963
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
953
537
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
954
659
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
955
524
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
956
1.52k
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
957
            0x3f => {
958
182k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
959
182k
                visitor.visit_memory_size(mem)
960
            }
961
            0x40 => {
962
23.5k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
963
23.5k
                visitor.visit_memory_grow(mem)
964
            }
965
966
1.74M
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
967
4.77M
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
968
7.09M
            0x43 => visitor.visit_f32_const(self.read_f32()?),
969
2.54M
            0x44 => visitor.visit_f64_const(self.read_f64()?),
970
971
421k
            0x45 => visitor.visit_i32_eqz(),
972
3.16k
            0x46 => visitor.visit_i32_eq(),
973
6.05k
            0x47 => visitor.visit_i32_ne(),
974
1.15k
            0x48 => visitor.visit_i32_lt_s(),
975
5.64k
            0x49 => visitor.visit_i32_lt_u(),
976
1.06k
            0x4a => visitor.visit_i32_gt_s(),
977
1.84k
            0x4b => visitor.visit_i32_gt_u(),
978
61.8k
            0x4c => visitor.visit_i32_le_s(),
979
53.2k
            0x4d => visitor.visit_i32_le_u(),
980
1.34k
            0x4e => visitor.visit_i32_ge_s(),
981
3.41k
            0x4f => visitor.visit_i32_ge_u(),
982
28.3k
            0x50 => visitor.visit_i64_eqz(),
983
502
            0x51 => visitor.visit_i64_eq(),
984
7.14k
            0x52 => visitor.visit_i64_ne(),
985
1.00k
            0x53 => visitor.visit_i64_lt_s(),
986
813
            0x54 => visitor.visit_i64_lt_u(),
987
2.84k
            0x55 => visitor.visit_i64_gt_s(),
988
993
            0x56 => visitor.visit_i64_gt_u(),
989
86.5k
            0x57 => visitor.visit_i64_le_s(),
990
86.5k
            0x58 => visitor.visit_i64_le_u(),
991
1.38k
            0x59 => visitor.visit_i64_ge_s(),
992
2.66k
            0x5a => visitor.visit_i64_ge_u(),
993
2.05M
            0x5b => visitor.visit_f32_eq(),
994
934k
            0x5c => visitor.visit_f32_ne(),
995
934k
            0x5d => visitor.visit_f32_lt(),
996
934k
            0x5e => visitor.visit_f32_gt(),
997
240
            0x5f => visitor.visit_f32_le(),
998
852
            0x60 => visitor.visit_f32_ge(),
999
356k
            0x61 => visitor.visit_f64_eq(),
1000
142k
            0x62 => visitor.visit_f64_ne(),
1001
142k
            0x63 => visitor.visit_f64_lt(),
1002
142k
            0x64 => visitor.visit_f64_gt(),
1003
249
            0x65 => visitor.visit_f64_le(),
1004
156
            0x66 => visitor.visit_f64_ge(),
1005
67.9k
            0x67 => visitor.visit_i32_clz(),
1006
52.0k
            0x68 => visitor.visit_i32_ctz(),
1007
46.1k
            0x69 => visitor.visit_i32_popcnt(),
1008
177k
            0x6a => visitor.visit_i32_add(),
1009
12.6k
            0x6b => visitor.visit_i32_sub(),
1010
470k
            0x6c => visitor.visit_i32_mul(),
1011
898
            0x6d => visitor.visit_i32_div_s(),
1012
11.0k
            0x6e => visitor.visit_i32_div_u(),
1013
1.13k
            0x6f => visitor.visit_i32_rem_s(),
1014
1.07k
            0x70 => visitor.visit_i32_rem_u(),
1015
1.21k
            0x71 => visitor.visit_i32_and(),
1016
2.15M
            0x72 => visitor.visit_i32_or(),
1017
626k
            0x73 => visitor.visit_i32_xor(),
1018
851
            0x74 => visitor.visit_i32_shl(),
1019
853
            0x75 => visitor.visit_i32_shr_s(),
1020
1.50k
            0x76 => visitor.visit_i32_shr_u(),
1021
919
            0x77 => visitor.visit_i32_rotl(),
1022
1.63k
            0x78 => visitor.visit_i32_rotr(),
1023
70.8k
            0x79 => visitor.visit_i64_clz(),
1024
129k
            0x7a => visitor.visit_i64_ctz(),
1025
173k
            0x7b => visitor.visit_i64_popcnt(),
1026
1.45M
            0x7c => visitor.visit_i64_add(),
1027
7.91k
            0x7d => visitor.visit_i64_sub(),
1028
756k
            0x7e => visitor.visit_i64_mul(),
1029
1.03k
            0x7f => visitor.visit_i64_div_s(),
1030
1.69k
            0x80 => visitor.visit_i64_div_u(),
1031
2.96k
            0x81 => visitor.visit_i64_rem_s(),
1032
1.74k
            0x82 => visitor.visit_i64_rem_u(),
1033
1.32k
            0x83 => visitor.visit_i64_and(),
1034
8.78k
            0x84 => visitor.visit_i64_or(),
1035
900k
            0x85 => visitor.visit_i64_xor(),
1036
2.26k
            0x86 => visitor.visit_i64_shl(),
1037
4.00k
            0x87 => visitor.visit_i64_shr_s(),
1038
3.43k
            0x88 => visitor.visit_i64_shr_u(),
1039
868
            0x89 => visitor.visit_i64_rotl(),
1040
1.37k
            0x8a => visitor.visit_i64_rotr(),
1041
148k
            0x8b => visitor.visit_f32_abs(),
1042
18.5k
            0x8c => visitor.visit_f32_neg(),
1043
133k
            0x8d => visitor.visit_f32_ceil(),
1044
31.9k
            0x8e => visitor.visit_f32_floor(),
1045
12.6k
            0x8f => visitor.visit_f32_trunc(),
1046
6.50k
            0x90 => visitor.visit_f32_nearest(),
1047
9.49k
            0x91 => visitor.visit_f32_sqrt(),
1048
2.41k
            0x92 => visitor.visit_f32_add(),
1049
869
            0x93 => visitor.visit_f32_sub(),
1050
449
            0x94 => visitor.visit_f32_mul(),
1051
359
            0x95 => visitor.visit_f32_div(),
1052
729
            0x96 => visitor.visit_f32_min(),
1053
256
            0x97 => visitor.visit_f32_max(),
1054
200
            0x98 => visitor.visit_f32_copysign(),
1055
19.5k
            0x99 => visitor.visit_f64_abs(),
1056
32.1k
            0x9a => visitor.visit_f64_neg(),
1057
9.86k
            0x9b => visitor.visit_f64_ceil(),
1058
6.88k
            0x9c => visitor.visit_f64_floor(),
1059
9.20k
            0x9d => visitor.visit_f64_trunc(),
1060
11.0k
            0x9e => visitor.visit_f64_nearest(),
1061
14.9k
            0x9f => visitor.visit_f64_sqrt(),
1062
489
            0xa0 => visitor.visit_f64_add(),
1063
15.2k
            0xa1 => visitor.visit_f64_sub(),
1064
392
            0xa2 => visitor.visit_f64_mul(),
1065
1.24k
            0xa3 => visitor.visit_f64_div(),
1066
705
            0xa4 => visitor.visit_f64_min(),
1067
368
            0xa5 => visitor.visit_f64_max(),
1068
193
            0xa6 => visitor.visit_f64_copysign(),
1069
169k
            0xa7 => visitor.visit_i32_wrap_i64(),
1070
3.86k
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1071
922k
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1072
13.6k
            0xaa => visitor.visit_i32_trunc_f64_s(),
1073
118k
            0xab => visitor.visit_i32_trunc_f64_u(),
1074
16.8k
            0xac => visitor.visit_i64_extend_i32_s(),
1075
236k
            0xad => visitor.visit_i64_extend_i32_u(),
1076
6.52k
            0xae => visitor.visit_i64_trunc_f32_s(),
1077
3.07k
            0xaf => visitor.visit_i64_trunc_f32_u(),
1078
4.42k
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1079
7.27k
            0xb1 => visitor.visit_i64_trunc_f64_u(),
1080
7.16k
            0xb2 => visitor.visit_f32_convert_i32_s(),
1081
901k
            0xb3 => visitor.visit_f32_convert_i32_u(),
1082
8.15k
            0xb4 => visitor.visit_f32_convert_i64_s(),
1083
8.06k
            0xb5 => visitor.visit_f32_convert_i64_u(),
1084
13.8k
            0xb6 => visitor.visit_f32_demote_f64(),
1085
17.0k
            0xb7 => visitor.visit_f64_convert_i32_s(),
1086
8.68k
            0xb8 => visitor.visit_f64_convert_i32_u(),
1087
119k
            0xb9 => visitor.visit_f64_convert_i64_s(),
1088
42.0k
            0xba => visitor.visit_f64_convert_i64_u(),
1089
16.3k
            0xbb => visitor.visit_f64_promote_f32(),
1090
137k
            0xbc => visitor.visit_i32_reinterpret_f32(),
1091
395k
            0xbd => visitor.visit_i64_reinterpret_f64(),
1092
17.8k
            0xbe => visitor.visit_f32_reinterpret_i32(),
1093
3.47k
            0xbf => visitor.visit_f64_reinterpret_i64(),
1094
1095
85.2k
            0xc0 => visitor.visit_i32_extend8_s(),
1096
36.3k
            0xc1 => visitor.visit_i32_extend16_s(),
1097
33.9k
            0xc2 => visitor.visit_i64_extend8_s(),
1098
22.3k
            0xc3 => visitor.visit_i64_extend16_s(),
1099
24.5k
            0xc4 => visitor.visit_i64_extend32_s(),
1100
1101
2.61M
            0xd0 => visitor.visit_ref_null(self.read()?),
1102
10.1k
            0xd1 => visitor.visit_ref_is_null(),
1103
169k
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1104
1.57k
            0xd3 => visitor.visit_ref_eq(),
1105
50.9k
            0xd4 => visitor.visit_ref_as_non_null(),
1106
47.1k
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1107
2.37k
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1108
1109
1
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1110
0
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1111
0
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1112
0
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1113
            0xe4 => {
1114
0
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1115
            }
1116
0
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1117
0
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1118
1119
681k
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1120
324k
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1121
            0xfd => {
1122
                #[cfg(feature = "simd")]
1123
605k
                if let Some(mut visitor) = visitor.simd_visitor() {
1124
605k
                    return self.visit_0xfd_operator(pos, &mut visitor);
1125
0
                }
1126
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1127
            }
1128
343k
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1129
1130
5
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1131
        })
1132
73.9M
    }
<wasmparser::binary_reader::BinaryReader>::visit_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>
Line
Count
Source
830
5.94M
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
831
5.94M
    where
832
5.94M
        T: VisitOperator<'a> + FrameStack,
833
    {
834
5.94M
        if visitor.current_frame().is_none() {
835
0
            bail!(
836
0
                self.original_position(),
837
                "operators remaining after end of function body or expression"
838
            );
839
5.94M
        }
840
5.94M
        let pos = self.original_position();
841
5.94M
        let code = self.read_u8()?;
842
5.94M
        Ok(match code {
843
17.4k
            0x00 => visitor.visit_unreachable(),
844
17.7k
            0x01 => visitor.visit_nop(),
845
211k
            0x02 => visitor.visit_block(self.read_block_type()?),
846
35.6k
            0x03 => visitor.visit_loop(self.read_block_type()?),
847
29.1k
            0x04 => visitor.visit_if(self.read_block_type()?),
848
            0x05 => {
849
3.80k
                self.expect_frame(visitor, FrameKind::If, "else")?;
850
3.80k
                visitor.visit_else()
851
            }
852
            0x06 => {
853
                #[cfg(feature = "features")]
854
0
                require_feature::legacy_exceptions(
855
0
                    self.features,
856
                    "legacy_exceptions feature required for try instruction",
857
0
                    pos,
858
0
                )?;
859
0
                visitor.visit_try(self.read_block_type()?)
860
            }
861
            0x07 => {
862
                #[cfg(feature = "features")]
863
0
                require_feature::legacy_exceptions(
864
0
                    self.features,
865
                    "legacy_exceptions feature required for catch instruction",
866
0
                    pos,
867
0
                )?;
868
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
869
0
                    Ok(()) => (),
870
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
871
                }
872
0
                visitor.visit_catch(self.read_var_u32()?)
873
            }
874
914
            0x08 => visitor.visit_throw(self.read_var_u32()?),
875
1
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
876
39
            0x0a => visitor.visit_throw_ref(),
877
339k
            0x0b => visitor.visit_end(),
878
162k
            0x0c => visitor.visit_br(self.read_var_u32()?),
879
92.6k
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
880
2.19k
            0x0e => visitor.visit_br_table(self.read_br_table()?),
881
678
            0x0f => visitor.visit_return(),
882
10.2k
            0x10 => visitor.visit_call(self.read_var_u32()?),
883
            0x11 => {
884
155
                let index = self.read_var_u32()?;
885
155
                let table = self.read_call_indirect_table_immediate()?;
886
155
                visitor.visit_call_indirect(index, table)
887
            }
888
3.36k
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
889
44
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
890
0
            0x14 => visitor.visit_call_ref(self.read()?),
891
2
            0x15 => visitor.visit_return_call_ref(self.read()?),
892
            0x18 => {
893
0
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
894
0
                visitor.visit_delegate(self.read_var_u32()?)
895
            }
896
            0x19 => {
897
                #[cfg(feature = "features")]
898
0
                require_feature::legacy_exceptions(
899
0
                    self.features,
900
                    "legacy_exceptions feature required for catch_all instruction",
901
0
                    pos,
902
0
                )?;
903
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch_all") {
904
0
                    Ok(()) => (),
905
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch_all")?,
906
                }
907
0
                visitor.visit_catch_all()
908
            }
909
98.0k
            0x1a => visitor.visit_drop(),
910
21.4k
            0x1b => visitor.visit_select(),
911
            0x1c => {
912
4
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
913
4
                if result_count == 1 {
914
4
                    visitor.visit_typed_select(self.read()?)
915
                } else {
916
0
                    let mut results = Vec::new();
917
0
                    results.reserve_exact(result_count);
918
0
                    for _ in 0..result_count {
919
0
                        results.push(self.read()?);
920
                    }
921
0
                    visitor.visit_typed_select_multi(results)
922
                }
923
            }
924
63.0k
            0x1f => visitor.visit_try_table(self.read()?),
925
926
343k
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
927
175k
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
928
95.7k
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
929
278k
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
930
253k
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
931
252
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
932
8
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
933
934
4.96k
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
935
6.98k
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
936
5.31k
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
937
2.14k
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
938
2.49k
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
939
2.93k
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
940
7.19k
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
941
1.95k
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
942
2.52k
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
943
2.28k
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
944
3.21k
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
945
2.80k
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
946
3.04k
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
947
1.86k
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
948
120
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
949
207
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
950
115
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
951
80
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
952
621
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
953
75
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
954
124
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
955
183
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
956
113
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
957
            0x3f => {
958
54.6k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
959
54.6k
                visitor.visit_memory_size(mem)
960
            }
961
            0x40 => {
962
8.07k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
963
8.07k
                visitor.visit_memory_grow(mem)
964
            }
965
966
247k
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
967
869k
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
968
68.7k
            0x43 => visitor.visit_f32_const(self.read_f32()?),
969
383k
            0x44 => visitor.visit_f64_const(self.read_f64()?),
970
971
9.97k
            0x45 => visitor.visit_i32_eqz(),
972
1.16k
            0x46 => visitor.visit_i32_eq(),
973
1.33k
            0x47 => visitor.visit_i32_ne(),
974
306
            0x48 => visitor.visit_i32_lt_s(),
975
1.30k
            0x49 => visitor.visit_i32_lt_u(),
976
376
            0x4a => visitor.visit_i32_gt_s(),
977
341
            0x4b => visitor.visit_i32_gt_u(),
978
13.2k
            0x4c => visitor.visit_i32_le_s(),
979
13.2k
            0x4d => visitor.visit_i32_le_u(),
980
299
            0x4e => visitor.visit_i32_ge_s(),
981
703
            0x4f => visitor.visit_i32_ge_u(),
982
6.08k
            0x50 => visitor.visit_i64_eqz(),
983
146
            0x51 => visitor.visit_i64_eq(),
984
1.12k
            0x52 => visitor.visit_i64_ne(),
985
155
            0x53 => visitor.visit_i64_lt_s(),
986
159
            0x54 => visitor.visit_i64_lt_u(),
987
484
            0x55 => visitor.visit_i64_gt_s(),
988
184
            0x56 => visitor.visit_i64_gt_u(),
989
30.7k
            0x57 => visitor.visit_i64_le_s(),
990
31.3k
            0x58 => visitor.visit_i64_le_u(),
991
379
            0x59 => visitor.visit_i64_ge_s(),
992
161
            0x5a => visitor.visit_i64_ge_u(),
993
11.1k
            0x5b => visitor.visit_f32_eq(),
994
2.17k
            0x5c => visitor.visit_f32_ne(),
995
2.15k
            0x5d => visitor.visit_f32_lt(),
996
2.21k
            0x5e => visitor.visit_f32_gt(),
997
84
            0x5f => visitor.visit_f32_le(),
998
389
            0x60 => visitor.visit_f32_ge(),
999
28.0k
            0x61 => visitor.visit_f64_eq(),
1000
6.30k
            0x62 => visitor.visit_f64_ne(),
1001
6.29k
            0x63 => visitor.visit_f64_lt(),
1002
6.28k
            0x64 => visitor.visit_f64_gt(),
1003
64
            0x65 => visitor.visit_f64_le(),
1004
60
            0x66 => visitor.visit_f64_ge(),
1005
10.6k
            0x67 => visitor.visit_i32_clz(),
1006
12.2k
            0x68 => visitor.visit_i32_ctz(),
1007
6.00k
            0x69 => visitor.visit_i32_popcnt(),
1008
36.3k
            0x6a => visitor.visit_i32_add(),
1009
1.90k
            0x6b => visitor.visit_i32_sub(),
1010
85.5k
            0x6c => visitor.visit_i32_mul(),
1011
241
            0x6d => visitor.visit_i32_div_s(),
1012
328
            0x6e => visitor.visit_i32_div_u(),
1013
364
            0x6f => visitor.visit_i32_rem_s(),
1014
233
            0x70 => visitor.visit_i32_rem_u(),
1015
351
            0x71 => visitor.visit_i32_and(),
1016
17.4k
            0x72 => visitor.visit_i32_or(),
1017
72.3k
            0x73 => visitor.visit_i32_xor(),
1018
274
            0x74 => visitor.visit_i32_shl(),
1019
122
            0x75 => visitor.visit_i32_shr_s(),
1020
274
            0x76 => visitor.visit_i32_shr_u(),
1021
445
            0x77 => visitor.visit_i32_rotl(),
1022
204
            0x78 => visitor.visit_i32_rotr(),
1023
15.5k
            0x79 => visitor.visit_i64_clz(),
1024
46.2k
            0x7a => visitor.visit_i64_ctz(),
1025
49.7k
            0x7b => visitor.visit_i64_popcnt(),
1026
53.2k
            0x7c => visitor.visit_i64_add(),
1027
1.27k
            0x7d => visitor.visit_i64_sub(),
1028
72.5k
            0x7e => visitor.visit_i64_mul(),
1029
196
            0x7f => visitor.visit_i64_div_s(),
1030
286
            0x80 => visitor.visit_i64_div_u(),
1031
533
            0x81 => visitor.visit_i64_rem_s(),
1032
434
            0x82 => visitor.visit_i64_rem_u(),
1033
228
            0x83 => visitor.visit_i64_and(),
1034
1.69k
            0x84 => visitor.visit_i64_or(),
1035
140k
            0x85 => visitor.visit_i64_xor(),
1036
504
            0x86 => visitor.visit_i64_shl(),
1037
1.74k
            0x87 => visitor.visit_i64_shr_s(),
1038
142
            0x88 => visitor.visit_i64_shr_u(),
1039
50
            0x89 => visitor.visit_i64_rotl(),
1040
218
            0x8a => visitor.visit_i64_rotr(),
1041
2.38k
            0x8b => visitor.visit_f32_abs(),
1042
3.51k
            0x8c => visitor.visit_f32_neg(),
1043
887
            0x8d => visitor.visit_f32_ceil(),
1044
1.23k
            0x8e => visitor.visit_f32_floor(),
1045
7.72k
            0x8f => visitor.visit_f32_trunc(),
1046
1.35k
            0x90 => visitor.visit_f32_nearest(),
1047
1.10k
            0x91 => visitor.visit_f32_sqrt(),
1048
86
            0x92 => visitor.visit_f32_add(),
1049
84
            0x93 => visitor.visit_f32_sub(),
1050
59
            0x94 => visitor.visit_f32_mul(),
1051
48
            0x95 => visitor.visit_f32_div(),
1052
84
            0x96 => visitor.visit_f32_min(),
1053
82
            0x97 => visitor.visit_f32_max(),
1054
37
            0x98 => visitor.visit_f32_copysign(),
1055
2.27k
            0x99 => visitor.visit_f64_abs(),
1056
2.49k
            0x9a => visitor.visit_f64_neg(),
1057
1.60k
            0x9b => visitor.visit_f64_ceil(),
1058
2.01k
            0x9c => visitor.visit_f64_floor(),
1059
1.96k
            0x9d => visitor.visit_f64_trunc(),
1060
2.55k
            0x9e => visitor.visit_f64_nearest(),
1061
3.47k
            0x9f => visitor.visit_f64_sqrt(),
1062
73
            0xa0 => visitor.visit_f64_add(),
1063
80
            0xa1 => visitor.visit_f64_sub(),
1064
69
            0xa2 => visitor.visit_f64_mul(),
1065
198
            0xa3 => visitor.visit_f64_div(),
1066
264
            0xa4 => visitor.visit_f64_min(),
1067
68
            0xa5 => visitor.visit_f64_max(),
1068
49
            0xa6 => visitor.visit_f64_copysign(),
1069
7.24k
            0xa7 => visitor.visit_i32_wrap_i64(),
1070
483
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1071
603
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1072
2.01k
            0xaa => visitor.visit_i32_trunc_f64_s(),
1073
1.93k
            0xab => visitor.visit_i32_trunc_f64_u(),
1074
3.12k
            0xac => visitor.visit_i64_extend_i32_s(),
1075
5.65k
            0xad => visitor.visit_i64_extend_i32_u(),
1076
575
            0xae => visitor.visit_i64_trunc_f32_s(),
1077
826
            0xaf => visitor.visit_i64_trunc_f32_u(),
1078
1.08k
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1079
1.53k
            0xb1 => visitor.visit_i64_trunc_f64_u(),
1080
1.99k
            0xb2 => visitor.visit_f32_convert_i32_s(),
1081
1.68k
            0xb3 => visitor.visit_f32_convert_i32_u(),
1082
1.35k
            0xb4 => visitor.visit_f32_convert_i64_s(),
1083
934
            0xb5 => visitor.visit_f32_convert_i64_u(),
1084
1.47k
            0xb6 => visitor.visit_f32_demote_f64(),
1085
3.13k
            0xb7 => visitor.visit_f64_convert_i32_s(),
1086
2.51k
            0xb8 => visitor.visit_f64_convert_i32_u(),
1087
777
            0xb9 => visitor.visit_f64_convert_i64_s(),
1088
12.2k
            0xba => visitor.visit_f64_convert_i64_u(),
1089
3.41k
            0xbb => visitor.visit_f64_promote_f32(),
1090
33.1k
            0xbc => visitor.visit_i32_reinterpret_f32(),
1091
86.8k
            0xbd => visitor.visit_i64_reinterpret_f64(),
1092
5.36k
            0xbe => visitor.visit_f32_reinterpret_i32(),
1093
518
            0xbf => visitor.visit_f64_reinterpret_i64(),
1094
1095
19.4k
            0xc0 => visitor.visit_i32_extend8_s(),
1096
10.2k
            0xc1 => visitor.visit_i32_extend16_s(),
1097
7.34k
            0xc2 => visitor.visit_i64_extend8_s(),
1098
7.66k
            0xc3 => visitor.visit_i64_extend16_s(),
1099
5.86k
            0xc4 => visitor.visit_i64_extend32_s(),
1100
1101
322k
            0xd0 => visitor.visit_ref_null(self.read()?),
1102
3.92k
            0xd1 => visitor.visit_ref_is_null(),
1103
23.0k
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1104
788
            0xd3 => visitor.visit_ref_eq(),
1105
25.1k
            0xd4 => visitor.visit_ref_as_non_null(),
1106
22.8k
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1107
1.18k
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1108
1109
0
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1110
0
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1111
0
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1112
0
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1113
            0xe4 => {
1114
0
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1115
            }
1116
0
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1117
0
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1118
1119
99.2k
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1120
116k
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1121
            0xfd => {
1122
                #[cfg(feature = "simd")]
1123
163k
                if let Some(mut visitor) = visitor.simd_visitor() {
1124
163k
                    return self.visit_0xfd_operator(pos, &mut visitor);
1125
0
                }
1126
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1127
            }
1128
145k
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1129
1130
5
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1131
        })
1132
5.94M
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wit_component::gc::Module>>
<wasmparser::binary_reader::BinaryReader>::visit_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>
Line
Count
Source
830
52.6M
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
831
52.6M
    where
832
52.6M
        T: VisitOperator<'a> + FrameStack,
833
    {
834
52.6M
        if visitor.current_frame().is_none() {
835
0
            bail!(
836
0
                self.original_position(),
837
                "operators remaining after end of function body or expression"
838
            );
839
52.6M
        }
840
52.6M
        let pos = self.original_position();
841
52.6M
        let code = self.read_u8()?;
842
52.6M
        Ok(match code {
843
24.3k
            0x00 => visitor.visit_unreachable(),
844
110k
            0x01 => visitor.visit_nop(),
845
464k
            0x02 => visitor.visit_block(self.read_block_type()?),
846
317k
            0x03 => visitor.visit_loop(self.read_block_type()?),
847
3.18M
            0x04 => visitor.visit_if(self.read_block_type()?),
848
            0x05 => {
849
10.4k
                self.expect_frame(visitor, FrameKind::If, "else")?;
850
10.4k
                visitor.visit_else()
851
            }
852
            0x06 => {
853
                #[cfg(feature = "features")]
854
0
                require_feature::legacy_exceptions(
855
0
                    self.features,
856
                    "legacy_exceptions feature required for try instruction",
857
0
                    pos,
858
0
                )?;
859
0
                visitor.visit_try(self.read_block_type()?)
860
            }
861
            0x07 => {
862
                #[cfg(feature = "features")]
863
0
                require_feature::legacy_exceptions(
864
0
                    self.features,
865
                    "legacy_exceptions feature required for catch instruction",
866
0
                    pos,
867
0
                )?;
868
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
869
0
                    Ok(()) => (),
870
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
871
                }
872
0
                visitor.visit_catch(self.read_var_u32()?)
873
            }
874
457
            0x08 => visitor.visit_throw(self.read_var_u32()?),
875
0
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
876
205k
            0x0a => visitor.visit_throw_ref(),
877
5.67M
            0x0b => visitor.visit_end(),
878
844k
            0x0c => visitor.visit_br(self.read_var_u32()?),
879
114k
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
880
3.19k
            0x0e => visitor.visit_br_table(self.read_br_table()?),
881
2.10k
            0x0f => visitor.visit_return(),
882
69.3k
            0x10 => visitor.visit_call(self.read_var_u32()?),
883
            0x11 => {
884
718
                let index = self.read_var_u32()?;
885
718
                let table = self.read_call_indirect_table_immediate()?;
886
718
                visitor.visit_call_indirect(index, table)
887
            }
888
9.18k
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
889
26
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
890
0
            0x14 => visitor.visit_call_ref(self.read()?),
891
296
            0x15 => visitor.visit_return_call_ref(self.read()?),
892
            0x18 => {
893
0
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
894
0
                visitor.visit_delegate(self.read_var_u32()?)
895
            }
896
            0x19 => {
897
                #[cfg(feature = "features")]
898
0
                require_feature::legacy_exceptions(
899
0
                    self.features,
900
                    "legacy_exceptions feature required for catch_all instruction",
901
0
                    pos,
902
0
                )?;
903
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch_all") {
904
0
                    Ok(()) => (),
905
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch_all")?,
906
                }
907
0
                visitor.visit_catch_all()
908
            }
909
902k
            0x1a => visitor.visit_drop(),
910
220k
            0x1b => visitor.visit_select(),
911
            0x1c => {
912
50
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
913
50
                if result_count == 1 {
914
50
                    visitor.visit_typed_select(self.read()?)
915
                } else {
916
0
                    let mut results = Vec::new();
917
0
                    results.reserve_exact(result_count);
918
0
                    for _ in 0..result_count {
919
0
                        results.push(self.read()?);
920
                    }
921
0
                    visitor.visit_typed_select_multi(results)
922
                }
923
            }
924
1.39M
            0x1f => visitor.visit_try_table(self.read()?),
925
926
7.08M
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
927
3.38M
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
928
1.39M
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
929
1.36M
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
930
1.25M
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
931
204
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
932
10
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
933
934
74.9k
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
935
5.21k
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
936
4.31k
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
937
3.55k
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
938
6.23k
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
939
3.24k
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
940
5.79k
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
941
3.91k
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
942
3.75k
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
943
3.31k
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
944
3.99k
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
945
3.36k
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
946
4.43k
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
947
5.44k
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
948
386
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
949
386
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
950
78
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
951
190
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
952
166
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
953
205
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
954
312
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
955
227
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
956
1.29k
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
957
            0x3f => {
958
73.4k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
959
73.4k
                visitor.visit_memory_size(mem)
960
            }
961
            0x40 => {
962
10.2k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
963
10.2k
                visitor.visit_memory_grow(mem)
964
            }
965
966
419k
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
967
1.16M
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
968
6.90M
            0x43 => visitor.visit_f32_const(self.read_f32()?),
969
1.71M
            0x44 => visitor.visit_f64_const(self.read_f64()?),
970
971
388k
            0x45 => visitor.visit_i32_eqz(),
972
1.20k
            0x46 => visitor.visit_i32_eq(),
973
3.83k
            0x47 => visitor.visit_i32_ne(),
974
628
            0x48 => visitor.visit_i32_lt_s(),
975
3.52k
            0x49 => visitor.visit_i32_lt_u(),
976
441
            0x4a => visitor.visit_i32_gt_s(),
977
1.21k
            0x4b => visitor.visit_i32_gt_u(),
978
26.1k
            0x4c => visitor.visit_i32_le_s(),
979
21.2k
            0x4d => visitor.visit_i32_le_u(),
980
778
            0x4e => visitor.visit_i32_ge_s(),
981
1.45k
            0x4f => visitor.visit_i32_ge_u(),
982
14.9k
            0x50 => visitor.visit_i64_eqz(),
983
254
            0x51 => visitor.visit_i64_eq(),
984
4.82k
            0x52 => visitor.visit_i64_ne(),
985
441
            0x53 => visitor.visit_i64_lt_s(),
986
481
            0x54 => visitor.visit_i64_lt_u(),
987
1.72k
            0x55 => visitor.visit_i64_gt_s(),
988
441
            0x56 => visitor.visit_i64_gt_u(),
989
33.3k
            0x57 => visitor.visit_i64_le_s(),
990
32.5k
            0x58 => visitor.visit_i64_le_u(),
991
581
            0x59 => visitor.visit_i64_ge_s(),
992
370
            0x5a => visitor.visit_i64_ge_u(),
993
2.02M
            0x5b => visitor.visit_f32_eq(),
994
927k
            0x5c => visitor.visit_f32_ne(),
995
927k
            0x5d => visitor.visit_f32_lt(),
996
927k
            0x5e => visitor.visit_f32_gt(),
997
84
            0x5f => visitor.visit_f32_le(),
998
230
            0x60 => visitor.visit_f32_ge(),
999
303k
            0x61 => visitor.visit_f64_eq(),
1000
131k
            0x62 => visitor.visit_f64_ne(),
1001
131k
            0x63 => visitor.visit_f64_lt(),
1002
131k
            0x64 => visitor.visit_f64_gt(),
1003
106
            0x65 => visitor.visit_f64_le(),
1004
47
            0x66 => visitor.visit_f64_ge(),
1005
46.2k
            0x67 => visitor.visit_i32_clz(),
1006
28.2k
            0x68 => visitor.visit_i32_ctz(),
1007
25.2k
            0x69 => visitor.visit_i32_popcnt(),
1008
21.2k
            0x6a => visitor.visit_i32_add(),
1009
940
            0x6b => visitor.visit_i32_sub(),
1010
21.0k
            0x6c => visitor.visit_i32_mul(),
1011
480
            0x6d => visitor.visit_i32_div_s(),
1012
5.52k
            0x6e => visitor.visit_i32_div_u(),
1013
523
            0x6f => visitor.visit_i32_rem_s(),
1014
469
            0x70 => visitor.visit_i32_rem_u(),
1015
624
            0x71 => visitor.visit_i32_and(),
1016
2.11M
            0x72 => visitor.visit_i32_or(),
1017
498k
            0x73 => visitor.visit_i32_xor(),
1018
348
            0x74 => visitor.visit_i32_shl(),
1019
536
            0x75 => visitor.visit_i32_shr_s(),
1020
669
            0x76 => visitor.visit_i32_shr_u(),
1021
344
            0x77 => visitor.visit_i32_rotl(),
1022
1.03k
            0x78 => visitor.visit_i32_rotr(),
1023
33.8k
            0x79 => visitor.visit_i64_clz(),
1024
54.2k
            0x7a => visitor.visit_i64_ctz(),
1025
88.6k
            0x7b => visitor.visit_i64_popcnt(),
1026
34.3k
            0x7c => visitor.visit_i64_add(),
1027
849
            0x7d => visitor.visit_i64_sub(),
1028
33.0k
            0x7e => visitor.visit_i64_mul(),
1029
541
            0x7f => visitor.visit_i64_div_s(),
1030
894
            0x80 => visitor.visit_i64_div_u(),
1031
2.06k
            0x81 => visitor.visit_i64_rem_s(),
1032
825
            0x82 => visitor.visit_i64_rem_u(),
1033
765
            0x83 => visitor.visit_i64_and(),
1034
5.48k
            0x84 => visitor.visit_i64_or(),
1035
667k
            0x85 => visitor.visit_i64_xor(),
1036
1.35k
            0x86 => visitor.visit_i64_shl(),
1037
1.21k
            0x87 => visitor.visit_i64_shr_s(),
1038
940
            0x88 => visitor.visit_i64_shr_u(),
1039
388
            0x89 => visitor.visit_i64_rotl(),
1040
240
            0x8a => visitor.visit_i64_rotr(),
1041
142k
            0x8b => visitor.visit_f32_abs(),
1042
10.9k
            0x8c => visitor.visit_f32_neg(),
1043
130k
            0x8d => visitor.visit_f32_ceil(),
1044
29.1k
            0x8e => visitor.visit_f32_floor(),
1045
2.27k
            0x8f => visitor.visit_f32_trunc(),
1046
3.27k
            0x90 => visitor.visit_f32_nearest(),
1047
3.04k
            0x91 => visitor.visit_f32_sqrt(),
1048
2.20k
            0x92 => visitor.visit_f32_add(),
1049
714
            0x93 => visitor.visit_f32_sub(),
1050
270
            0x94 => visitor.visit_f32_mul(),
1051
241
            0x95 => visitor.visit_f32_div(),
1052
540
            0x96 => visitor.visit_f32_min(),
1053
86
            0x97 => visitor.visit_f32_max(),
1054
112
            0x98 => visitor.visit_f32_copysign(),
1055
15.3k
            0x99 => visitor.visit_f64_abs(),
1056
21.5k
            0x9a => visitor.visit_f64_neg(),
1057
6.75k
            0x9b => visitor.visit_f64_ceil(),
1058
2.97k
            0x9c => visitor.visit_f64_floor(),
1059
3.95k
            0x9d => visitor.visit_f64_trunc(),
1060
6.34k
            0x9e => visitor.visit_f64_nearest(),
1061
6.56k
            0x9f => visitor.visit_f64_sqrt(),
1062
358
            0xa0 => visitor.visit_f64_add(),
1063
15.0k
            0xa1 => visitor.visit_f64_sub(),
1064
209
            0xa2 => visitor.visit_f64_mul(),
1065
858
            0xa3 => visitor.visit_f64_div(),
1066
251
            0xa4 => visitor.visit_f64_min(),
1067
214
            0xa5 => visitor.visit_f64_max(),
1068
94
            0xa6 => visitor.visit_f64_copysign(),
1069
146k
            0xa7 => visitor.visit_i32_wrap_i64(),
1070
2.59k
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1071
920k
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1072
10.2k
            0xaa => visitor.visit_i32_trunc_f64_s(),
1073
114k
            0xab => visitor.visit_i32_trunc_f64_u(),
1074
10.0k
            0xac => visitor.visit_i64_extend_i32_s(),
1075
225k
            0xad => visitor.visit_i64_extend_i32_u(),
1076
4.21k
            0xae => visitor.visit_i64_trunc_f32_s(),
1077
1.05k
            0xaf => visitor.visit_i64_trunc_f32_u(),
1078
1.82k
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1079
4.38k
            0xb1 => visitor.visit_i64_trunc_f64_u(),
1080
3.04k
            0xb2 => visitor.visit_f32_convert_i32_s(),
1081
897k
            0xb3 => visitor.visit_f32_convert_i32_u(),
1082
5.58k
            0xb4 => visitor.visit_f32_convert_i64_s(),
1083
4.76k
            0xb5 => visitor.visit_f32_convert_i64_u(),
1084
9.87k
            0xb6 => visitor.visit_f32_demote_f64(),
1085
11.8k
            0xb7 => visitor.visit_f64_convert_i32_s(),
1086
4.23k
            0xb8 => visitor.visit_f64_convert_i32_u(),
1087
117k
            0xb9 => visitor.visit_f64_convert_i64_s(),
1088
20.7k
            0xba => visitor.visit_f64_convert_i64_u(),
1089
10.4k
            0xbb => visitor.visit_f64_promote_f32(),
1090
82.3k
            0xbc => visitor.visit_i32_reinterpret_f32(),
1091
253k
            0xbd => visitor.visit_i64_reinterpret_f64(),
1092
9.07k
            0xbe => visitor.visit_f32_reinterpret_i32(),
1093
1.92k
            0xbf => visitor.visit_f64_reinterpret_i64(),
1094
1095
55.7k
            0xc0 => visitor.visit_i32_extend8_s(),
1096
18.4k
            0xc1 => visitor.visit_i32_extend16_s(),
1097
21.8k
            0xc2 => visitor.visit_i64_extend8_s(),
1098
10.1k
            0xc3 => visitor.visit_i64_extend16_s(),
1099
14.4k
            0xc4 => visitor.visit_i64_extend32_s(),
1100
1101
493k
            0xd0 => visitor.visit_ref_null(self.read()?),
1102
3.89k
            0xd1 => visitor.visit_ref_is_null(),
1103
4.11k
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1104
394
            0xd3 => visitor.visit_ref_eq(),
1105
12.8k
            0xd4 => visitor.visit_ref_as_non_null(),
1106
11.4k
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1107
593
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1108
1109
0
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1110
0
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1111
0
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1112
0
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1113
            0xe4 => {
1114
0
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1115
            }
1116
0
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1117
0
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1118
1119
20.3k
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1120
122k
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1121
            0xfd => {
1122
                #[cfg(feature = "simd")]
1123
292k
                if let Some(mut visitor) = visitor.simd_visitor() {
1124
292k
                    return self.visit_0xfd_operator(pos, &mut visitor);
1125
0
                }
1126
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1127
            }
1128
104k
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1129
1130
0
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1131
        })
1132
52.6M
    }
<wasmparser::binary_reader::BinaryReader>::visit_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
830
13.2M
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
831
13.2M
    where
832
13.2M
        T: VisitOperator<'a> + FrameStack,
833
    {
834
13.2M
        if visitor.current_frame().is_none() {
835
0
            bail!(
836
0
                self.original_position(),
837
                "operators remaining after end of function body or expression"
838
            );
839
13.2M
        }
840
13.2M
        let pos = self.original_position();
841
13.2M
        let code = self.read_u8()?;
842
13.2M
        Ok(match code {
843
12.5k
            0x00 => visitor.visit_unreachable(),
844
10.8k
            0x01 => visitor.visit_nop(),
845
167k
            0x02 => visitor.visit_block(self.read_block_type()?),
846
20.9k
            0x03 => visitor.visit_loop(self.read_block_type()?),
847
34.2k
            0x04 => visitor.visit_if(self.read_block_type()?),
848
            0x05 => {
849
3.53k
                self.expect_frame(visitor, FrameKind::If, "else")?;
850
3.53k
                visitor.visit_else()
851
            }
852
            0x06 => {
853
                #[cfg(feature = "features")]
854
0
                require_feature::legacy_exceptions(
855
0
                    self.features,
856
                    "legacy_exceptions feature required for try instruction",
857
0
                    pos,
858
0
                )?;
859
0
                visitor.visit_try(self.read_block_type()?)
860
            }
861
            0x07 => {
862
                #[cfg(feature = "features")]
863
0
                require_feature::legacy_exceptions(
864
0
                    self.features,
865
                    "legacy_exceptions feature required for catch instruction",
866
0
                    pos,
867
0
                )?;
868
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
869
0
                    Ok(()) => (),
870
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
871
                }
872
0
                visitor.visit_catch(self.read_var_u32()?)
873
            }
874
495
            0x08 => visitor.visit_throw(self.read_var_u32()?),
875
0
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
876
5
            0x0a => visitor.visit_throw_ref(),
877
2.59M
            0x0b => visitor.visit_end(),
878
113k
            0x0c => visitor.visit_br(self.read_var_u32()?),
879
84.9k
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
880
3.30k
            0x0e => visitor.visit_br_table(self.read_br_table()?),
881
610
            0x0f => visitor.visit_return(),
882
13.2k
            0x10 => visitor.visit_call(self.read_var_u32()?),
883
            0x11 => {
884
105
                let index = self.read_var_u32()?;
885
105
                let table = self.read_call_indirect_table_immediate()?;
886
105
                visitor.visit_call_indirect(index, table)
887
            }
888
7.56k
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
889
24
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
890
0
            0x14 => visitor.visit_call_ref(self.read()?),
891
1
            0x15 => visitor.visit_return_call_ref(self.read()?),
892
            0x18 => {
893
0
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
894
0
                visitor.visit_delegate(self.read_var_u32()?)
895
            }
896
            0x19 => {
897
                #[cfg(feature = "features")]
898
0
                require_feature::legacy_exceptions(
899
0
                    self.features,
900
                    "legacy_exceptions feature required for catch_all instruction",
901
0
                    pos,
902
0
                )?;
903
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch_all") {
904
0
                    Ok(()) => (),
905
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch_all")?,
906
                }
907
0
                visitor.visit_catch_all()
908
            }
909
71.7k
            0x1a => visitor.visit_drop(),
910
34.7k
            0x1b => visitor.visit_select(),
911
            0x1c => {
912
8
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
913
8
                if result_count == 1 {
914
8
                    visitor.visit_typed_select(self.read()?)
915
                } else {
916
0
                    let mut results = Vec::new();
917
0
                    results.reserve_exact(result_count);
918
0
                    for _ in 0..result_count {
919
0
                        results.push(self.read()?);
920
                    }
921
0
                    visitor.visit_typed_select_multi(results)
922
                }
923
            }
924
53.9k
            0x1f => visitor.visit_try_table(self.read()?),
925
926
336k
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
927
170k
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
928
75.8k
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
929
213k
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
930
177k
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
931
136
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
932
4
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
933
934
4.53k
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
935
6.66k
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
936
4.31k
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
937
1.44k
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
938
3.42k
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
939
2.65k
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
940
4.76k
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
941
2.75k
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
942
3.98k
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
943
2.72k
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
944
3.14k
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
945
2.25k
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
946
3.31k
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
947
3.68k
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
948
140
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
949
203
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
950
46
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
951
75
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
952
176
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
953
257
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
954
223
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
955
114
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
956
114
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
957
            0x3f => {
958
54.2k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
959
54.2k
                visitor.visit_memory_size(mem)
960
            }
961
            0x40 => {
962
5.21k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
963
5.21k
                visitor.visit_memory_grow(mem)
964
            }
965
966
975k
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
967
2.19M
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
968
116k
            0x43 => visitor.visit_f32_const(self.read_f32()?),
969
404k
            0x44 => visitor.visit_f64_const(self.read_f64()?),
970
971
22.3k
            0x45 => visitor.visit_i32_eqz(),
972
802
            0x46 => visitor.visit_i32_eq(),
973
878
            0x47 => visitor.visit_i32_ne(),
974
219
            0x48 => visitor.visit_i32_lt_s(),
975
822
            0x49 => visitor.visit_i32_lt_u(),
976
249
            0x4a => visitor.visit_i32_gt_s(),
977
295
            0x4b => visitor.visit_i32_gt_u(),
978
22.5k
            0x4c => visitor.visit_i32_le_s(),
979
18.7k
            0x4d => visitor.visit_i32_le_u(),
980
271
            0x4e => visitor.visit_i32_ge_s(),
981
1.25k
            0x4f => visitor.visit_i32_ge_u(),
982
7.26k
            0x50 => visitor.visit_i64_eqz(),
983
102
            0x51 => visitor.visit_i64_eq(),
984
1.20k
            0x52 => visitor.visit_i64_ne(),
985
405
            0x53 => visitor.visit_i64_lt_s(),
986
173
            0x54 => visitor.visit_i64_lt_u(),
987
635
            0x55 => visitor.visit_i64_gt_s(),
988
368
            0x56 => visitor.visit_i64_gt_u(),
989
22.5k
            0x57 => visitor.visit_i64_le_s(),
990
22.6k
            0x58 => visitor.visit_i64_le_u(),
991
428
            0x59 => visitor.visit_i64_ge_s(),
992
2.13k
            0x5a => visitor.visit_i64_ge_u(),
993
22.8k
            0x5b => visitor.visit_f32_eq(),
994
4.74k
            0x5c => visitor.visit_f32_ne(),
995
4.79k
            0x5d => visitor.visit_f32_lt(),
996
4.75k
            0x5e => visitor.visit_f32_gt(),
997
72
            0x5f => visitor.visit_f32_le(),
998
233
            0x60 => visitor.visit_f32_ge(),
999
24.8k
            0x61 => visitor.visit_f64_eq(),
1000
5.36k
            0x62 => visitor.visit_f64_ne(),
1001
5.40k
            0x63 => visitor.visit_f64_lt(),
1002
5.36k
            0x64 => visitor.visit_f64_gt(),
1003
79
            0x65 => visitor.visit_f64_le(),
1004
49
            0x66 => visitor.visit_f64_ge(),
1005
11.1k
            0x67 => visitor.visit_i32_clz(),
1006
11.5k
            0x68 => visitor.visit_i32_ctz(),
1007
14.8k
            0x69 => visitor.visit_i32_popcnt(),
1008
104k
            0x6a => visitor.visit_i32_add(),
1009
8.52k
            0x6b => visitor.visit_i32_sub(),
1010
308k
            0x6c => visitor.visit_i32_mul(),
1011
177
            0x6d => visitor.visit_i32_div_s(),
1012
5.16k
            0x6e => visitor.visit_i32_div_u(),
1013
249
            0x6f => visitor.visit_i32_rem_s(),
1014
371
            0x70 => visitor.visit_i32_rem_u(),
1015
240
            0x71 => visitor.visit_i32_and(),
1016
20.5k
            0x72 => visitor.visit_i32_or(),
1017
56.1k
            0x73 => visitor.visit_i32_xor(),
1018
229
            0x74 => visitor.visit_i32_shl(),
1019
195
            0x75 => visitor.visit_i32_shr_s(),
1020
565
            0x76 => visitor.visit_i32_shr_u(),
1021
130
            0x77 => visitor.visit_i32_rotl(),
1022
396
            0x78 => visitor.visit_i32_rotr(),
1023
21.4k
            0x79 => visitor.visit_i64_clz(),
1024
29.4k
            0x7a => visitor.visit_i64_ctz(),
1025
35.0k
            0x7b => visitor.visit_i64_popcnt(),
1026
1.05M
            0x7c => visitor.visit_i64_add(),
1027
4.60k
            0x7d => visitor.visit_i64_sub(),
1028
494k
            0x7e => visitor.visit_i64_mul(),
1029
297
            0x7f => visitor.visit_i64_div_s(),
1030
511
            0x80 => visitor.visit_i64_div_u(),
1031
363
            0x81 => visitor.visit_i64_rem_s(),
1032
490
            0x82 => visitor.visit_i64_rem_u(),
1033
331
            0x83 => visitor.visit_i64_and(),
1034
1.61k
            0x84 => visitor.visit_i64_or(),
1035
92.6k
            0x85 => visitor.visit_i64_xor(),
1036
411
            0x86 => visitor.visit_i64_shl(),
1037
1.04k
            0x87 => visitor.visit_i64_shr_s(),
1038
2.34k
            0x88 => visitor.visit_i64_shr_u(),
1039
430
            0x89 => visitor.visit_i64_rotl(),
1040
914
            0x8a => visitor.visit_i64_rotr(),
1041
3.20k
            0x8b => visitor.visit_f32_abs(),
1042
4.15k
            0x8c => visitor.visit_f32_neg(),
1043
2.08k
            0x8d => visitor.visit_f32_ceil(),
1044
1.58k
            0x8e => visitor.visit_f32_floor(),
1045
2.61k
            0x8f => visitor.visit_f32_trunc(),
1046
1.87k
            0x90 => visitor.visit_f32_nearest(),
1047
5.35k
            0x91 => visitor.visit_f32_sqrt(),
1048
128
            0x92 => visitor.visit_f32_add(),
1049
71
            0x93 => visitor.visit_f32_sub(),
1050
120
            0x94 => visitor.visit_f32_mul(),
1051
70
            0x95 => visitor.visit_f32_div(),
1052
105
            0x96 => visitor.visit_f32_min(),
1053
88
            0x97 => visitor.visit_f32_max(),
1054
51
            0x98 => visitor.visit_f32_copysign(),
1055
1.94k
            0x99 => visitor.visit_f64_abs(),
1056
8.15k
            0x9a => visitor.visit_f64_neg(),
1057
1.49k
            0x9b => visitor.visit_f64_ceil(),
1058
1.89k
            0x9c => visitor.visit_f64_floor(),
1059
3.29k
            0x9d => visitor.visit_f64_trunc(),
1060
2.10k
            0x9e => visitor.visit_f64_nearest(),
1061
4.86k
            0x9f => visitor.visit_f64_sqrt(),
1062
58
            0xa0 => visitor.visit_f64_add(),
1063
61
            0xa1 => visitor.visit_f64_sub(),
1064
114
            0xa2 => visitor.visit_f64_mul(),
1065
191
            0xa3 => visitor.visit_f64_div(),
1066
190
            0xa4 => visitor.visit_f64_min(),
1067
86
            0xa5 => visitor.visit_f64_max(),
1068
50
            0xa6 => visitor.visit_f64_copysign(),
1069
15.4k
            0xa7 => visitor.visit_i32_wrap_i64(),
1070
787
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1071
1.32k
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1072
1.38k
            0xaa => visitor.visit_i32_trunc_f64_s(),
1073
1.41k
            0xab => visitor.visit_i32_trunc_f64_u(),
1074
3.73k
            0xac => visitor.visit_i64_extend_i32_s(),
1075
5.86k
            0xad => visitor.visit_i64_extend_i32_u(),
1076
1.73k
            0xae => visitor.visit_i64_trunc_f32_s(),
1077
1.19k
            0xaf => visitor.visit_i64_trunc_f32_u(),
1078
1.51k
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1079
1.35k
            0xb1 => visitor.visit_i64_trunc_f64_u(),
1080
2.11k
            0xb2 => visitor.visit_f32_convert_i32_s(),
1081
2.23k
            0xb3 => visitor.visit_f32_convert_i32_u(),
1082
1.22k
            0xb4 => visitor.visit_f32_convert_i64_s(),
1083
2.36k
            0xb5 => visitor.visit_f32_convert_i64_u(),
1084
2.54k
            0xb6 => visitor.visit_f32_demote_f64(),
1085
2.05k
            0xb7 => visitor.visit_f64_convert_i32_s(),
1086
1.93k
            0xb8 => visitor.visit_f64_convert_i32_u(),
1087
1.03k
            0xb9 => visitor.visit_f64_convert_i64_s(),
1088
9.03k
            0xba => visitor.visit_f64_convert_i64_u(),
1089
2.44k
            0xbb => visitor.visit_f64_promote_f32(),
1090
22.3k
            0xbc => visitor.visit_i32_reinterpret_f32(),
1091
55.3k
            0xbd => visitor.visit_i64_reinterpret_f64(),
1092
3.37k
            0xbe => visitor.visit_f32_reinterpret_i32(),
1093
1.03k
            0xbf => visitor.visit_f64_reinterpret_i64(),
1094
1095
10.0k
            0xc0 => visitor.visit_i32_extend8_s(),
1096
7.53k
            0xc1 => visitor.visit_i32_extend16_s(),
1097
4.72k
            0xc2 => visitor.visit_i64_extend8_s(),
1098
4.52k
            0xc3 => visitor.visit_i64_extend16_s(),
1099
4.26k
            0xc4 => visitor.visit_i64_extend32_s(),
1100
1101
1.53M
            0xd0 => visitor.visit_ref_null(self.read()?),
1102
2.33k
            0xd1 => visitor.visit_ref_is_null(),
1103
120k
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1104
397
            0xd3 => visitor.visit_ref_eq(),
1105
12.9k
            0xd4 => visitor.visit_ref_as_non_null(),
1106
12.8k
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1107
595
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1108
1109
1
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1110
0
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1111
0
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1112
0
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1113
            0xe4 => {
1114
0
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1115
            }
1116
0
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1117
0
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1118
1119
521k
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1120
85.2k
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1121
            0xfd => {
1122
                #[cfg(feature = "simd")]
1123
145k
                if let Some(mut visitor) = visitor.simd_visitor() {
1124
145k
                    return self.visit_0xfd_operator(pos, &mut visitor);
1125
0
                }
1126
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1127
            }
1128
93.7k
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1129
1130
0
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1131
        })
1132
13.2M
    }
<wasmparser::binary_reader::BinaryReader>::visit_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
Line
Count
Source
830
2.07M
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
831
2.07M
    where
832
2.07M
        T: VisitOperator<'a> + FrameStack,
833
    {
834
2.07M
        if visitor.current_frame().is_none() {
835
0
            bail!(
836
0
                self.original_position(),
837
                "operators remaining after end of function body or expression"
838
            );
839
2.07M
        }
840
2.07M
        let pos = self.original_position();
841
2.07M
        let code = self.read_u8()?;
842
2.07M
        Ok(match code {
843
0
            0x00 => visitor.visit_unreachable(),
844
0
            0x01 => visitor.visit_nop(),
845
0
            0x02 => visitor.visit_block(self.read_block_type()?),
846
0
            0x03 => visitor.visit_loop(self.read_block_type()?),
847
0
            0x04 => visitor.visit_if(self.read_block_type()?),
848
            0x05 => {
849
0
                self.expect_frame(visitor, FrameKind::If, "else")?;
850
0
                visitor.visit_else()
851
            }
852
            0x06 => {
853
                #[cfg(feature = "features")]
854
0
                require_feature::legacy_exceptions(
855
0
                    self.features,
856
                    "legacy_exceptions feature required for try instruction",
857
0
                    pos,
858
0
                )?;
859
0
                visitor.visit_try(self.read_block_type()?)
860
            }
861
            0x07 => {
862
                #[cfg(feature = "features")]
863
0
                require_feature::legacy_exceptions(
864
0
                    self.features,
865
                    "legacy_exceptions feature required for catch instruction",
866
0
                    pos,
867
0
                )?;
868
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
869
0
                    Ok(()) => (),
870
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
871
                }
872
0
                visitor.visit_catch(self.read_var_u32()?)
873
            }
874
0
            0x08 => visitor.visit_throw(self.read_var_u32()?),
875
0
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
876
0
            0x0a => visitor.visit_throw_ref(),
877
468k
            0x0b => visitor.visit_end(),
878
0
            0x0c => visitor.visit_br(self.read_var_u32()?),
879
0
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
880
0
            0x0e => visitor.visit_br_table(self.read_br_table()?),
881
0
            0x0f => visitor.visit_return(),
882
0
            0x10 => visitor.visit_call(self.read_var_u32()?),
883
            0x11 => {
884
0
                let index = self.read_var_u32()?;
885
0
                let table = self.read_call_indirect_table_immediate()?;
886
0
                visitor.visit_call_indirect(index, table)
887
            }
888
0
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
889
0
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
890
0
            0x14 => visitor.visit_call_ref(self.read()?),
891
0
            0x15 => visitor.visit_return_call_ref(self.read()?),
892
            0x18 => {
893
0
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
894
0
                visitor.visit_delegate(self.read_var_u32()?)
895
            }
896
            0x19 => {
897
                #[cfg(feature = "features")]
898
0
                require_feature::legacy_exceptions(
899
0
                    self.features,
900
                    "legacy_exceptions feature required for catch_all instruction",
901
0
                    pos,
902
0
                )?;
903
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch_all") {
904
0
                    Ok(()) => (),
905
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch_all")?,
906
                }
907
0
                visitor.visit_catch_all()
908
            }
909
0
            0x1a => visitor.visit_drop(),
910
0
            0x1b => visitor.visit_select(),
911
            0x1c => {
912
0
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
913
0
                if result_count == 1 {
914
0
                    visitor.visit_typed_select(self.read()?)
915
                } else {
916
0
                    let mut results = Vec::new();
917
0
                    results.reserve_exact(result_count);
918
0
                    for _ in 0..result_count {
919
0
                        results.push(self.read()?);
920
                    }
921
0
                    visitor.visit_typed_select_multi(results)
922
                }
923
            }
924
0
            0x1f => visitor.visit_try_table(self.read()?),
925
926
0
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
927
0
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
928
0
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
929
3.87k
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
930
0
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
931
0
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
932
0
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
933
934
0
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
935
0
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
936
0
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
937
0
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
938
0
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
939
0
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
940
0
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
941
0
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
942
0
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
943
0
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
944
0
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
945
0
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
946
0
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
947
0
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
948
0
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
949
0
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
950
0
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
951
0
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
952
0
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
953
0
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
954
0
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
955
0
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
956
0
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
957
            0x3f => {
958
0
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
959
0
                visitor.visit_memory_size(mem)
960
            }
961
            0x40 => {
962
0
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
963
0
                visitor.visit_memory_grow(mem)
964
            }
965
966
107k
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
967
552k
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
968
11.6k
            0x43 => visitor.visit_f32_const(self.read_f32()?),
969
46.2k
            0x44 => visitor.visit_f64_const(self.read_f64()?),
970
971
0
            0x45 => visitor.visit_i32_eqz(),
972
0
            0x46 => visitor.visit_i32_eq(),
973
0
            0x47 => visitor.visit_i32_ne(),
974
0
            0x48 => visitor.visit_i32_lt_s(),
975
0
            0x49 => visitor.visit_i32_lt_u(),
976
0
            0x4a => visitor.visit_i32_gt_s(),
977
0
            0x4b => visitor.visit_i32_gt_u(),
978
0
            0x4c => visitor.visit_i32_le_s(),
979
0
            0x4d => visitor.visit_i32_le_u(),
980
0
            0x4e => visitor.visit_i32_ge_s(),
981
0
            0x4f => visitor.visit_i32_ge_u(),
982
0
            0x50 => visitor.visit_i64_eqz(),
983
0
            0x51 => visitor.visit_i64_eq(),
984
0
            0x52 => visitor.visit_i64_ne(),
985
0
            0x53 => visitor.visit_i64_lt_s(),
986
0
            0x54 => visitor.visit_i64_lt_u(),
987
0
            0x55 => visitor.visit_i64_gt_s(),
988
0
            0x56 => visitor.visit_i64_gt_u(),
989
0
            0x57 => visitor.visit_i64_le_s(),
990
0
            0x58 => visitor.visit_i64_le_u(),
991
0
            0x59 => visitor.visit_i64_ge_s(),
992
0
            0x5a => visitor.visit_i64_ge_u(),
993
0
            0x5b => visitor.visit_f32_eq(),
994
0
            0x5c => visitor.visit_f32_ne(),
995
0
            0x5d => visitor.visit_f32_lt(),
996
0
            0x5e => visitor.visit_f32_gt(),
997
0
            0x5f => visitor.visit_f32_le(),
998
0
            0x60 => visitor.visit_f32_ge(),
999
0
            0x61 => visitor.visit_f64_eq(),
1000
0
            0x62 => visitor.visit_f64_ne(),
1001
0
            0x63 => visitor.visit_f64_lt(),
1002
0
            0x64 => visitor.visit_f64_gt(),
1003
0
            0x65 => visitor.visit_f64_le(),
1004
0
            0x66 => visitor.visit_f64_ge(),
1005
0
            0x67 => visitor.visit_i32_clz(),
1006
0
            0x68 => visitor.visit_i32_ctz(),
1007
0
            0x69 => visitor.visit_i32_popcnt(),
1008
15.2k
            0x6a => visitor.visit_i32_add(),
1009
1.28k
            0x6b => visitor.visit_i32_sub(),
1010
55.6k
            0x6c => visitor.visit_i32_mul(),
1011
0
            0x6d => visitor.visit_i32_div_s(),
1012
0
            0x6e => visitor.visit_i32_div_u(),
1013
0
            0x6f => visitor.visit_i32_rem_s(),
1014
0
            0x70 => visitor.visit_i32_rem_u(),
1015
0
            0x71 => visitor.visit_i32_and(),
1016
0
            0x72 => visitor.visit_i32_or(),
1017
0
            0x73 => visitor.visit_i32_xor(),
1018
0
            0x74 => visitor.visit_i32_shl(),
1019
0
            0x75 => visitor.visit_i32_shr_s(),
1020
0
            0x76 => visitor.visit_i32_shr_u(),
1021
0
            0x77 => visitor.visit_i32_rotl(),
1022
0
            0x78 => visitor.visit_i32_rotr(),
1023
0
            0x79 => visitor.visit_i64_clz(),
1024
0
            0x7a => visitor.visit_i64_ctz(),
1025
0
            0x7b => visitor.visit_i64_popcnt(),
1026
314k
            0x7c => visitor.visit_i64_add(),
1027
1.19k
            0x7d => visitor.visit_i64_sub(),
1028
156k
            0x7e => visitor.visit_i64_mul(),
1029
0
            0x7f => visitor.visit_i64_div_s(),
1030
0
            0x80 => visitor.visit_i64_div_u(),
1031
0
            0x81 => visitor.visit_i64_rem_s(),
1032
0
            0x82 => visitor.visit_i64_rem_u(),
1033
0
            0x83 => visitor.visit_i64_and(),
1034
0
            0x84 => visitor.visit_i64_or(),
1035
0
            0x85 => visitor.visit_i64_xor(),
1036
0
            0x86 => visitor.visit_i64_shl(),
1037
0
            0x87 => visitor.visit_i64_shr_s(),
1038
0
            0x88 => visitor.visit_i64_shr_u(),
1039
0
            0x89 => visitor.visit_i64_rotl(),
1040
0
            0x8a => visitor.visit_i64_rotr(),
1041
0
            0x8b => visitor.visit_f32_abs(),
1042
0
            0x8c => visitor.visit_f32_neg(),
1043
0
            0x8d => visitor.visit_f32_ceil(),
1044
0
            0x8e => visitor.visit_f32_floor(),
1045
0
            0x8f => visitor.visit_f32_trunc(),
1046
0
            0x90 => visitor.visit_f32_nearest(),
1047
0
            0x91 => visitor.visit_f32_sqrt(),
1048
0
            0x92 => visitor.visit_f32_add(),
1049
0
            0x93 => visitor.visit_f32_sub(),
1050
0
            0x94 => visitor.visit_f32_mul(),
1051
0
            0x95 => visitor.visit_f32_div(),
1052
0
            0x96 => visitor.visit_f32_min(),
1053
0
            0x97 => visitor.visit_f32_max(),
1054
0
            0x98 => visitor.visit_f32_copysign(),
1055
0
            0x99 => visitor.visit_f64_abs(),
1056
0
            0x9a => visitor.visit_f64_neg(),
1057
0
            0x9b => visitor.visit_f64_ceil(),
1058
0
            0x9c => visitor.visit_f64_floor(),
1059
0
            0x9d => visitor.visit_f64_trunc(),
1060
0
            0x9e => visitor.visit_f64_nearest(),
1061
0
            0x9f => visitor.visit_f64_sqrt(),
1062
0
            0xa0 => visitor.visit_f64_add(),
1063
0
            0xa1 => visitor.visit_f64_sub(),
1064
0
            0xa2 => visitor.visit_f64_mul(),
1065
0
            0xa3 => visitor.visit_f64_div(),
1066
0
            0xa4 => visitor.visit_f64_min(),
1067
0
            0xa5 => visitor.visit_f64_max(),
1068
0
            0xa6 => visitor.visit_f64_copysign(),
1069
0
            0xa7 => visitor.visit_i32_wrap_i64(),
1070
0
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1071
0
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1072
0
            0xaa => visitor.visit_i32_trunc_f64_s(),
1073
0
            0xab => visitor.visit_i32_trunc_f64_u(),
1074
0
            0xac => visitor.visit_i64_extend_i32_s(),
1075
0
            0xad => visitor.visit_i64_extend_i32_u(),
1076
0
            0xae => visitor.visit_i64_trunc_f32_s(),
1077
0
            0xaf => visitor.visit_i64_trunc_f32_u(),
1078
0
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1079
0
            0xb1 => visitor.visit_i64_trunc_f64_u(),
1080
0
            0xb2 => visitor.visit_f32_convert_i32_s(),
1081
0
            0xb3 => visitor.visit_f32_convert_i32_u(),
1082
0
            0xb4 => visitor.visit_f32_convert_i64_s(),
1083
0
            0xb5 => visitor.visit_f32_convert_i64_u(),
1084
0
            0xb6 => visitor.visit_f32_demote_f64(),
1085
0
            0xb7 => visitor.visit_f64_convert_i32_s(),
1086
0
            0xb8 => visitor.visit_f64_convert_i32_u(),
1087
0
            0xb9 => visitor.visit_f64_convert_i64_s(),
1088
0
            0xba => visitor.visit_f64_convert_i64_u(),
1089
0
            0xbb => visitor.visit_f64_promote_f32(),
1090
0
            0xbc => visitor.visit_i32_reinterpret_f32(),
1091
0
            0xbd => visitor.visit_i64_reinterpret_f64(),
1092
0
            0xbe => visitor.visit_f32_reinterpret_i32(),
1093
0
            0xbf => visitor.visit_f64_reinterpret_i64(),
1094
1095
0
            0xc0 => visitor.visit_i32_extend8_s(),
1096
0
            0xc1 => visitor.visit_i32_extend16_s(),
1097
0
            0xc2 => visitor.visit_i64_extend8_s(),
1098
0
            0xc3 => visitor.visit_i64_extend16_s(),
1099
0
            0xc4 => visitor.visit_i64_extend32_s(),
1100
1101
271k
            0xd0 => visitor.visit_ref_null(self.read()?),
1102
0
            0xd1 => visitor.visit_ref_is_null(),
1103
22.2k
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1104
0
            0xd3 => visitor.visit_ref_eq(),
1105
0
            0xd4 => visitor.visit_ref_as_non_null(),
1106
0
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1107
0
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1108
1109
0
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1110
0
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1111
0
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1112
0
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1113
            0xe4 => {
1114
0
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1115
            }
1116
0
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1117
0
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1118
1119
40.2k
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1120
0
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1121
            0xfd => {
1122
                #[cfg(feature = "simd")]
1123
2.70k
                if let Some(mut visitor) = visitor.simd_visitor() {
1124
2.70k
                    return self.visit_0xfd_operator(pos, &mut visitor);
1125
0
                }
1126
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1127
            }
1128
2
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1129
1130
0
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1131
        })
1132
2.07M
    }
1133
1134
681k
    fn visit_0xfb_operator<T>(
1135
681k
        &mut self,
1136
681k
        pos: u64,
1137
681k
        visitor: &mut T,
1138
681k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1139
681k
    where
1140
681k
        T: VisitOperator<'a>,
1141
    {
1142
681k
        let code = self.read_var_u32()?;
1143
681k
        Ok(match code {
1144
            0x0 => {
1145
76.6k
                let type_index = self.read_var_u32()?;
1146
76.6k
                visitor.visit_struct_new(type_index)
1147
            }
1148
            0x01 => {
1149
86.4k
                let type_index = self.read_var_u32()?;
1150
86.4k
                visitor.visit_struct_new_default(type_index)
1151
            }
1152
            0x02 => {
1153
40
                let type_index = self.read_var_u32()?;
1154
40
                let field_index = self.read_var_u32()?;
1155
40
                visitor.visit_struct_get(type_index, field_index)
1156
            }
1157
            0x03 => {
1158
80
                let type_index = self.read_var_u32()?;
1159
80
                let field_index = self.read_var_u32()?;
1160
80
                visitor.visit_struct_get_s(type_index, field_index)
1161
            }
1162
            0x04 => {
1163
12
                let type_index = self.read_var_u32()?;
1164
12
                let field_index = self.read_var_u32()?;
1165
12
                visitor.visit_struct_get_u(type_index, field_index)
1166
            }
1167
            0x05 => {
1168
394
                let type_index = self.read_var_u32()?;
1169
394
                let field_index = self.read_var_u32()?;
1170
394
                visitor.visit_struct_set(type_index, field_index)
1171
            }
1172
            0x06 => {
1173
9.47k
                let type_index = self.read_var_u32()?;
1174
9.47k
                visitor.visit_array_new(type_index)
1175
            }
1176
            0x07 => {
1177
387k
                let type_index = self.read_var_u32()?;
1178
387k
                visitor.visit_array_new_default(type_index)
1179
            }
1180
            0x08 => {
1181
14.4k
                let type_index = self.read_var_u32()?;
1182
14.4k
                let n = self.read_var_u32()?;
1183
14.4k
                visitor.visit_array_new_fixed(type_index, n)
1184
            }
1185
            0x09 => {
1186
92
                let type_index = self.read_var_u32()?;
1187
92
                let data_index = self.read_var_u32()?;
1188
92
                visitor.visit_array_new_data(type_index, data_index)
1189
            }
1190
            0x0a => {
1191
0
                let type_index = self.read_var_u32()?;
1192
0
                let elem_index = self.read_var_u32()?;
1193
0
                visitor.visit_array_new_elem(type_index, elem_index)
1194
            }
1195
            0x0b => {
1196
0
                let type_index = self.read_var_u32()?;
1197
0
                visitor.visit_array_get(type_index)
1198
            }
1199
            0x0c => {
1200
76
                let type_index = self.read_var_u32()?;
1201
76
                visitor.visit_array_get_s(type_index)
1202
            }
1203
            0x0d => {
1204
0
                let type_index = self.read_var_u32()?;
1205
0
                visitor.visit_array_get_u(type_index)
1206
            }
1207
            0x0e => {
1208
0
                let type_index = self.read_var_u32()?;
1209
0
                visitor.visit_array_set(type_index)
1210
            }
1211
1.12k
            0x0f => visitor.visit_array_len(),
1212
            0x10 => {
1213
28
                let type_index = self.read_var_u32()?;
1214
28
                visitor.visit_array_fill(type_index)
1215
            }
1216
            0x11 => {
1217
0
                let type_index_dst = self.read_var_u32()?;
1218
0
                let type_index_src = self.read_var_u32()?;
1219
0
                visitor.visit_array_copy(type_index_dst, type_index_src)
1220
            }
1221
            0x12 => {
1222
0
                let type_index = self.read_var_u32()?;
1223
0
                let data_index = self.read_var_u32()?;
1224
0
                visitor.visit_array_init_data(type_index, data_index)
1225
            }
1226
            0x13 => {
1227
0
                let type_index = self.read_var_u32()?;
1228
0
                let elem_index = self.read_var_u32()?;
1229
0
                visitor.visit_array_init_elem(type_index, elem_index)
1230
            }
1231
7.31k
            0x14 => visitor.visit_ref_test_non_null(self.read()?),
1232
463
            0x15 => visitor.visit_ref_test_nullable(self.read()?),
1233
1.47k
            0x16 => visitor.visit_ref_cast_non_null(self.read()?),
1234
1.70k
            0x17 => visitor.visit_ref_cast_nullable(self.read()?),
1235
            0x18 => {
1236
236
                let pos = self.original_position();
1237
236
                let cast_flags = self.read_u8()?;
1238
236
                let relative_depth = self.read_var_u32()?;
1239
236
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1240
0
                    0b00 => (false, false),
1241
0
                    0b01 => (true, false),
1242
0
                    0b10 => (false, true),
1243
236
                    0b11 => (true, true),
1244
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1245
                };
1246
236
                let from_heap_type = self.read()?;
1247
236
                let from_ref_type =
1248
236
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1249
0
                        format_err!(pos, "implementation error: type index too large")
1250
0
                    })?;
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>::{closure#0}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wit_component::gc::Module>>::{closure#0}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>::{closure#0}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>::{closure#0}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#0}
1251
236
                let to_heap_type = self.read()?;
1252
236
                let to_ref_type =
1253
236
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1254
0
                        format_err!(pos, "implementation error: type index too large")
1255
0
                    })?;
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>::{closure#1}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wit_component::gc::Module>>::{closure#1}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>::{closure#1}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>::{closure#1}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#1}
1256
236
                visitor.visit_br_on_cast(relative_depth, from_ref_type, to_ref_type)
1257
            }
1258
            0x19 => {
1259
1.50k
                let pos = self.original_position();
1260
1.50k
                let cast_flags = self.read_u8()?;
1261
1.50k
                let relative_depth = self.read_var_u32()?;
1262
1.50k
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1263
904
                    0 => (false, false),
1264
0
                    1 => (true, false),
1265
0
                    2 => (false, true),
1266
600
                    3 => (true, true),
1267
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1268
                };
1269
1.50k
                let from_heap_type = self.read()?;
1270
1.50k
                let from_ref_type =
1271
1.50k
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1272
0
                        format_err!(pos, "implementation error: type index too large")
1273
0
                    })?;
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>::{closure#2}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wit_component::gc::Module>>::{closure#2}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>::{closure#2}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>::{closure#2}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#2}
1274
1.50k
                let to_heap_type = self.read()?;
1275
1.50k
                let to_ref_type =
1276
1.50k
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1277
0
                        format_err!(pos, "implementation error: type index too large")
1278
0
                    })?;
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>::{closure#3}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wit_component::gc::Module>>::{closure#3}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>::{closure#3}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>::{closure#3}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#3}
1279
1.50k
                visitor.visit_br_on_cast_fail(relative_depth, from_ref_type, to_ref_type)
1280
            }
1281
1282
17.8k
            0x1a => visitor.visit_any_convert_extern(),
1283
65.2k
            0x1b => visitor.visit_extern_convert_any(),
1284
1285
9.36k
            0x1c => visitor.visit_ref_i31(),
1286
30
            0x1d => visitor.visit_i31_get_s(),
1287
20
            0x1e => visitor.visit_i31_get_u(),
1288
1289
            0x20 => {
1290
0
                let type_index = self.read_var_u32()?;
1291
0
                visitor.visit_struct_new_desc(type_index)
1292
            }
1293
            0x21 => {
1294
0
                let type_index = self.read_var_u32()?;
1295
0
                visitor.visit_struct_new_default_desc(type_index)
1296
            }
1297
0
            0x22 => visitor.visit_ref_get_desc(self.read()?),
1298
0
            0x23 => visitor.visit_ref_cast_desc_eq_non_null(self.read()?),
1299
0
            0x24 => visitor.visit_ref_cast_desc_eq_nullable(self.read()?),
1300
            0x25 => {
1301
0
                let pos = self.original_position();
1302
0
                let cast_flags = self.read_u8()?;
1303
0
                let relative_depth = self.read_var_u32()?;
1304
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1305
0
                    0b00 => (false, false),
1306
0
                    0b01 => (true, false),
1307
0
                    0b10 => (false, true),
1308
0
                    0b11 => (true, true),
1309
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1310
                };
1311
0
                let from_heap_type = self.read()?;
1312
0
                let from_ref_type =
1313
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1314
0
                        format_err!(pos, "implementation error: type index too large")
1315
0
                    })?;
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>::{closure#4}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wit_component::gc::Module>>::{closure#4}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>::{closure#4}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>::{closure#4}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#4}
1316
0
                let to_heap_type = self.read()?;
1317
0
                let to_ref_type =
1318
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1319
0
                        format_err!(pos, "implementation error: type index too large")
1320
0
                    })?;
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>::{closure#5}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wit_component::gc::Module>>::{closure#5}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>::{closure#5}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>::{closure#5}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#5}
1321
0
                visitor.visit_br_on_cast_desc_eq(relative_depth, from_ref_type, to_ref_type)
1322
            }
1323
            0x26 => {
1324
0
                let pos = self.original_position();
1325
0
                let cast_flags = self.read_u8()?;
1326
0
                let relative_depth = self.read_var_u32()?;
1327
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1328
0
                    0 => (false, false),
1329
0
                    1 => (true, false),
1330
0
                    2 => (false, true),
1331
0
                    3 => (true, true),
1332
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1333
                };
1334
0
                let from_heap_type = self.read()?;
1335
0
                let from_ref_type =
1336
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1337
0
                        format_err!(pos, "implementation error: type index too large")
1338
0
                    })?;
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>::{closure#6}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wit_component::gc::Module>>::{closure#6}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>::{closure#6}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>::{closure#6}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#6}
1339
0
                let to_heap_type = self.read()?;
1340
0
                let to_ref_type =
1341
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1342
0
                        format_err!(pos, "implementation error: type index too large")
1343
0
                    })?;
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>::{closure#7}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wit_component::gc::Module>>::{closure#7}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>::{closure#7}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>::{closure#7}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#7}
1344
0
                visitor.visit_br_on_cast_desc_eq_fail(relative_depth, from_ref_type, to_ref_type)
1345
            }
1346
1347
0
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1348
        })
1349
681k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>
Line
Count
Source
1134
99.2k
    fn visit_0xfb_operator<T>(
1135
99.2k
        &mut self,
1136
99.2k
        pos: u64,
1137
99.2k
        visitor: &mut T,
1138
99.2k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1139
99.2k
    where
1140
99.2k
        T: VisitOperator<'a>,
1141
    {
1142
99.2k
        let code = self.read_var_u32()?;
1143
99.2k
        Ok(match code {
1144
            0x0 => {
1145
16.4k
                let type_index = self.read_var_u32()?;
1146
16.4k
                visitor.visit_struct_new(type_index)
1147
            }
1148
            0x01 => {
1149
26.0k
                let type_index = self.read_var_u32()?;
1150
26.0k
                visitor.visit_struct_new_default(type_index)
1151
            }
1152
            0x02 => {
1153
20
                let type_index = self.read_var_u32()?;
1154
20
                let field_index = self.read_var_u32()?;
1155
20
                visitor.visit_struct_get(type_index, field_index)
1156
            }
1157
            0x03 => {
1158
40
                let type_index = self.read_var_u32()?;
1159
40
                let field_index = self.read_var_u32()?;
1160
40
                visitor.visit_struct_get_s(type_index, field_index)
1161
            }
1162
            0x04 => {
1163
6
                let type_index = self.read_var_u32()?;
1164
6
                let field_index = self.read_var_u32()?;
1165
6
                visitor.visit_struct_get_u(type_index, field_index)
1166
            }
1167
            0x05 => {
1168
196
                let type_index = self.read_var_u32()?;
1169
196
                let field_index = self.read_var_u32()?;
1170
196
                visitor.visit_struct_set(type_index, field_index)
1171
            }
1172
            0x06 => {
1173
1.95k
                let type_index = self.read_var_u32()?;
1174
1.95k
                visitor.visit_array_new(type_index)
1175
            }
1176
            0x07 => {
1177
24.5k
                let type_index = self.read_var_u32()?;
1178
24.5k
                visitor.visit_array_new_default(type_index)
1179
            }
1180
            0x08 => {
1181
6.08k
                let type_index = self.read_var_u32()?;
1182
6.08k
                let n = self.read_var_u32()?;
1183
6.08k
                visitor.visit_array_new_fixed(type_index, n)
1184
            }
1185
            0x09 => {
1186
46
                let type_index = self.read_var_u32()?;
1187
46
                let data_index = self.read_var_u32()?;
1188
46
                visitor.visit_array_new_data(type_index, data_index)
1189
            }
1190
            0x0a => {
1191
0
                let type_index = self.read_var_u32()?;
1192
0
                let elem_index = self.read_var_u32()?;
1193
0
                visitor.visit_array_new_elem(type_index, elem_index)
1194
            }
1195
            0x0b => {
1196
0
                let type_index = self.read_var_u32()?;
1197
0
                visitor.visit_array_get(type_index)
1198
            }
1199
            0x0c => {
1200
38
                let type_index = self.read_var_u32()?;
1201
38
                visitor.visit_array_get_s(type_index)
1202
            }
1203
            0x0d => {
1204
0
                let type_index = self.read_var_u32()?;
1205
0
                visitor.visit_array_get_u(type_index)
1206
            }
1207
            0x0e => {
1208
0
                let type_index = self.read_var_u32()?;
1209
0
                visitor.visit_array_set(type_index)
1210
            }
1211
551
            0x0f => visitor.visit_array_len(),
1212
            0x10 => {
1213
14
                let type_index = self.read_var_u32()?;
1214
14
                visitor.visit_array_fill(type_index)
1215
            }
1216
            0x11 => {
1217
0
                let type_index_dst = self.read_var_u32()?;
1218
0
                let type_index_src = self.read_var_u32()?;
1219
0
                visitor.visit_array_copy(type_index_dst, type_index_src)
1220
            }
1221
            0x12 => {
1222
0
                let type_index = self.read_var_u32()?;
1223
0
                let data_index = self.read_var_u32()?;
1224
0
                visitor.visit_array_init_data(type_index, data_index)
1225
            }
1226
            0x13 => {
1227
0
                let type_index = self.read_var_u32()?;
1228
0
                let elem_index = self.read_var_u32()?;
1229
0
                visitor.visit_array_init_elem(type_index, elem_index)
1230
            }
1231
3.63k
            0x14 => visitor.visit_ref_test_non_null(self.read()?),
1232
218
            0x15 => visitor.visit_ref_test_nullable(self.read()?),
1233
736
            0x16 => visitor.visit_ref_cast_non_null(self.read()?),
1234
850
            0x17 => visitor.visit_ref_cast_nullable(self.read()?),
1235
            0x18 => {
1236
118
                let pos = self.original_position();
1237
118
                let cast_flags = self.read_u8()?;
1238
118
                let relative_depth = self.read_var_u32()?;
1239
118
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1240
0
                    0b00 => (false, false),
1241
0
                    0b01 => (true, false),
1242
0
                    0b10 => (false, true),
1243
118
                    0b11 => (true, true),
1244
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1245
                };
1246
118
                let from_heap_type = self.read()?;
1247
118
                let from_ref_type =
1248
118
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1249
                        format_err!(pos, "implementation error: type index too large")
1250
0
                    })?;
1251
118
                let to_heap_type = self.read()?;
1252
118
                let to_ref_type =
1253
118
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1254
                        format_err!(pos, "implementation error: type index too large")
1255
0
                    })?;
1256
118
                visitor.visit_br_on_cast(relative_depth, from_ref_type, to_ref_type)
1257
            }
1258
            0x19 => {
1259
752
                let pos = self.original_position();
1260
752
                let cast_flags = self.read_u8()?;
1261
752
                let relative_depth = self.read_var_u32()?;
1262
752
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1263
452
                    0 => (false, false),
1264
0
                    1 => (true, false),
1265
0
                    2 => (false, true),
1266
300
                    3 => (true, true),
1267
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1268
                };
1269
752
                let from_heap_type = self.read()?;
1270
752
                let from_ref_type =
1271
752
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1272
                        format_err!(pos, "implementation error: type index too large")
1273
0
                    })?;
1274
752
                let to_heap_type = self.read()?;
1275
752
                let to_ref_type =
1276
752
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1277
                        format_err!(pos, "implementation error: type index too large")
1278
0
                    })?;
1279
752
                visitor.visit_br_on_cast_fail(relative_depth, from_ref_type, to_ref_type)
1280
            }
1281
1282
761
            0x1a => visitor.visit_any_convert_extern(),
1283
12.1k
            0x1b => visitor.visit_extern_convert_any(),
1284
1285
4.03k
            0x1c => visitor.visit_ref_i31(),
1286
12
            0x1d => visitor.visit_i31_get_s(),
1287
10
            0x1e => visitor.visit_i31_get_u(),
1288
1289
            0x20 => {
1290
0
                let type_index = self.read_var_u32()?;
1291
0
                visitor.visit_struct_new_desc(type_index)
1292
            }
1293
            0x21 => {
1294
0
                let type_index = self.read_var_u32()?;
1295
0
                visitor.visit_struct_new_default_desc(type_index)
1296
            }
1297
0
            0x22 => visitor.visit_ref_get_desc(self.read()?),
1298
0
            0x23 => visitor.visit_ref_cast_desc_eq_non_null(self.read()?),
1299
0
            0x24 => visitor.visit_ref_cast_desc_eq_nullable(self.read()?),
1300
            0x25 => {
1301
0
                let pos = self.original_position();
1302
0
                let cast_flags = self.read_u8()?;
1303
0
                let relative_depth = self.read_var_u32()?;
1304
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1305
0
                    0b00 => (false, false),
1306
0
                    0b01 => (true, false),
1307
0
                    0b10 => (false, true),
1308
0
                    0b11 => (true, true),
1309
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1310
                };
1311
0
                let from_heap_type = self.read()?;
1312
0
                let from_ref_type =
1313
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1314
                        format_err!(pos, "implementation error: type index too large")
1315
0
                    })?;
1316
0
                let to_heap_type = self.read()?;
1317
0
                let to_ref_type =
1318
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1319
                        format_err!(pos, "implementation error: type index too large")
1320
0
                    })?;
1321
0
                visitor.visit_br_on_cast_desc_eq(relative_depth, from_ref_type, to_ref_type)
1322
            }
1323
            0x26 => {
1324
0
                let pos = self.original_position();
1325
0
                let cast_flags = self.read_u8()?;
1326
0
                let relative_depth = self.read_var_u32()?;
1327
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1328
0
                    0 => (false, false),
1329
0
                    1 => (true, false),
1330
0
                    2 => (false, true),
1331
0
                    3 => (true, true),
1332
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1333
                };
1334
0
                let from_heap_type = self.read()?;
1335
0
                let from_ref_type =
1336
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1337
                        format_err!(pos, "implementation error: type index too large")
1338
0
                    })?;
1339
0
                let to_heap_type = self.read()?;
1340
0
                let to_ref_type =
1341
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1342
                        format_err!(pos, "implementation error: type index too large")
1343
0
                    })?;
1344
0
                visitor.visit_br_on_cast_desc_eq_fail(relative_depth, from_ref_type, to_ref_type)
1345
            }
1346
1347
0
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1348
        })
1349
99.2k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wit_component::gc::Module>>
<wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>
Line
Count
Source
1134
20.3k
    fn visit_0xfb_operator<T>(
1135
20.3k
        &mut self,
1136
20.3k
        pos: u64,
1137
20.3k
        visitor: &mut T,
1138
20.3k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1139
20.3k
    where
1140
20.3k
        T: VisitOperator<'a>,
1141
    {
1142
20.3k
        let code = self.read_var_u32()?;
1143
20.3k
        Ok(match code {
1144
            0x0 => {
1145
833
                let type_index = self.read_var_u32()?;
1146
833
                visitor.visit_struct_new(type_index)
1147
            }
1148
            0x01 => {
1149
7.91k
                let type_index = self.read_var_u32()?;
1150
7.91k
                visitor.visit_struct_new_default(type_index)
1151
            }
1152
            0x02 => {
1153
10
                let type_index = self.read_var_u32()?;
1154
10
                let field_index = self.read_var_u32()?;
1155
10
                visitor.visit_struct_get(type_index, field_index)
1156
            }
1157
            0x03 => {
1158
20
                let type_index = self.read_var_u32()?;
1159
20
                let field_index = self.read_var_u32()?;
1160
20
                visitor.visit_struct_get_s(type_index, field_index)
1161
            }
1162
            0x04 => {
1163
3
                let type_index = self.read_var_u32()?;
1164
3
                let field_index = self.read_var_u32()?;
1165
3
                visitor.visit_struct_get_u(type_index, field_index)
1166
            }
1167
            0x05 => {
1168
98
                let type_index = self.read_var_u32()?;
1169
98
                let field_index = self.read_var_u32()?;
1170
98
                visitor.visit_struct_set(type_index, field_index)
1171
            }
1172
            0x06 => {
1173
93
                let type_index = self.read_var_u32()?;
1174
93
                visitor.visit_array_new(type_index)
1175
            }
1176
            0x07 => {
1177
1.31k
                let type_index = self.read_var_u32()?;
1178
1.31k
                visitor.visit_array_new_default(type_index)
1179
            }
1180
            0x08 => {
1181
2.43k
                let type_index = self.read_var_u32()?;
1182
2.43k
                let n = self.read_var_u32()?;
1183
2.43k
                visitor.visit_array_new_fixed(type_index, n)
1184
            }
1185
            0x09 => {
1186
23
                let type_index = self.read_var_u32()?;
1187
23
                let data_index = self.read_var_u32()?;
1188
23
                visitor.visit_array_new_data(type_index, data_index)
1189
            }
1190
            0x0a => {
1191
0
                let type_index = self.read_var_u32()?;
1192
0
                let elem_index = self.read_var_u32()?;
1193
0
                visitor.visit_array_new_elem(type_index, elem_index)
1194
            }
1195
            0x0b => {
1196
0
                let type_index = self.read_var_u32()?;
1197
0
                visitor.visit_array_get(type_index)
1198
            }
1199
            0x0c => {
1200
19
                let type_index = self.read_var_u32()?;
1201
19
                visitor.visit_array_get_s(type_index)
1202
            }
1203
            0x0d => {
1204
0
                let type_index = self.read_var_u32()?;
1205
0
                visitor.visit_array_get_u(type_index)
1206
            }
1207
            0x0e => {
1208
0
                let type_index = self.read_var_u32()?;
1209
0
                visitor.visit_array_set(type_index)
1210
            }
1211
275
            0x0f => visitor.visit_array_len(),
1212
            0x10 => {
1213
7
                let type_index = self.read_var_u32()?;
1214
7
                visitor.visit_array_fill(type_index)
1215
            }
1216
            0x11 => {
1217
0
                let type_index_dst = self.read_var_u32()?;
1218
0
                let type_index_src = self.read_var_u32()?;
1219
0
                visitor.visit_array_copy(type_index_dst, type_index_src)
1220
            }
1221
            0x12 => {
1222
0
                let type_index = self.read_var_u32()?;
1223
0
                let data_index = self.read_var_u32()?;
1224
0
                visitor.visit_array_init_data(type_index, data_index)
1225
            }
1226
            0x13 => {
1227
0
                let type_index = self.read_var_u32()?;
1228
0
                let elem_index = self.read_var_u32()?;
1229
0
                visitor.visit_array_init_elem(type_index, elem_index)
1230
            }
1231
1.82k
            0x14 => visitor.visit_ref_test_non_null(self.read()?),
1232
137
            0x15 => visitor.visit_ref_test_nullable(self.read()?),
1233
368
            0x16 => visitor.visit_ref_cast_non_null(self.read()?),
1234
425
            0x17 => visitor.visit_ref_cast_nullable(self.read()?),
1235
            0x18 => {
1236
59
                let pos = self.original_position();
1237
59
                let cast_flags = self.read_u8()?;
1238
59
                let relative_depth = self.read_var_u32()?;
1239
59
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1240
0
                    0b00 => (false, false),
1241
0
                    0b01 => (true, false),
1242
0
                    0b10 => (false, true),
1243
59
                    0b11 => (true, true),
1244
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1245
                };
1246
59
                let from_heap_type = self.read()?;
1247
59
                let from_ref_type =
1248
59
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1249
                        format_err!(pos, "implementation error: type index too large")
1250
0
                    })?;
1251
59
                let to_heap_type = self.read()?;
1252
59
                let to_ref_type =
1253
59
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1254
                        format_err!(pos, "implementation error: type index too large")
1255
0
                    })?;
1256
59
                visitor.visit_br_on_cast(relative_depth, from_ref_type, to_ref_type)
1257
            }
1258
            0x19 => {
1259
376
                let pos = self.original_position();
1260
376
                let cast_flags = self.read_u8()?;
1261
376
                let relative_depth = self.read_var_u32()?;
1262
376
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1263
226
                    0 => (false, false),
1264
0
                    1 => (true, false),
1265
0
                    2 => (false, true),
1266
150
                    3 => (true, true),
1267
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1268
                };
1269
376
                let from_heap_type = self.read()?;
1270
376
                let from_ref_type =
1271
376
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1272
                        format_err!(pos, "implementation error: type index too large")
1273
0
                    })?;
1274
376
                let to_heap_type = self.read()?;
1275
376
                let to_ref_type =
1276
376
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1277
                        format_err!(pos, "implementation error: type index too large")
1278
0
                    })?;
1279
376
                visitor.visit_br_on_cast_fail(relative_depth, from_ref_type, to_ref_type)
1280
            }
1281
1282
365
            0x1a => visitor.visit_any_convert_extern(),
1283
1.96k
            0x1b => visitor.visit_extern_convert_any(),
1284
1285
1.82k
            0x1c => visitor.visit_ref_i31(),
1286
6
            0x1d => visitor.visit_i31_get_s(),
1287
5
            0x1e => visitor.visit_i31_get_u(),
1288
1289
            0x20 => {
1290
0
                let type_index = self.read_var_u32()?;
1291
0
                visitor.visit_struct_new_desc(type_index)
1292
            }
1293
            0x21 => {
1294
0
                let type_index = self.read_var_u32()?;
1295
0
                visitor.visit_struct_new_default_desc(type_index)
1296
            }
1297
0
            0x22 => visitor.visit_ref_get_desc(self.read()?),
1298
0
            0x23 => visitor.visit_ref_cast_desc_eq_non_null(self.read()?),
1299
0
            0x24 => visitor.visit_ref_cast_desc_eq_nullable(self.read()?),
1300
            0x25 => {
1301
0
                let pos = self.original_position();
1302
0
                let cast_flags = self.read_u8()?;
1303
0
                let relative_depth = self.read_var_u32()?;
1304
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1305
0
                    0b00 => (false, false),
1306
0
                    0b01 => (true, false),
1307
0
                    0b10 => (false, true),
1308
0
                    0b11 => (true, true),
1309
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1310
                };
1311
0
                let from_heap_type = self.read()?;
1312
0
                let from_ref_type =
1313
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1314
                        format_err!(pos, "implementation error: type index too large")
1315
0
                    })?;
1316
0
                let to_heap_type = self.read()?;
1317
0
                let to_ref_type =
1318
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1319
                        format_err!(pos, "implementation error: type index too large")
1320
0
                    })?;
1321
0
                visitor.visit_br_on_cast_desc_eq(relative_depth, from_ref_type, to_ref_type)
1322
            }
1323
            0x26 => {
1324
0
                let pos = self.original_position();
1325
0
                let cast_flags = self.read_u8()?;
1326
0
                let relative_depth = self.read_var_u32()?;
1327
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1328
0
                    0 => (false, false),
1329
0
                    1 => (true, false),
1330
0
                    2 => (false, true),
1331
0
                    3 => (true, true),
1332
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1333
                };
1334
0
                let from_heap_type = self.read()?;
1335
0
                let from_ref_type =
1336
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1337
                        format_err!(pos, "implementation error: type index too large")
1338
0
                    })?;
1339
0
                let to_heap_type = self.read()?;
1340
0
                let to_ref_type =
1341
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1342
                        format_err!(pos, "implementation error: type index too large")
1343
0
                    })?;
1344
0
                visitor.visit_br_on_cast_desc_eq_fail(relative_depth, from_ref_type, to_ref_type)
1345
            }
1346
1347
0
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1348
        })
1349
20.3k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
1134
521k
    fn visit_0xfb_operator<T>(
1135
521k
        &mut self,
1136
521k
        pos: u64,
1137
521k
        visitor: &mut T,
1138
521k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1139
521k
    where
1140
521k
        T: VisitOperator<'a>,
1141
    {
1142
521k
        let code = self.read_var_u32()?;
1143
521k
        Ok(match code {
1144
            0x0 => {
1145
52.0k
                let type_index = self.read_var_u32()?;
1146
52.0k
                visitor.visit_struct_new(type_index)
1147
            }
1148
            0x01 => {
1149
47.3k
                let type_index = self.read_var_u32()?;
1150
47.3k
                visitor.visit_struct_new_default(type_index)
1151
            }
1152
            0x02 => {
1153
10
                let type_index = self.read_var_u32()?;
1154
10
                let field_index = self.read_var_u32()?;
1155
10
                visitor.visit_struct_get(type_index, field_index)
1156
            }
1157
            0x03 => {
1158
20
                let type_index = self.read_var_u32()?;
1159
20
                let field_index = self.read_var_u32()?;
1160
20
                visitor.visit_struct_get_s(type_index, field_index)
1161
            }
1162
            0x04 => {
1163
3
                let type_index = self.read_var_u32()?;
1164
3
                let field_index = self.read_var_u32()?;
1165
3
                visitor.visit_struct_get_u(type_index, field_index)
1166
            }
1167
            0x05 => {
1168
100
                let type_index = self.read_var_u32()?;
1169
100
                let field_index = self.read_var_u32()?;
1170
100
                visitor.visit_struct_set(type_index, field_index)
1171
            }
1172
            0x06 => {
1173
6.42k
                let type_index = self.read_var_u32()?;
1174
6.42k
                visitor.visit_array_new(type_index)
1175
            }
1176
            0x07 => {
1177
350k
                let type_index = self.read_var_u32()?;
1178
350k
                visitor.visit_array_new_default(type_index)
1179
            }
1180
            0x08 => {
1181
5.31k
                let type_index = self.read_var_u32()?;
1182
5.31k
                let n = self.read_var_u32()?;
1183
5.31k
                visitor.visit_array_new_fixed(type_index, n)
1184
            }
1185
            0x09 => {
1186
23
                let type_index = self.read_var_u32()?;
1187
23
                let data_index = self.read_var_u32()?;
1188
23
                visitor.visit_array_new_data(type_index, data_index)
1189
            }
1190
            0x0a => {
1191
0
                let type_index = self.read_var_u32()?;
1192
0
                let elem_index = self.read_var_u32()?;
1193
0
                visitor.visit_array_new_elem(type_index, elem_index)
1194
            }
1195
            0x0b => {
1196
0
                let type_index = self.read_var_u32()?;
1197
0
                visitor.visit_array_get(type_index)
1198
            }
1199
            0x0c => {
1200
19
                let type_index = self.read_var_u32()?;
1201
19
                visitor.visit_array_get_s(type_index)
1202
            }
1203
            0x0d => {
1204
0
                let type_index = self.read_var_u32()?;
1205
0
                visitor.visit_array_get_u(type_index)
1206
            }
1207
            0x0e => {
1208
0
                let type_index = self.read_var_u32()?;
1209
0
                visitor.visit_array_set(type_index)
1210
            }
1211
299
            0x0f => visitor.visit_array_len(),
1212
            0x10 => {
1213
7
                let type_index = self.read_var_u32()?;
1214
7
                visitor.visit_array_fill(type_index)
1215
            }
1216
            0x11 => {
1217
0
                let type_index_dst = self.read_var_u32()?;
1218
0
                let type_index_src = self.read_var_u32()?;
1219
0
                visitor.visit_array_copy(type_index_dst, type_index_src)
1220
            }
1221
            0x12 => {
1222
0
                let type_index = self.read_var_u32()?;
1223
0
                let data_index = self.read_var_u32()?;
1224
0
                visitor.visit_array_init_data(type_index, data_index)
1225
            }
1226
            0x13 => {
1227
0
                let type_index = self.read_var_u32()?;
1228
0
                let elem_index = self.read_var_u32()?;
1229
0
                visitor.visit_array_init_elem(type_index, elem_index)
1230
            }
1231
1.85k
            0x14 => visitor.visit_ref_test_non_null(self.read()?),
1232
108
            0x15 => visitor.visit_ref_test_nullable(self.read()?),
1233
368
            0x16 => visitor.visit_ref_cast_non_null(self.read()?),
1234
425
            0x17 => visitor.visit_ref_cast_nullable(self.read()?),
1235
            0x18 => {
1236
59
                let pos = self.original_position();
1237
59
                let cast_flags = self.read_u8()?;
1238
59
                let relative_depth = self.read_var_u32()?;
1239
59
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1240
0
                    0b00 => (false, false),
1241
0
                    0b01 => (true, false),
1242
0
                    0b10 => (false, true),
1243
59
                    0b11 => (true, true),
1244
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1245
                };
1246
59
                let from_heap_type = self.read()?;
1247
59
                let from_ref_type =
1248
59
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1249
                        format_err!(pos, "implementation error: type index too large")
1250
0
                    })?;
1251
59
                let to_heap_type = self.read()?;
1252
59
                let to_ref_type =
1253
59
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1254
                        format_err!(pos, "implementation error: type index too large")
1255
0
                    })?;
1256
59
                visitor.visit_br_on_cast(relative_depth, from_ref_type, to_ref_type)
1257
            }
1258
            0x19 => {
1259
376
                let pos = self.original_position();
1260
376
                let cast_flags = self.read_u8()?;
1261
376
                let relative_depth = self.read_var_u32()?;
1262
376
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1263
226
                    0 => (false, false),
1264
0
                    1 => (true, false),
1265
0
                    2 => (false, true),
1266
150
                    3 => (true, true),
1267
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1268
                };
1269
376
                let from_heap_type = self.read()?;
1270
376
                let from_ref_type =
1271
376
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1272
                        format_err!(pos, "implementation error: type index too large")
1273
0
                    })?;
1274
376
                let to_heap_type = self.read()?;
1275
376
                let to_ref_type =
1276
376
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1277
                        format_err!(pos, "implementation error: type index too large")
1278
0
                    })?;
1279
376
                visitor.visit_br_on_cast_fail(relative_depth, from_ref_type, to_ref_type)
1280
            }
1281
1282
11.2k
            0x1a => visitor.visit_any_convert_extern(),
1283
41.6k
            0x1b => visitor.visit_extern_convert_any(),
1284
1285
3.27k
            0x1c => visitor.visit_ref_i31(),
1286
12
            0x1d => visitor.visit_i31_get_s(),
1287
5
            0x1e => visitor.visit_i31_get_u(),
1288
1289
            0x20 => {
1290
0
                let type_index = self.read_var_u32()?;
1291
0
                visitor.visit_struct_new_desc(type_index)
1292
            }
1293
            0x21 => {
1294
0
                let type_index = self.read_var_u32()?;
1295
0
                visitor.visit_struct_new_default_desc(type_index)
1296
            }
1297
0
            0x22 => visitor.visit_ref_get_desc(self.read()?),
1298
0
            0x23 => visitor.visit_ref_cast_desc_eq_non_null(self.read()?),
1299
0
            0x24 => visitor.visit_ref_cast_desc_eq_nullable(self.read()?),
1300
            0x25 => {
1301
0
                let pos = self.original_position();
1302
0
                let cast_flags = self.read_u8()?;
1303
0
                let relative_depth = self.read_var_u32()?;
1304
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1305
0
                    0b00 => (false, false),
1306
0
                    0b01 => (true, false),
1307
0
                    0b10 => (false, true),
1308
0
                    0b11 => (true, true),
1309
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1310
                };
1311
0
                let from_heap_type = self.read()?;
1312
0
                let from_ref_type =
1313
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1314
                        format_err!(pos, "implementation error: type index too large")
1315
0
                    })?;
1316
0
                let to_heap_type = self.read()?;
1317
0
                let to_ref_type =
1318
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1319
                        format_err!(pos, "implementation error: type index too large")
1320
0
                    })?;
1321
0
                visitor.visit_br_on_cast_desc_eq(relative_depth, from_ref_type, to_ref_type)
1322
            }
1323
            0x26 => {
1324
0
                let pos = self.original_position();
1325
0
                let cast_flags = self.read_u8()?;
1326
0
                let relative_depth = self.read_var_u32()?;
1327
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1328
0
                    0 => (false, false),
1329
0
                    1 => (true, false),
1330
0
                    2 => (false, true),
1331
0
                    3 => (true, true),
1332
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1333
                };
1334
0
                let from_heap_type = self.read()?;
1335
0
                let from_ref_type =
1336
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1337
                        format_err!(pos, "implementation error: type index too large")
1338
0
                    })?;
1339
0
                let to_heap_type = self.read()?;
1340
0
                let to_ref_type =
1341
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1342
                        format_err!(pos, "implementation error: type index too large")
1343
0
                    })?;
1344
0
                visitor.visit_br_on_cast_desc_eq_fail(relative_depth, from_ref_type, to_ref_type)
1345
            }
1346
1347
0
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1348
        })
1349
521k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
Line
Count
Source
1134
40.2k
    fn visit_0xfb_operator<T>(
1135
40.2k
        &mut self,
1136
40.2k
        pos: u64,
1137
40.2k
        visitor: &mut T,
1138
40.2k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1139
40.2k
    where
1140
40.2k
        T: VisitOperator<'a>,
1141
    {
1142
40.2k
        let code = self.read_var_u32()?;
1143
40.2k
        Ok(match code {
1144
            0x0 => {
1145
7.37k
                let type_index = self.read_var_u32()?;
1146
7.37k
                visitor.visit_struct_new(type_index)
1147
            }
1148
            0x01 => {
1149
5.10k
                let type_index = self.read_var_u32()?;
1150
5.10k
                visitor.visit_struct_new_default(type_index)
1151
            }
1152
            0x02 => {
1153
0
                let type_index = self.read_var_u32()?;
1154
0
                let field_index = self.read_var_u32()?;
1155
0
                visitor.visit_struct_get(type_index, field_index)
1156
            }
1157
            0x03 => {
1158
0
                let type_index = self.read_var_u32()?;
1159
0
                let field_index = self.read_var_u32()?;
1160
0
                visitor.visit_struct_get_s(type_index, field_index)
1161
            }
1162
            0x04 => {
1163
0
                let type_index = self.read_var_u32()?;
1164
0
                let field_index = self.read_var_u32()?;
1165
0
                visitor.visit_struct_get_u(type_index, field_index)
1166
            }
1167
            0x05 => {
1168
0
                let type_index = self.read_var_u32()?;
1169
0
                let field_index = self.read_var_u32()?;
1170
0
                visitor.visit_struct_set(type_index, field_index)
1171
            }
1172
            0x06 => {
1173
999
                let type_index = self.read_var_u32()?;
1174
999
                visitor.visit_array_new(type_index)
1175
            }
1176
            0x07 => {
1177
10.9k
                let type_index = self.read_var_u32()?;
1178
10.9k
                visitor.visit_array_new_default(type_index)
1179
            }
1180
            0x08 => {
1181
613
                let type_index = self.read_var_u32()?;
1182
613
                let n = self.read_var_u32()?;
1183
613
                visitor.visit_array_new_fixed(type_index, n)
1184
            }
1185
            0x09 => {
1186
0
                let type_index = self.read_var_u32()?;
1187
0
                let data_index = self.read_var_u32()?;
1188
0
                visitor.visit_array_new_data(type_index, data_index)
1189
            }
1190
            0x0a => {
1191
0
                let type_index = self.read_var_u32()?;
1192
0
                let elem_index = self.read_var_u32()?;
1193
0
                visitor.visit_array_new_elem(type_index, elem_index)
1194
            }
1195
            0x0b => {
1196
0
                let type_index = self.read_var_u32()?;
1197
0
                visitor.visit_array_get(type_index)
1198
            }
1199
            0x0c => {
1200
0
                let type_index = self.read_var_u32()?;
1201
0
                visitor.visit_array_get_s(type_index)
1202
            }
1203
            0x0d => {
1204
0
                let type_index = self.read_var_u32()?;
1205
0
                visitor.visit_array_get_u(type_index)
1206
            }
1207
            0x0e => {
1208
0
                let type_index = self.read_var_u32()?;
1209
0
                visitor.visit_array_set(type_index)
1210
            }
1211
0
            0x0f => visitor.visit_array_len(),
1212
            0x10 => {
1213
0
                let type_index = self.read_var_u32()?;
1214
0
                visitor.visit_array_fill(type_index)
1215
            }
1216
            0x11 => {
1217
0
                let type_index_dst = self.read_var_u32()?;
1218
0
                let type_index_src = self.read_var_u32()?;
1219
0
                visitor.visit_array_copy(type_index_dst, type_index_src)
1220
            }
1221
            0x12 => {
1222
0
                let type_index = self.read_var_u32()?;
1223
0
                let data_index = self.read_var_u32()?;
1224
0
                visitor.visit_array_init_data(type_index, data_index)
1225
            }
1226
            0x13 => {
1227
0
                let type_index = self.read_var_u32()?;
1228
0
                let elem_index = self.read_var_u32()?;
1229
0
                visitor.visit_array_init_elem(type_index, elem_index)
1230
            }
1231
0
            0x14 => visitor.visit_ref_test_non_null(self.read()?),
1232
0
            0x15 => visitor.visit_ref_test_nullable(self.read()?),
1233
0
            0x16 => visitor.visit_ref_cast_non_null(self.read()?),
1234
0
            0x17 => visitor.visit_ref_cast_nullable(self.read()?),
1235
            0x18 => {
1236
0
                let pos = self.original_position();
1237
0
                let cast_flags = self.read_u8()?;
1238
0
                let relative_depth = self.read_var_u32()?;
1239
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1240
0
                    0b00 => (false, false),
1241
0
                    0b01 => (true, false),
1242
0
                    0b10 => (false, true),
1243
0
                    0b11 => (true, true),
1244
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1245
                };
1246
0
                let from_heap_type = self.read()?;
1247
0
                let from_ref_type =
1248
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1249
                        format_err!(pos, "implementation error: type index too large")
1250
0
                    })?;
1251
0
                let to_heap_type = self.read()?;
1252
0
                let to_ref_type =
1253
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1254
                        format_err!(pos, "implementation error: type index too large")
1255
0
                    })?;
1256
0
                visitor.visit_br_on_cast(relative_depth, from_ref_type, to_ref_type)
1257
            }
1258
            0x19 => {
1259
0
                let pos = self.original_position();
1260
0
                let cast_flags = self.read_u8()?;
1261
0
                let relative_depth = self.read_var_u32()?;
1262
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1263
0
                    0 => (false, false),
1264
0
                    1 => (true, false),
1265
0
                    2 => (false, true),
1266
0
                    3 => (true, true),
1267
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1268
                };
1269
0
                let from_heap_type = self.read()?;
1270
0
                let from_ref_type =
1271
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1272
                        format_err!(pos, "implementation error: type index too large")
1273
0
                    })?;
1274
0
                let to_heap_type = self.read()?;
1275
0
                let to_ref_type =
1276
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1277
                        format_err!(pos, "implementation error: type index too large")
1278
0
                    })?;
1279
0
                visitor.visit_br_on_cast_fail(relative_depth, from_ref_type, to_ref_type)
1280
            }
1281
1282
5.42k
            0x1a => visitor.visit_any_convert_extern(),
1283
9.53k
            0x1b => visitor.visit_extern_convert_any(),
1284
1285
241
            0x1c => visitor.visit_ref_i31(),
1286
0
            0x1d => visitor.visit_i31_get_s(),
1287
0
            0x1e => visitor.visit_i31_get_u(),
1288
1289
            0x20 => {
1290
0
                let type_index = self.read_var_u32()?;
1291
0
                visitor.visit_struct_new_desc(type_index)
1292
            }
1293
            0x21 => {
1294
0
                let type_index = self.read_var_u32()?;
1295
0
                visitor.visit_struct_new_default_desc(type_index)
1296
            }
1297
0
            0x22 => visitor.visit_ref_get_desc(self.read()?),
1298
0
            0x23 => visitor.visit_ref_cast_desc_eq_non_null(self.read()?),
1299
0
            0x24 => visitor.visit_ref_cast_desc_eq_nullable(self.read()?),
1300
            0x25 => {
1301
0
                let pos = self.original_position();
1302
0
                let cast_flags = self.read_u8()?;
1303
0
                let relative_depth = self.read_var_u32()?;
1304
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1305
0
                    0b00 => (false, false),
1306
0
                    0b01 => (true, false),
1307
0
                    0b10 => (false, true),
1308
0
                    0b11 => (true, true),
1309
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1310
                };
1311
0
                let from_heap_type = self.read()?;
1312
0
                let from_ref_type =
1313
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1314
                        format_err!(pos, "implementation error: type index too large")
1315
0
                    })?;
1316
0
                let to_heap_type = self.read()?;
1317
0
                let to_ref_type =
1318
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1319
                        format_err!(pos, "implementation error: type index too large")
1320
0
                    })?;
1321
0
                visitor.visit_br_on_cast_desc_eq(relative_depth, from_ref_type, to_ref_type)
1322
            }
1323
            0x26 => {
1324
0
                let pos = self.original_position();
1325
0
                let cast_flags = self.read_u8()?;
1326
0
                let relative_depth = self.read_var_u32()?;
1327
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1328
0
                    0 => (false, false),
1329
0
                    1 => (true, false),
1330
0
                    2 => (false, true),
1331
0
                    3 => (true, true),
1332
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1333
                };
1334
0
                let from_heap_type = self.read()?;
1335
0
                let from_ref_type =
1336
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1337
                        format_err!(pos, "implementation error: type index too large")
1338
0
                    })?;
1339
0
                let to_heap_type = self.read()?;
1340
0
                let to_ref_type =
1341
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1342
                        format_err!(pos, "implementation error: type index too large")
1343
0
                    })?;
1344
0
                visitor.visit_br_on_cast_desc_eq_fail(relative_depth, from_ref_type, to_ref_type)
1345
            }
1346
1347
0
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1348
        })
1349
40.2k
    }
1350
1351
324k
    fn visit_0xfc_operator<T>(
1352
324k
        &mut self,
1353
324k
        pos: u64,
1354
324k
        visitor: &mut T,
1355
324k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1356
324k
    where
1357
324k
        T: VisitOperator<'a>,
1358
    {
1359
324k
        let code = self.read_var_u32()?;
1360
324k
        Ok(match code {
1361
8.06k
            0x00 => visitor.visit_i32_trunc_sat_f32_s(),
1362
5.48k
            0x01 => visitor.visit_i32_trunc_sat_f32_u(),
1363
20.3k
            0x02 => visitor.visit_i32_trunc_sat_f64_s(),
1364
4.88k
            0x03 => visitor.visit_i32_trunc_sat_f64_u(),
1365
6.56k
            0x04 => visitor.visit_i64_trunc_sat_f32_s(),
1366
8.85k
            0x05 => visitor.visit_i64_trunc_sat_f32_u(),
1367
8.16k
            0x06 => visitor.visit_i64_trunc_sat_f64_s(),
1368
7.09k
            0x07 => visitor.visit_i64_trunc_sat_f64_u(),
1369
1370
            0x08 => {
1371
0
                let segment = self.read_var_u32()?;
1372
0
                let mem = self.read_var_u32()?;
1373
0
                visitor.visit_memory_init(segment, mem)
1374
            }
1375
            0x09 => {
1376
68.4k
                let segment = self.read_var_u32()?;
1377
68.4k
                visitor.visit_data_drop(segment)
1378
            }
1379
            0x0a => {
1380
0
                let dst = self.read_var_u32()?;
1381
0
                let src = self.read_var_u32()?;
1382
0
                visitor.visit_memory_copy(dst, src)
1383
            }
1384
            0x0b => {
1385
20
                let mem = self.read_var_u32()?;
1386
20
                visitor.visit_memory_fill(mem)
1387
            }
1388
            0x0c => {
1389
12
                let segment = self.read_var_u32()?;
1390
12
                let table = self.read_var_u32()?;
1391
12
                visitor.visit_table_init(segment, table)
1392
            }
1393
            0x0d => {
1394
125k
                let segment = self.read_var_u32()?;
1395
125k
                visitor.visit_elem_drop(segment)
1396
            }
1397
            0x0e => {
1398
18
                let dst_table = self.read_var_u32()?;
1399
18
                let src_table = self.read_var_u32()?;
1400
18
                visitor.visit_table_copy(dst_table, src_table)
1401
            }
1402
1403
            0x0f => {
1404
872
                let table = self.read_var_u32()?;
1405
872
                visitor.visit_table_grow(table)
1406
            }
1407
            0x10 => {
1408
53.6k
                let table = self.read_var_u32()?;
1409
53.6k
                visitor.visit_table_size(table)
1410
            }
1411
1412
            0x11 => {
1413
0
                let table = self.read_var_u32()?;
1414
0
                visitor.visit_table_fill(table)
1415
            }
1416
1417
            0x12 => {
1418
0
                let mem = self.read_var_u32()?;
1419
0
                visitor.visit_memory_discard(mem)
1420
            }
1421
1422
8
            0x13 => visitor.visit_i64_add128(),
1423
0
            0x14 => visitor.visit_i64_sub128(),
1424
2.03k
            0x15 => visitor.visit_i64_mul_wide_s(),
1425
4.41k
            0x16 => visitor.visit_i64_mul_wide_u(),
1426
1427
2
            _ => bail!(pos, "unknown 0xfc subopcode: 0x{code:x}"),
1428
        })
1429
324k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfc_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>
Line
Count
Source
1351
116k
    fn visit_0xfc_operator<T>(
1352
116k
        &mut self,
1353
116k
        pos: u64,
1354
116k
        visitor: &mut T,
1355
116k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1356
116k
    where
1357
116k
        T: VisitOperator<'a>,
1358
    {
1359
116k
        let code = self.read_var_u32()?;
1360
116k
        Ok(match code {
1361
1.67k
            0x00 => visitor.visit_i32_trunc_sat_f32_s(),
1362
2.10k
            0x01 => visitor.visit_i32_trunc_sat_f32_u(),
1363
4.26k
            0x02 => visitor.visit_i32_trunc_sat_f64_s(),
1364
1.10k
            0x03 => visitor.visit_i32_trunc_sat_f64_u(),
1365
1.84k
            0x04 => visitor.visit_i64_trunc_sat_f32_s(),
1366
3.35k
            0x05 => visitor.visit_i64_trunc_sat_f32_u(),
1367
1.53k
            0x06 => visitor.visit_i64_trunc_sat_f64_s(),
1368
2.11k
            0x07 => visitor.visit_i64_trunc_sat_f64_u(),
1369
1370
            0x08 => {
1371
0
                let segment = self.read_var_u32()?;
1372
0
                let mem = self.read_var_u32()?;
1373
0
                visitor.visit_memory_init(segment, mem)
1374
            }
1375
            0x09 => {
1376
22.5k
                let segment = self.read_var_u32()?;
1377
22.5k
                visitor.visit_data_drop(segment)
1378
            }
1379
            0x0a => {
1380
0
                let dst = self.read_var_u32()?;
1381
0
                let src = self.read_var_u32()?;
1382
0
                visitor.visit_memory_copy(dst, src)
1383
            }
1384
            0x0b => {
1385
10
                let mem = self.read_var_u32()?;
1386
10
                visitor.visit_memory_fill(mem)
1387
            }
1388
            0x0c => {
1389
6
                let segment = self.read_var_u32()?;
1390
6
                let table = self.read_var_u32()?;
1391
6
                visitor.visit_table_init(segment, table)
1392
            }
1393
            0x0d => {
1394
56.6k
                let segment = self.read_var_u32()?;
1395
56.6k
                visitor.visit_elem_drop(segment)
1396
            }
1397
            0x0e => {
1398
8
                let dst_table = self.read_var_u32()?;
1399
8
                let src_table = self.read_var_u32()?;
1400
8
                visitor.visit_table_copy(dst_table, src_table)
1401
            }
1402
1403
            0x0f => {
1404
46
                let table = self.read_var_u32()?;
1405
46
                visitor.visit_table_grow(table)
1406
            }
1407
            0x10 => {
1408
17.0k
                let table = self.read_var_u32()?;
1409
17.0k
                visitor.visit_table_size(table)
1410
            }
1411
1412
            0x11 => {
1413
0
                let table = self.read_var_u32()?;
1414
0
                visitor.visit_table_fill(table)
1415
            }
1416
1417
            0x12 => {
1418
0
                let mem = self.read_var_u32()?;
1419
0
                visitor.visit_memory_discard(mem)
1420
            }
1421
1422
4
            0x13 => visitor.visit_i64_add128(),
1423
0
            0x14 => visitor.visit_i64_sub128(),
1424
286
            0x15 => visitor.visit_i64_mul_wide_s(),
1425
1.59k
            0x16 => visitor.visit_i64_mul_wide_u(),
1426
1427
2
            _ => bail!(pos, "unknown 0xfc subopcode: 0x{code:x}"),
1428
        })
1429
116k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfc_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wit_component::gc::Module>>
<wasmparser::binary_reader::BinaryReader>::visit_0xfc_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>
Line
Count
Source
1351
122k
    fn visit_0xfc_operator<T>(
1352
122k
        &mut self,
1353
122k
        pos: u64,
1354
122k
        visitor: &mut T,
1355
122k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1356
122k
    where
1357
122k
        T: VisitOperator<'a>,
1358
    {
1359
122k
        let code = self.read_var_u32()?;
1360
122k
        Ok(match code {
1361
4.27k
            0x00 => visitor.visit_i32_trunc_sat_f32_s(),
1362
2.06k
            0x01 => visitor.visit_i32_trunc_sat_f32_u(),
1363
13.0k
            0x02 => visitor.visit_i32_trunc_sat_f64_s(),
1364
2.80k
            0x03 => visitor.visit_i32_trunc_sat_f64_u(),
1365
2.26k
            0x04 => visitor.visit_i64_trunc_sat_f32_s(),
1366
3.22k
            0x05 => visitor.visit_i64_trunc_sat_f32_u(),
1367
3.54k
            0x06 => visitor.visit_i64_trunc_sat_f64_s(),
1368
2.75k
            0x07 => visitor.visit_i64_trunc_sat_f64_u(),
1369
1370
            0x08 => {
1371
0
                let segment = self.read_var_u32()?;
1372
0
                let mem = self.read_var_u32()?;
1373
0
                visitor.visit_memory_init(segment, mem)
1374
            }
1375
            0x09 => {
1376
29.2k
                let segment = self.read_var_u32()?;
1377
29.2k
                visitor.visit_data_drop(segment)
1378
            }
1379
            0x0a => {
1380
0
                let dst = self.read_var_u32()?;
1381
0
                let src = self.read_var_u32()?;
1382
0
                visitor.visit_memory_copy(dst, src)
1383
            }
1384
            0x0b => {
1385
5
                let mem = self.read_var_u32()?;
1386
5
                visitor.visit_memory_fill(mem)
1387
            }
1388
            0x0c => {
1389
3
                let segment = self.read_var_u32()?;
1390
3
                let table = self.read_var_u32()?;
1391
3
                visitor.visit_table_init(segment, table)
1392
            }
1393
            0x0d => {
1394
35.5k
                let segment = self.read_var_u32()?;
1395
35.5k
                visitor.visit_elem_drop(segment)
1396
            }
1397
            0x0e => {
1398
5
                let dst_table = self.read_var_u32()?;
1399
5
                let src_table = self.read_var_u32()?;
1400
5
                visitor.visit_table_copy(dst_table, src_table)
1401
            }
1402
1403
            0x0f => {
1404
516
                let table = self.read_var_u32()?;
1405
516
                visitor.visit_table_grow(table)
1406
            }
1407
            0x10 => {
1408
21.6k
                let table = self.read_var_u32()?;
1409
21.6k
                visitor.visit_table_size(table)
1410
            }
1411
1412
            0x11 => {
1413
0
                let table = self.read_var_u32()?;
1414
0
                visitor.visit_table_fill(table)
1415
            }
1416
1417
            0x12 => {
1418
0
                let mem = self.read_var_u32()?;
1419
0
                visitor.visit_memory_discard(mem)
1420
            }
1421
1422
2
            0x13 => visitor.visit_i64_add128(),
1423
0
            0x14 => visitor.visit_i64_sub128(),
1424
819
            0x15 => visitor.visit_i64_mul_wide_s(),
1425
1.00k
            0x16 => visitor.visit_i64_mul_wide_u(),
1426
1427
0
            _ => bail!(pos, "unknown 0xfc subopcode: 0x{code:x}"),
1428
        })
1429
122k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfc_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
1351
85.2k
    fn visit_0xfc_operator<T>(
1352
85.2k
        &mut self,
1353
85.2k
        pos: u64,
1354
85.2k
        visitor: &mut T,
1355
85.2k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1356
85.2k
    where
1357
85.2k
        T: VisitOperator<'a>,
1358
    {
1359
85.2k
        let code = self.read_var_u32()?;
1360
85.2k
        Ok(match code {
1361
2.11k
            0x00 => visitor.visit_i32_trunc_sat_f32_s(),
1362
1.31k
            0x01 => visitor.visit_i32_trunc_sat_f32_u(),
1363
3.07k
            0x02 => visitor.visit_i32_trunc_sat_f64_s(),
1364
971
            0x03 => visitor.visit_i32_trunc_sat_f64_u(),
1365
2.45k
            0x04 => visitor.visit_i64_trunc_sat_f32_s(),
1366
2.26k
            0x05 => visitor.visit_i64_trunc_sat_f32_u(),
1367
3.09k
            0x06 => visitor.visit_i64_trunc_sat_f64_s(),
1368
2.22k
            0x07 => visitor.visit_i64_trunc_sat_f64_u(),
1369
1370
            0x08 => {
1371
0
                let segment = self.read_var_u32()?;
1372
0
                let mem = self.read_var_u32()?;
1373
0
                visitor.visit_memory_init(segment, mem)
1374
            }
1375
            0x09 => {
1376
16.6k
                let segment = self.read_var_u32()?;
1377
16.6k
                visitor.visit_data_drop(segment)
1378
            }
1379
            0x0a => {
1380
0
                let dst = self.read_var_u32()?;
1381
0
                let src = self.read_var_u32()?;
1382
0
                visitor.visit_memory_copy(dst, src)
1383
            }
1384
            0x0b => {
1385
5
                let mem = self.read_var_u32()?;
1386
5
                visitor.visit_memory_fill(mem)
1387
            }
1388
            0x0c => {
1389
3
                let segment = self.read_var_u32()?;
1390
3
                let table = self.read_var_u32()?;
1391
3
                visitor.visit_table_init(segment, table)
1392
            }
1393
            0x0d => {
1394
33.0k
                let segment = self.read_var_u32()?;
1395
33.0k
                visitor.visit_elem_drop(segment)
1396
            }
1397
            0x0e => {
1398
5
                let dst_table = self.read_var_u32()?;
1399
5
                let src_table = self.read_var_u32()?;
1400
5
                visitor.visit_table_copy(dst_table, src_table)
1401
            }
1402
1403
            0x0f => {
1404
310
                let table = self.read_var_u32()?;
1405
310
                visitor.visit_table_grow(table)
1406
            }
1407
            0x10 => {
1408
14.8k
                let table = self.read_var_u32()?;
1409
14.8k
                visitor.visit_table_size(table)
1410
            }
1411
1412
            0x11 => {
1413
0
                let table = self.read_var_u32()?;
1414
0
                visitor.visit_table_fill(table)
1415
            }
1416
1417
            0x12 => {
1418
0
                let mem = self.read_var_u32()?;
1419
0
                visitor.visit_memory_discard(mem)
1420
            }
1421
1422
2
            0x13 => visitor.visit_i64_add128(),
1423
0
            0x14 => visitor.visit_i64_sub128(),
1424
930
            0x15 => visitor.visit_i64_mul_wide_s(),
1425
1.81k
            0x16 => visitor.visit_i64_mul_wide_u(),
1426
1427
0
            _ => bail!(pos, "unknown 0xfc subopcode: 0x{code:x}"),
1428
        })
1429
85.2k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfc_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
1430
1431
    #[cfg(feature = "simd")]
1432
605k
    pub(super) fn visit_0xfd_operator<T>(
1433
605k
        &mut self,
1434
605k
        pos: u64,
1435
605k
        visitor: &mut T,
1436
605k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1437
605k
    where
1438
605k
        T: VisitSimdOperator<'a>,
1439
    {
1440
605k
        let code = self.read_var_u32()?;
1441
605k
        Ok(match code {
1442
686
            0x00 => visitor.visit_v128_load(self.read_memarg(4)?),
1443
255
            0x01 => visitor.visit_v128_load8x8_s(self.read_memarg(3)?),
1444
658
            0x02 => visitor.visit_v128_load8x8_u(self.read_memarg(3)?),
1445
390
            0x03 => visitor.visit_v128_load16x4_s(self.read_memarg(3)?),
1446
974
            0x04 => visitor.visit_v128_load16x4_u(self.read_memarg(3)?),
1447
778
            0x05 => visitor.visit_v128_load32x2_s(self.read_memarg(3)?),
1448
451
            0x06 => visitor.visit_v128_load32x2_u(self.read_memarg(3)?),
1449
361
            0x07 => visitor.visit_v128_load8_splat(self.read_memarg(0)?),
1450
614
            0x08 => visitor.visit_v128_load16_splat(self.read_memarg(1)?),
1451
738
            0x09 => visitor.visit_v128_load32_splat(self.read_memarg(2)?),
1452
733
            0x0a => visitor.visit_v128_load64_splat(self.read_memarg(3)?),
1453
1454
50
            0x0b => visitor.visit_v128_store(self.read_memarg(4)?),
1455
204k
            0x0c => visitor.visit_v128_const(self.read_v128()?),
1456
            0x0d => {
1457
3
                let mut lanes: [u8; 16] = [0; 16];
1458
48
                for lane in &mut lanes {
1459
48
                    *lane = self.read_lane_index()?
1460
                }
1461
3
                visitor.visit_i8x16_shuffle(lanes)
1462
            }
1463
1464
5
            0x0e => visitor.visit_i8x16_swizzle(),
1465
3.41k
            0x0f => visitor.visit_i8x16_splat(),
1466
3.16k
            0x10 => visitor.visit_i16x8_splat(),
1467
3.83k
            0x11 => visitor.visit_i32x4_splat(),
1468
2.31k
            0x12 => visitor.visit_i64x2_splat(),
1469
176
            0x13 => visitor.visit_f32x4_splat(),
1470
140
            0x14 => visitor.visit_f64x2_splat(),
1471
1472
1.72k
            0x15 => visitor.visit_i8x16_extract_lane_s(self.read_lane_index()?),
1473
2.16k
            0x16 => visitor.visit_i8x16_extract_lane_u(self.read_lane_index()?),
1474
247
            0x17 => visitor.visit_i8x16_replace_lane(self.read_lane_index()?),
1475
3.06k
            0x18 => visitor.visit_i16x8_extract_lane_s(self.read_lane_index()?),
1476
750
            0x19 => visitor.visit_i16x8_extract_lane_u(self.read_lane_index()?),
1477
44
            0x1a => visitor.visit_i16x8_replace_lane(self.read_lane_index()?),
1478
1.25k
            0x1b => visitor.visit_i32x4_extract_lane(self.read_lane_index()?),
1479
1480
105
            0x1c => visitor.visit_i32x4_replace_lane(self.read_lane_index()?),
1481
1.20k
            0x1d => visitor.visit_i64x2_extract_lane(self.read_lane_index()?),
1482
535
            0x1e => visitor.visit_i64x2_replace_lane(self.read_lane_index()?),
1483
238
            0x1f => visitor.visit_f32x4_extract_lane(self.read_lane_index()?),
1484
4
            0x20 => visitor.visit_f32x4_replace_lane(self.read_lane_index()?),
1485
71
            0x21 => visitor.visit_f64x2_extract_lane(self.read_lane_index()?),
1486
37
            0x22 => visitor.visit_f64x2_replace_lane(self.read_lane_index()?),
1487
1488
19
            0x23 => visitor.visit_i8x16_eq(),
1489
23
            0x24 => visitor.visit_i8x16_ne(),
1490
12
            0x25 => visitor.visit_i8x16_lt_s(),
1491
3
            0x26 => visitor.visit_i8x16_lt_u(),
1492
22
            0x27 => visitor.visit_i8x16_gt_s(),
1493
4
            0x28 => visitor.visit_i8x16_gt_u(),
1494
40
            0x29 => visitor.visit_i8x16_le_s(),
1495
4
            0x2a => visitor.visit_i8x16_le_u(),
1496
23
            0x2b => visitor.visit_i8x16_ge_s(),
1497
22
            0x2c => visitor.visit_i8x16_ge_u(),
1498
53
            0x2d => visitor.visit_i16x8_eq(),
1499
70
            0x2e => visitor.visit_i16x8_ne(),
1500
26
            0x2f => visitor.visit_i16x8_lt_s(),
1501
5
            0x30 => visitor.visit_i16x8_lt_u(),
1502
14
            0x31 => visitor.visit_i16x8_gt_s(),
1503
9
            0x32 => visitor.visit_i16x8_gt_u(),
1504
7
            0x33 => visitor.visit_i16x8_le_s(),
1505
21
            0x34 => visitor.visit_i16x8_le_u(),
1506
8
            0x35 => visitor.visit_i16x8_ge_s(),
1507
4
            0x36 => visitor.visit_i16x8_ge_u(),
1508
38
            0x37 => visitor.visit_i32x4_eq(),
1509
44
            0x38 => visitor.visit_i32x4_ne(),
1510
17
            0x39 => visitor.visit_i32x4_lt_s(),
1511
12
            0x3a => visitor.visit_i32x4_lt_u(),
1512
6
            0x3b => visitor.visit_i32x4_gt_s(),
1513
52
            0x3c => visitor.visit_i32x4_gt_u(),
1514
17
            0x3d => visitor.visit_i32x4_le_s(),
1515
7
            0x3e => visitor.visit_i32x4_le_u(),
1516
27
            0x3f => visitor.visit_i32x4_ge_s(),
1517
7
            0x40 => visitor.visit_i32x4_ge_u(),
1518
3.32k
            0x41 => visitor.visit_f32x4_eq(),
1519
44
            0x42 => visitor.visit_f32x4_ne(),
1520
63
            0x43 => visitor.visit_f32x4_lt(),
1521
11
            0x44 => visitor.visit_f32x4_gt(),
1522
4
            0x45 => visitor.visit_f32x4_le(),
1523
0
            0x46 => visitor.visit_f32x4_ge(),
1524
2.91k
            0x47 => visitor.visit_f64x2_eq(),
1525
4
            0x48 => visitor.visit_f64x2_ne(),
1526
0
            0x49 => visitor.visit_f64x2_lt(),
1527
8
            0x4a => visitor.visit_f64x2_gt(),
1528
12
            0x4b => visitor.visit_f64x2_le(),
1529
0
            0x4c => visitor.visit_f64x2_ge(),
1530
1.71k
            0x4d => visitor.visit_v128_not(),
1531
41
            0x4e => visitor.visit_v128_and(),
1532
25
            0x4f => visitor.visit_v128_andnot(),
1533
7
            0x50 => visitor.visit_v128_or(),
1534
139k
            0x51 => visitor.visit_v128_xor(),
1535
6.23k
            0x52 => visitor.visit_v128_bitselect(),
1536
13
            0x53 => visitor.visit_v128_any_true(),
1537
1538
            0x54 => {
1539
46
                let memarg = self.read_memarg(0)?;
1540
46
                let lane = self.read_lane_index()?;
1541
46
                visitor.visit_v128_load8_lane(memarg, lane)
1542
            }
1543
            0x55 => {
1544
72
                let memarg = self.read_memarg(1)?;
1545
72
                let lane = self.read_lane_index()?;
1546
72
                visitor.visit_v128_load16_lane(memarg, lane)
1547
            }
1548
            0x56 => {
1549
129
                let memarg = self.read_memarg(2)?;
1550
129
                let lane = self.read_lane_index()?;
1551
129
                visitor.visit_v128_load32_lane(memarg, lane)
1552
            }
1553
            0x57 => {
1554
103
                let memarg = self.read_memarg(3)?;
1555
103
                let lane = self.read_lane_index()?;
1556
103
                visitor.visit_v128_load64_lane(memarg, lane)
1557
            }
1558
            0x58 => {
1559
73
                let memarg = self.read_memarg(0)?;
1560
73
                let lane = self.read_lane_index()?;
1561
73
                visitor.visit_v128_store8_lane(memarg, lane)
1562
            }
1563
            0x59 => {
1564
8
                let memarg = self.read_memarg(1)?;
1565
8
                let lane = self.read_lane_index()?;
1566
8
                visitor.visit_v128_store16_lane(memarg, lane)
1567
            }
1568
            0x5a => {
1569
5
                let memarg = self.read_memarg(2)?;
1570
5
                let lane = self.read_lane_index()?;
1571
5
                visitor.visit_v128_store32_lane(memarg, lane)
1572
            }
1573
            0x5b => {
1574
26
                let memarg = self.read_memarg(3)?;
1575
26
                let lane = self.read_lane_index()?;
1576
26
                visitor.visit_v128_store64_lane(memarg, lane)
1577
            }
1578
1579
2.12k
            0x5c => visitor.visit_v128_load32_zero(self.read_memarg(2)?),
1580
658
            0x5d => visitor.visit_v128_load64_zero(self.read_memarg(3)?),
1581
769
            0x5e => visitor.visit_f32x4_demote_f64x2_zero(),
1582
1.35k
            0x5f => visitor.visit_f64x2_promote_low_f32x4(),
1583
2.12k
            0x60 => visitor.visit_i8x16_abs(),
1584
1.67k
            0x61 => visitor.visit_i8x16_neg(),
1585
2.26k
            0x62 => visitor.visit_i8x16_popcnt(),
1586
1.98k
            0x63 => visitor.visit_i8x16_all_true(),
1587
857
            0x64 => visitor.visit_i8x16_bitmask(),
1588
13
            0x65 => visitor.visit_i8x16_narrow_i16x8_s(),
1589
4
            0x66 => visitor.visit_i8x16_narrow_i16x8_u(),
1590
1.06k
            0x67 => visitor.visit_f32x4_ceil(),
1591
799
            0x68 => visitor.visit_f32x4_floor(),
1592
905
            0x69 => visitor.visit_f32x4_trunc(),
1593
258
            0x6a => visitor.visit_f32x4_nearest(),
1594
129
            0x6b => visitor.visit_i8x16_shl(),
1595
282
            0x6c => visitor.visit_i8x16_shr_s(),
1596
51
            0x6d => visitor.visit_i8x16_shr_u(),
1597
15
            0x6e => visitor.visit_i8x16_add(),
1598
20
            0x6f => visitor.visit_i8x16_add_sat_s(),
1599
36
            0x70 => visitor.visit_i8x16_add_sat_u(),
1600
69
            0x71 => visitor.visit_i8x16_sub(),
1601
20
            0x72 => visitor.visit_i8x16_sub_sat_s(),
1602
3
            0x73 => visitor.visit_i8x16_sub_sat_u(),
1603
484
            0x74 => visitor.visit_f64x2_ceil(),
1604
981
            0x75 => visitor.visit_f64x2_floor(),
1605
39
            0x76 => visitor.visit_i8x16_min_s(),
1606
1
            0x77 => visitor.visit_i8x16_min_u(),
1607
16
            0x78 => visitor.visit_i8x16_max_s(),
1608
4
            0x79 => visitor.visit_i8x16_max_u(),
1609
266
            0x7a => visitor.visit_f64x2_trunc(),
1610
27
            0x7b => visitor.visit_i8x16_avgr_u(),
1611
1.39k
            0x7c => visitor.visit_i16x8_extadd_pairwise_i8x16_s(),
1612
2.69k
            0x7d => visitor.visit_i16x8_extadd_pairwise_i8x16_u(),
1613
1.95k
            0x7e => visitor.visit_i32x4_extadd_pairwise_i16x8_s(),
1614
1.10k
            0x7f => visitor.visit_i32x4_extadd_pairwise_i16x8_u(),
1615
1.69k
            0x80 => visitor.visit_i16x8_abs(),
1616
1.93k
            0x81 => visitor.visit_i16x8_neg(),
1617
8
            0x82 => visitor.visit_i16x8_q15mulr_sat_s(),
1618
759
            0x83 => visitor.visit_i16x8_all_true(),
1619
807
            0x84 => visitor.visit_i16x8_bitmask(),
1620
0
            0x85 => visitor.visit_i16x8_narrow_i32x4_s(),
1621
13
            0x86 => visitor.visit_i16x8_narrow_i32x4_u(),
1622
2.76k
            0x87 => visitor.visit_i16x8_extend_low_i8x16_s(),
1623
9.02k
            0x88 => visitor.visit_i16x8_extend_high_i8x16_s(),
1624
17.1k
            0x89 => visitor.visit_i16x8_extend_low_i8x16_u(),
1625
1.74k
            0x8a => visitor.visit_i16x8_extend_high_i8x16_u(),
1626
47
            0x8b => visitor.visit_i16x8_shl(),
1627
302
            0x8c => visitor.visit_i16x8_shr_s(),
1628
29
            0x8d => visitor.visit_i16x8_shr_u(),
1629
1
            0x8e => visitor.visit_i16x8_add(),
1630
21
            0x8f => visitor.visit_i16x8_add_sat_s(),
1631
0
            0x90 => visitor.visit_i16x8_add_sat_u(),
1632
36
            0x91 => visitor.visit_i16x8_sub(),
1633
7
            0x92 => visitor.visit_i16x8_sub_sat_s(),
1634
5
            0x93 => visitor.visit_i16x8_sub_sat_u(),
1635
430
            0x94 => visitor.visit_f64x2_nearest(),
1636
8
            0x95 => visitor.visit_i16x8_mul(),
1637
10
            0x96 => visitor.visit_i16x8_min_s(),
1638
63
            0x97 => visitor.visit_i16x8_min_u(),
1639
67
            0x98 => visitor.visit_i16x8_max_s(),
1640
27
            0x99 => visitor.visit_i16x8_max_u(),
1641
24
            0x9b => visitor.visit_i16x8_avgr_u(),
1642
56
            0x9c => visitor.visit_i16x8_extmul_low_i8x16_s(),
1643
20
            0x9d => visitor.visit_i16x8_extmul_high_i8x16_s(),
1644
17
            0x9e => visitor.visit_i16x8_extmul_low_i8x16_u(),
1645
21
            0x9f => visitor.visit_i16x8_extmul_high_i8x16_u(),
1646
3.26k
            0xa0 => visitor.visit_i32x4_abs(),
1647
2.40k
            0xa1 => visitor.visit_i32x4_neg(),
1648
725
            0xa3 => visitor.visit_i32x4_all_true(),
1649
362
            0xa4 => visitor.visit_i32x4_bitmask(),
1650
2.07k
            0xa7 => visitor.visit_i32x4_extend_low_i16x8_s(),
1651
5.68k
            0xa8 => visitor.visit_i32x4_extend_high_i16x8_s(),
1652
1.63k
            0xa9 => visitor.visit_i32x4_extend_low_i16x8_u(),
1653
5.95k
            0xaa => visitor.visit_i32x4_extend_high_i16x8_u(),
1654
39
            0xab => visitor.visit_i32x4_shl(),
1655
78
            0xac => visitor.visit_i32x4_shr_s(),
1656
46
            0xad => visitor.visit_i32x4_shr_u(),
1657
53
            0xae => visitor.visit_i32x4_add(),
1658
0
            0xb1 => visitor.visit_i32x4_sub(),
1659
9
            0xb5 => visitor.visit_i32x4_mul(),
1660
105
            0xb6 => visitor.visit_i32x4_min_s(),
1661
26
            0xb7 => visitor.visit_i32x4_min_u(),
1662
4
            0xb8 => visitor.visit_i32x4_max_s(),
1663
9
            0xb9 => visitor.visit_i32x4_max_u(),
1664
7
            0xba => visitor.visit_i32x4_dot_i16x8_s(),
1665
34
            0xbc => visitor.visit_i32x4_extmul_low_i16x8_s(),
1666
61
            0xbd => visitor.visit_i32x4_extmul_high_i16x8_s(),
1667
21
            0xbe => visitor.visit_i32x4_extmul_low_i16x8_u(),
1668
4
            0xbf => visitor.visit_i32x4_extmul_high_i16x8_u(),
1669
8.96k
            0xc0 => visitor.visit_i64x2_abs(),
1670
11.3k
            0xc1 => visitor.visit_i64x2_neg(),
1671
4.99k
            0xc3 => visitor.visit_i64x2_all_true(),
1672
987
            0xc4 => visitor.visit_i64x2_bitmask(),
1673
9.19k
            0xc7 => visitor.visit_i64x2_extend_low_i32x4_s(),
1674
11.2k
            0xc8 => visitor.visit_i64x2_extend_high_i32x4_s(),
1675
35.9k
            0xc9 => visitor.visit_i64x2_extend_low_i32x4_u(),
1676
38.4k
            0xca => visitor.visit_i64x2_extend_high_i32x4_u(),
1677
45
            0xcb => visitor.visit_i64x2_shl(),
1678
33
            0xcc => visitor.visit_i64x2_shr_s(),
1679
1
            0xcd => visitor.visit_i64x2_shr_u(),
1680
76
            0xce => visitor.visit_i64x2_add(),
1681
78
            0xd1 => visitor.visit_i64x2_sub(),
1682
15
            0xd5 => visitor.visit_i64x2_mul(),
1683
10
            0xd6 => visitor.visit_i64x2_eq(),
1684
49
            0xd7 => visitor.visit_i64x2_ne(),
1685
25
            0xd8 => visitor.visit_i64x2_lt_s(),
1686
0
            0xd9 => visitor.visit_i64x2_gt_s(),
1687
4
            0xda => visitor.visit_i64x2_le_s(),
1688
97
            0xdb => visitor.visit_i64x2_ge_s(),
1689
140
            0xdc => visitor.visit_i64x2_extmul_low_i32x4_s(),
1690
487
            0xdd => visitor.visit_i64x2_extmul_high_i32x4_s(),
1691
64
            0xde => visitor.visit_i64x2_extmul_low_i32x4_u(),
1692
16
            0xdf => visitor.visit_i64x2_extmul_high_i32x4_u(),
1693
359
            0xe0 => visitor.visit_f32x4_abs(),
1694
291
            0xe1 => visitor.visit_f32x4_neg(),
1695
293
            0xe3 => visitor.visit_f32x4_sqrt(),
1696
12
            0xe4 => visitor.visit_f32x4_add(),
1697
0
            0xe5 => visitor.visit_f32x4_sub(),
1698
0
            0xe6 => visitor.visit_f32x4_mul(),
1699
8
            0xe7 => visitor.visit_f32x4_div(),
1700
11
            0xe8 => visitor.visit_f32x4_min(),
1701
4
            0xe9 => visitor.visit_f32x4_max(),
1702
44
            0xea => visitor.visit_f32x4_pmin(),
1703
4
            0xeb => visitor.visit_f32x4_pmax(),
1704
107
            0xec => visitor.visit_f64x2_abs(),
1705
163
            0xed => visitor.visit_f64x2_neg(),
1706
629
            0xef => visitor.visit_f64x2_sqrt(),
1707
0
            0xf0 => visitor.visit_f64x2_add(),
1708
0
            0xf1 => visitor.visit_f64x2_sub(),
1709
95
            0xf2 => visitor.visit_f64x2_mul(),
1710
0
            0xf3 => visitor.visit_f64x2_div(),
1711
4
            0xf4 => visitor.visit_f64x2_min(),
1712
80
            0xf5 => visitor.visit_f64x2_max(),
1713
0
            0xf6 => visitor.visit_f64x2_pmin(),
1714
8
            0xf7 => visitor.visit_f64x2_pmax(),
1715
292
            0xf8 => visitor.visit_i32x4_trunc_sat_f32x4_s(),
1716
1.09k
            0xf9 => visitor.visit_i32x4_trunc_sat_f32x4_u(),
1717
285
            0xfa => visitor.visit_f32x4_convert_i32x4_s(),
1718
667
            0xfb => visitor.visit_f32x4_convert_i32x4_u(),
1719
112
            0xfc => visitor.visit_i32x4_trunc_sat_f64x2_s_zero(),
1720
248
            0xfd => visitor.visit_i32x4_trunc_sat_f64x2_u_zero(),
1721
303
            0xfe => visitor.visit_f64x2_convert_low_i32x4_s(),
1722
312
            0xff => visitor.visit_f64x2_convert_low_i32x4_u(),
1723
10
            0x100 => visitor.visit_i8x16_relaxed_swizzle(),
1724
160
            0x101 => visitor.visit_i32x4_relaxed_trunc_f32x4_s(),
1725
4
            0x102 => visitor.visit_i32x4_relaxed_trunc_f32x4_u(),
1726
23
            0x103 => visitor.visit_i32x4_relaxed_trunc_f64x2_s_zero(),
1727
63
            0x104 => visitor.visit_i32x4_relaxed_trunc_f64x2_u_zero(),
1728
0
            0x105 => visitor.visit_f32x4_relaxed_madd(),
1729
0
            0x106 => visitor.visit_f32x4_relaxed_nmadd(),
1730
0
            0x107 => visitor.visit_f64x2_relaxed_madd(),
1731
0
            0x108 => visitor.visit_f64x2_relaxed_nmadd(),
1732
11
            0x109 => visitor.visit_i8x16_relaxed_laneselect(),
1733
0
            0x10a => visitor.visit_i16x8_relaxed_laneselect(),
1734
0
            0x10b => visitor.visit_i32x4_relaxed_laneselect(),
1735
0
            0x10c => visitor.visit_i64x2_relaxed_laneselect(),
1736
0
            0x10d => visitor.visit_f32x4_relaxed_min(),
1737
0
            0x10e => visitor.visit_f32x4_relaxed_max(),
1738
0
            0x10f => visitor.visit_f64x2_relaxed_min(),
1739
4
            0x110 => visitor.visit_f64x2_relaxed_max(),
1740
9
            0x111 => visitor.visit_i16x8_relaxed_q15mulr_s(),
1741
0
            0x112 => visitor.visit_i16x8_relaxed_dot_i8x16_i7x16_s(),
1742
0
            0x113 => visitor.visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(),
1743
1744
0
            _ => bail!(pos, "unknown 0xfd subopcode: 0x{code:x}"),
1745
        })
1746
605k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfd_operator::<&mut dyn wasmparser::readers::core::operators::VisitSimdOperator<Output = core::result::Result<(), anyhow::Error>>>
Line
Count
Source
1432
163k
    pub(super) fn visit_0xfd_operator<T>(
1433
163k
        &mut self,
1434
163k
        pos: u64,
1435
163k
        visitor: &mut T,
1436
163k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1437
163k
    where
1438
163k
        T: VisitSimdOperator<'a>,
1439
    {
1440
163k
        let code = self.read_var_u32()?;
1441
163k
        Ok(match code {
1442
238
            0x00 => visitor.visit_v128_load(self.read_memarg(4)?),
1443
80
            0x01 => visitor.visit_v128_load8x8_s(self.read_memarg(3)?),
1444
86
            0x02 => visitor.visit_v128_load8x8_u(self.read_memarg(3)?),
1445
76
            0x03 => visitor.visit_v128_load16x4_s(self.read_memarg(3)?),
1446
274
            0x04 => visitor.visit_v128_load16x4_u(self.read_memarg(3)?),
1447
282
            0x05 => visitor.visit_v128_load32x2_s(self.read_memarg(3)?),
1448
100
            0x06 => visitor.visit_v128_load32x2_u(self.read_memarg(3)?),
1449
104
            0x07 => visitor.visit_v128_load8_splat(self.read_memarg(0)?),
1450
142
            0x08 => visitor.visit_v128_load16_splat(self.read_memarg(1)?),
1451
166
            0x09 => visitor.visit_v128_load32_splat(self.read_memarg(2)?),
1452
166
            0x0a => visitor.visit_v128_load64_splat(self.read_memarg(3)?),
1453
1454
22
            0x0b => visitor.visit_v128_store(self.read_memarg(4)?),
1455
44.1k
            0x0c => visitor.visit_v128_const(self.read_v128()?),
1456
            0x0d => {
1457
0
                let mut lanes: [u8; 16] = [0; 16];
1458
0
                for lane in &mut lanes {
1459
0
                    *lane = self.read_lane_index()?
1460
                }
1461
0
                visitor.visit_i8x16_shuffle(lanes)
1462
            }
1463
1464
0
            0x0e => visitor.visit_i8x16_swizzle(),
1465
1.22k
            0x0f => visitor.visit_i8x16_splat(),
1466
1.30k
            0x10 => visitor.visit_i16x8_splat(),
1467
1.78k
            0x11 => visitor.visit_i32x4_splat(),
1468
720
            0x12 => visitor.visit_i64x2_splat(),
1469
28
            0x13 => visitor.visit_f32x4_splat(),
1470
36
            0x14 => visitor.visit_f64x2_splat(),
1471
1472
524
            0x15 => visitor.visit_i8x16_extract_lane_s(self.read_lane_index()?),
1473
852
            0x16 => visitor.visit_i8x16_extract_lane_u(self.read_lane_index()?),
1474
112
            0x17 => visitor.visit_i8x16_replace_lane(self.read_lane_index()?),
1475
708
            0x18 => visitor.visit_i16x8_extract_lane_s(self.read_lane_index()?),
1476
226
            0x19 => visitor.visit_i16x8_extract_lane_u(self.read_lane_index()?),
1477
18
            0x1a => visitor.visit_i16x8_replace_lane(self.read_lane_index()?),
1478
252
            0x1b => visitor.visit_i32x4_extract_lane(self.read_lane_index()?),
1479
1480
50
            0x1c => visitor.visit_i32x4_replace_lane(self.read_lane_index()?),
1481
419
            0x1d => visitor.visit_i64x2_extract_lane(self.read_lane_index()?),
1482
28
            0x1e => visitor.visit_i64x2_replace_lane(self.read_lane_index()?),
1483
94
            0x1f => visitor.visit_f32x4_extract_lane(self.read_lane_index()?),
1484
2
            0x20 => visitor.visit_f32x4_replace_lane(self.read_lane_index()?),
1485
34
            0x21 => visitor.visit_f64x2_extract_lane(self.read_lane_index()?),
1486
0
            0x22 => visitor.visit_f64x2_replace_lane(self.read_lane_index()?),
1487
1488
8
            0x23 => visitor.visit_i8x16_eq(),
1489
10
            0x24 => visitor.visit_i8x16_ne(),
1490
6
            0x25 => visitor.visit_i8x16_lt_s(),
1491
0
            0x26 => visitor.visit_i8x16_lt_u(),
1492
2
            0x27 => visitor.visit_i8x16_gt_s(),
1493
2
            0x28 => visitor.visit_i8x16_gt_u(),
1494
4
            0x29 => visitor.visit_i8x16_le_s(),
1495
2
            0x2a => visitor.visit_i8x16_le_u(),
1496
8
            0x2b => visitor.visit_i8x16_ge_s(),
1497
6
            0x2c => visitor.visit_i8x16_ge_u(),
1498
10
            0x2d => visitor.visit_i16x8_eq(),
1499
0
            0x2e => visitor.visit_i16x8_ne(),
1500
2
            0x2f => visitor.visit_i16x8_lt_s(),
1501
0
            0x30 => visitor.visit_i16x8_lt_u(),
1502
2
            0x31 => visitor.visit_i16x8_gt_s(),
1503
4
            0x32 => visitor.visit_i16x8_gt_u(),
1504
2
            0x33 => visitor.visit_i16x8_le_s(),
1505
4
            0x34 => visitor.visit_i16x8_le_u(),
1506
2
            0x35 => visitor.visit_i16x8_ge_s(),
1507
2
            0x36 => visitor.visit_i16x8_ge_u(),
1508
8
            0x37 => visitor.visit_i32x4_eq(),
1509
12
            0x38 => visitor.visit_i32x4_ne(),
1510
8
            0x39 => visitor.visit_i32x4_lt_s(),
1511
0
            0x3a => visitor.visit_i32x4_lt_u(),
1512
2
            0x3b => visitor.visit_i32x4_gt_s(),
1513
18
            0x3c => visitor.visit_i32x4_gt_u(),
1514
6
            0x3d => visitor.visit_i32x4_le_s(),
1515
0
            0x3e => visitor.visit_i32x4_le_u(),
1516
2
            0x3f => visitor.visit_i32x4_ge_s(),
1517
0
            0x40 => visitor.visit_i32x4_ge_u(),
1518
1.51k
            0x41 => visitor.visit_f32x4_eq(),
1519
22
            0x42 => visitor.visit_f32x4_ne(),
1520
26
            0x43 => visitor.visit_f32x4_lt(),
1521
0
            0x44 => visitor.visit_f32x4_gt(),
1522
2
            0x45 => visitor.visit_f32x4_le(),
1523
0
            0x46 => visitor.visit_f32x4_ge(),
1524
1.34k
            0x47 => visitor.visit_f64x2_eq(),
1525
2
            0x48 => visitor.visit_f64x2_ne(),
1526
0
            0x49 => visitor.visit_f64x2_lt(),
1527
4
            0x4a => visitor.visit_f64x2_gt(),
1528
6
            0x4b => visitor.visit_f64x2_le(),
1529
0
            0x4c => visitor.visit_f64x2_ge(),
1530
519
            0x4d => visitor.visit_v128_not(),
1531
0
            0x4e => visitor.visit_v128_and(),
1532
4
            0x4f => visitor.visit_v128_andnot(),
1533
0
            0x50 => visitor.visit_v128_or(),
1534
30.5k
            0x51 => visitor.visit_v128_xor(),
1535
2.85k
            0x52 => visitor.visit_v128_bitselect(),
1536
0
            0x53 => visitor.visit_v128_any_true(),
1537
1538
            0x54 => {
1539
8
                let memarg = self.read_memarg(0)?;
1540
8
                let lane = self.read_lane_index()?;
1541
8
                visitor.visit_v128_load8_lane(memarg, lane)
1542
            }
1543
            0x55 => {
1544
22
                let memarg = self.read_memarg(1)?;
1545
22
                let lane = self.read_lane_index()?;
1546
22
                visitor.visit_v128_load16_lane(memarg, lane)
1547
            }
1548
            0x56 => {
1549
46
                let memarg = self.read_memarg(2)?;
1550
46
                let lane = self.read_lane_index()?;
1551
46
                visitor.visit_v128_load32_lane(memarg, lane)
1552
            }
1553
            0x57 => {
1554
32
                let memarg = self.read_memarg(3)?;
1555
32
                let lane = self.read_lane_index()?;
1556
32
                visitor.visit_v128_load64_lane(memarg, lane)
1557
            }
1558
            0x58 => {
1559
18
                let memarg = self.read_memarg(0)?;
1560
18
                let lane = self.read_lane_index()?;
1561
18
                visitor.visit_v128_store8_lane(memarg, lane)
1562
            }
1563
            0x59 => {
1564
2
                let memarg = self.read_memarg(1)?;
1565
2
                let lane = self.read_lane_index()?;
1566
2
                visitor.visit_v128_store16_lane(memarg, lane)
1567
            }
1568
            0x5a => {
1569
0
                let memarg = self.read_memarg(2)?;
1570
0
                let lane = self.read_lane_index()?;
1571
0
                visitor.visit_v128_store32_lane(memarg, lane)
1572
            }
1573
            0x5b => {
1574
12
                let memarg = self.read_memarg(3)?;
1575
12
                let lane = self.read_lane_index()?;
1576
12
                visitor.visit_v128_store64_lane(memarg, lane)
1577
            }
1578
1579
278
            0x5c => visitor.visit_v128_load32_zero(self.read_memarg(2)?),
1580
158
            0x5d => visitor.visit_v128_load64_zero(self.read_memarg(3)?),
1581
342
            0x5e => visitor.visit_f32x4_demote_f64x2_zero(),
1582
166
            0x5f => visitor.visit_f64x2_promote_low_f32x4(),
1583
200
            0x60 => visitor.visit_i8x16_abs(),
1584
498
            0x61 => visitor.visit_i8x16_neg(),
1585
704
            0x62 => visitor.visit_i8x16_popcnt(),
1586
288
            0x63 => visitor.visit_i8x16_all_true(),
1587
166
            0x64 => visitor.visit_i8x16_bitmask(),
1588
0
            0x65 => visitor.visit_i8x16_narrow_i16x8_s(),
1589
2
            0x66 => visitor.visit_i8x16_narrow_i16x8_u(),
1590
480
            0x67 => visitor.visit_f32x4_ceil(),
1591
344
            0x68 => visitor.visit_f32x4_floor(),
1592
434
            0x69 => visitor.visit_f32x4_trunc(),
1593
112
            0x6a => visitor.visit_f32x4_nearest(),
1594
48
            0x6b => visitor.visit_i8x16_shl(),
1595
106
            0x6c => visitor.visit_i8x16_shr_s(),
1596
10
            0x6d => visitor.visit_i8x16_shr_u(),
1597
0
            0x6e => visitor.visit_i8x16_add(),
1598
4
            0x6f => visitor.visit_i8x16_add_sat_s(),
1599
8
            0x70 => visitor.visit_i8x16_add_sat_u(),
1600
4
            0x71 => visitor.visit_i8x16_sub(),
1601
2
            0x72 => visitor.visit_i8x16_sub_sat_s(),
1602
0
            0x73 => visitor.visit_i8x16_sub_sat_u(),
1603
234
            0x74 => visitor.visit_f64x2_ceil(),
1604
454
            0x75 => visitor.visit_f64x2_floor(),
1605
16
            0x76 => visitor.visit_i8x16_min_s(),
1606
0
            0x77 => visitor.visit_i8x16_min_u(),
1607
6
            0x78 => visitor.visit_i8x16_max_s(),
1608
2
            0x79 => visitor.visit_i8x16_max_u(),
1609
102
            0x7a => visitor.visit_f64x2_trunc(),
1610
2
            0x7b => visitor.visit_i8x16_avgr_u(),
1611
344
            0x7c => visitor.visit_i16x8_extadd_pairwise_i8x16_s(),
1612
1.12k
            0x7d => visitor.visit_i16x8_extadd_pairwise_i8x16_u(),
1613
537
            0x7e => visitor.visit_i32x4_extadd_pairwise_i16x8_s(),
1614
130
            0x7f => visitor.visit_i32x4_extadd_pairwise_i16x8_u(),
1615
670
            0x80 => visitor.visit_i16x8_abs(),
1616
810
            0x81 => visitor.visit_i16x8_neg(),
1617
4
            0x82 => visitor.visit_i16x8_q15mulr_sat_s(),
1618
232
            0x83 => visitor.visit_i16x8_all_true(),
1619
198
            0x84 => visitor.visit_i16x8_bitmask(),
1620
0
            0x85 => visitor.visit_i16x8_narrow_i32x4_s(),
1621
2
            0x86 => visitor.visit_i16x8_narrow_i32x4_u(),
1622
403
            0x87 => visitor.visit_i16x8_extend_low_i8x16_s(),
1623
614
            0x88 => visitor.visit_i16x8_extend_high_i8x16_s(),
1624
698
            0x89 => visitor.visit_i16x8_extend_low_i8x16_u(),
1625
464
            0x8a => visitor.visit_i16x8_extend_high_i8x16_u(),
1626
10
            0x8b => visitor.visit_i16x8_shl(),
1627
62
            0x8c => visitor.visit_i16x8_shr_s(),
1628
2
            0x8d => visitor.visit_i16x8_shr_u(),
1629
0
            0x8e => visitor.visit_i16x8_add(),
1630
10
            0x8f => visitor.visit_i16x8_add_sat_s(),
1631
0
            0x90 => visitor.visit_i16x8_add_sat_u(),
1632
14
            0x91 => visitor.visit_i16x8_sub(),
1633
2
            0x92 => visitor.visit_i16x8_sub_sat_s(),
1634
0
            0x93 => visitor.visit_i16x8_sub_sat_u(),
1635
188
            0x94 => visitor.visit_f64x2_nearest(),
1636
4
            0x95 => visitor.visit_i16x8_mul(),
1637
0
            0x96 => visitor.visit_i16x8_min_s(),
1638
26
            0x97 => visitor.visit_i16x8_min_u(),
1639
2
            0x98 => visitor.visit_i16x8_max_s(),
1640
12
            0x99 => visitor.visit_i16x8_max_u(),
1641
4
            0x9b => visitor.visit_i16x8_avgr_u(),
1642
6
            0x9c => visitor.visit_i16x8_extmul_low_i8x16_s(),
1643
2
            0x9d => visitor.visit_i16x8_extmul_high_i8x16_s(),
1644
4
            0x9e => visitor.visit_i16x8_extmul_low_i8x16_u(),
1645
8
            0x9f => visitor.visit_i16x8_extmul_high_i8x16_u(),
1646
1.14k
            0xa0 => visitor.visit_i32x4_abs(),
1647
466
            0xa1 => visitor.visit_i32x4_neg(),
1648
292
            0xa3 => visitor.visit_i32x4_all_true(),
1649
126
            0xa4 => visitor.visit_i32x4_bitmask(),
1650
539
            0xa7 => visitor.visit_i32x4_extend_low_i16x8_s(),
1651
2.59k
            0xa8 => visitor.visit_i32x4_extend_high_i16x8_s(),
1652
418
            0xa9 => visitor.visit_i32x4_extend_low_i16x8_u(),
1653
1.48k
            0xaa => visitor.visit_i32x4_extend_high_i16x8_u(),
1654
4
            0xab => visitor.visit_i32x4_shl(),
1655
14
            0xac => visitor.visit_i32x4_shr_s(),
1656
2
            0xad => visitor.visit_i32x4_shr_u(),
1657
20
            0xae => visitor.visit_i32x4_add(),
1658
0
            0xb1 => visitor.visit_i32x4_sub(),
1659
2
            0xb5 => visitor.visit_i32x4_mul(),
1660
4
            0xb6 => visitor.visit_i32x4_min_s(),
1661
12
            0xb7 => visitor.visit_i32x4_min_u(),
1662
2
            0xb8 => visitor.visit_i32x4_max_s(),
1663
4
            0xb9 => visitor.visit_i32x4_max_u(),
1664
2
            0xba => visitor.visit_i32x4_dot_i16x8_s(),
1665
16
            0xbc => visitor.visit_i32x4_extmul_low_i16x8_s(),
1666
2
            0xbd => visitor.visit_i32x4_extmul_high_i16x8_s(),
1667
10
            0xbe => visitor.visit_i32x4_extmul_low_i16x8_u(),
1668
2
            0xbf => visitor.visit_i32x4_extmul_high_i16x8_u(),
1669
2.67k
            0xc0 => visitor.visit_i64x2_abs(),
1670
3.59k
            0xc1 => visitor.visit_i64x2_neg(),
1671
1.95k
            0xc3 => visitor.visit_i64x2_all_true(),
1672
308
            0xc4 => visitor.visit_i64x2_bitmask(),
1673
2.08k
            0xc7 => visitor.visit_i64x2_extend_low_i32x4_s(),
1674
4.10k
            0xc8 => visitor.visit_i64x2_extend_high_i32x4_s(),
1675
17.5k
            0xc9 => visitor.visit_i64x2_extend_low_i32x4_u(),
1676
18.7k
            0xca => visitor.visit_i64x2_extend_high_i32x4_u(),
1677
20
            0xcb => visitor.visit_i64x2_shl(),
1678
12
            0xcc => visitor.visit_i64x2_shr_s(),
1679
0
            0xcd => visitor.visit_i64x2_shr_u(),
1680
12
            0xce => visitor.visit_i64x2_add(),
1681
14
            0xd1 => visitor.visit_i64x2_sub(),
1682
4
            0xd5 => visitor.visit_i64x2_mul(),
1683
2
            0xd6 => visitor.visit_i64x2_eq(),
1684
16
            0xd7 => visitor.visit_i64x2_ne(),
1685
2
            0xd8 => visitor.visit_i64x2_lt_s(),
1686
0
            0xd9 => visitor.visit_i64x2_gt_s(),
1687
2
            0xda => visitor.visit_i64x2_le_s(),
1688
2
            0xdb => visitor.visit_i64x2_ge_s(),
1689
70
            0xdc => visitor.visit_i64x2_extmul_low_i32x4_s(),
1690
2
            0xdd => visitor.visit_i64x2_extmul_high_i32x4_s(),
1691
32
            0xde => visitor.visit_i64x2_extmul_low_i32x4_u(),
1692
6
            0xdf => visitor.visit_i64x2_extmul_high_i32x4_u(),
1693
68
            0xe0 => visitor.visit_f32x4_abs(),
1694
128
            0xe1 => visitor.visit_f32x4_neg(),
1695
134
            0xe3 => visitor.visit_f32x4_sqrt(),
1696
6
            0xe4 => visitor.visit_f32x4_add(),
1697
0
            0xe5 => visitor.visit_f32x4_sub(),
1698
0
            0xe6 => visitor.visit_f32x4_mul(),
1699
4
            0xe7 => visitor.visit_f32x4_div(),
1700
0
            0xe8 => visitor.visit_f32x4_min(),
1701
2
            0xe9 => visitor.visit_f32x4_max(),
1702
22
            0xea => visitor.visit_f32x4_pmin(),
1703
2
            0xeb => visitor.visit_f32x4_pmax(),
1704
32
            0xec => visitor.visit_f64x2_abs(),
1705
56
            0xed => visitor.visit_f64x2_neg(),
1706
302
            0xef => visitor.visit_f64x2_sqrt(),
1707
0
            0xf0 => visitor.visit_f64x2_add(),
1708
0
            0xf1 => visitor.visit_f64x2_sub(),
1709
20
            0xf2 => visitor.visit_f64x2_mul(),
1710
0
            0xf3 => visitor.visit_f64x2_div(),
1711
2
            0xf4 => visitor.visit_f64x2_min(),
1712
40
            0xf5 => visitor.visit_f64x2_max(),
1713
0
            0xf6 => visitor.visit_f64x2_pmin(),
1714
4
            0xf7 => visitor.visit_f64x2_pmax(),
1715
126
            0xf8 => visitor.visit_i32x4_trunc_sat_f32x4_s(),
1716
266
            0xf9 => visitor.visit_i32x4_trunc_sat_f32x4_u(),
1717
128
            0xfa => visitor.visit_f32x4_convert_i32x4_s(),
1718
302
            0xfb => visitor.visit_f32x4_convert_i32x4_u(),
1719
36
            0xfc => visitor.visit_i32x4_trunc_sat_f64x2_s_zero(),
1720
108
            0xfd => visitor.visit_i32x4_trunc_sat_f64x2_u_zero(),
1721
138
            0xfe => visitor.visit_f64x2_convert_low_i32x4_s(),
1722
140
            0xff => visitor.visit_f64x2_convert_low_i32x4_u(),
1723
4
            0x100 => visitor.visit_i8x16_relaxed_swizzle(),
1724
2
            0x101 => visitor.visit_i32x4_relaxed_trunc_f32x4_s(),
1725
0
            0x102 => visitor.visit_i32x4_relaxed_trunc_f32x4_u(),
1726
8
            0x103 => visitor.visit_i32x4_relaxed_trunc_f64x2_s_zero(),
1727
20
            0x104 => visitor.visit_i32x4_relaxed_trunc_f64x2_u_zero(),
1728
0
            0x105 => visitor.visit_f32x4_relaxed_madd(),
1729
0
            0x106 => visitor.visit_f32x4_relaxed_nmadd(),
1730
0
            0x107 => visitor.visit_f64x2_relaxed_madd(),
1731
0
            0x108 => visitor.visit_f64x2_relaxed_nmadd(),
1732
0
            0x109 => visitor.visit_i8x16_relaxed_laneselect(),
1733
0
            0x10a => visitor.visit_i16x8_relaxed_laneselect(),
1734
0
            0x10b => visitor.visit_i32x4_relaxed_laneselect(),
1735
0
            0x10c => visitor.visit_i64x2_relaxed_laneselect(),
1736
0
            0x10d => visitor.visit_f32x4_relaxed_min(),
1737
0
            0x10e => visitor.visit_f32x4_relaxed_max(),
1738
0
            0x10f => visitor.visit_f64x2_relaxed_min(),
1739
0
            0x110 => visitor.visit_f64x2_relaxed_max(),
1740
2
            0x111 => visitor.visit_i16x8_relaxed_q15mulr_s(),
1741
0
            0x112 => visitor.visit_i16x8_relaxed_dot_i8x16_i7x16_s(),
1742
0
            0x113 => visitor.visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(),
1743
1744
0
            _ => bail!(pos, "unknown 0xfd subopcode: 0x{code:x}"),
1745
        })
1746
163k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfd_operator::<&mut dyn wasmparser::readers::core::operators::VisitSimdOperator<Output = ()>>
<wasmparser::binary_reader::BinaryReader>::visit_0xfd_operator::<&mut dyn wasmparser::readers::core::operators::VisitSimdOperator<Output = core::result::Result<(), wasmparser::error::Error>>>
Line
Count
Source
1432
295k
    pub(super) fn visit_0xfd_operator<T>(
1433
295k
        &mut self,
1434
295k
        pos: u64,
1435
295k
        visitor: &mut T,
1436
295k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1437
295k
    where
1438
295k
        T: VisitSimdOperator<'a>,
1439
    {
1440
295k
        let code = self.read_var_u32()?;
1441
295k
        Ok(match code {
1442
271
            0x00 => visitor.visit_v128_load(self.read_memarg(4)?),
1443
106
            0x01 => visitor.visit_v128_load8x8_s(self.read_memarg(3)?),
1444
491
            0x02 => visitor.visit_v128_load8x8_u(self.read_memarg(3)?),
1445
229
            0x03 => visitor.visit_v128_load16x4_s(self.read_memarg(3)?),
1446
198
            0x04 => visitor.visit_v128_load16x4_u(self.read_memarg(3)?),
1447
300
            0x05 => visitor.visit_v128_load32x2_s(self.read_memarg(3)?),
1448
260
            0x06 => visitor.visit_v128_load32x2_u(self.read_memarg(3)?),
1449
166
            0x07 => visitor.visit_v128_load8_splat(self.read_memarg(0)?),
1450
284
            0x08 => visitor.visit_v128_load16_splat(self.read_memarg(1)?),
1451
262
            0x09 => visitor.visit_v128_load32_splat(self.read_memarg(2)?),
1452
295
            0x0a => visitor.visit_v128_load64_splat(self.read_memarg(3)?),
1453
1454
12
            0x0b => visitor.visit_v128_store(self.read_memarg(4)?),
1455
108k
            0x0c => visitor.visit_v128_const(self.read_v128()?),
1456
            0x0d => {
1457
0
                let mut lanes: [u8; 16] = [0; 16];
1458
0
                for lane in &mut lanes {
1459
0
                    *lane = self.read_lane_index()?
1460
                }
1461
0
                visitor.visit_i8x16_shuffle(lanes)
1462
            }
1463
1464
5
            0x0e => visitor.visit_i8x16_swizzle(),
1465
1.50k
            0x0f => visitor.visit_i8x16_splat(),
1466
1.02k
            0x10 => visitor.visit_i16x8_splat(),
1467
1.09k
            0x11 => visitor.visit_i32x4_splat(),
1468
1.09k
            0x12 => visitor.visit_i64x2_splat(),
1469
112
            0x13 => visitor.visit_f32x4_splat(),
1470
79
            0x14 => visitor.visit_f64x2_splat(),
1471
1472
504
            0x15 => visitor.visit_i8x16_extract_lane_s(self.read_lane_index()?),
1473
795
            0x16 => visitor.visit_i8x16_extract_lane_u(self.read_lane_index()?),
1474
67
            0x17 => visitor.visit_i8x16_replace_lane(self.read_lane_index()?),
1475
1.79k
            0x18 => visitor.visit_i16x8_extract_lane_s(self.read_lane_index()?),
1476
345
            0x19 => visitor.visit_i16x8_extract_lane_u(self.read_lane_index()?),
1477
12
            0x1a => visitor.visit_i16x8_replace_lane(self.read_lane_index()?),
1478
760
            0x1b => visitor.visit_i32x4_extract_lane(self.read_lane_index()?),
1479
1480
26
            0x1c => visitor.visit_i32x4_replace_lane(self.read_lane_index()?),
1481
477
            0x1d => visitor.visit_i64x2_extract_lane(self.read_lane_index()?),
1482
447
            0x1e => visitor.visit_i64x2_replace_lane(self.read_lane_index()?),
1483
68
            0x1f => visitor.visit_f32x4_extract_lane(self.read_lane_index()?),
1484
1
            0x20 => visitor.visit_f32x4_replace_lane(self.read_lane_index()?),
1485
18
            0x21 => visitor.visit_f64x2_extract_lane(self.read_lane_index()?),
1486
32
            0x22 => visitor.visit_f64x2_replace_lane(self.read_lane_index()?),
1487
1488
7
            0x23 => visitor.visit_i8x16_eq(),
1489
5
            0x24 => visitor.visit_i8x16_ne(),
1490
3
            0x25 => visitor.visit_i8x16_lt_s(),
1491
2
            0x26 => visitor.visit_i8x16_lt_u(),
1492
9
            0x27 => visitor.visit_i8x16_gt_s(),
1493
1
            0x28 => visitor.visit_i8x16_gt_u(),
1494
23
            0x29 => visitor.visit_i8x16_le_s(),
1495
1
            0x2a => visitor.visit_i8x16_le_u(),
1496
11
            0x2b => visitor.visit_i8x16_ge_s(),
1497
13
            0x2c => visitor.visit_i8x16_ge_u(),
1498
5
            0x2d => visitor.visit_i16x8_eq(),
1499
70
            0x2e => visitor.visit_i16x8_ne(),
1500
21
            0x2f => visitor.visit_i16x8_lt_s(),
1501
2
            0x30 => visitor.visit_i16x8_lt_u(),
1502
11
            0x31 => visitor.visit_i16x8_gt_s(),
1503
3
            0x32 => visitor.visit_i16x8_gt_u(),
1504
3
            0x33 => visitor.visit_i16x8_le_s(),
1505
12
            0x34 => visitor.visit_i16x8_le_u(),
1506
5
            0x35 => visitor.visit_i16x8_ge_s(),
1507
1
            0x36 => visitor.visit_i16x8_ge_u(),
1508
24
            0x37 => visitor.visit_i32x4_eq(),
1509
22
            0x38 => visitor.visit_i32x4_ne(),
1510
4
            0x39 => visitor.visit_i32x4_lt_s(),
1511
11
            0x3a => visitor.visit_i32x4_lt_u(),
1512
3
            0x3b => visitor.visit_i32x4_gt_s(),
1513
10
            0x3c => visitor.visit_i32x4_gt_u(),
1514
3
            0x3d => visitor.visit_i32x4_le_s(),
1515
5
            0x3e => visitor.visit_i32x4_le_u(),
1516
14
            0x3f => visitor.visit_i32x4_ge_s(),
1517
4
            0x40 => visitor.visit_i32x4_ge_u(),
1518
992
            0x41 => visitor.visit_f32x4_eq(),
1519
11
            0x42 => visitor.visit_f32x4_ne(),
1520
23
            0x43 => visitor.visit_f32x4_lt(),
1521
10
            0x44 => visitor.visit_f32x4_gt(),
1522
1
            0x45 => visitor.visit_f32x4_le(),
1523
0
            0x46 => visitor.visit_f32x4_ge(),
1524
840
            0x47 => visitor.visit_f64x2_eq(),
1525
1
            0x48 => visitor.visit_f64x2_ne(),
1526
0
            0x49 => visitor.visit_f64x2_lt(),
1527
2
            0x4a => visitor.visit_f64x2_gt(),
1528
3
            0x4b => visitor.visit_f64x2_le(),
1529
0
            0x4c => visitor.visit_f64x2_ge(),
1530
611
            0x4d => visitor.visit_v128_not(),
1531
40
            0x4e => visitor.visit_v128_and(),
1532
14
            0x4f => visitor.visit_v128_andnot(),
1533
0
            0x50 => visitor.visit_v128_or(),
1534
85.5k
            0x51 => visitor.visit_v128_xor(),
1535
1.82k
            0x52 => visitor.visit_v128_bitselect(),
1536
12
            0x53 => visitor.visit_v128_any_true(),
1537
1538
            0x54 => {
1539
27
                let memarg = self.read_memarg(0)?;
1540
27
                let lane = self.read_lane_index()?;
1541
27
                visitor.visit_v128_load8_lane(memarg, lane)
1542
            }
1543
            0x55 => {
1544
32
                let memarg = self.read_memarg(1)?;
1545
32
                let lane = self.read_lane_index()?;
1546
32
                visitor.visit_v128_load16_lane(memarg, lane)
1547
            }
1548
            0x56 => {
1549
29
                let memarg = self.read_memarg(2)?;
1550
29
                let lane = self.read_lane_index()?;
1551
29
                visitor.visit_v128_load32_lane(memarg, lane)
1552
            }
1553
            0x57 => {
1554
51
                let memarg = self.read_memarg(3)?;
1555
51
                let lane = self.read_lane_index()?;
1556
51
                visitor.visit_v128_load64_lane(memarg, lane)
1557
            }
1558
            0x58 => {
1559
45
                let memarg = self.read_memarg(0)?;
1560
45
                let lane = self.read_lane_index()?;
1561
45
                visitor.visit_v128_store8_lane(memarg, lane)
1562
            }
1563
            0x59 => {
1564
4
                let memarg = self.read_memarg(1)?;
1565
4
                let lane = self.read_lane_index()?;
1566
4
                visitor.visit_v128_store16_lane(memarg, lane)
1567
            }
1568
            0x5a => {
1569
1
                let memarg = self.read_memarg(2)?;
1570
1
                let lane = self.read_lane_index()?;
1571
1
                visitor.visit_v128_store32_lane(memarg, lane)
1572
            }
1573
            0x5b => {
1574
6
                let memarg = self.read_memarg(3)?;
1575
6
                let lane = self.read_lane_index()?;
1576
6
                visitor.visit_v128_store64_lane(memarg, lane)
1577
            }
1578
1579
1.63k
            0x5c => visitor.visit_v128_load32_zero(self.read_memarg(2)?),
1580
206
            0x5d => visitor.visit_v128_load64_zero(self.read_memarg(3)?),
1581
186
            0x5e => visitor.visit_f32x4_demote_f64x2_zero(),
1582
1.01k
            0x5f => visitor.visit_f64x2_promote_low_f32x4(),
1583
1.41k
            0x60 => visitor.visit_i8x16_abs(),
1584
833
            0x61 => visitor.visit_i8x16_neg(),
1585
982
            0x62 => visitor.visit_i8x16_popcnt(),
1586
1.32k
            0x63 => visitor.visit_i8x16_all_true(),
1587
407
            0x64 => visitor.visit_i8x16_bitmask(),
1588
13
            0x65 => visitor.visit_i8x16_narrow_i16x8_s(),
1589
1
            0x66 => visitor.visit_i8x16_narrow_i16x8_u(),
1590
326
            0x67 => visitor.visit_f32x4_ceil(),
1591
265
            0x68 => visitor.visit_f32x4_floor(),
1592
236
            0x69 => visitor.visit_f32x4_trunc(),
1593
86
            0x6a => visitor.visit_f32x4_nearest(),
1594
47
            0x6b => visitor.visit_i8x16_shl(),
1595
90
            0x6c => visitor.visit_i8x16_shr_s(),
1596
26
            0x6d => visitor.visit_i8x16_shr_u(),
1597
10
            0x6e => visitor.visit_i8x16_add(),
1598
12
            0x6f => visitor.visit_i8x16_add_sat_s(),
1599
24
            0x70 => visitor.visit_i8x16_add_sat_u(),
1600
53
            0x71 => visitor.visit_i8x16_sub(),
1601
11
            0x72 => visitor.visit_i8x16_sub_sat_s(),
1602
3
            0x73 => visitor.visit_i8x16_sub_sat_u(),
1603
130
            0x74 => visitor.visit_f64x2_ceil(),
1604
281
            0x75 => visitor.visit_f64x2_floor(),
1605
11
            0x76 => visitor.visit_i8x16_min_s(),
1606
0
            0x77 => visitor.visit_i8x16_min_u(),
1607
6
            0x78 => visitor.visit_i8x16_max_s(),
1608
1
            0x79 => visitor.visit_i8x16_max_u(),
1609
103
            0x7a => visitor.visit_f64x2_trunc(),
1610
22
            0x7b => visitor.visit_i8x16_avgr_u(),
1611
572
            0x7c => visitor.visit_i16x8_extadd_pairwise_i8x16_s(),
1612
954
            0x7d => visitor.visit_i16x8_extadd_pairwise_i8x16_u(),
1613
878
            0x7e => visitor.visit_i32x4_extadd_pairwise_i16x8_s(),
1614
800
            0x7f => visitor.visit_i32x4_extadd_pairwise_i16x8_u(),
1615
615
            0x80 => visitor.visit_i16x8_abs(),
1616
549
            0x81 => visitor.visit_i16x8_neg(),
1617
2
            0x82 => visitor.visit_i16x8_q15mulr_sat_s(),
1618
359
            0x83 => visitor.visit_i16x8_all_true(),
1619
411
            0x84 => visitor.visit_i16x8_bitmask(),
1620
0
            0x85 => visitor.visit_i16x8_narrow_i32x4_s(),
1621
3
            0x86 => visitor.visit_i16x8_narrow_i32x4_u(),
1622
1.59k
            0x87 => visitor.visit_i16x8_extend_low_i8x16_s(),
1623
4.10k
            0x88 => visitor.visit_i16x8_extend_high_i8x16_s(),
1624
9.69k
            0x89 => visitor.visit_i16x8_extend_low_i8x16_u(),
1625
427
            0x8a => visitor.visit_i16x8_extend_high_i8x16_u(),
1626
28
            0x8b => visitor.visit_i16x8_shl(),
1627
124
            0x8c => visitor.visit_i16x8_shr_s(),
1628
17
            0x8d => visitor.visit_i16x8_shr_u(),
1629
1
            0x8e => visitor.visit_i16x8_add(),
1630
5
            0x8f => visitor.visit_i16x8_add_sat_s(),
1631
0
            0x90 => visitor.visit_i16x8_add_sat_u(),
1632
7
            0x91 => visitor.visit_i16x8_sub(),
1633
2
            0x92 => visitor.visit_i16x8_sub_sat_s(),
1634
3
            0x93 => visitor.visit_i16x8_sub_sat_u(),
1635
127
            0x94 => visitor.visit_f64x2_nearest(),
1636
2
            0x95 => visitor.visit_i16x8_mul(),
1637
10
            0x96 => visitor.visit_i16x8_min_s(),
1638
16
            0x97 => visitor.visit_i16x8_min_u(),
1639
61
            0x98 => visitor.visit_i16x8_max_s(),
1640
8
            0x99 => visitor.visit_i16x8_max_u(),
1641
14
            0x9b => visitor.visit_i16x8_avgr_u(),
1642
44
            0x9c => visitor.visit_i16x8_extmul_low_i8x16_s(),
1643
5
            0x9d => visitor.visit_i16x8_extmul_high_i8x16_s(),
1644
5
            0x9e => visitor.visit_i16x8_extmul_low_i8x16_u(),
1645
8
            0x9f => visitor.visit_i16x8_extmul_high_i8x16_u(),
1646
852
            0xa0 => visitor.visit_i32x4_abs(),
1647
1.56k
            0xa1 => visitor.visit_i32x4_neg(),
1648
238
            0xa3 => visitor.visit_i32x4_all_true(),
1649
142
            0xa4 => visitor.visit_i32x4_bitmask(),
1650
941
            0xa7 => visitor.visit_i32x4_extend_low_i16x8_s(),
1651
1.75k
            0xa8 => visitor.visit_i32x4_extend_high_i16x8_s(),
1652
722
            0xa9 => visitor.visit_i32x4_extend_low_i16x8_u(),
1653
2.65k
            0xaa => visitor.visit_i32x4_extend_high_i16x8_u(),
1654
29
            0xab => visitor.visit_i32x4_shl(),
1655
51
            0xac => visitor.visit_i32x4_shr_s(),
1656
24
            0xad => visitor.visit_i32x4_shr_u(),
1657
20
            0xae => visitor.visit_i32x4_add(),
1658
0
            0xb1 => visitor.visit_i32x4_sub(),
1659
1
            0xb5 => visitor.visit_i32x4_mul(),
1660
13
            0xb6 => visitor.visit_i32x4_min_s(),
1661
8
            0xb7 => visitor.visit_i32x4_min_u(),
1662
1
            0xb8 => visitor.visit_i32x4_max_s(),
1663
2
            0xb9 => visitor.visit_i32x4_max_u(),
1664
1
            0xba => visitor.visit_i32x4_dot_i16x8_s(),
1665
10
            0xbc => visitor.visit_i32x4_extmul_low_i16x8_s(),
1666
51
            0xbd => visitor.visit_i32x4_extmul_high_i16x8_s(),
1667
5
            0xbe => visitor.visit_i32x4_extmul_low_i16x8_u(),
1668
1
            0xbf => visitor.visit_i32x4_extmul_high_i16x8_u(),
1669
3.30k
            0xc0 => visitor.visit_i64x2_abs(),
1670
4.04k
            0xc1 => visitor.visit_i64x2_neg(),
1671
1.67k
            0xc3 => visitor.visit_i64x2_all_true(),
1672
481
            0xc4 => visitor.visit_i64x2_bitmask(),
1673
5.93k
            0xc7 => visitor.visit_i64x2_extend_low_i32x4_s(),
1674
5.07k
            0xc8 => visitor.visit_i64x2_extend_high_i32x4_s(),
1675
9.53k
            0xc9 => visitor.visit_i64x2_extend_low_i32x4_u(),
1676
10.3k
            0xca => visitor.visit_i64x2_extend_high_i32x4_u(),
1677
15
            0xcb => visitor.visit_i64x2_shl(),
1678
14
            0xcc => visitor.visit_i64x2_shr_s(),
1679
1
            0xcd => visitor.visit_i64x2_shr_u(),
1680
17
            0xce => visitor.visit_i64x2_add(),
1681
57
            0xd1 => visitor.visit_i64x2_sub(),
1682
4
            0xd5 => visitor.visit_i64x2_mul(),
1683
1
            0xd6 => visitor.visit_i64x2_eq(),
1684
18
            0xd7 => visitor.visit_i64x2_ne(),
1685
14
            0xd8 => visitor.visit_i64x2_lt_s(),
1686
0
            0xd9 => visitor.visit_i64x2_gt_s(),
1687
1
            0xda => visitor.visit_i64x2_le_s(),
1688
93
            0xdb => visitor.visit_i64x2_ge_s(),
1689
35
            0xdc => visitor.visit_i64x2_extmul_low_i32x4_s(),
1690
217
            0xdd => visitor.visit_i64x2_extmul_high_i32x4_s(),
1691
16
            0xde => visitor.visit_i64x2_extmul_low_i32x4_u(),
1692
5
            0xdf => visitor.visit_i64x2_extmul_high_i32x4_u(),
1693
229
            0xe0 => visitor.visit_f32x4_abs(),
1694
96
            0xe1 => visitor.visit_f32x4_neg(),
1695
83
            0xe3 => visitor.visit_f32x4_sqrt(),
1696
3
            0xe4 => visitor.visit_f32x4_add(),
1697
0
            0xe5 => visitor.visit_f32x4_sub(),
1698
0
            0xe6 => visitor.visit_f32x4_mul(),
1699
2
            0xe7 => visitor.visit_f32x4_div(),
1700
10
            0xe8 => visitor.visit_f32x4_min(),
1701
1
            0xe9 => visitor.visit_f32x4_max(),
1702
11
            0xea => visitor.visit_f32x4_pmin(),
1703
1
            0xeb => visitor.visit_f32x4_pmax(),
1704
49
            0xec => visitor.visit_f64x2_abs(),
1705
50
            0xed => visitor.visit_f64x2_neg(),
1706
166
            0xef => visitor.visit_f64x2_sqrt(),
1707
0
            0xf0 => visitor.visit_f64x2_add(),
1708
0
            0xf1 => visitor.visit_f64x2_sub(),
1709
60
            0xf2 => visitor.visit_f64x2_mul(),
1710
0
            0xf3 => visitor.visit_f64x2_div(),
1711
1
            0xf4 => visitor.visit_f64x2_min(),
1712
20
            0xf5 => visitor.visit_f64x2_max(),
1713
0
            0xf6 => visitor.visit_f64x2_pmin(),
1714
2
            0xf7 => visitor.visit_f64x2_pmax(),
1715
95
            0xf8 => visitor.visit_i32x4_trunc_sat_f32x4_s(),
1716
337
            0xf9 => visitor.visit_i32x4_trunc_sat_f32x4_u(),
1717
86
            0xfa => visitor.visit_f32x4_convert_i32x4_s(),
1718
195
            0xfb => visitor.visit_f32x4_convert_i32x4_u(),
1719
49
            0xfc => visitor.visit_i32x4_trunc_sat_f64x2_s_zero(),
1720
78
            0xfd => visitor.visit_i32x4_trunc_sat_f64x2_u_zero(),
1721
91
            0xfe => visitor.visit_f64x2_convert_low_i32x4_s(),
1722
94
            0xff => visitor.visit_f64x2_convert_low_i32x4_u(),
1723
2
            0x100 => visitor.visit_i8x16_relaxed_swizzle(),
1724
142
            0x101 => visitor.visit_i32x4_relaxed_trunc_f32x4_s(),
1725
1
            0x102 => visitor.visit_i32x4_relaxed_trunc_f32x4_u(),
1726
9
            0x103 => visitor.visit_i32x4_relaxed_trunc_f64x2_s_zero(),
1727
21
            0x104 => visitor.visit_i32x4_relaxed_trunc_f64x2_u_zero(),
1728
0
            0x105 => visitor.visit_f32x4_relaxed_madd(),
1729
0
            0x106 => visitor.visit_f32x4_relaxed_nmadd(),
1730
0
            0x107 => visitor.visit_f64x2_relaxed_madd(),
1731
0
            0x108 => visitor.visit_f64x2_relaxed_nmadd(),
1732
10
            0x109 => visitor.visit_i8x16_relaxed_laneselect(),
1733
0
            0x10a => visitor.visit_i16x8_relaxed_laneselect(),
1734
0
            0x10b => visitor.visit_i32x4_relaxed_laneselect(),
1735
0
            0x10c => visitor.visit_i64x2_relaxed_laneselect(),
1736
0
            0x10d => visitor.visit_f32x4_relaxed_min(),
1737
0
            0x10e => visitor.visit_f32x4_relaxed_max(),
1738
0
            0x10f => visitor.visit_f64x2_relaxed_min(),
1739
2
            0x110 => visitor.visit_f64x2_relaxed_max(),
1740
1
            0x111 => visitor.visit_i16x8_relaxed_q15mulr_s(),
1741
0
            0x112 => visitor.visit_i16x8_relaxed_dot_i8x16_i7x16_s(),
1742
0
            0x113 => visitor.visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(),
1743
1744
0
            _ => bail!(pos, "unknown 0xfd subopcode: 0x{code:x}"),
1745
        })
1746
295k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfd_operator::<&mut dyn wasmparser::readers::core::operators::VisitSimdOperator<Output = wasmparser::readers::core::operators::Operator>>
Line
Count
Source
1432
145k
    pub(super) fn visit_0xfd_operator<T>(
1433
145k
        &mut self,
1434
145k
        pos: u64,
1435
145k
        visitor: &mut T,
1436
145k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1437
145k
    where
1438
145k
        T: VisitSimdOperator<'a>,
1439
    {
1440
145k
        let code = self.read_var_u32()?;
1441
145k
        Ok(match code {
1442
177
            0x00 => visitor.visit_v128_load(self.read_memarg(4)?),
1443
69
            0x01 => visitor.visit_v128_load8x8_s(self.read_memarg(3)?),
1444
81
            0x02 => visitor.visit_v128_load8x8_u(self.read_memarg(3)?),
1445
85
            0x03 => visitor.visit_v128_load16x4_s(self.read_memarg(3)?),
1446
502
            0x04 => visitor.visit_v128_load16x4_u(self.read_memarg(3)?),
1447
196
            0x05 => visitor.visit_v128_load32x2_s(self.read_memarg(3)?),
1448
91
            0x06 => visitor.visit_v128_load32x2_u(self.read_memarg(3)?),
1449
91
            0x07 => visitor.visit_v128_load8_splat(self.read_memarg(0)?),
1450
188
            0x08 => visitor.visit_v128_load16_splat(self.read_memarg(1)?),
1451
310
            0x09 => visitor.visit_v128_load32_splat(self.read_memarg(2)?),
1452
272
            0x0a => visitor.visit_v128_load64_splat(self.read_memarg(3)?),
1453
1454
16
            0x0b => visitor.visit_v128_store(self.read_memarg(4)?),
1455
51.6k
            0x0c => visitor.visit_v128_const(self.read_v128()?),
1456
            0x0d => {
1457
3
                let mut lanes: [u8; 16] = [0; 16];
1458
48
                for lane in &mut lanes {
1459
48
                    *lane = self.read_lane_index()?
1460
                }
1461
3
                visitor.visit_i8x16_shuffle(lanes)
1462
            }
1463
1464
0
            0x0e => visitor.visit_i8x16_swizzle(),
1465
685
            0x0f => visitor.visit_i8x16_splat(),
1466
839
            0x10 => visitor.visit_i16x8_splat(),
1467
958
            0x11 => visitor.visit_i32x4_splat(),
1468
496
            0x12 => visitor.visit_i64x2_splat(),
1469
36
            0x13 => visitor.visit_f32x4_splat(),
1470
25
            0x14 => visitor.visit_f64x2_splat(),
1471
1472
701
            0x15 => visitor.visit_i8x16_extract_lane_s(self.read_lane_index()?),
1473
514
            0x16 => visitor.visit_i8x16_extract_lane_u(self.read_lane_index()?),
1474
68
            0x17 => visitor.visit_i8x16_replace_lane(self.read_lane_index()?),
1475
557
            0x18 => visitor.visit_i16x8_extract_lane_s(self.read_lane_index()?),
1476
179
            0x19 => visitor.visit_i16x8_extract_lane_u(self.read_lane_index()?),
1477
14
            0x1a => visitor.visit_i16x8_replace_lane(self.read_lane_index()?),
1478
241
            0x1b => visitor.visit_i32x4_extract_lane(self.read_lane_index()?),
1479
1480
29
            0x1c => visitor.visit_i32x4_replace_lane(self.read_lane_index()?),
1481
306
            0x1d => visitor.visit_i64x2_extract_lane(self.read_lane_index()?),
1482
60
            0x1e => visitor.visit_i64x2_replace_lane(self.read_lane_index()?),
1483
76
            0x1f => visitor.visit_f32x4_extract_lane(self.read_lane_index()?),
1484
1
            0x20 => visitor.visit_f32x4_replace_lane(self.read_lane_index()?),
1485
19
            0x21 => visitor.visit_f64x2_extract_lane(self.read_lane_index()?),
1486
5
            0x22 => visitor.visit_f64x2_replace_lane(self.read_lane_index()?),
1487
1488
4
            0x23 => visitor.visit_i8x16_eq(),
1489
8
            0x24 => visitor.visit_i8x16_ne(),
1490
3
            0x25 => visitor.visit_i8x16_lt_s(),
1491
1
            0x26 => visitor.visit_i8x16_lt_u(),
1492
11
            0x27 => visitor.visit_i8x16_gt_s(),
1493
1
            0x28 => visitor.visit_i8x16_gt_u(),
1494
13
            0x29 => visitor.visit_i8x16_le_s(),
1495
1
            0x2a => visitor.visit_i8x16_le_u(),
1496
4
            0x2b => visitor.visit_i8x16_ge_s(),
1497
3
            0x2c => visitor.visit_i8x16_ge_u(),
1498
38
            0x2d => visitor.visit_i16x8_eq(),
1499
0
            0x2e => visitor.visit_i16x8_ne(),
1500
3
            0x2f => visitor.visit_i16x8_lt_s(),
1501
3
            0x30 => visitor.visit_i16x8_lt_u(),
1502
1
            0x31 => visitor.visit_i16x8_gt_s(),
1503
2
            0x32 => visitor.visit_i16x8_gt_u(),
1504
2
            0x33 => visitor.visit_i16x8_le_s(),
1505
5
            0x34 => visitor.visit_i16x8_le_u(),
1506
1
            0x35 => visitor.visit_i16x8_ge_s(),
1507
1
            0x36 => visitor.visit_i16x8_ge_u(),
1508
6
            0x37 => visitor.visit_i32x4_eq(),
1509
10
            0x38 => visitor.visit_i32x4_ne(),
1510
5
            0x39 => visitor.visit_i32x4_lt_s(),
1511
1
            0x3a => visitor.visit_i32x4_lt_u(),
1512
1
            0x3b => visitor.visit_i32x4_gt_s(),
1513
24
            0x3c => visitor.visit_i32x4_gt_u(),
1514
8
            0x3d => visitor.visit_i32x4_le_s(),
1515
2
            0x3e => visitor.visit_i32x4_le_u(),
1516
11
            0x3f => visitor.visit_i32x4_ge_s(),
1517
3
            0x40 => visitor.visit_i32x4_ge_u(),
1518
813
            0x41 => visitor.visit_f32x4_eq(),
1519
11
            0x42 => visitor.visit_f32x4_ne(),
1520
14
            0x43 => visitor.visit_f32x4_lt(),
1521
1
            0x44 => visitor.visit_f32x4_gt(),
1522
1
            0x45 => visitor.visit_f32x4_le(),
1523
0
            0x46 => visitor.visit_f32x4_ge(),
1524
736
            0x47 => visitor.visit_f64x2_eq(),
1525
1
            0x48 => visitor.visit_f64x2_ne(),
1526
0
            0x49 => visitor.visit_f64x2_lt(),
1527
2
            0x4a => visitor.visit_f64x2_gt(),
1528
3
            0x4b => visitor.visit_f64x2_le(),
1529
0
            0x4c => visitor.visit_f64x2_ge(),
1530
587
            0x4d => visitor.visit_v128_not(),
1531
1
            0x4e => visitor.visit_v128_and(),
1532
7
            0x4f => visitor.visit_v128_andnot(),
1533
7
            0x50 => visitor.visit_v128_or(),
1534
23.6k
            0x51 => visitor.visit_v128_xor(),
1535
1.54k
            0x52 => visitor.visit_v128_bitselect(),
1536
1
            0x53 => visitor.visit_v128_any_true(),
1537
1538
            0x54 => {
1539
11
                let memarg = self.read_memarg(0)?;
1540
11
                let lane = self.read_lane_index()?;
1541
11
                visitor.visit_v128_load8_lane(memarg, lane)
1542
            }
1543
            0x55 => {
1544
18
                let memarg = self.read_memarg(1)?;
1545
18
                let lane = self.read_lane_index()?;
1546
18
                visitor.visit_v128_load16_lane(memarg, lane)
1547
            }
1548
            0x56 => {
1549
54
                let memarg = self.read_memarg(2)?;
1550
54
                let lane = self.read_lane_index()?;
1551
54
                visitor.visit_v128_load32_lane(memarg, lane)
1552
            }
1553
            0x57 => {
1554
20
                let memarg = self.read_memarg(3)?;
1555
20
                let lane = self.read_lane_index()?;
1556
20
                visitor.visit_v128_load64_lane(memarg, lane)
1557
            }
1558
            0x58 => {
1559
10
                let memarg = self.read_memarg(0)?;
1560
10
                let lane = self.read_lane_index()?;
1561
10
                visitor.visit_v128_store8_lane(memarg, lane)
1562
            }
1563
            0x59 => {
1564
2
                let memarg = self.read_memarg(1)?;
1565
2
                let lane = self.read_lane_index()?;
1566
2
                visitor.visit_v128_store16_lane(memarg, lane)
1567
            }
1568
            0x5a => {
1569
4
                let memarg = self.read_memarg(2)?;
1570
4
                let lane = self.read_lane_index()?;
1571
4
                visitor.visit_v128_store32_lane(memarg, lane)
1572
            }
1573
            0x5b => {
1574
8
                let memarg = self.read_memarg(3)?;
1575
8
                let lane = self.read_lane_index()?;
1576
8
                visitor.visit_v128_store64_lane(memarg, lane)
1577
            }
1578
1579
212
            0x5c => visitor.visit_v128_load32_zero(self.read_memarg(2)?),
1580
294
            0x5d => visitor.visit_v128_load64_zero(self.read_memarg(3)?),
1581
241
            0x5e => visitor.visit_f32x4_demote_f64x2_zero(),
1582
183
            0x5f => visitor.visit_f64x2_promote_low_f32x4(),
1583
501
            0x60 => visitor.visit_i8x16_abs(),
1584
339
            0x61 => visitor.visit_i8x16_neg(),
1585
580
            0x62 => visitor.visit_i8x16_popcnt(),
1586
365
            0x63 => visitor.visit_i8x16_all_true(),
1587
284
            0x64 => visitor.visit_i8x16_bitmask(),
1588
0
            0x65 => visitor.visit_i8x16_narrow_i16x8_s(),
1589
1
            0x66 => visitor.visit_i8x16_narrow_i16x8_u(),
1590
258
            0x67 => visitor.visit_f32x4_ceil(),
1591
190
            0x68 => visitor.visit_f32x4_floor(),
1592
235
            0x69 => visitor.visit_f32x4_trunc(),
1593
60
            0x6a => visitor.visit_f32x4_nearest(),
1594
34
            0x6b => visitor.visit_i8x16_shl(),
1595
86
            0x6c => visitor.visit_i8x16_shr_s(),
1596
15
            0x6d => visitor.visit_i8x16_shr_u(),
1597
5
            0x6e => visitor.visit_i8x16_add(),
1598
4
            0x6f => visitor.visit_i8x16_add_sat_s(),
1599
4
            0x70 => visitor.visit_i8x16_add_sat_u(),
1600
12
            0x71 => visitor.visit_i8x16_sub(),
1601
7
            0x72 => visitor.visit_i8x16_sub_sat_s(),
1602
0
            0x73 => visitor.visit_i8x16_sub_sat_u(),
1603
120
            0x74 => visitor.visit_f64x2_ceil(),
1604
246
            0x75 => visitor.visit_f64x2_floor(),
1605
12
            0x76 => visitor.visit_i8x16_min_s(),
1606
1
            0x77 => visitor.visit_i8x16_min_u(),
1607
4
            0x78 => visitor.visit_i8x16_max_s(),
1608
1
            0x79 => visitor.visit_i8x16_max_u(),
1609
61
            0x7a => visitor.visit_f64x2_trunc(),
1610
3
            0x7b => visitor.visit_i8x16_avgr_u(),
1611
479
            0x7c => visitor.visit_i16x8_extadd_pairwise_i8x16_s(),
1612
614
            0x7d => visitor.visit_i16x8_extadd_pairwise_i8x16_u(),
1613
543
            0x7e => visitor.visit_i32x4_extadd_pairwise_i16x8_s(),
1614
174
            0x7f => visitor.visit_i32x4_extadd_pairwise_i16x8_u(),
1615
405
            0x80 => visitor.visit_i16x8_abs(),
1616
577
            0x81 => visitor.visit_i16x8_neg(),
1617
2
            0x82 => visitor.visit_i16x8_q15mulr_sat_s(),
1618
168
            0x83 => visitor.visit_i16x8_all_true(),
1619
198
            0x84 => visitor.visit_i16x8_bitmask(),
1620
0
            0x85 => visitor.visit_i16x8_narrow_i32x4_s(),
1621
8
            0x86 => visitor.visit_i16x8_narrow_i32x4_u(),
1622
761
            0x87 => visitor.visit_i16x8_extend_low_i8x16_s(),
1623
4.29k
            0x88 => visitor.visit_i16x8_extend_high_i8x16_s(),
1624
6.78k
            0x89 => visitor.visit_i16x8_extend_low_i8x16_u(),
1625
856
            0x8a => visitor.visit_i16x8_extend_high_i8x16_u(),
1626
9
            0x8b => visitor.visit_i16x8_shl(),
1627
116
            0x8c => visitor.visit_i16x8_shr_s(),
1628
10
            0x8d => visitor.visit_i16x8_shr_u(),
1629
0
            0x8e => visitor.visit_i16x8_add(),
1630
6
            0x8f => visitor.visit_i16x8_add_sat_s(),
1631
0
            0x90 => visitor.visit_i16x8_add_sat_u(),
1632
15
            0x91 => visitor.visit_i16x8_sub(),
1633
3
            0x92 => visitor.visit_i16x8_sub_sat_s(),
1634
2
            0x93 => visitor.visit_i16x8_sub_sat_u(),
1635
115
            0x94 => visitor.visit_f64x2_nearest(),
1636
2
            0x95 => visitor.visit_i16x8_mul(),
1637
0
            0x96 => visitor.visit_i16x8_min_s(),
1638
21
            0x97 => visitor.visit_i16x8_min_u(),
1639
4
            0x98 => visitor.visit_i16x8_max_s(),
1640
7
            0x99 => visitor.visit_i16x8_max_u(),
1641
6
            0x9b => visitor.visit_i16x8_avgr_u(),
1642
6
            0x9c => visitor.visit_i16x8_extmul_low_i8x16_s(),
1643
13
            0x9d => visitor.visit_i16x8_extmul_high_i8x16_s(),
1644
8
            0x9e => visitor.visit_i16x8_extmul_low_i8x16_u(),
1645
5
            0x9f => visitor.visit_i16x8_extmul_high_i8x16_u(),
1646
1.26k
            0xa0 => visitor.visit_i32x4_abs(),
1647
378
            0xa1 => visitor.visit_i32x4_neg(),
1648
195
            0xa3 => visitor.visit_i32x4_all_true(),
1649
94
            0xa4 => visitor.visit_i32x4_bitmask(),
1650
597
            0xa7 => visitor.visit_i32x4_extend_low_i16x8_s(),
1651
1.33k
            0xa8 => visitor.visit_i32x4_extend_high_i16x8_s(),
1652
494
            0xa9 => visitor.visit_i32x4_extend_low_i16x8_u(),
1653
1.81k
            0xaa => visitor.visit_i32x4_extend_high_i16x8_u(),
1654
6
            0xab => visitor.visit_i32x4_shl(),
1655
13
            0xac => visitor.visit_i32x4_shr_s(),
1656
20
            0xad => visitor.visit_i32x4_shr_u(),
1657
13
            0xae => visitor.visit_i32x4_add(),
1658
0
            0xb1 => visitor.visit_i32x4_sub(),
1659
6
            0xb5 => visitor.visit_i32x4_mul(),
1660
88
            0xb6 => visitor.visit_i32x4_min_s(),
1661
6
            0xb7 => visitor.visit_i32x4_min_u(),
1662
1
            0xb8 => visitor.visit_i32x4_max_s(),
1663
3
            0xb9 => visitor.visit_i32x4_max_u(),
1664
4
            0xba => visitor.visit_i32x4_dot_i16x8_s(),
1665
8
            0xbc => visitor.visit_i32x4_extmul_low_i16x8_s(),
1666
8
            0xbd => visitor.visit_i32x4_extmul_high_i16x8_s(),
1667
6
            0xbe => visitor.visit_i32x4_extmul_low_i16x8_u(),
1668
1
            0xbf => visitor.visit_i32x4_extmul_high_i16x8_u(),
1669
2.99k
            0xc0 => visitor.visit_i64x2_abs(),
1670
3.69k
            0xc1 => visitor.visit_i64x2_neg(),
1671
1.36k
            0xc3 => visitor.visit_i64x2_all_true(),
1672
198
            0xc4 => visitor.visit_i64x2_bitmask(),
1673
1.17k
            0xc7 => visitor.visit_i64x2_extend_low_i32x4_s(),
1674
2.11k
            0xc8 => visitor.visit_i64x2_extend_high_i32x4_s(),
1675
8.85k
            0xc9 => visitor.visit_i64x2_extend_low_i32x4_u(),
1676
9.47k
            0xca => visitor.visit_i64x2_extend_high_i32x4_u(),
1677
10
            0xcb => visitor.visit_i64x2_shl(),
1678
7
            0xcc => visitor.visit_i64x2_shr_s(),
1679
0
            0xcd => visitor.visit_i64x2_shr_u(),
1680
47
            0xce => visitor.visit_i64x2_add(),
1681
7
            0xd1 => visitor.visit_i64x2_sub(),
1682
7
            0xd5 => visitor.visit_i64x2_mul(),
1683
7
            0xd6 => visitor.visit_i64x2_eq(),
1684
15
            0xd7 => visitor.visit_i64x2_ne(),
1685
9
            0xd8 => visitor.visit_i64x2_lt_s(),
1686
0
            0xd9 => visitor.visit_i64x2_gt_s(),
1687
1
            0xda => visitor.visit_i64x2_le_s(),
1688
2
            0xdb => visitor.visit_i64x2_ge_s(),
1689
35
            0xdc => visitor.visit_i64x2_extmul_low_i32x4_s(),
1690
268
            0xdd => visitor.visit_i64x2_extmul_high_i32x4_s(),
1691
16
            0xde => visitor.visit_i64x2_extmul_low_i32x4_u(),
1692
5
            0xdf => visitor.visit_i64x2_extmul_high_i32x4_u(),
1693
62
            0xe0 => visitor.visit_f32x4_abs(),
1694
67
            0xe1 => visitor.visit_f32x4_neg(),
1695
76
            0xe3 => visitor.visit_f32x4_sqrt(),
1696
3
            0xe4 => visitor.visit_f32x4_add(),
1697
0
            0xe5 => visitor.visit_f32x4_sub(),
1698
0
            0xe6 => visitor.visit_f32x4_mul(),
1699
2
            0xe7 => visitor.visit_f32x4_div(),
1700
1
            0xe8 => visitor.visit_f32x4_min(),
1701
1
            0xe9 => visitor.visit_f32x4_max(),
1702
11
            0xea => visitor.visit_f32x4_pmin(),
1703
1
            0xeb => visitor.visit_f32x4_pmax(),
1704
26
            0xec => visitor.visit_f64x2_abs(),
1705
57
            0xed => visitor.visit_f64x2_neg(),
1706
161
            0xef => visitor.visit_f64x2_sqrt(),
1707
0
            0xf0 => visitor.visit_f64x2_add(),
1708
0
            0xf1 => visitor.visit_f64x2_sub(),
1709
15
            0xf2 => visitor.visit_f64x2_mul(),
1710
0
            0xf3 => visitor.visit_f64x2_div(),
1711
1
            0xf4 => visitor.visit_f64x2_min(),
1712
20
            0xf5 => visitor.visit_f64x2_max(),
1713
0
            0xf6 => visitor.visit_f64x2_pmin(),
1714
2
            0xf7 => visitor.visit_f64x2_pmax(),
1715
71
            0xf8 => visitor.visit_i32x4_trunc_sat_f32x4_s(),
1716
488
            0xf9 => visitor.visit_i32x4_trunc_sat_f32x4_u(),
1717
71
            0xfa => visitor.visit_f32x4_convert_i32x4_s(),
1718
170
            0xfb => visitor.visit_f32x4_convert_i32x4_u(),
1719
27
            0xfc => visitor.visit_i32x4_trunc_sat_f64x2_s_zero(),
1720
62
            0xfd => visitor.visit_i32x4_trunc_sat_f64x2_u_zero(),
1721
74
            0xfe => visitor.visit_f64x2_convert_low_i32x4_s(),
1722
78
            0xff => visitor.visit_f64x2_convert_low_i32x4_u(),
1723
4
            0x100 => visitor.visit_i8x16_relaxed_swizzle(),
1724
16
            0x101 => visitor.visit_i32x4_relaxed_trunc_f32x4_s(),
1725
3
            0x102 => visitor.visit_i32x4_relaxed_trunc_f32x4_u(),
1726
6
            0x103 => visitor.visit_i32x4_relaxed_trunc_f64x2_s_zero(),
1727
22
            0x104 => visitor.visit_i32x4_relaxed_trunc_f64x2_u_zero(),
1728
0
            0x105 => visitor.visit_f32x4_relaxed_madd(),
1729
0
            0x106 => visitor.visit_f32x4_relaxed_nmadd(),
1730
0
            0x107 => visitor.visit_f64x2_relaxed_madd(),
1731
0
            0x108 => visitor.visit_f64x2_relaxed_nmadd(),
1732
1
            0x109 => visitor.visit_i8x16_relaxed_laneselect(),
1733
0
            0x10a => visitor.visit_i16x8_relaxed_laneselect(),
1734
0
            0x10b => visitor.visit_i32x4_relaxed_laneselect(),
1735
0
            0x10c => visitor.visit_i64x2_relaxed_laneselect(),
1736
0
            0x10d => visitor.visit_f32x4_relaxed_min(),
1737
0
            0x10e => visitor.visit_f32x4_relaxed_max(),
1738
0
            0x10f => visitor.visit_f64x2_relaxed_min(),
1739
2
            0x110 => visitor.visit_f64x2_relaxed_max(),
1740
6
            0x111 => visitor.visit_i16x8_relaxed_q15mulr_s(),
1741
0
            0x112 => visitor.visit_i16x8_relaxed_dot_i8x16_i7x16_s(),
1742
0
            0x113 => visitor.visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(),
1743
1744
0
            _ => bail!(pos, "unknown 0xfd subopcode: 0x{code:x}"),
1745
        })
1746
145k
    }
1747
1748
343k
    fn visit_0xfe_operator<T>(
1749
343k
        &mut self,
1750
343k
        pos: u64,
1751
343k
        visitor: &mut T,
1752
343k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1753
343k
    where
1754
343k
        T: VisitOperator<'a>,
1755
    {
1756
343k
        let code = self.read_var_u32()?;
1757
343k
        Ok(match code {
1758
156
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1759
8
            0x01 => visitor.visit_memory_atomic_wait32(self.read_memarg(2)?),
1760
8
            0x02 => visitor.visit_memory_atomic_wait64(self.read_memarg(3)?),
1761
            0x03 => {
1762
309k
                if self.read_u8()? != 0 {
1763
0
                    bail!(pos, "nonzero byte after `atomic.fence`");
1764
309k
                }
1765
309k
                visitor.visit_atomic_fence()
1766
            }
1767
3.89k
            0x10 => visitor.visit_i32_atomic_load(self.read_memarg(2)?),
1768
2.41k
            0x11 => visitor.visit_i64_atomic_load(self.read_memarg(3)?),
1769
2.73k
            0x12 => visitor.visit_i32_atomic_load8_u(self.read_memarg(0)?),
1770
1.80k
            0x13 => visitor.visit_i32_atomic_load16_u(self.read_memarg(1)?),
1771
1.94k
            0x14 => visitor.visit_i64_atomic_load8_u(self.read_memarg(0)?),
1772
2.61k
            0x15 => visitor.visit_i64_atomic_load16_u(self.read_memarg(1)?),
1773
1.47k
            0x16 => visitor.visit_i64_atomic_load32_u(self.read_memarg(2)?),
1774
145
            0x17 => visitor.visit_i32_atomic_store(self.read_memarg(2)?),
1775
213
            0x18 => visitor.visit_i64_atomic_store(self.read_memarg(3)?),
1776
234
            0x19 => visitor.visit_i32_atomic_store8(self.read_memarg(0)?),
1777
234
            0x1a => visitor.visit_i32_atomic_store16(self.read_memarg(1)?),
1778
81
            0x1b => visitor.visit_i64_atomic_store8(self.read_memarg(0)?),
1779
418
            0x1c => visitor.visit_i64_atomic_store16(self.read_memarg(1)?),
1780
320
            0x1d => visitor.visit_i64_atomic_store32(self.read_memarg(2)?),
1781
173
            0x1e => visitor.visit_i32_atomic_rmw_add(self.read_memarg(2)?),
1782
186
            0x1f => visitor.visit_i64_atomic_rmw_add(self.read_memarg(3)?),
1783
125
            0x20 => visitor.visit_i32_atomic_rmw8_add_u(self.read_memarg(0)?),
1784
69
            0x21 => visitor.visit_i32_atomic_rmw16_add_u(self.read_memarg(1)?),
1785
665
            0x22 => visitor.visit_i64_atomic_rmw8_add_u(self.read_memarg(0)?),
1786
139
            0x23 => visitor.visit_i64_atomic_rmw16_add_u(self.read_memarg(1)?),
1787
173
            0x24 => visitor.visit_i64_atomic_rmw32_add_u(self.read_memarg(2)?),
1788
365
            0x25 => visitor.visit_i32_atomic_rmw_sub(self.read_memarg(2)?),
1789
187
            0x26 => visitor.visit_i64_atomic_rmw_sub(self.read_memarg(3)?),
1790
297
            0x27 => visitor.visit_i32_atomic_rmw8_sub_u(self.read_memarg(0)?),
1791
179
            0x28 => visitor.visit_i32_atomic_rmw16_sub_u(self.read_memarg(1)?),
1792
209
            0x29 => visitor.visit_i64_atomic_rmw8_sub_u(self.read_memarg(0)?),
1793
761
            0x2a => visitor.visit_i64_atomic_rmw16_sub_u(self.read_memarg(1)?),
1794
540
            0x2b => visitor.visit_i64_atomic_rmw32_sub_u(self.read_memarg(2)?),
1795
181
            0x2c => visitor.visit_i32_atomic_rmw_and(self.read_memarg(2)?),
1796
257
            0x2d => visitor.visit_i64_atomic_rmw_and(self.read_memarg(3)?),
1797
158
            0x2e => visitor.visit_i32_atomic_rmw8_and_u(self.read_memarg(0)?),
1798
168
            0x2f => visitor.visit_i32_atomic_rmw16_and_u(self.read_memarg(1)?),
1799
966
            0x30 => visitor.visit_i64_atomic_rmw8_and_u(self.read_memarg(0)?),
1800
145
            0x31 => visitor.visit_i64_atomic_rmw16_and_u(self.read_memarg(1)?),
1801
153
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1802
395
            0x33 => visitor.visit_i32_atomic_rmw_or(self.read_memarg(2)?),
1803
317
            0x34 => visitor.visit_i64_atomic_rmw_or(self.read_memarg(3)?),
1804
582
            0x35 => visitor.visit_i32_atomic_rmw8_or_u(self.read_memarg(0)?),
1805
102
            0x36 => visitor.visit_i32_atomic_rmw16_or_u(self.read_memarg(1)?),
1806
803
            0x37 => visitor.visit_i64_atomic_rmw8_or_u(self.read_memarg(0)?),
1807
359
            0x38 => visitor.visit_i64_atomic_rmw16_or_u(self.read_memarg(1)?),
1808
252
            0x39 => visitor.visit_i64_atomic_rmw32_or_u(self.read_memarg(2)?),
1809
698
            0x3a => visitor.visit_i32_atomic_rmw_xor(self.read_memarg(2)?),
1810
230
            0x3b => visitor.visit_i64_atomic_rmw_xor(self.read_memarg(3)?),
1811
859
            0x3c => visitor.visit_i32_atomic_rmw8_xor_u(self.read_memarg(0)?),
1812
280
            0x3d => visitor.visit_i32_atomic_rmw16_xor_u(self.read_memarg(1)?),
1813
200
            0x3e => visitor.visit_i64_atomic_rmw8_xor_u(self.read_memarg(0)?),
1814
154
            0x3f => visitor.visit_i64_atomic_rmw16_xor_u(self.read_memarg(1)?),
1815
1.69k
            0x40 => visitor.visit_i64_atomic_rmw32_xor_u(self.read_memarg(2)?),
1816
45
            0x41 => visitor.visit_i32_atomic_rmw_xchg(self.read_memarg(2)?),
1817
389
            0x42 => visitor.visit_i64_atomic_rmw_xchg(self.read_memarg(3)?),
1818
531
            0x43 => visitor.visit_i32_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1819
288
            0x44 => visitor.visit_i32_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1820
290
            0x45 => visitor.visit_i64_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1821
395
            0x46 => visitor.visit_i64_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1822
202
            0x47 => visitor.visit_i64_atomic_rmw32_xchg_u(self.read_memarg(2)?),
1823
32
            0x48 => visitor.visit_i32_atomic_rmw_cmpxchg(self.read_memarg(2)?),
1824
5
            0x49 => visitor.visit_i64_atomic_rmw_cmpxchg(self.read_memarg(3)?),
1825
28
            0x4a => visitor.visit_i32_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1826
12
            0x4b => visitor.visit_i32_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1827
25
            0x4c => visitor.visit_i64_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1828
4
            0x4d => visitor.visit_i64_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1829
20
            0x4e => visitor.visit_i64_atomic_rmw32_cmpxchg_u(self.read_memarg(2)?),
1830
1831
            // Decode shared-everything-threads proposal.
1832
0
            0x4f => visitor.visit_global_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1833
0
            0x50 => visitor.visit_global_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1834
            0x51 => {
1835
0
                visitor.visit_global_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?)
1836
            }
1837
            0x52 => {
1838
0
                visitor.visit_global_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?)
1839
            }
1840
            0x53 => {
1841
0
                visitor.visit_global_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?)
1842
            }
1843
0
            0x54 => visitor.visit_global_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1844
            0x55 => {
1845
0
                visitor.visit_global_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?)
1846
            }
1847
            0x56 => {
1848
0
                visitor.visit_global_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1849
            }
1850
            0x57 => {
1851
0
                visitor.visit_global_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1852
            }
1853
0
            0x58 => visitor.visit_table_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1854
0
            0x59 => visitor.visit_table_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1855
            0x5a => {
1856
0
                visitor.visit_table_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1857
            }
1858
            0x5b => {
1859
0
                visitor.visit_table_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1860
            }
1861
0
            0x5c => visitor.visit_struct_atomic_get(
1862
0
                self.read_ordering()?,
1863
0
                self.read_var_u32()?,
1864
0
                self.read_var_u32()?,
1865
            ),
1866
0
            0x5d => visitor.visit_struct_atomic_get_s(
1867
0
                self.read_ordering()?,
1868
0
                self.read_var_u32()?,
1869
0
                self.read_var_u32()?,
1870
            ),
1871
0
            0x5e => visitor.visit_struct_atomic_get_u(
1872
0
                self.read_ordering()?,
1873
0
                self.read_var_u32()?,
1874
0
                self.read_var_u32()?,
1875
            ),
1876
0
            0x5f => visitor.visit_struct_atomic_set(
1877
0
                self.read_ordering()?,
1878
0
                self.read_var_u32()?,
1879
0
                self.read_var_u32()?,
1880
            ),
1881
0
            0x60 => visitor.visit_struct_atomic_rmw_add(
1882
0
                self.read_ordering()?,
1883
0
                self.read_var_u32()?,
1884
0
                self.read_var_u32()?,
1885
            ),
1886
0
            0x61 => visitor.visit_struct_atomic_rmw_sub(
1887
0
                self.read_ordering()?,
1888
0
                self.read_var_u32()?,
1889
0
                self.read_var_u32()?,
1890
            ),
1891
0
            0x62 => visitor.visit_struct_atomic_rmw_and(
1892
0
                self.read_ordering()?,
1893
0
                self.read_var_u32()?,
1894
0
                self.read_var_u32()?,
1895
            ),
1896
0
            0x63 => visitor.visit_struct_atomic_rmw_or(
1897
0
                self.read_ordering()?,
1898
0
                self.read_var_u32()?,
1899
0
                self.read_var_u32()?,
1900
            ),
1901
0
            0x64 => visitor.visit_struct_atomic_rmw_xor(
1902
0
                self.read_ordering()?,
1903
0
                self.read_var_u32()?,
1904
0
                self.read_var_u32()?,
1905
            ),
1906
0
            0x65 => visitor.visit_struct_atomic_rmw_xchg(
1907
0
                self.read_ordering()?,
1908
0
                self.read_var_u32()?,
1909
0
                self.read_var_u32()?,
1910
            ),
1911
0
            0x66 => visitor.visit_struct_atomic_rmw_cmpxchg(
1912
0
                self.read_ordering()?,
1913
0
                self.read_var_u32()?,
1914
0
                self.read_var_u32()?,
1915
            ),
1916
0
            0x67 => visitor.visit_array_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1917
0
            0x68 => visitor.visit_array_atomic_get_s(self.read_ordering()?, self.read_var_u32()?),
1918
0
            0x69 => visitor.visit_array_atomic_get_u(self.read_ordering()?, self.read_var_u32()?),
1919
0
            0x6a => visitor.visit_array_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1920
0
            0x6b => visitor.visit_array_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?),
1921
0
            0x6c => visitor.visit_array_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?),
1922
0
            0x6d => visitor.visit_array_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?),
1923
0
            0x6e => visitor.visit_array_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1924
0
            0x6f => visitor.visit_array_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?),
1925
            0x70 => {
1926
0
                visitor.visit_array_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1927
            }
1928
            0x71 => {
1929
0
                visitor.visit_array_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1930
            }
1931
14
            0x72 => visitor.visit_ref_i31_shared(),
1932
1933
0
            _ => bail!(pos, "unknown 0xfe subopcode: 0x{code:x}"),
1934
        })
1935
343k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfe_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>
Line
Count
Source
1748
145k
    fn visit_0xfe_operator<T>(
1749
145k
        &mut self,
1750
145k
        pos: u64,
1751
145k
        visitor: &mut T,
1752
145k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1753
145k
    where
1754
145k
        T: VisitOperator<'a>,
1755
    {
1756
145k
        let code = self.read_var_u32()?;
1757
145k
        Ok(match code {
1758
50
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1759
4
            0x01 => visitor.visit_memory_atomic_wait32(self.read_memarg(2)?),
1760
4
            0x02 => visitor.visit_memory_atomic_wait64(self.read_memarg(3)?),
1761
            0x03 => {
1762
133k
                if self.read_u8()? != 0 {
1763
0
                    bail!(pos, "nonzero byte after `atomic.fence`");
1764
133k
                }
1765
133k
                visitor.visit_atomic_fence()
1766
            }
1767
1.60k
            0x10 => visitor.visit_i32_atomic_load(self.read_memarg(2)?),
1768
865
            0x11 => visitor.visit_i64_atomic_load(self.read_memarg(3)?),
1769
868
            0x12 => visitor.visit_i32_atomic_load8_u(self.read_memarg(0)?),
1770
696
            0x13 => visitor.visit_i32_atomic_load16_u(self.read_memarg(1)?),
1771
659
            0x14 => visitor.visit_i64_atomic_load8_u(self.read_memarg(0)?),
1772
1.07k
            0x15 => visitor.visit_i64_atomic_load16_u(self.read_memarg(1)?),
1773
530
            0x16 => visitor.visit_i64_atomic_load32_u(self.read_memarg(2)?),
1774
64
            0x17 => visitor.visit_i32_atomic_store(self.read_memarg(2)?),
1775
50
            0x18 => visitor.visit_i64_atomic_store(self.read_memarg(3)?),
1776
80
            0x19 => visitor.visit_i32_atomic_store8(self.read_memarg(0)?),
1777
82
            0x1a => visitor.visit_i32_atomic_store16(self.read_memarg(1)?),
1778
36
            0x1b => visitor.visit_i64_atomic_store8(self.read_memarg(0)?),
1779
194
            0x1c => visitor.visit_i64_atomic_store16(self.read_memarg(1)?),
1780
40
            0x1d => visitor.visit_i64_atomic_store32(self.read_memarg(2)?),
1781
54
            0x1e => visitor.visit_i32_atomic_rmw_add(self.read_memarg(2)?),
1782
80
            0x1f => visitor.visit_i64_atomic_rmw_add(self.read_memarg(3)?),
1783
58
            0x20 => visitor.visit_i32_atomic_rmw8_add_u(self.read_memarg(0)?),
1784
24
            0x21 => visitor.visit_i32_atomic_rmw16_add_u(self.read_memarg(1)?),
1785
308
            0x22 => visitor.visit_i64_atomic_rmw8_add_u(self.read_memarg(0)?),
1786
50
            0x23 => visitor.visit_i64_atomic_rmw16_add_u(self.read_memarg(1)?),
1787
80
            0x24 => visitor.visit_i64_atomic_rmw32_add_u(self.read_memarg(2)?),
1788
162
            0x25 => visitor.visit_i32_atomic_rmw_sub(self.read_memarg(2)?),
1789
72
            0x26 => visitor.visit_i64_atomic_rmw_sub(self.read_memarg(3)?),
1790
124
            0x27 => visitor.visit_i32_atomic_rmw8_sub_u(self.read_memarg(0)?),
1791
87
            0x28 => visitor.visit_i32_atomic_rmw16_sub_u(self.read_memarg(1)?),
1792
74
            0x29 => visitor.visit_i64_atomic_rmw8_sub_u(self.read_memarg(0)?),
1793
280
            0x2a => visitor.visit_i64_atomic_rmw16_sub_u(self.read_memarg(1)?),
1794
144
            0x2b => visitor.visit_i64_atomic_rmw32_sub_u(self.read_memarg(2)?),
1795
84
            0x2c => visitor.visit_i32_atomic_rmw_and(self.read_memarg(2)?),
1796
82
            0x2d => visitor.visit_i64_atomic_rmw_and(self.read_memarg(3)?),
1797
68
            0x2e => visitor.visit_i32_atomic_rmw8_and_u(self.read_memarg(0)?),
1798
76
            0x2f => visitor.visit_i32_atomic_rmw16_and_u(self.read_memarg(1)?),
1799
42
            0x30 => visitor.visit_i64_atomic_rmw8_and_u(self.read_memarg(0)?),
1800
52
            0x31 => visitor.visit_i64_atomic_rmw16_and_u(self.read_memarg(1)?),
1801
64
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1802
190
            0x33 => visitor.visit_i32_atomic_rmw_or(self.read_memarg(2)?),
1803
139
            0x34 => visitor.visit_i64_atomic_rmw_or(self.read_memarg(3)?),
1804
274
            0x35 => visitor.visit_i32_atomic_rmw8_or_u(self.read_memarg(0)?),
1805
36
            0x36 => visitor.visit_i32_atomic_rmw16_or_u(self.read_memarg(1)?),
1806
380
            0x37 => visitor.visit_i64_atomic_rmw8_or_u(self.read_memarg(0)?),
1807
156
            0x38 => visitor.visit_i64_atomic_rmw16_or_u(self.read_memarg(1)?),
1808
108
            0x39 => visitor.visit_i64_atomic_rmw32_or_u(self.read_memarg(2)?),
1809
340
            0x3a => visitor.visit_i32_atomic_rmw_xor(self.read_memarg(2)?),
1810
20
            0x3b => visitor.visit_i64_atomic_rmw_xor(self.read_memarg(3)?),
1811
424
            0x3c => visitor.visit_i32_atomic_rmw8_xor_u(self.read_memarg(0)?),
1812
136
            0x3d => visitor.visit_i32_atomic_rmw16_xor_u(self.read_memarg(1)?),
1813
94
            0x3e => visitor.visit_i64_atomic_rmw8_xor_u(self.read_memarg(0)?),
1814
42
            0x3f => visitor.visit_i64_atomic_rmw16_xor_u(self.read_memarg(1)?),
1815
62
            0x40 => visitor.visit_i64_atomic_rmw32_xor_u(self.read_memarg(2)?),
1816
18
            0x41 => visitor.visit_i32_atomic_rmw_xchg(self.read_memarg(2)?),
1817
188
            0x42 => visitor.visit_i64_atomic_rmw_xchg(self.read_memarg(3)?),
1818
166
            0x43 => visitor.visit_i32_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1819
128
            0x44 => visitor.visit_i32_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1820
86
            0x45 => visitor.visit_i64_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1821
38
            0x46 => visitor.visit_i64_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1822
74
            0x47 => visitor.visit_i64_atomic_rmw32_xchg_u(self.read_memarg(2)?),
1823
16
            0x48 => visitor.visit_i32_atomic_rmw_cmpxchg(self.read_memarg(2)?),
1824
2
            0x49 => visitor.visit_i64_atomic_rmw_cmpxchg(self.read_memarg(3)?),
1825
14
            0x4a => visitor.visit_i32_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1826
6
            0x4b => visitor.visit_i32_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1827
2
            0x4c => visitor.visit_i64_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1828
2
            0x4d => visitor.visit_i64_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1829
10
            0x4e => visitor.visit_i64_atomic_rmw32_cmpxchg_u(self.read_memarg(2)?),
1830
1831
            // Decode shared-everything-threads proposal.
1832
0
            0x4f => visitor.visit_global_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1833
0
            0x50 => visitor.visit_global_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1834
            0x51 => {
1835
0
                visitor.visit_global_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?)
1836
            }
1837
            0x52 => {
1838
0
                visitor.visit_global_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?)
1839
            }
1840
            0x53 => {
1841
0
                visitor.visit_global_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?)
1842
            }
1843
0
            0x54 => visitor.visit_global_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1844
            0x55 => {
1845
0
                visitor.visit_global_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?)
1846
            }
1847
            0x56 => {
1848
0
                visitor.visit_global_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1849
            }
1850
            0x57 => {
1851
0
                visitor.visit_global_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1852
            }
1853
0
            0x58 => visitor.visit_table_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1854
0
            0x59 => visitor.visit_table_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1855
            0x5a => {
1856
0
                visitor.visit_table_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1857
            }
1858
            0x5b => {
1859
0
                visitor.visit_table_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1860
            }
1861
0
            0x5c => visitor.visit_struct_atomic_get(
1862
0
                self.read_ordering()?,
1863
0
                self.read_var_u32()?,
1864
0
                self.read_var_u32()?,
1865
            ),
1866
0
            0x5d => visitor.visit_struct_atomic_get_s(
1867
0
                self.read_ordering()?,
1868
0
                self.read_var_u32()?,
1869
0
                self.read_var_u32()?,
1870
            ),
1871
0
            0x5e => visitor.visit_struct_atomic_get_u(
1872
0
                self.read_ordering()?,
1873
0
                self.read_var_u32()?,
1874
0
                self.read_var_u32()?,
1875
            ),
1876
0
            0x5f => visitor.visit_struct_atomic_set(
1877
0
                self.read_ordering()?,
1878
0
                self.read_var_u32()?,
1879
0
                self.read_var_u32()?,
1880
            ),
1881
0
            0x60 => visitor.visit_struct_atomic_rmw_add(
1882
0
                self.read_ordering()?,
1883
0
                self.read_var_u32()?,
1884
0
                self.read_var_u32()?,
1885
            ),
1886
0
            0x61 => visitor.visit_struct_atomic_rmw_sub(
1887
0
                self.read_ordering()?,
1888
0
                self.read_var_u32()?,
1889
0
                self.read_var_u32()?,
1890
            ),
1891
0
            0x62 => visitor.visit_struct_atomic_rmw_and(
1892
0
                self.read_ordering()?,
1893
0
                self.read_var_u32()?,
1894
0
                self.read_var_u32()?,
1895
            ),
1896
0
            0x63 => visitor.visit_struct_atomic_rmw_or(
1897
0
                self.read_ordering()?,
1898
0
                self.read_var_u32()?,
1899
0
                self.read_var_u32()?,
1900
            ),
1901
0
            0x64 => visitor.visit_struct_atomic_rmw_xor(
1902
0
                self.read_ordering()?,
1903
0
                self.read_var_u32()?,
1904
0
                self.read_var_u32()?,
1905
            ),
1906
0
            0x65 => visitor.visit_struct_atomic_rmw_xchg(
1907
0
                self.read_ordering()?,
1908
0
                self.read_var_u32()?,
1909
0
                self.read_var_u32()?,
1910
            ),
1911
0
            0x66 => visitor.visit_struct_atomic_rmw_cmpxchg(
1912
0
                self.read_ordering()?,
1913
0
                self.read_var_u32()?,
1914
0
                self.read_var_u32()?,
1915
            ),
1916
0
            0x67 => visitor.visit_array_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1917
0
            0x68 => visitor.visit_array_atomic_get_s(self.read_ordering()?, self.read_var_u32()?),
1918
0
            0x69 => visitor.visit_array_atomic_get_u(self.read_ordering()?, self.read_var_u32()?),
1919
0
            0x6a => visitor.visit_array_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1920
0
            0x6b => visitor.visit_array_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?),
1921
0
            0x6c => visitor.visit_array_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?),
1922
0
            0x6d => visitor.visit_array_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?),
1923
0
            0x6e => visitor.visit_array_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1924
0
            0x6f => visitor.visit_array_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?),
1925
            0x70 => {
1926
0
                visitor.visit_array_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1927
            }
1928
            0x71 => {
1929
0
                visitor.visit_array_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1930
            }
1931
4
            0x72 => visitor.visit_ref_i31_shared(),
1932
1933
0
            _ => bail!(pos, "unknown 0xfe subopcode: 0x{code:x}"),
1934
        })
1935
145k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfe_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wit_component::gc::Module>>
<wasmparser::binary_reader::BinaryReader>::visit_0xfe_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>
Line
Count
Source
1748
104k
    fn visit_0xfe_operator<T>(
1749
104k
        &mut self,
1750
104k
        pos: u64,
1751
104k
        visitor: &mut T,
1752
104k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1753
104k
    where
1754
104k
        T: VisitOperator<'a>,
1755
    {
1756
104k
        let code = self.read_var_u32()?;
1757
104k
        Ok(match code {
1758
57
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1759
2
            0x01 => visitor.visit_memory_atomic_wait32(self.read_memarg(2)?),
1760
2
            0x02 => visitor.visit_memory_atomic_wait64(self.read_memarg(3)?),
1761
            0x03 => {
1762
91.5k
                if self.read_u8()? != 0 {
1763
0
                    bail!(pos, "nonzero byte after `atomic.fence`");
1764
91.5k
                }
1765
91.5k
                visitor.visit_atomic_fence()
1766
            }
1767
1.23k
            0x10 => visitor.visit_i32_atomic_load(self.read_memarg(2)?),
1768
1.04k
            0x11 => visitor.visit_i64_atomic_load(self.read_memarg(3)?),
1769
937
            0x12 => visitor.visit_i32_atomic_load8_u(self.read_memarg(0)?),
1770
691
            0x13 => visitor.visit_i32_atomic_load16_u(self.read_memarg(1)?),
1771
727
            0x14 => visitor.visit_i64_atomic_load8_u(self.read_memarg(0)?),
1772
962
            0x15 => visitor.visit_i64_atomic_load16_u(self.read_memarg(1)?),
1773
574
            0x16 => visitor.visit_i64_atomic_load32_u(self.read_memarg(2)?),
1774
43
            0x17 => visitor.visit_i32_atomic_store(self.read_memarg(2)?),
1775
71
            0x18 => visitor.visit_i64_atomic_store(self.read_memarg(3)?),
1776
62
            0x19 => visitor.visit_i32_atomic_store8(self.read_memarg(0)?),
1777
93
            0x1a => visitor.visit_i32_atomic_store16(self.read_memarg(1)?),
1778
19
            0x1b => visitor.visit_i64_atomic_store8(self.read_memarg(0)?),
1779
110
            0x1c => visitor.visit_i64_atomic_store16(self.read_memarg(1)?),
1780
212
            0x1d => visitor.visit_i64_atomic_store32(self.read_memarg(2)?),
1781
40
            0x1e => visitor.visit_i32_atomic_rmw_add(self.read_memarg(2)?),
1782
48
            0x1f => visitor.visit_i64_atomic_rmw_add(self.read_memarg(3)?),
1783
31
            0x20 => visitor.visit_i32_atomic_rmw8_add_u(self.read_memarg(0)?),
1784
26
            0x21 => visitor.visit_i32_atomic_rmw16_add_u(self.read_memarg(1)?),
1785
186
            0x22 => visitor.visit_i64_atomic_rmw8_add_u(self.read_memarg(0)?),
1786
48
            0x23 => visitor.visit_i64_atomic_rmw16_add_u(self.read_memarg(1)?),
1787
47
            0x24 => visitor.visit_i64_atomic_rmw32_add_u(self.read_memarg(2)?),
1788
121
            0x25 => visitor.visit_i32_atomic_rmw_sub(self.read_memarg(2)?),
1789
67
            0x26 => visitor.visit_i64_atomic_rmw_sub(self.read_memarg(3)?),
1790
80
            0x27 => visitor.visit_i32_atomic_rmw8_sub_u(self.read_memarg(0)?),
1791
45
            0x28 => visitor.visit_i32_atomic_rmw16_sub_u(self.read_memarg(1)?),
1792
96
            0x29 => visitor.visit_i64_atomic_rmw8_sub_u(self.read_memarg(0)?),
1793
246
            0x2a => visitor.visit_i64_atomic_rmw16_sub_u(self.read_memarg(1)?),
1794
193
            0x2b => visitor.visit_i64_atomic_rmw32_sub_u(self.read_memarg(2)?),
1795
46
            0x2c => visitor.visit_i32_atomic_rmw_and(self.read_memarg(2)?),
1796
115
            0x2d => visitor.visit_i64_atomic_rmw_and(self.read_memarg(3)?),
1797
41
            0x2e => visitor.visit_i32_atomic_rmw8_and_u(self.read_memarg(0)?),
1798
46
            0x2f => visitor.visit_i32_atomic_rmw16_and_u(self.read_memarg(1)?),
1799
361
            0x30 => visitor.visit_i64_atomic_rmw8_and_u(self.read_memarg(0)?),
1800
41
            0x31 => visitor.visit_i64_atomic_rmw16_and_u(self.read_memarg(1)?),
1801
53
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1802
107
            0x33 => visitor.visit_i32_atomic_rmw_or(self.read_memarg(2)?),
1803
104
            0x34 => visitor.visit_i64_atomic_rmw_or(self.read_memarg(3)?),
1804
163
            0x35 => visitor.visit_i32_atomic_rmw8_or_u(self.read_memarg(0)?),
1805
37
            0x36 => visitor.visit_i32_atomic_rmw16_or_u(self.read_memarg(1)?),
1806
217
            0x37 => visitor.visit_i64_atomic_rmw8_or_u(self.read_memarg(0)?),
1807
95
            0x38 => visitor.visit_i64_atomic_rmw16_or_u(self.read_memarg(1)?),
1808
79
            0x39 => visitor.visit_i64_atomic_rmw32_or_u(self.read_memarg(2)?),
1809
184
            0x3a => visitor.visit_i32_atomic_rmw_xor(self.read_memarg(2)?),
1810
115
            0x3b => visitor.visit_i64_atomic_rmw_xor(self.read_memarg(3)?),
1811
217
            0x3c => visitor.visit_i32_atomic_rmw8_xor_u(self.read_memarg(0)?),
1812
72
            0x3d => visitor.visit_i32_atomic_rmw16_xor_u(self.read_memarg(1)?),
1813
42
            0x3e => visitor.visit_i64_atomic_rmw8_xor_u(self.read_memarg(0)?),
1814
72
            0x3f => visitor.visit_i64_atomic_rmw16_xor_u(self.read_memarg(1)?),
1815
1.54k
            0x40 => visitor.visit_i64_atomic_rmw32_xor_u(self.read_memarg(2)?),
1816
16
            0x41 => visitor.visit_i32_atomic_rmw_xchg(self.read_memarg(2)?),
1817
105
            0x42 => visitor.visit_i64_atomic_rmw_xchg(self.read_memarg(3)?),
1818
187
            0x43 => visitor.visit_i32_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1819
91
            0x44 => visitor.visit_i32_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1820
136
            0x45 => visitor.visit_i64_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1821
304
            0x46 => visitor.visit_i64_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1822
81
            0x47 => visitor.visit_i64_atomic_rmw32_xchg_u(self.read_memarg(2)?),
1823
8
            0x48 => visitor.visit_i32_atomic_rmw_cmpxchg(self.read_memarg(2)?),
1824
1
            0x49 => visitor.visit_i64_atomic_rmw_cmpxchg(self.read_memarg(3)?),
1825
7
            0x4a => visitor.visit_i32_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1826
3
            0x4b => visitor.visit_i32_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1827
8
            0x4c => visitor.visit_i64_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1828
1
            0x4d => visitor.visit_i64_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1829
5
            0x4e => visitor.visit_i64_atomic_rmw32_cmpxchg_u(self.read_memarg(2)?),
1830
1831
            // Decode shared-everything-threads proposal.
1832
0
            0x4f => visitor.visit_global_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1833
0
            0x50 => visitor.visit_global_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1834
            0x51 => {
1835
0
                visitor.visit_global_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?)
1836
            }
1837
            0x52 => {
1838
0
                visitor.visit_global_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?)
1839
            }
1840
            0x53 => {
1841
0
                visitor.visit_global_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?)
1842
            }
1843
0
            0x54 => visitor.visit_global_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1844
            0x55 => {
1845
0
                visitor.visit_global_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?)
1846
            }
1847
            0x56 => {
1848
0
                visitor.visit_global_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1849
            }
1850
            0x57 => {
1851
0
                visitor.visit_global_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1852
            }
1853
0
            0x58 => visitor.visit_table_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1854
0
            0x59 => visitor.visit_table_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1855
            0x5a => {
1856
0
                visitor.visit_table_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1857
            }
1858
            0x5b => {
1859
0
                visitor.visit_table_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1860
            }
1861
0
            0x5c => visitor.visit_struct_atomic_get(
1862
0
                self.read_ordering()?,
1863
0
                self.read_var_u32()?,
1864
0
                self.read_var_u32()?,
1865
            ),
1866
0
            0x5d => visitor.visit_struct_atomic_get_s(
1867
0
                self.read_ordering()?,
1868
0
                self.read_var_u32()?,
1869
0
                self.read_var_u32()?,
1870
            ),
1871
0
            0x5e => visitor.visit_struct_atomic_get_u(
1872
0
                self.read_ordering()?,
1873
0
                self.read_var_u32()?,
1874
0
                self.read_var_u32()?,
1875
            ),
1876
0
            0x5f => visitor.visit_struct_atomic_set(
1877
0
                self.read_ordering()?,
1878
0
                self.read_var_u32()?,
1879
0
                self.read_var_u32()?,
1880
            ),
1881
0
            0x60 => visitor.visit_struct_atomic_rmw_add(
1882
0
                self.read_ordering()?,
1883
0
                self.read_var_u32()?,
1884
0
                self.read_var_u32()?,
1885
            ),
1886
0
            0x61 => visitor.visit_struct_atomic_rmw_sub(
1887
0
                self.read_ordering()?,
1888
0
                self.read_var_u32()?,
1889
0
                self.read_var_u32()?,
1890
            ),
1891
0
            0x62 => visitor.visit_struct_atomic_rmw_and(
1892
0
                self.read_ordering()?,
1893
0
                self.read_var_u32()?,
1894
0
                self.read_var_u32()?,
1895
            ),
1896
0
            0x63 => visitor.visit_struct_atomic_rmw_or(
1897
0
                self.read_ordering()?,
1898
0
                self.read_var_u32()?,
1899
0
                self.read_var_u32()?,
1900
            ),
1901
0
            0x64 => visitor.visit_struct_atomic_rmw_xor(
1902
0
                self.read_ordering()?,
1903
0
                self.read_var_u32()?,
1904
0
                self.read_var_u32()?,
1905
            ),
1906
0
            0x65 => visitor.visit_struct_atomic_rmw_xchg(
1907
0
                self.read_ordering()?,
1908
0
                self.read_var_u32()?,
1909
0
                self.read_var_u32()?,
1910
            ),
1911
0
            0x66 => visitor.visit_struct_atomic_rmw_cmpxchg(
1912
0
                self.read_ordering()?,
1913
0
                self.read_var_u32()?,
1914
0
                self.read_var_u32()?,
1915
            ),
1916
0
            0x67 => visitor.visit_array_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1917
0
            0x68 => visitor.visit_array_atomic_get_s(self.read_ordering()?, self.read_var_u32()?),
1918
0
            0x69 => visitor.visit_array_atomic_get_u(self.read_ordering()?, self.read_var_u32()?),
1919
0
            0x6a => visitor.visit_array_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1920
0
            0x6b => visitor.visit_array_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?),
1921
0
            0x6c => visitor.visit_array_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?),
1922
0
            0x6d => visitor.visit_array_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?),
1923
0
            0x6e => visitor.visit_array_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1924
0
            0x6f => visitor.visit_array_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?),
1925
            0x70 => {
1926
0
                visitor.visit_array_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1927
            }
1928
            0x71 => {
1929
0
                visitor.visit_array_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1930
            }
1931
0
            0x72 => visitor.visit_ref_i31_shared(),
1932
1933
0
            _ => bail!(pos, "unknown 0xfe subopcode: 0x{code:x}"),
1934
        })
1935
104k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfe_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
1748
93.7k
    fn visit_0xfe_operator<T>(
1749
93.7k
        &mut self,
1750
93.7k
        pos: u64,
1751
93.7k
        visitor: &mut T,
1752
93.7k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1753
93.7k
    where
1754
93.7k
        T: VisitOperator<'a>,
1755
    {
1756
93.7k
        let code = self.read_var_u32()?;
1757
93.7k
        Ok(match code {
1758
49
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1759
2
            0x01 => visitor.visit_memory_atomic_wait32(self.read_memarg(2)?),
1760
2
            0x02 => visitor.visit_memory_atomic_wait64(self.read_memarg(3)?),
1761
            0x03 => {
1762
84.7k
                if self.read_u8()? != 0 {
1763
0
                    bail!(pos, "nonzero byte after `atomic.fence`");
1764
84.7k
                }
1765
84.7k
                visitor.visit_atomic_fence()
1766
            }
1767
1.06k
            0x10 => visitor.visit_i32_atomic_load(self.read_memarg(2)?),
1768
502
            0x11 => visitor.visit_i64_atomic_load(self.read_memarg(3)?),
1769
929
            0x12 => visitor.visit_i32_atomic_load8_u(self.read_memarg(0)?),
1770
419
            0x13 => visitor.visit_i32_atomic_load16_u(self.read_memarg(1)?),
1771
557
            0x14 => visitor.visit_i64_atomic_load8_u(self.read_memarg(0)?),
1772
587
            0x15 => visitor.visit_i64_atomic_load16_u(self.read_memarg(1)?),
1773
368
            0x16 => visitor.visit_i64_atomic_load32_u(self.read_memarg(2)?),
1774
38
            0x17 => visitor.visit_i32_atomic_store(self.read_memarg(2)?),
1775
92
            0x18 => visitor.visit_i64_atomic_store(self.read_memarg(3)?),
1776
92
            0x19 => visitor.visit_i32_atomic_store8(self.read_memarg(0)?),
1777
59
            0x1a => visitor.visit_i32_atomic_store16(self.read_memarg(1)?),
1778
26
            0x1b => visitor.visit_i64_atomic_store8(self.read_memarg(0)?),
1779
114
            0x1c => visitor.visit_i64_atomic_store16(self.read_memarg(1)?),
1780
68
            0x1d => visitor.visit_i64_atomic_store32(self.read_memarg(2)?),
1781
79
            0x1e => visitor.visit_i32_atomic_rmw_add(self.read_memarg(2)?),
1782
58
            0x1f => visitor.visit_i64_atomic_rmw_add(self.read_memarg(3)?),
1783
36
            0x20 => visitor.visit_i32_atomic_rmw8_add_u(self.read_memarg(0)?),
1784
19
            0x21 => visitor.visit_i32_atomic_rmw16_add_u(self.read_memarg(1)?),
1785
171
            0x22 => visitor.visit_i64_atomic_rmw8_add_u(self.read_memarg(0)?),
1786
41
            0x23 => visitor.visit_i64_atomic_rmw16_add_u(self.read_memarg(1)?),
1787
46
            0x24 => visitor.visit_i64_atomic_rmw32_add_u(self.read_memarg(2)?),
1788
82
            0x25 => visitor.visit_i32_atomic_rmw_sub(self.read_memarg(2)?),
1789
48
            0x26 => visitor.visit_i64_atomic_rmw_sub(self.read_memarg(3)?),
1790
93
            0x27 => visitor.visit_i32_atomic_rmw8_sub_u(self.read_memarg(0)?),
1791
47
            0x28 => visitor.visit_i32_atomic_rmw16_sub_u(self.read_memarg(1)?),
1792
39
            0x29 => visitor.visit_i64_atomic_rmw8_sub_u(self.read_memarg(0)?),
1793
235
            0x2a => visitor.visit_i64_atomic_rmw16_sub_u(self.read_memarg(1)?),
1794
203
            0x2b => visitor.visit_i64_atomic_rmw32_sub_u(self.read_memarg(2)?),
1795
51
            0x2c => visitor.visit_i32_atomic_rmw_and(self.read_memarg(2)?),
1796
60
            0x2d => visitor.visit_i64_atomic_rmw_and(self.read_memarg(3)?),
1797
49
            0x2e => visitor.visit_i32_atomic_rmw8_and_u(self.read_memarg(0)?),
1798
46
            0x2f => visitor.visit_i32_atomic_rmw16_and_u(self.read_memarg(1)?),
1799
563
            0x30 => visitor.visit_i64_atomic_rmw8_and_u(self.read_memarg(0)?),
1800
52
            0x31 => visitor.visit_i64_atomic_rmw16_and_u(self.read_memarg(1)?),
1801
36
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1802
98
            0x33 => visitor.visit_i32_atomic_rmw_or(self.read_memarg(2)?),
1803
74
            0x34 => visitor.visit_i64_atomic_rmw_or(self.read_memarg(3)?),
1804
145
            0x35 => visitor.visit_i32_atomic_rmw8_or_u(self.read_memarg(0)?),
1805
29
            0x36 => visitor.visit_i32_atomic_rmw16_or_u(self.read_memarg(1)?),
1806
206
            0x37 => visitor.visit_i64_atomic_rmw8_or_u(self.read_memarg(0)?),
1807
108
            0x38 => visitor.visit_i64_atomic_rmw16_or_u(self.read_memarg(1)?),
1808
65
            0x39 => visitor.visit_i64_atomic_rmw32_or_u(self.read_memarg(2)?),
1809
174
            0x3a => visitor.visit_i32_atomic_rmw_xor(self.read_memarg(2)?),
1810
95
            0x3b => visitor.visit_i64_atomic_rmw_xor(self.read_memarg(3)?),
1811
218
            0x3c => visitor.visit_i32_atomic_rmw8_xor_u(self.read_memarg(0)?),
1812
72
            0x3d => visitor.visit_i32_atomic_rmw16_xor_u(self.read_memarg(1)?),
1813
64
            0x3e => visitor.visit_i64_atomic_rmw8_xor_u(self.read_memarg(0)?),
1814
40
            0x3f => visitor.visit_i64_atomic_rmw16_xor_u(self.read_memarg(1)?),
1815
81
            0x40 => visitor.visit_i64_atomic_rmw32_xor_u(self.read_memarg(2)?),
1816
11
            0x41 => visitor.visit_i32_atomic_rmw_xchg(self.read_memarg(2)?),
1817
96
            0x42 => visitor.visit_i64_atomic_rmw_xchg(self.read_memarg(3)?),
1818
178
            0x43 => visitor.visit_i32_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1819
69
            0x44 => visitor.visit_i32_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1820
68
            0x45 => visitor.visit_i64_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1821
53
            0x46 => visitor.visit_i64_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1822
47
            0x47 => visitor.visit_i64_atomic_rmw32_xchg_u(self.read_memarg(2)?),
1823
8
            0x48 => visitor.visit_i32_atomic_rmw_cmpxchg(self.read_memarg(2)?),
1824
2
            0x49 => visitor.visit_i64_atomic_rmw_cmpxchg(self.read_memarg(3)?),
1825
7
            0x4a => visitor.visit_i32_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1826
3
            0x4b => visitor.visit_i32_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1827
15
            0x4c => visitor.visit_i64_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1828
1
            0x4d => visitor.visit_i64_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1829
5
            0x4e => visitor.visit_i64_atomic_rmw32_cmpxchg_u(self.read_memarg(2)?),
1830
1831
            // Decode shared-everything-threads proposal.
1832
0
            0x4f => visitor.visit_global_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1833
0
            0x50 => visitor.visit_global_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1834
            0x51 => {
1835
0
                visitor.visit_global_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?)
1836
            }
1837
            0x52 => {
1838
0
                visitor.visit_global_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?)
1839
            }
1840
            0x53 => {
1841
0
                visitor.visit_global_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?)
1842
            }
1843
0
            0x54 => visitor.visit_global_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1844
            0x55 => {
1845
0
                visitor.visit_global_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?)
1846
            }
1847
            0x56 => {
1848
0
                visitor.visit_global_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1849
            }
1850
            0x57 => {
1851
0
                visitor.visit_global_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1852
            }
1853
0
            0x58 => visitor.visit_table_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1854
0
            0x59 => visitor.visit_table_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1855
            0x5a => {
1856
0
                visitor.visit_table_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1857
            }
1858
            0x5b => {
1859
0
                visitor.visit_table_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1860
            }
1861
0
            0x5c => visitor.visit_struct_atomic_get(
1862
0
                self.read_ordering()?,
1863
0
                self.read_var_u32()?,
1864
0
                self.read_var_u32()?,
1865
            ),
1866
0
            0x5d => visitor.visit_struct_atomic_get_s(
1867
0
                self.read_ordering()?,
1868
0
                self.read_var_u32()?,
1869
0
                self.read_var_u32()?,
1870
            ),
1871
0
            0x5e => visitor.visit_struct_atomic_get_u(
1872
0
                self.read_ordering()?,
1873
0
                self.read_var_u32()?,
1874
0
                self.read_var_u32()?,
1875
            ),
1876
0
            0x5f => visitor.visit_struct_atomic_set(
1877
0
                self.read_ordering()?,
1878
0
                self.read_var_u32()?,
1879
0
                self.read_var_u32()?,
1880
            ),
1881
0
            0x60 => visitor.visit_struct_atomic_rmw_add(
1882
0
                self.read_ordering()?,
1883
0
                self.read_var_u32()?,
1884
0
                self.read_var_u32()?,
1885
            ),
1886
0
            0x61 => visitor.visit_struct_atomic_rmw_sub(
1887
0
                self.read_ordering()?,
1888
0
                self.read_var_u32()?,
1889
0
                self.read_var_u32()?,
1890
            ),
1891
0
            0x62 => visitor.visit_struct_atomic_rmw_and(
1892
0
                self.read_ordering()?,
1893
0
                self.read_var_u32()?,
1894
0
                self.read_var_u32()?,
1895
            ),
1896
0
            0x63 => visitor.visit_struct_atomic_rmw_or(
1897
0
                self.read_ordering()?,
1898
0
                self.read_var_u32()?,
1899
0
                self.read_var_u32()?,
1900
            ),
1901
0
            0x64 => visitor.visit_struct_atomic_rmw_xor(
1902
0
                self.read_ordering()?,
1903
0
                self.read_var_u32()?,
1904
0
                self.read_var_u32()?,
1905
            ),
1906
0
            0x65 => visitor.visit_struct_atomic_rmw_xchg(
1907
0
                self.read_ordering()?,
1908
0
                self.read_var_u32()?,
1909
0
                self.read_var_u32()?,
1910
            ),
1911
0
            0x66 => visitor.visit_struct_atomic_rmw_cmpxchg(
1912
0
                self.read_ordering()?,
1913
0
                self.read_var_u32()?,
1914
0
                self.read_var_u32()?,
1915
            ),
1916
0
            0x67 => visitor.visit_array_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1917
0
            0x68 => visitor.visit_array_atomic_get_s(self.read_ordering()?, self.read_var_u32()?),
1918
0
            0x69 => visitor.visit_array_atomic_get_u(self.read_ordering()?, self.read_var_u32()?),
1919
0
            0x6a => visitor.visit_array_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1920
0
            0x6b => visitor.visit_array_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?),
1921
0
            0x6c => visitor.visit_array_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?),
1922
0
            0x6d => visitor.visit_array_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?),
1923
0
            0x6e => visitor.visit_array_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1924
0
            0x6f => visitor.visit_array_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?),
1925
            0x70 => {
1926
0
                visitor.visit_array_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1927
            }
1928
            0x71 => {
1929
0
                visitor.visit_array_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1930
            }
1931
8
            0x72 => visitor.visit_ref_i31_shared(),
1932
1933
0
            _ => bail!(pos, "unknown 0xfe subopcode: 0x{code:x}"),
1934
        })
1935
93.7k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfe_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
Line
Count
Source
1748
2
    fn visit_0xfe_operator<T>(
1749
2
        &mut self,
1750
2
        pos: u64,
1751
2
        visitor: &mut T,
1752
2
    ) -> Result<<T as VisitOperator<'a>>::Output>
1753
2
    where
1754
2
        T: VisitOperator<'a>,
1755
    {
1756
2
        let code = self.read_var_u32()?;
1757
2
        Ok(match code {
1758
0
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1759
0
            0x01 => visitor.visit_memory_atomic_wait32(self.read_memarg(2)?),
1760
0
            0x02 => visitor.visit_memory_atomic_wait64(self.read_memarg(3)?),
1761
            0x03 => {
1762
0
                if self.read_u8()? != 0 {
1763
0
                    bail!(pos, "nonzero byte after `atomic.fence`");
1764
0
                }
1765
0
                visitor.visit_atomic_fence()
1766
            }
1767
0
            0x10 => visitor.visit_i32_atomic_load(self.read_memarg(2)?),
1768
0
            0x11 => visitor.visit_i64_atomic_load(self.read_memarg(3)?),
1769
0
            0x12 => visitor.visit_i32_atomic_load8_u(self.read_memarg(0)?),
1770
0
            0x13 => visitor.visit_i32_atomic_load16_u(self.read_memarg(1)?),
1771
0
            0x14 => visitor.visit_i64_atomic_load8_u(self.read_memarg(0)?),
1772
0
            0x15 => visitor.visit_i64_atomic_load16_u(self.read_memarg(1)?),
1773
0
            0x16 => visitor.visit_i64_atomic_load32_u(self.read_memarg(2)?),
1774
0
            0x17 => visitor.visit_i32_atomic_store(self.read_memarg(2)?),
1775
0
            0x18 => visitor.visit_i64_atomic_store(self.read_memarg(3)?),
1776
0
            0x19 => visitor.visit_i32_atomic_store8(self.read_memarg(0)?),
1777
0
            0x1a => visitor.visit_i32_atomic_store16(self.read_memarg(1)?),
1778
0
            0x1b => visitor.visit_i64_atomic_store8(self.read_memarg(0)?),
1779
0
            0x1c => visitor.visit_i64_atomic_store16(self.read_memarg(1)?),
1780
0
            0x1d => visitor.visit_i64_atomic_store32(self.read_memarg(2)?),
1781
0
            0x1e => visitor.visit_i32_atomic_rmw_add(self.read_memarg(2)?),
1782
0
            0x1f => visitor.visit_i64_atomic_rmw_add(self.read_memarg(3)?),
1783
0
            0x20 => visitor.visit_i32_atomic_rmw8_add_u(self.read_memarg(0)?),
1784
0
            0x21 => visitor.visit_i32_atomic_rmw16_add_u(self.read_memarg(1)?),
1785
0
            0x22 => visitor.visit_i64_atomic_rmw8_add_u(self.read_memarg(0)?),
1786
0
            0x23 => visitor.visit_i64_atomic_rmw16_add_u(self.read_memarg(1)?),
1787
0
            0x24 => visitor.visit_i64_atomic_rmw32_add_u(self.read_memarg(2)?),
1788
0
            0x25 => visitor.visit_i32_atomic_rmw_sub(self.read_memarg(2)?),
1789
0
            0x26 => visitor.visit_i64_atomic_rmw_sub(self.read_memarg(3)?),
1790
0
            0x27 => visitor.visit_i32_atomic_rmw8_sub_u(self.read_memarg(0)?),
1791
0
            0x28 => visitor.visit_i32_atomic_rmw16_sub_u(self.read_memarg(1)?),
1792
0
            0x29 => visitor.visit_i64_atomic_rmw8_sub_u(self.read_memarg(0)?),
1793
0
            0x2a => visitor.visit_i64_atomic_rmw16_sub_u(self.read_memarg(1)?),
1794
0
            0x2b => visitor.visit_i64_atomic_rmw32_sub_u(self.read_memarg(2)?),
1795
0
            0x2c => visitor.visit_i32_atomic_rmw_and(self.read_memarg(2)?),
1796
0
            0x2d => visitor.visit_i64_atomic_rmw_and(self.read_memarg(3)?),
1797
0
            0x2e => visitor.visit_i32_atomic_rmw8_and_u(self.read_memarg(0)?),
1798
0
            0x2f => visitor.visit_i32_atomic_rmw16_and_u(self.read_memarg(1)?),
1799
0
            0x30 => visitor.visit_i64_atomic_rmw8_and_u(self.read_memarg(0)?),
1800
0
            0x31 => visitor.visit_i64_atomic_rmw16_and_u(self.read_memarg(1)?),
1801
0
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1802
0
            0x33 => visitor.visit_i32_atomic_rmw_or(self.read_memarg(2)?),
1803
0
            0x34 => visitor.visit_i64_atomic_rmw_or(self.read_memarg(3)?),
1804
0
            0x35 => visitor.visit_i32_atomic_rmw8_or_u(self.read_memarg(0)?),
1805
0
            0x36 => visitor.visit_i32_atomic_rmw16_or_u(self.read_memarg(1)?),
1806
0
            0x37 => visitor.visit_i64_atomic_rmw8_or_u(self.read_memarg(0)?),
1807
0
            0x38 => visitor.visit_i64_atomic_rmw16_or_u(self.read_memarg(1)?),
1808
0
            0x39 => visitor.visit_i64_atomic_rmw32_or_u(self.read_memarg(2)?),
1809
0
            0x3a => visitor.visit_i32_atomic_rmw_xor(self.read_memarg(2)?),
1810
0
            0x3b => visitor.visit_i64_atomic_rmw_xor(self.read_memarg(3)?),
1811
0
            0x3c => visitor.visit_i32_atomic_rmw8_xor_u(self.read_memarg(0)?),
1812
0
            0x3d => visitor.visit_i32_atomic_rmw16_xor_u(self.read_memarg(1)?),
1813
0
            0x3e => visitor.visit_i64_atomic_rmw8_xor_u(self.read_memarg(0)?),
1814
0
            0x3f => visitor.visit_i64_atomic_rmw16_xor_u(self.read_memarg(1)?),
1815
0
            0x40 => visitor.visit_i64_atomic_rmw32_xor_u(self.read_memarg(2)?),
1816
0
            0x41 => visitor.visit_i32_atomic_rmw_xchg(self.read_memarg(2)?),
1817
0
            0x42 => visitor.visit_i64_atomic_rmw_xchg(self.read_memarg(3)?),
1818
0
            0x43 => visitor.visit_i32_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1819
0
            0x44 => visitor.visit_i32_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1820
0
            0x45 => visitor.visit_i64_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1821
0
            0x46 => visitor.visit_i64_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1822
0
            0x47 => visitor.visit_i64_atomic_rmw32_xchg_u(self.read_memarg(2)?),
1823
0
            0x48 => visitor.visit_i32_atomic_rmw_cmpxchg(self.read_memarg(2)?),
1824
0
            0x49 => visitor.visit_i64_atomic_rmw_cmpxchg(self.read_memarg(3)?),
1825
0
            0x4a => visitor.visit_i32_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1826
0
            0x4b => visitor.visit_i32_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1827
0
            0x4c => visitor.visit_i64_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1828
0
            0x4d => visitor.visit_i64_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1829
0
            0x4e => visitor.visit_i64_atomic_rmw32_cmpxchg_u(self.read_memarg(2)?),
1830
1831
            // Decode shared-everything-threads proposal.
1832
0
            0x4f => visitor.visit_global_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1833
0
            0x50 => visitor.visit_global_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1834
            0x51 => {
1835
0
                visitor.visit_global_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?)
1836
            }
1837
            0x52 => {
1838
0
                visitor.visit_global_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?)
1839
            }
1840
            0x53 => {
1841
0
                visitor.visit_global_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?)
1842
            }
1843
0
            0x54 => visitor.visit_global_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1844
            0x55 => {
1845
0
                visitor.visit_global_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?)
1846
            }
1847
            0x56 => {
1848
0
                visitor.visit_global_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1849
            }
1850
            0x57 => {
1851
0
                visitor.visit_global_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1852
            }
1853
0
            0x58 => visitor.visit_table_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1854
0
            0x59 => visitor.visit_table_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1855
            0x5a => {
1856
0
                visitor.visit_table_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1857
            }
1858
            0x5b => {
1859
0
                visitor.visit_table_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1860
            }
1861
0
            0x5c => visitor.visit_struct_atomic_get(
1862
0
                self.read_ordering()?,
1863
0
                self.read_var_u32()?,
1864
0
                self.read_var_u32()?,
1865
            ),
1866
0
            0x5d => visitor.visit_struct_atomic_get_s(
1867
0
                self.read_ordering()?,
1868
0
                self.read_var_u32()?,
1869
0
                self.read_var_u32()?,
1870
            ),
1871
0
            0x5e => visitor.visit_struct_atomic_get_u(
1872
0
                self.read_ordering()?,
1873
0
                self.read_var_u32()?,
1874
0
                self.read_var_u32()?,
1875
            ),
1876
0
            0x5f => visitor.visit_struct_atomic_set(
1877
0
                self.read_ordering()?,
1878
0
                self.read_var_u32()?,
1879
0
                self.read_var_u32()?,
1880
            ),
1881
0
            0x60 => visitor.visit_struct_atomic_rmw_add(
1882
0
                self.read_ordering()?,
1883
0
                self.read_var_u32()?,
1884
0
                self.read_var_u32()?,
1885
            ),
1886
0
            0x61 => visitor.visit_struct_atomic_rmw_sub(
1887
0
                self.read_ordering()?,
1888
0
                self.read_var_u32()?,
1889
0
                self.read_var_u32()?,
1890
            ),
1891
0
            0x62 => visitor.visit_struct_atomic_rmw_and(
1892
0
                self.read_ordering()?,
1893
0
                self.read_var_u32()?,
1894
0
                self.read_var_u32()?,
1895
            ),
1896
0
            0x63 => visitor.visit_struct_atomic_rmw_or(
1897
0
                self.read_ordering()?,
1898
0
                self.read_var_u32()?,
1899
0
                self.read_var_u32()?,
1900
            ),
1901
0
            0x64 => visitor.visit_struct_atomic_rmw_xor(
1902
0
                self.read_ordering()?,
1903
0
                self.read_var_u32()?,
1904
0
                self.read_var_u32()?,
1905
            ),
1906
0
            0x65 => visitor.visit_struct_atomic_rmw_xchg(
1907
0
                self.read_ordering()?,
1908
0
                self.read_var_u32()?,
1909
0
                self.read_var_u32()?,
1910
            ),
1911
0
            0x66 => visitor.visit_struct_atomic_rmw_cmpxchg(
1912
0
                self.read_ordering()?,
1913
0
                self.read_var_u32()?,
1914
0
                self.read_var_u32()?,
1915
            ),
1916
0
            0x67 => visitor.visit_array_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1917
0
            0x68 => visitor.visit_array_atomic_get_s(self.read_ordering()?, self.read_var_u32()?),
1918
0
            0x69 => visitor.visit_array_atomic_get_u(self.read_ordering()?, self.read_var_u32()?),
1919
0
            0x6a => visitor.visit_array_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1920
0
            0x6b => visitor.visit_array_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?),
1921
0
            0x6c => visitor.visit_array_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?),
1922
0
            0x6d => visitor.visit_array_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?),
1923
0
            0x6e => visitor.visit_array_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1924
0
            0x6f => visitor.visit_array_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?),
1925
            0x70 => {
1926
0
                visitor.visit_array_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1927
            }
1928
            0x71 => {
1929
0
                visitor.visit_array_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1930
            }
1931
2
            0x72 => visitor.visit_ref_i31_shared(),
1932
1933
0
            _ => bail!(pos, "unknown 0xfe subopcode: 0x{code:x}"),
1934
        })
1935
2
    }
1936
1937
280k
    fn read_memarg(&mut self, max_align: u8) -> Result<MemArg> {
1938
280k
        let flags_pos = self.original_position();
1939
280k
        let mut flags = self.read_var_u32()?;
1940
1941
280k
        let memory = if self.multi_memory() && flags & (1 << 6) != 0 {
1942
220k
            flags ^= 1 << 6;
1943
220k
            self.read_var_u32()?
1944
        } else {
1945
60.0k
            0
1946
        };
1947
280k
        let max_flag_bits = if self.multi_memory() { 6 } else { 5 };
1948
280k
        if flags >= (1 << max_flag_bits) {
1949
2
            return Err(Error::new(
1950
2
                "malformed memop alignment: alignment too large",
1951
2
                flags_pos,
1952
2
            ));
1953
280k
        }
1954
280k
        let align = flags as u8;
1955
280k
        let offset = if self.memory64() {
1956
278k
            self.read_var_u64()?
1957
        } else {
1958
2.73k
            u64::from(self.read_var_u32()?)
1959
        };
1960
280k
        Ok(MemArg {
1961
280k
            align,
1962
280k
            max_align,
1963
280k
            offset,
1964
280k
            memory,
1965
280k
        })
1966
280k
    }
1967
1968
0
    fn read_ordering(&mut self) -> Result<Ordering> {
1969
0
        let byte = self.read_var_u32()?;
1970
0
        match byte {
1971
0
            0 => Ok(Ordering::SeqCst),
1972
0
            1 => Ok(Ordering::AcqRel),
1973
0
            x => Err(Error::new(
1974
0
                format!("invalid atomic consistency ordering {x}"),
1975
0
                self.original_position() - 1,
1976
0
            )),
1977
        }
1978
0
    }
1979
1980
8.69k
    fn read_br_table(&mut self) -> Result<BrTable<'a>> {
1981
8.69k
        let cnt = self.read_size(MAX_WASM_BR_TABLE_SIZE, "br_table")?;
1982
8.69k
        let reader = self.skip(|reader| {
1983
8.69k
            for _ in 0..cnt {
1984
41.2k
                reader.read_var_u32()?;
1985
            }
1986
8.69k
            Ok(())
1987
8.69k
        })?;
1988
8.69k
        let default = self.read_var_u32()?;
1989
8.69k
        Ok(BrTable {
1990
8.69k
            reader,
1991
8.69k
            cnt: cnt as u32,
1992
8.69k
            default,
1993
8.69k
        })
1994
8.69k
    }
1995
1996
    #[cfg(feature = "simd")]
1997
11.9k
    fn read_lane_index(&mut self) -> Result<u8> {
1998
11.9k
        self.read_u8()
1999
11.9k
    }
2000
2001
    #[cfg(feature = "simd")]
2002
204k
    fn read_v128(&mut self) -> Result<V128> {
2003
204k
        let mut bytes = [0; 16];
2004
204k
        bytes.clone_from_slice(self.read_bytes(16)?);
2005
204k
        Ok(V128(bytes))
2006
204k
    }
2007
2008
205k
    fn read_memory_index_or_zero_if_not_multi_memory(&mut self) -> Result<u32> {
2009
205k
        if self.multi_memory() {
2010
205k
            self.read_var_u32()
2011
        } else {
2012
            // Before bulk memory this byte was required to be a single zero
2013
            // byte, not a LEB-encoded zero, so require a precise zero byte.
2014
644
            match self.read_u8()? {
2015
644
                0 => Ok(0),
2016
0
                _ => bail!(self.original_position() - 1, "zero byte expected"),
2017
            }
2018
        }
2019
205k
    }
2020
2021
978
    fn read_call_indirect_table_immediate(&mut self) -> Result<u32> {
2022
        // If the `call_indirect_overlong` feature is enabled, then read this
2023
        // immediate as a LEB. This feature is enabled as part of the
2024
        // `reference_types` feature or the `lime1` feature.
2025
978
        if self.call_indirect_overlong() {
2026
915
            return self.read_var_u32();
2027
63
        }
2028
2029
        // Before reference types this byte was required to be a single zero
2030
        // byte, not a LEB-encoded zero, so require a precise zero byte.
2031
63
        match self.read_u8()? {
2032
63
            0 => Ok(0),
2033
0
            _ => bail!(self.original_position() - 1, "zero byte expected"),
2034
        }
2035
978
    }
2036
}
2037
2038
#[cfg(test)]
2039
mod tests {
2040
    use super::*;
2041
2042
    macro_rules! assert_matches {
2043
        ($a:expr, $b:pat $(,)?) => {
2044
            match $a {
2045
                $b => {}
2046
                a => panic!("`{:?}` doesn't match `{}`", a, stringify!($b)),
2047
            }
2048
        };
2049
    }
2050
2051
    #[test]
2052
    #[should_panic = "too large"]
2053
    fn panic_on_large_offsets() {
2054
        assert!(
2055
            BinaryReader::max_data_len(u64::MAX) == 0,
2056
            "must not accept data at offset 0x{:x}",
2057
            u64::MAX
2058
        );
2059
        let _rdr = BinaryReader::new(&[10], u64::MAX);
2060
    }
2061
2062
    #[test]
2063
    fn can_parse_on_large_offset() {
2064
        let large_offset = u64::from(u32::MAX) + 1;
2065
        assert!(BinaryReader::max_data_len(large_offset) > 1);
2066
        let mut rdr = BinaryReader::new(&[10], large_offset);
2067
        assert_matches!(rdr.read_u8(), Ok(10));
2068
    }
2069
}