Coverage Report

Created: 2026-10-12 08:10

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
2.86M
    pub fn new(data: &[u8], original_offset: u64) -> BinaryReader<'_> {
65
2.86M
        let max_len = Self::max_data_len(original_offset);
66
2.86M
        if max_len < data.len() {
67
0
            panic_too_many_bytes(original_offset, data.len(), max_len);
68
2.86M
        }
69
2.86M
        BinaryReader {
70
2.86M
            buffer: data,
71
2.86M
            position: 0,
72
2.86M
            original_offset,
73
2.86M
            #[cfg(feature = "features")]
74
2.86M
            features: WasmFeatures::all(),
75
2.86M
        }
76
2.86M
    }
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
2.86M
    pub fn max_data_len(original_offset: u64) -> usize {
135
2.86M
        max_data_len(original_offset, u64::MAX)
136
2.86M
    }
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
3.24k
    pub(crate) fn shrink(&self) -> BinaryReader<'a> {
149
3.24k
        let buffer = &self.buffer[self.position..];
150
3.24k
        let original_offset = self.original_position();
151
3.24k
        BinaryReader {
152
3.24k
            buffer,
153
3.24k
            position: 0,
154
3.24k
            original_offset,
155
3.24k
            #[cfg(feature = "features")]
156
3.24k
            features: self.features,
157
3.24k
        }
158
3.24k
    }
159
160
    /// Gets the original position of the binary reader.
161
    #[inline]
162
112M
    pub fn original_position(&self) -> u64 {
163
112M
        self.original_offset + self.position as u64
164
112M
    }
<wasmparser::binary_reader::BinaryReader>::original_position
Line
Count
Source
162
9.44M
    pub fn original_position(&self) -> u64 {
163
9.44M
        self.original_offset + self.position as u64
164
9.44M
    }
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
103M
    pub fn original_position(&self) -> u64 {
163
103M
        self.original_offset + self.position as u64
164
103M
    }
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
7.85k
    pub fn features(&self) -> WasmFeatures {
172
7.85k
        self.features
173
7.85k
    }
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
3.17M
    pub fn set_features(&mut self, features: WasmFeatures) {
180
3.17M
        self.features = features;
181
3.17M
    }
182
183
    /// Returns a range from the starting offset to the end of the buffer.
184
1.79M
    pub fn range(&self) -> Range<u64> {
185
1.79M
        self.original_offset..(self.original_offset + self.max_position() as u64)
186
1.79M
    }
187
188
11.8M
    pub(crate) fn remaining_buffer(&self) -> &'a [u8] {
189
11.8M
        &self.buffer[self.position..]
190
11.8M
    }
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
81.9M
    fn max_position(&self) -> usize {
198
        // constructor enforces:
199
        // self.buffer.len() <= max_memory_offset(u64::MAX - self.original_offset, self.buffer.len())
200
81.9M
        self.buffer.len()
201
81.9M
    }
202
203
23.5M
    fn ensure_has_byte(&self) -> Result<()> {
204
23.5M
        if self.position < self.max_position() {
205
23.5M
            Ok(())
206
        } else {
207
1
            Err(self.eof_err(1))
208
        }
209
23.5M
    }
210
211
    /// Returns the offset past `len` bytes on success
212
13.5M
    pub(crate) fn ensure_has_bytes(&self, len: usize) -> Result<usize> {
213
13.5M
        let remaining = self.bytes_remaining();
214
13.5M
        match len <= remaining {
215
12.1M
            true => Ok(self.position + len),
216
1.45M
            false => Err(self.eof_err(len - remaining)),
217
        }
218
13.5M
    }
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
41.4M
    pub fn read<T>(&mut self) -> Result<T>
224
41.4M
    where
225
41.4M
        T: FromReader<'a>,
226
    {
227
41.4M
        T::from_reader(self)
228
41.4M
    }
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
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::producers::ProducersField>
Line
Count
Source
223
3.24k
    pub fn read<T>(&mut self) -> Result<T>
224
3.24k
    where
225
3.24k
        T: FromReader<'a>,
226
    {
227
3.24k
        T::from_reader(self)
228
3.24k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::producers::ProducersFieldValue>
Line
Count
Source
223
3.24k
    pub fn read<T>(&mut self) -> Result<T>
224
3.24k
    where
225
3.24k
        T: FromReader<'a>,
226
    {
227
3.24k
        T::from_reader(self)
228
3.24k
    }
<wasmparser::binary_reader::BinaryReader>::read::<core::option::Option<wasmparser::readers::component::types::ComponentValType>>
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
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::branch_hinting::BranchHint>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::branch_hinting::BranchHintFunction>
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::data::Data>
Line
Count
Source
223
62.1k
    pub fn read<T>(&mut self) -> Result<T>
224
62.1k
    where
225
62.1k
        T: FromReader<'a>,
226
    {
227
62.1k
        T::from_reader(self)
228
62.1k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::init::ConstExpr>
Line
Count
Source
223
538k
    pub fn read<T>(&mut self) -> Result<T>
224
538k
    where
225
538k
        T: FromReader<'a>,
226
    {
227
538k
        T::from_reader(self)
228
538k
    }
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::types::GlobalType>
Line
Count
Source
223
548k
    pub fn read<T>(&mut self) -> Result<T>
224
548k
    where
225
548k
        T: FromReader<'a>,
226
    {
227
548k
        T::from_reader(self)
228
548k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::MemoryType>
Line
Count
Source
223
121k
    pub fn read<T>(&mut self) -> Result<T>
224
121k
    where
225
121k
        T: FromReader<'a>,
226
    {
227
121k
        T::from_reader(self)
228
121k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::StructType>
Line
Count
Source
223
173k
    pub fn read<T>(&mut self) -> Result<T>
224
173k
    where
225
173k
        T: FromReader<'a>,
226
    {
227
173k
        T::from_reader(self)
228
173k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::StorageType>
Line
Count
Source
223
1.91M
    pub fn read<T>(&mut self) -> Result<T>
224
1.91M
    where
225
1.91M
        T: FromReader<'a>,
226
    {
227
1.91M
        T::from_reader(self)
228
1.91M
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::AbstractHeapType>
Line
Count
Source
223
1.75M
    pub fn read<T>(&mut self) -> Result<T>
224
1.75M
    where
225
1.75M
        T: FromReader<'a>,
226
    {
227
1.75M
        T::from_reader(self)
228
1.75M
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::RefType>
Line
Count
Source
223
1.88M
    pub fn read<T>(&mut self) -> Result<T>
224
1.88M
    where
225
1.88M
        T: FromReader<'a>,
226
    {
227
1.88M
        T::from_reader(self)
228
1.88M
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::SubType>
Line
Count
Source
223
1.14M
    pub fn read<T>(&mut self) -> Result<T>
224
1.14M
    where
225
1.14M
        T: FromReader<'a>,
226
    {
227
1.14M
        T::from_reader(self)
228
1.14M
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::TagType>
Line
Count
Source
223
98.2k
    pub fn read<T>(&mut self) -> Result<T>
224
98.2k
    where
225
98.2k
        T: FromReader<'a>,
226
    {
227
98.2k
        T::from_reader(self)
228
98.2k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::ValType>
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
    }
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
430k
    pub fn read<T>(&mut self) -> Result<T>
224
430k
    where
225
430k
        T: FromReader<'a>,
226
    {
227
430k
        T::from_reader(self)
228
430k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::HeapType>
Line
Count
Source
223
943k
    pub fn read<T>(&mut self) -> Result<T>
224
943k
    where
225
943k
        T: FromReader<'a>,
226
    {
227
943k
        T::from_reader(self)
228
943k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::RecGroup>
Line
Count
Source
223
461k
    pub fn read<T>(&mut self) -> Result<T>
224
461k
    where
225
461k
        T: FromReader<'a>,
226
    {
227
461k
        T::from_reader(self)
228
461k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::ArrayType>
Line
Count
Source
223
540k
    pub fn read<T>(&mut self) -> Result<T>
224
540k
    where
225
540k
        T: FromReader<'a>,
226
    {
227
540k
        T::from_reader(self)
228
540k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::FieldType>
Line
Count
Source
223
1.37M
    pub fn read<T>(&mut self) -> Result<T>
224
1.37M
    where
225
1.37M
        T: FromReader<'a>,
226
    {
227
1.37M
        T::from_reader(self)
228
1.37M
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::TableType>
Line
Count
Source
223
85.5k
    pub fn read<T>(&mut self) -> Result<T>
224
85.5k
    where
225
85.5k
        T: FromReader<'a>,
226
    {
227
85.5k
        T::from_reader(self)
228
85.5k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::tables::Table>
Line
Count
Source
223
58.6k
    pub fn read<T>(&mut self) -> Result<T>
224
58.6k
    where
225
58.6k
        T: FromReader<'a>,
226
    {
227
58.6k
        T::from_reader(self)
228
58.6k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::exports::ExternalKind>
Line
Count
Source
223
648k
    pub fn read<T>(&mut self) -> Result<T>
224
648k
    where
225
648k
        T: FromReader<'a>,
226
    {
227
648k
        T::from_reader(self)
228
648k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::exports::Export>
Line
Count
Source
223
271k
    pub fn read<T>(&mut self) -> Result<T>
224
271k
    where
225
271k
        T: FromReader<'a>,
226
    {
227
271k
        T::from_reader(self)
228
271k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::globals::Global>
Line
Count
Source
223
459k
    pub fn read<T>(&mut self) -> Result<T>
224
459k
    where
225
459k
        T: FromReader<'a>,
226
    {
227
459k
        T::from_reader(self)
228
459k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::imports::ImportItemCompact>
Line
Count
Source
223
94.5k
    pub fn read<T>(&mut self) -> Result<T>
224
94.5k
    where
225
94.5k
        T: FromReader<'a>,
226
    {
227
94.5k
        T::from_reader(self)
228
94.5k
    }
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
158k
    pub fn read<T>(&mut self) -> Result<T>
224
158k
    where
225
158k
        T: FromReader<'a>,
226
    {
227
158k
        T::from_reader(self)
228
158k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::imports::TypeRef>
Line
Count
Source
223
344k
    pub fn read<T>(&mut self) -> Result<T>
224
344k
    where
225
344k
        T: FromReader<'a>,
226
    {
227
344k
        T::from_reader(self)
228
344k
    }
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
137k
    pub fn read<T>(&mut self) -> Result<T>
224
137k
    where
225
137k
        T: FromReader<'a>,
226
    {
227
137k
        T::from_reader(self)
228
137k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::operators::ResumeTable>
Line
Count
Source
223
9
    pub fn read<T>(&mut self) -> Result<T>
224
9
    where
225
9
        T: FromReader<'a>,
226
    {
227
9
        T::from_reader(self)
228
9
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::operators::Catch>
Line
Count
Source
223
2.81M
    pub fn read<T>(&mut self) -> Result<T>
224
2.81M
    where
225
2.81M
        T: FromReader<'a>,
226
    {
227
2.81M
        T::from_reader(self)
228
2.81M
    }
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
647k
    pub fn read<T>(&mut self) -> Result<T>
224
647k
    where
225
647k
        T: FromReader<'a>,
226
    {
227
647k
        T::from_reader(self)
228
647k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::canonicals::CanonicalOption>
Line
Count
Source
223
16.3k
    pub fn read<T>(&mut self) -> Result<T>
224
16.3k
    where
225
16.3k
        T: FromReader<'a>,
226
    {
227
16.3k
        T::from_reader(self)
228
16.3k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::canonicals::CanonicalFunction>
Line
Count
Source
223
42.0k
    pub fn read<T>(&mut self) -> Result<T>
224
42.0k
    where
225
42.0k
        T: FromReader<'a>,
226
    {
227
42.0k
        T::from_reader(self)
228
42.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
39.1k
    pub fn read<T>(&mut self) -> Result<T>
224
39.1k
    where
225
39.1k
        T: FromReader<'a>,
226
    {
227
39.1k
        T::from_reader(self)
228
39.1k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::ComponentType>
Line
Count
Source
223
234k
    pub fn read<T>(&mut self) -> Result<T>
224
234k
    where
225
234k
        T: FromReader<'a>,
226
    {
227
234k
        T::from_reader(self)
228
234k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::ComponentValType>
Line
Count
Source
223
664k
    pub fn read<T>(&mut self) -> Result<T>
224
664k
    where
225
664k
        T: FromReader<'a>,
226
    {
227
664k
        T::from_reader(self)
228
664k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::ModuleTypeDeclaration>
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
51.8k
    pub fn read<T>(&mut self) -> Result<T>
224
51.8k
    where
225
51.8k
        T: FromReader<'a>,
226
    {
227
51.8k
        T::from_reader(self)
228
51.8k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::exports::ComponentExport>
Line
Count
Source
223
164k
    pub fn read<T>(&mut self) -> Result<T>
224
164k
    where
225
164k
        T: FromReader<'a>,
226
    {
227
164k
        T::from_reader(self)
228
164k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::exports::ComponentExternalKind>
Line
Count
Source
223
430k
    pub fn read<T>(&mut self) -> Result<T>
224
430k
    where
225
430k
        T: FromReader<'a>,
226
    {
227
430k
        T::from_reader(self)
228
430k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::TypeBounds>
Line
Count
Source
223
129k
    pub fn read<T>(&mut self) -> Result<T>
224
129k
    where
225
129k
        T: FromReader<'a>,
226
    {
227
129k
        T::from_reader(self)
228
129k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::ComponentImport>
Line
Count
Source
223
37.6k
    pub fn read<T>(&mut self) -> Result<T>
224
37.6k
    where
225
37.6k
        T: FromReader<'a>,
226
    {
227
37.6k
        T::from_reader(self)
228
37.6k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::ComponentNameOpt>
Line
Count
Source
223
304k
    pub fn read<T>(&mut self) -> Result<T>
224
304k
    where
225
304k
        T: FromReader<'a>,
226
    {
227
304k
        T::from_reader(self)
228
304k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::ComponentTypeRef>
Line
Count
Source
223
256k
    pub fn read<T>(&mut self) -> Result<T>
224
256k
    where
225
256k
        T: FromReader<'a>,
226
    {
227
256k
        T::from_reader(self)
228
256k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::ComponentExternName>
Line
Count
Source
223
414k
    pub fn read<T>(&mut self) -> Result<T>
224
414k
    where
225
414k
        T: FromReader<'a>,
226
    {
227
414k
        T::from_reader(self)
228
414k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::InstantiationArg>
Line
Count
Source
223
21.1k
    pub fn read<T>(&mut self) -> Result<T>
224
21.1k
    where
225
21.1k
        T: FromReader<'a>,
226
    {
227
21.1k
        T::from_reader(self)
228
21.1k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::ComponentInstance>
Line
Count
Source
223
13.4k
    pub fn read<T>(&mut self) -> Result<T>
224
13.4k
    where
225
13.4k
        T: FromReader<'a>,
226
    {
227
13.4k
        T::from_reader(self)
228
13.4k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::InstantiationArgKind>
Line
Count
Source
223
21.1k
    pub fn read<T>(&mut self) -> Result<T>
224
21.1k
    where
225
21.1k
        T: FromReader<'a>,
226
    {
227
21.1k
        T::from_reader(self)
228
21.1k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::ComponentInstantiationArg>
Line
Count
Source
223
8.70k
    pub fn read<T>(&mut self) -> Result<T>
224
8.70k
    where
225
8.70k
        T: FromReader<'a>,
226
    {
227
8.70k
        T::from_reader(self)
228
8.70k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::Instance>
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::<&str>
Line
Count
Source
223
2.28M
    pub fn read<T>(&mut self) -> Result<T>
224
2.28M
    where
225
2.28M
        T: FromReader<'a>,
226
    {
227
2.28M
        T::from_reader(self)
228
2.28M
    }
<wasmparser::binary_reader::BinaryReader>::read::<(&str, wasmparser::readers::component::types::ComponentValType)>
Line
Count
Source
223
204k
    pub fn read<T>(&mut self) -> Result<T>
224
204k
    where
225
204k
        T: FromReader<'a>,
226
    {
227
204k
        T::from_reader(self)
228
204k
    }
<wasmparser::binary_reader::BinaryReader>::read::<bool>
Line
Count
Source
223
3.05k
    pub fn read<T>(&mut self) -> Result<T>
224
3.05k
    where
225
3.05k
        T: FromReader<'a>,
226
    {
227
3.05k
        T::from_reader(self)
228
3.05k
    }
<wasmparser::binary_reader::BinaryReader>::read::<u32>
Line
Count
Source
223
4.99M
    pub fn read<T>(&mut self) -> Result<T>
224
4.99M
    where
225
4.99M
        T: FromReader<'a>,
226
    {
227
4.99M
        T::from_reader(self)
228
4.99M
    }
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
680k
    pub(crate) fn external_kind_from_byte(byte: u8, offset: u64) -> Result<ExternalKind> {
239
680k
        match byte {
240
364k
            0x00 => Ok(ExternalKind::Func),
241
66.1k
            0x01 => Ok(ExternalKind::Table),
242
57.7k
            0x02 => Ok(ExternalKind::Memory),
243
160k
            0x03 => Ok(ExternalKind::Global),
244
32.2k
            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
680k
    }
249
250
    /// Reads a variable-length 32-bit size from the byte stream while checking
251
    /// against a limit.
252
2.80M
    pub fn read_size(&mut self, limit: usize, desc: &str) -> Result<usize> {
253
2.80M
        let pos = self.original_position();
254
2.80M
        let size = self.read_var_u32()? as usize;
255
2.80M
        if size > limit {
256
1
            bail!(pos, "{desc} size is out of bounds");
257
2.80M
        }
258
2.80M
        Ok(size)
259
2.80M
    }
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.65M
    pub fn read_iter<'me, T>(
269
2.65M
        &'me mut self,
270
2.65M
        limit: usize,
271
2.65M
        desc: &str,
272
2.65M
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
2.65M
    where
274
2.65M
        T: FromReader<'a>,
275
    {
276
2.65M
        let size = self.read_size(limit, desc)?;
277
2.65M
        Ok(BinaryReaderIter {
278
2.65M
            remaining: size,
279
2.65M
            reader: self,
280
2.65M
            _marker: marker::PhantomData,
281
2.65M
        })
282
2.65M
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::types::SubType>
Line
Count
Source
268
247k
    pub fn read_iter<'me, T>(
269
247k
        &'me mut self,
270
247k
        limit: usize,
271
247k
        desc: &str,
272
247k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
247k
    where
274
247k
        T: FromReader<'a>,
275
    {
276
247k
        let size = self.read_size(limit, desc)?;
277
247k
        Ok(BinaryReaderIter {
278
247k
            remaining: size,
279
247k
            reader: self,
280
247k
            _marker: marker::PhantomData,
281
247k
        })
282
247k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::types::ValType>
Line
Count
Source
268
861k
    pub fn read_iter<'me, T>(
269
861k
        &'me mut self,
270
861k
        limit: usize,
271
861k
        desc: &str,
272
861k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
861k
    where
274
861k
        T: FromReader<'a>,
275
    {
276
861k
        let size = self.read_size(limit, desc)?;
277
861k
        Ok(BinaryReaderIter {
278
861k
            remaining: size,
279
861k
            reader: self,
280
861k
            _marker: marker::PhantomData,
281
861k
        })
282
861k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::types::FieldType>
Line
Count
Source
268
173k
    pub fn read_iter<'me, T>(
269
173k
        &'me mut self,
270
173k
        limit: usize,
271
173k
        desc: &str,
272
173k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
173k
    where
274
173k
        T: FromReader<'a>,
275
    {
276
173k
        let size = self.read_size(limit, desc)?;
277
173k
        Ok(BinaryReaderIter {
278
173k
            remaining: size,
279
173k
            reader: self,
280
173k
            _marker: marker::PhantomData,
281
173k
        })
282
173k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::exports::Export>
Line
Count
Source
268
8.95k
    pub fn read_iter<'me, T>(
269
8.95k
        &'me mut self,
270
8.95k
        limit: usize,
271
8.95k
        desc: &str,
272
8.95k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
8.95k
    where
274
8.95k
        T: FromReader<'a>,
275
    {
276
8.95k
        let size = self.read_size(limit, desc)?;
277
8.95k
        Ok(BinaryReaderIter {
278
8.95k
            remaining: size,
279
8.95k
            reader: self,
280
8.95k
            _marker: marker::PhantomData,
281
8.95k
        })
282
8.95k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::operators::Catch>
Line
Count
Source
268
647k
    pub fn read_iter<'me, T>(
269
647k
        &'me mut self,
270
647k
        limit: usize,
271
647k
        desc: &str,
272
647k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
647k
    where
274
647k
        T: FromReader<'a>,
275
    {
276
647k
        let size = self.read_size(limit, desc)?;
277
647k
        Ok(BinaryReaderIter {
278
647k
            remaining: size,
279
647k
            reader: self,
280
647k
            _marker: marker::PhantomData,
281
647k
        })
282
647k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::operators::Handle>
Line
Count
Source
268
9
    pub fn read_iter<'me, T>(
269
9
        &'me mut self,
270
9
        limit: usize,
271
9
        desc: &str,
272
9
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
9
    where
274
9
        T: FromReader<'a>,
275
    {
276
9
        let size = self.read_size(limit, desc)?;
277
8
        Ok(BinaryReaderIter {
278
8
            remaining: size,
279
8
            reader: self,
280
8
            _marker: marker::PhantomData,
281
8
        })
282
9
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::canonicals::CanonicalOption>
Line
Count
Source
268
13.5k
    pub fn read_iter<'me, T>(
269
13.5k
        &'me mut self,
270
13.5k
        limit: usize,
271
13.5k
        desc: &str,
272
13.5k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
13.5k
    where
274
13.5k
        T: FromReader<'a>,
275
    {
276
13.5k
        let size = self.read_size(limit, desc)?;
277
13.5k
        Ok(BinaryReaderIter {
278
13.5k
            remaining: size,
279
13.5k
            reader: self,
280
13.5k
            _marker: marker::PhantomData,
281
13.5k
        })
282
13.5k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::types::VariantCase>
Line
Count
Source
268
8.01k
    pub fn read_iter<'me, T>(
269
8.01k
        &'me mut self,
270
8.01k
        limit: usize,
271
8.01k
        desc: &str,
272
8.01k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
8.01k
    where
274
8.01k
        T: FromReader<'a>,
275
    {
276
8.01k
        let size = self.read_size(limit, desc)?;
277
8.01k
        Ok(BinaryReaderIter {
278
8.01k
            remaining: size,
279
8.01k
            reader: self,
280
8.01k
            _marker: marker::PhantomData,
281
8.01k
        })
282
8.01k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::types::ComponentValType>
Line
Count
Source
268
73.3k
    pub fn read_iter<'me, T>(
269
73.3k
        &'me mut self,
270
73.3k
        limit: usize,
271
73.3k
        desc: &str,
272
73.3k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
73.3k
    where
274
73.3k
        T: FromReader<'a>,
275
    {
276
73.3k
        let size = self.read_size(limit, desc)?;
277
73.3k
        Ok(BinaryReaderIter {
278
73.3k
            remaining: size,
279
73.3k
            reader: self,
280
73.3k
            _marker: marker::PhantomData,
281
73.3k
        })
282
73.3k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::types::ModuleTypeDeclaration>
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::instances::InstantiationArg>
Line
Count
Source
268
21.9k
    pub fn read_iter<'me, T>(
269
21.9k
        &'me mut self,
270
21.9k
        limit: usize,
271
21.9k
        desc: &str,
272
21.9k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
21.9k
    where
274
21.9k
        T: FromReader<'a>,
275
    {
276
21.9k
        let size = self.read_size(limit, desc)?;
277
21.9k
        Ok(BinaryReaderIter {
278
21.9k
            remaining: size,
279
21.9k
            reader: self,
280
21.9k
            _marker: marker::PhantomData,
281
21.9k
        })
282
21.9k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::instances::ComponentInstantiationArg>
Line
Count
Source
268
13.4k
    pub fn read_iter<'me, T>(
269
13.4k
        &'me mut self,
270
13.4k
        limit: usize,
271
13.4k
        desc: &str,
272
13.4k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
13.4k
    where
274
13.4k
        T: FromReader<'a>,
275
    {
276
13.4k
        let size = self.read_size(limit, desc)?;
277
13.4k
        Ok(BinaryReaderIter {
278
13.4k
            remaining: size,
279
13.4k
            reader: self,
280
13.4k
            _marker: marker::PhantomData,
281
13.4k
        })
282
13.4k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<&str>
Line
Count
Source
268
171k
    pub fn read_iter<'me, T>(
269
171k
        &'me mut self,
270
171k
        limit: usize,
271
171k
        desc: &str,
272
171k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
171k
    where
274
171k
        T: FromReader<'a>,
275
    {
276
171k
        let size = self.read_size(limit, desc)?;
277
171k
        Ok(BinaryReaderIter {
278
171k
            remaining: size,
279
171k
            reader: self,
280
171k
            _marker: marker::PhantomData,
281
171k
        })
282
171k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<(&str, wasmparser::readers::component::types::ComponentValType)>
Line
Count
Source
268
53.3k
    pub fn read_iter<'me, T>(
269
53.3k
        &'me mut self,
270
53.3k
        limit: usize,
271
53.3k
        desc: &str,
272
53.3k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
53.3k
    where
274
53.3k
        T: FromReader<'a>,
275
    {
276
53.3k
        let size = self.read_size(limit, desc)?;
277
53.3k
        Ok(BinaryReaderIter {
278
53.3k
            remaining: size,
279
53.3k
            reader: self,
280
53.3k
            _marker: marker::PhantomData,
281
53.3k
        })
282
53.3k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<u32>
Line
Count
Source
268
359k
    pub fn read_iter<'me, T>(
269
359k
        &'me mut self,
270
359k
        limit: usize,
271
359k
        desc: &str,
272
359k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
359k
    where
274
359k
        T: FromReader<'a>,
275
    {
276
359k
        let size = self.read_size(limit, desc)?;
277
359k
        Ok(BinaryReaderIter {
278
359k
            remaining: size,
279
359k
            reader: self,
280
359k
            _marker: marker::PhantomData,
281
359k
        })
282
359k
    }
283
284
    /// Returns whether the `BinaryReader` has reached the end of the file.
285
    #[inline]
286
42.4M
    pub fn eof(&self) -> bool {
287
42.4M
        self.position >= self.max_position()
288
42.4M
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::eof
<wasmparser::binary_reader::BinaryReader>::eof
Line
Count
Source
286
11.3k
    pub fn eof(&self) -> bool {
287
11.3k
        self.position >= self.max_position()
288
11.3k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::eof
<wasmparser::binary_reader::BinaryReader>::eof
Line
Count
Source
286
6.48k
    pub fn eof(&self) -> bool {
287
6.48k
        self.position >= self.max_position()
288
6.48k
    }
<wasmparser::binary_reader::BinaryReader>::eof
Line
Count
Source
286
42.4M
    pub fn eof(&self) -> bool {
287
42.4M
        self.position >= self.max_position()
288
42.4M
    }
289
290
    /// Returns the `BinaryReader`'s current position.
291
    #[inline]
292
1.66M
    pub fn current_position(&self) -> usize {
293
1.66M
        self.position
294
1.66M
    }
295
296
    /// Returns the number of bytes remaining in the `BinaryReader`.
297
    #[inline]
298
14.2M
    pub fn bytes_remaining(&self) -> usize {
299
14.2M
        self.max_position() - self.position
300
14.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
11.3M
    pub fn read_bytes(&mut self, size: usize) -> Result<&'a [u8]> {
308
11.3M
        let start = self.position;
309
11.3M
        let end = self.ensure_has_bytes(size)?;
310
10.9M
        self.position = end;
311
10.9M
        Ok(&self.buffer[start..end])
312
11.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
1.00M
    pub fn read_reader(&mut self) -> Result<BinaryReader<'a>> {
317
1.00M
        let size = self.read_var_u32()? as usize;
318
974k
        self.skip(|reader| {
319
974k
            reader.read_bytes(size)?;
320
945k
            Ok(())
321
974k
        })
322
1.00M
    }
323
324
    /// Advances the `BinaryReader` four bytes and returns a `u32`.
325
    /// # Errors
326
    /// If `BinaryReader` has less than four bytes remaining.
327
3.03M
    pub fn read_u32(&mut self) -> Result<u32> {
328
3.03M
        let chunk = self.read_bytes(4)?;
329
3.00M
        let word = u32::from_le_bytes(chunk.try_into().unwrap());
330
3.00M
        Ok(word)
331
3.03M
    }
332
333
    /// Advances the `BinaryReader` eight bytes and returns a `u64`.
334
    /// # Errors
335
    /// If `BinaryReader` has less than eight bytes remaining.
336
2.21M
    pub fn read_u64(&mut self) -> Result<u64> {
337
2.21M
        let chunk = self.read_bytes(8)?;
338
2.21M
        let word = u64::from_le_bytes(chunk.try_into().unwrap());
339
2.21M
        Ok(word)
340
2.21M
    }
341
342
    /// Advances the `BinaryReader` a single byte.
343
    ///
344
    /// # Errors
345
    ///
346
    /// If `BinaryReader` has no bytes remaining.
347
    #[inline]
348
151M
    pub fn read_u8(&mut self) -> Result<u8> {
349
151M
        let b = match self.buffer.get(self.position) {
350
150M
            Some(b) => *b,
351
724k
            None => return Err(self.eof_err(1)),
352
        };
353
150M
        self.position += 1;
354
150M
        Ok(b)
355
151M
    }
<wasmparser::binary_reader::BinaryReader>::read_u8
Line
Count
Source
348
13.1M
    pub fn read_u8(&mut self) -> Result<u8> {
349
13.1M
        let b = match self.buffer.get(self.position) {
350
13.1M
            Some(b) => *b,
351
2
            None => return Err(self.eof_err(1)),
352
        };
353
13.1M
        self.position += 1;
354
13.1M
        Ok(b)
355
13.1M
    }
<wasmparser::binary_reader::BinaryReader>::read_u8
Line
Count
Source
348
11.5k
    pub fn read_u8(&mut self) -> Result<u8> {
349
11.5k
        let b = match self.buffer.get(self.position) {
350
11.5k
            Some(b) => *b,
351
0
            None => return Err(self.eof_err(1)),
352
        };
353
11.5k
        self.position += 1;
354
11.5k
        Ok(b)
355
11.5k
    }
<wasmparser::binary_reader::BinaryReader>::read_u8
Line
Count
Source
348
3.24k
    pub fn read_u8(&mut self) -> Result<u8> {
349
3.24k
        let b = match self.buffer.get(self.position) {
350
3.24k
            Some(b) => *b,
351
0
            None => return Err(self.eof_err(1)),
352
        };
353
3.24k
        self.position += 1;
354
3.24k
        Ok(b)
355
3.24k
    }
<wasmparser::binary_reader::BinaryReader>::read_u8
Line
Count
Source
348
138M
    pub fn read_u8(&mut self) -> Result<u8> {
349
138M
        let b = match self.buffer.get(self.position) {
350
137M
            Some(b) => *b,
351
724k
            None => return Err(self.eof_err(1)),
352
        };
353
137M
        self.position += 1;
354
137M
        Ok(b)
355
138M
    }
356
357
    #[cold]
358
2.17M
    fn eof_err(&self, hint: usize) -> Error {
359
2.17M
        Error::eof(self.original_position(), hint)
360
2.17M
    }
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
38.5M
    pub fn read_var_u32(&mut self) -> Result<u32> {
371
        // Optimization for single byte i32.
372
38.5M
        let byte = self.read_u8()?;
373
38.1M
        if (byte & 0x80) == 0 {
374
34.0M
            Ok(u32::from(byte))
375
        } else {
376
4.11M
            self.read_var_u32_big(byte)
377
        }
378
38.5M
    }
<wasmparser::binary_reader::BinaryReader>::read_var_u32
Line
Count
Source
370
4.02M
    pub fn read_var_u32(&mut self) -> Result<u32> {
371
        // Optimization for single byte i32.
372
4.02M
        let byte = self.read_u8()?;
373
4.02M
        if (byte & 0x80) == 0 {
374
3.74M
            Ok(u32::from(byte))
375
        } else {
376
277k
            self.read_var_u32_big(byte)
377
        }
378
4.02M
    }
<wasmparser::binary_reader::BinaryReader>::read_var_u32
Line
Count
Source
370
11.5k
    pub fn read_var_u32(&mut self) -> Result<u32> {
371
        // Optimization for single byte i32.
372
11.5k
        let byte = self.read_u8()?;
373
11.5k
        if (byte & 0x80) == 0 {
374
11.2k
            Ok(u32::from(byte))
375
        } else {
376
334
            self.read_var_u32_big(byte)
377
        }
378
11.5k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read_var_u32
<wasmparser::binary_reader::BinaryReader>::read_var_u32
Line
Count
Source
370
34.5M
    pub fn read_var_u32(&mut self) -> Result<u32> {
371
        // Optimization for single byte i32.
372
34.5M
        let byte = self.read_u8()?;
373
34.1M
        if (byte & 0x80) == 0 {
374
30.3M
            Ok(u32::from(byte))
375
        } else {
376
3.83M
            self.read_var_u32_big(byte)
377
        }
378
34.5M
    }
379
380
4.11M
    fn read_var_u32_big(&mut self, byte: u8) -> Result<u32> {
381
4.11M
        let mut result = (byte & 0x7F) as u32;
382
4.11M
        let mut shift = 7;
383
        loop {
384
4.13M
            let byte = self.read_u8()?;
385
4.10M
            result |= ((byte & 0x7F) as u32) << shift;
386
4.10M
            if shift >= 25 && (byte >> (32 - shift)) != 0 {
387
17
                let msg = if byte & 0x80 != 0 {
388
11
                    "invalid var_u32: integer representation too long"
389
                } else {
390
6
                    "invalid var_u32: integer too large"
391
                };
392
                // The continuation bit or unused bits are set.
393
17
                return Err(Error::new(msg, self.original_position() - 1));
394
4.10M
            }
395
4.10M
            shift += 7;
396
4.10M
            if (byte & 0x80) == 0 {
397
4.08M
                break;
398
15.9k
            }
399
        }
400
4.08M
        Ok(result)
401
4.11M
    }
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
1.09M
    pub fn read_var_u64(&mut self) -> Result<u64> {
412
        // Optimization for single byte u64.
413
1.09M
        let byte = u64::from(self.read_u8()?);
414
1.09M
        if (byte & 0x80) == 0 {
415
184k
            Ok(byte)
416
        } else {
417
910k
            self.read_var_u64_big(byte)
418
        }
419
1.09M
    }
420
421
910k
    fn read_var_u64_big(&mut self, byte: u64) -> Result<u64> {
422
910k
        let mut result = byte & 0x7F;
423
910k
        let mut shift = 7;
424
        loop {
425
3.26M
            let byte = u64::from(self.read_u8()?);
426
3.26M
            result |= (byte & 0x7F) << shift;
427
3.26M
            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
3.26M
            }
436
3.26M
            shift += 7;
437
3.26M
            if (byte & 0x80) == 0 {
438
910k
                break;
439
2.35M
            }
440
        }
441
910k
        Ok(result)
442
910k
    }
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.75M
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
2.75M
        let start_offset = self.original_position();
448
2.75M
        let start = self.position;
449
2.75M
        f(self)?;
450
2.41M
        let mut ret = self.clone();
451
2.41M
        ret.buffer = &self.buffer[start..self.position];
452
2.41M
        ret.original_offset = start_offset;
453
2.41M
        ret.position = 0;
454
2.41M
        Ok(ret)
455
2.75M
    }
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
25.9k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
25.9k
        let start_offset = self.original_position();
448
25.9k
        let start = self.position;
449
25.9k
        f(self)?;
450
19.4k
        let mut ret = self.clone();
451
19.4k
        ret.buffer = &self.buffer[start..self.position];
452
19.4k
        ret.original_offset = start_offset;
453
19.4k
        ret.position = 0;
454
19.4k
        Ok(ret)
455
25.9k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::data::Data>>::{closure#0}>
Line
Count
Source
446
10.1k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
10.1k
        let start_offset = self.original_position();
448
10.1k
        let start = self.position;
449
10.1k
        f(self)?;
450
10.1k
        let mut ret = self.clone();
451
10.1k
        ret.buffer = &self.buffer[start..self.position];
452
10.1k
        ret.original_offset = start_offset;
453
10.1k
        ret.position = 0;
454
10.1k
        Ok(ret)
455
10.1k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::types::MemoryType>>::{closure#0}>
Line
Count
Source
446
45.2k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
45.2k
        let start_offset = self.original_position();
448
45.2k
        let start = self.position;
449
45.2k
        f(self)?;
450
38.7k
        let mut ret = self.clone();
451
38.7k
        ret.buffer = &self.buffer[start..self.position];
452
38.7k
        ret.original_offset = start_offset;
453
38.7k
        ret.position = 0;
454
38.7k
        Ok(ret)
455
45.2k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::types::TagType>>::{closure#0}>
Line
Count
Source
446
3.76k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
3.76k
        let start_offset = self.original_position();
448
3.76k
        let start = self.position;
449
3.76k
        f(self)?;
450
3.76k
        let mut ret = self.clone();
451
3.76k
        ret.buffer = &self.buffer[start..self.position];
452
3.76k
        ret.original_offset = start_offset;
453
3.76k
        ret.position = 0;
454
3.76k
        Ok(ret)
455
3.76k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::types::RecGroup>>::{closure#0}>
Line
Count
Source
446
82.3k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
82.3k
        let start_offset = self.original_position();
448
82.3k
        let start = self.position;
449
82.3k
        f(self)?;
450
67.7k
        let mut ret = self.clone();
451
67.7k
        ret.buffer = &self.buffer[start..self.position];
452
67.7k
        ret.original_offset = start_offset;
453
67.7k
        ret.position = 0;
454
67.7k
        Ok(ret)
455
82.3k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::tables::Table>>::{closure#0}>
Line
Count
Source
446
16.3k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
16.3k
        let start_offset = self.original_position();
448
16.3k
        let start = self.position;
449
16.3k
        f(self)?;
450
15.3k
        let mut ret = self.clone();
451
15.3k
        ret.buffer = &self.buffer[start..self.position];
452
15.3k
        ret.original_offset = start_offset;
453
15.3k
        ret.position = 0;
454
15.3k
        Ok(ret)
455
16.3k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::exports::Export>>::{closure#0}>
Line
Count
Source
446
48.1k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
48.1k
        let start_offset = self.original_position();
448
48.1k
        let start = self.position;
449
48.1k
        f(self)?;
450
40.0k
        let mut ret = self.clone();
451
40.0k
        ret.buffer = &self.buffer[start..self.position];
452
40.0k
        ret.original_offset = start_offset;
453
40.0k
        ret.position = 0;
454
40.0k
        Ok(ret)
455
48.1k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::globals::Global>>::{closure#0}>
Line
Count
Source
446
26.4k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
26.4k
        let start_offset = self.original_position();
448
26.4k
        let start = self.position;
449
26.4k
        f(self)?;
450
25.8k
        let mut ret = self.clone();
451
25.8k
        ret.buffer = &self.buffer[start..self.position];
452
25.8k
        ret.original_offset = start_offset;
453
25.8k
        ret.position = 0;
454
25.8k
        Ok(ret)
455
26.4k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::imports::Imports>>::{closure#0}>
Line
Count
Source
446
47.5k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
47.5k
        let start_offset = self.original_position();
448
47.5k
        let start = self.position;
449
47.5k
        f(self)?;
450
38.6k
        let mut ret = self.clone();
451
38.6k
        ret.buffer = &self.buffer[start..self.position];
452
38.6k
        ret.original_offset = start_offset;
453
38.6k
        ret.position = 0;
454
38.6k
        Ok(ret)
455
47.5k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::elements::Element>>::{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.1k
        let mut ret = self.clone();
451
12.1k
        ret.buffer = &self.buffer[start..self.position];
452
12.1k
        ret.original_offset = start_offset;
453
12.1k
        ret.position = 0;
454
12.1k
        Ok(ret)
455
13.8k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::canonicals::CanonicalFunction>>::{closure#0}>
Line
Count
Source
446
32.5k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
32.5k
        let start_offset = self.original_position();
448
32.5k
        let start = self.position;
449
32.5k
        f(self)?;
450
19.5k
        let mut ret = self.clone();
451
19.5k
        ret.buffer = &self.buffer[start..self.position];
452
19.5k
        ret.original_offset = start_offset;
453
19.5k
        ret.position = 0;
454
19.5k
        Ok(ret)
455
32.5k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::types::ComponentType>>::{closure#0}>
Line
Count
Source
446
210k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
210k
        let start_offset = self.original_position();
448
210k
        let start = self.position;
449
210k
        f(self)?;
450
133k
        let mut ret = self.clone();
451
133k
        ret.buffer = &self.buffer[start..self.position];
452
133k
        ret.original_offset = start_offset;
453
133k
        ret.position = 0;
454
133k
        Ok(ret)
455
210k
    }
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
40.8k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
40.8k
        let start_offset = self.original_position();
448
40.8k
        let start = self.position;
449
40.8k
        f(self)?;
450
24.5k
        let mut ret = self.clone();
451
24.5k
        ret.buffer = &self.buffer[start..self.position];
452
24.5k
        ret.original_offset = start_offset;
453
24.5k
        ret.position = 0;
454
24.5k
        Ok(ret)
455
40.8k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::exports::ComponentExport>>::{closure#0}>
Line
Count
Source
446
202k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
202k
        let start_offset = self.original_position();
448
202k
        let start = self.position;
449
202k
        f(self)?;
450
128k
        let mut ret = self.clone();
451
128k
        ret.buffer = &self.buffer[start..self.position];
452
128k
        ret.original_offset = start_offset;
453
128k
        ret.position = 0;
454
128k
        Ok(ret)
455
202k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::imports::ComponentImport>>::{closure#0}>
Line
Count
Source
446
22.6k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
22.6k
        let start_offset = self.original_position();
448
22.6k
        let start = self.position;
449
22.6k
        f(self)?;
450
13.5k
        let mut ret = self.clone();
451
13.5k
        ret.buffer = &self.buffer[start..self.position];
452
13.5k
        ret.original_offset = start_offset;
453
13.5k
        ret.position = 0;
454
13.5k
        Ok(ret)
455
22.6k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::instances::ComponentInstance>>::{closure#0}>
Line
Count
Source
446
22.4k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
22.4k
        let start_offset = self.original_position();
448
22.4k
        let start = self.position;
449
22.4k
        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
22.4k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::instances::Instance>>::{closure#0}>
Line
Count
Source
446
41.4k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
41.4k
        let start_offset = self.original_position();
448
41.4k
        let start = self.position;
449
41.4k
        f(self)?;
450
24.8k
        let mut ret = self.clone();
451
24.8k
        ret.buffer = &self.buffer[start..self.position];
452
24.8k
        ret.original_offset = start_offset;
453
24.8k
        ret.position = 0;
454
24.8k
        Ok(ret)
455
41.4k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<u32>>::{closure#0}>
Line
Count
Source
446
60.0k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
60.0k
        let start_offset = self.original_position();
448
60.0k
        let start = self.position;
449
60.0k
        f(self)?;
450
51.2k
        let mut ret = self.clone();
451
51.2k
        ret.buffer = &self.buffer[start..self.position];
452
51.2k
        ret.original_offset = start_offset;
453
51.2k
        ret.position = 0;
454
51.2k
        Ok(ret)
455
60.0k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::core::custom::CustomSectionReader>::{closure#0}>
Line
Count
Source
446
126k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
126k
        let start_offset = self.original_position();
448
126k
        let start = self.position;
449
126k
        f(self)?;
450
87.3k
        let mut ret = self.clone();
451
87.3k
        ret.buffer = &self.buffer[start..self.position];
452
87.3k
        ret.original_offset = start_offset;
453
87.3k
        ret.position = 0;
454
87.3k
        Ok(ret)
455
126k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::binary_reader::BinaryReader>::read_reader::{closure#0}>
Line
Count
Source
446
974k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
974k
        let start_offset = self.original_position();
448
974k
        let start = self.position;
449
974k
        f(self)?;
450
945k
        let mut ret = self.clone();
451
945k
        ret.buffer = &self.buffer[start..self.position];
452
945k
        ret.original_offset = start_offset;
453
945k
        ret.position = 0;
454
945k
        Ok(ret)
455
974k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::binary_reader::BinaryReader>::read_br_table::{closure#0}>
Line
Count
Source
446
14.9k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
14.9k
        let start_offset = self.original_position();
448
14.9k
        let start = self.position;
449
14.9k
        f(self)?;
450
14.9k
        let mut ret = self.clone();
451
14.9k
        ret.buffer = &self.buffer[start..self.position];
452
14.9k
        ret.original_offset = start_offset;
453
14.9k
        ret.position = 0;
454
14.9k
        Ok(ret)
455
14.9k
    }
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
2.99k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
2.99k
        let start_offset = self.original_position();
448
2.99k
        let start = self.position;
449
2.99k
        f(self)?;
450
2.99k
        let mut ret = self.clone();
451
2.99k
        ret.buffer = &self.buffer[start..self.position];
452
2.99k
        ret.original_offset = start_offset;
453
2.99k
        ret.position = 0;
454
2.99k
        Ok(ret)
455
2.99k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::imports::Imports as wasmparser::readers::FromReader>::from_reader::{closure#1}>
Line
Count
Source
446
4.86k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
4.86k
        let start_offset = self.original_position();
448
4.86k
        let start = self.position;
449
4.86k
        f(self)?;
450
4.86k
        let mut ret = self.clone();
451
4.86k
        ret.buffer = &self.buffer[start..self.position];
452
4.86k
        ret.original_offset = start_offset;
453
4.86k
        ret.position = 0;
454
4.86k
        Ok(ret)
455
4.86k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::elements::Element as wasmparser::readers::FromReader>::from_reader::{closure#0}>
Line
Count
Source
446
137k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
137k
        let start_offset = self.original_position();
448
137k
        let start = self.position;
449
137k
        f(self)?;
450
137k
        let mut ret = self.clone();
451
137k
        ret.buffer = &self.buffer[start..self.position];
452
137k
        ret.original_offset = start_offset;
453
137k
        ret.position = 0;
454
137k
        Ok(ret)
455
137k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::producers::ProducersField as wasmparser::readers::FromReader>::from_reader::{closure#0}>
Line
Count
Source
446
3.24k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
3.24k
        let start_offset = self.original_position();
448
3.24k
        let start = self.position;
449
3.24k
        f(self)?;
450
3.24k
        let mut ret = self.clone();
451
3.24k
        ret.buffer = &self.buffer[start..self.position];
452
3.24k
        ret.original_offset = start_offset;
453
3.24k
        ret.position = 0;
454
3.24k
        Ok(ret)
455
3.24k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::init::ConstExpr as wasmparser::readers::FromReader>::from_reader::{closure#0}>
Line
Count
Source
446
538k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
538k
        let start_offset = self.original_position();
448
538k
        let start = self.position;
449
538k
        f(self)?;
450
538k
        let mut ret = self.clone();
451
538k
        ret.buffer = &self.buffer[start..self.position];
452
538k
        ret.original_offset = start_offset;
453
538k
        ret.position = 0;
454
538k
        Ok(ret)
455
538k
    }
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
203k
    pub fn skip_string(&mut self) -> Result<()> {
464
203k
        let len = self.read_var_u32()? as usize;
465
203k
        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
203k
        }
471
203k
        self.ensure_has_bytes(len)?;
472
203k
        self.position += len;
473
203k
        Ok(())
474
203k
    }
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.44M
    pub fn read_var_i32(&mut self) -> Result<i32> {
483
        // Optimization for single byte i32.
484
1.44M
        let byte = self.read_u8()?;
485
1.44M
        if (byte & 0x80) == 0 {
486
523k
            Ok(((byte as i32) << 25) >> 25)
487
        } else {
488
924k
            self.read_var_i32_big(byte)
489
        }
490
1.44M
    }
<wasmparser::binary_reader::BinaryReader>::read_var_i32
Line
Count
Source
482
238k
    pub fn read_var_i32(&mut self) -> Result<i32> {
483
        // Optimization for single byte i32.
484
238k
        let byte = self.read_u8()?;
485
238k
        if (byte & 0x80) == 0 {
486
102k
            Ok(((byte as i32) << 25) >> 25)
487
        } else {
488
135k
            self.read_var_i32_big(byte)
489
        }
490
238k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read_var_i32
<wasmparser::binary_reader::BinaryReader>::read_var_i32
Line
Count
Source
482
1.21M
    pub fn read_var_i32(&mut self) -> Result<i32> {
483
        // Optimization for single byte i32.
484
1.21M
        let byte = self.read_u8()?;
485
1.21M
        if (byte & 0x80) == 0 {
486
421k
            Ok(((byte as i32) << 25) >> 25)
487
        } else {
488
789k
            self.read_var_i32_big(byte)
489
        }
490
1.21M
    }
491
492
924k
    fn read_var_i32_big(&mut self, byte: u8) -> Result<i32> {
493
924k
        let mut result = (byte & 0x7F) as i32;
494
924k
        let mut shift = 7;
495
        loop {
496
3.00M
            let byte = self.read_u8()?;
497
3.00M
            result |= ((byte & 0x7F) as i32) << shift;
498
3.00M
            if shift >= 25 {
499
551k
                let continuation_bit = (byte & 0x80) != 0;
500
551k
                let sign_and_unused_bit = (byte << 1) as i8 >> (32 - shift);
501
551k
                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
551k
                }
509
551k
                return Ok(result);
510
2.45M
            }
511
2.45M
            shift += 7;
512
2.45M
            if (byte & 0x80) == 0 {
513
373k
                break;
514
2.08M
            }
515
        }
516
373k
        let ashift = 32 - shift;
517
373k
        Ok((result << ashift) >> ashift)
518
924k
    }
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
1.31M
    pub fn read_var_s33(&mut self) -> Result<i64> {
526
        // Optimization for single byte.
527
1.31M
        let byte = self.read_u8()?;
528
1.31M
        if (byte & 0x80) == 0 {
529
1.02M
            return Ok(((byte as i8) << 1) as i64 >> 1);
530
284k
        }
531
532
284k
        let mut result = (byte & 0x7F) as i64;
533
284k
        let mut shift = 7;
534
        loop {
535
284k
            let byte = self.read_u8()?;
536
284k
            result |= ((byte & 0x7F) as i64) << shift;
537
284k
            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
284k
            }
547
284k
            shift += 7;
548
284k
            if (byte & 0x80) == 0 {
549
284k
                break;
550
3
            }
551
        }
552
284k
        let ashift = 64 - shift;
553
284k
        Ok((result << ashift) >> ashift)
554
1.31M
    }
555
556
    /// Advances the `BinaryReader` up to eight bytes to parse a variable
557
    /// length integer as a 64 bit integer, returned as a `i64`.
558
    /// # Errors
559
    /// If `BinaryReader` has less than one or up to eight bytes remaining, or
560
    /// the integer is larger than 64 bits.
561
4.59M
    pub fn read_var_i64(&mut self) -> Result<i64> {
562
4.59M
        let mut result: i64 = 0;
563
4.59M
        let mut shift = 0;
564
        loop {
565
21.3M
            let byte = self.read_u8()?;
566
21.3M
            result |= i64::from(byte & 0x7F) << shift;
567
21.3M
            if shift >= 57 {
568
408k
                let continuation_bit = (byte & 0x80) != 0;
569
408k
                let sign_and_unused_bit = ((byte << 1) as i8) >> (64 - shift);
570
408k
                if continuation_bit || (sign_and_unused_bit != 0 && sign_and_unused_bit != -1) {
571
0
                    let msg = if continuation_bit {
572
0
                        "invalid var_i64: integer representation too long"
573
                    } else {
574
0
                        "invalid var_i64: integer too large"
575
                    };
576
0
                    return Err(Error::new(msg, self.original_position() - 1));
577
408k
                }
578
408k
                return Ok(result);
579
20.9M
            }
580
20.9M
            shift += 7;
581
20.9M
            if (byte & 0x80) == 0 {
582
4.19M
                break;
583
16.7M
            }
584
        }
585
4.19M
        let ashift = 64 - shift;
586
4.19M
        Ok((result << ashift) >> ashift)
587
4.59M
    }
588
589
    /// Advances the `BinaryReader` four bytes to parse a 32 bit floating point
590
    /// number, returned as `Ieee32`.
591
    /// # Errors
592
    /// If `BinaryReader` has less than four bytes remaining.
593
2.89M
    pub fn read_f32(&mut self) -> Result<Ieee32> {
594
2.89M
        let value = self.read_u32()?;
595
2.89M
        Ok(Ieee32(value))
596
2.89M
    }
597
598
    /// Advances the `BinaryReader` eight bytes to parse a 64 bit floating point
599
    /// number, returned as `Ieee64`.
600
    /// # Errors
601
    /// If `BinaryReader` has less than eight bytes remaining.
602
2.21M
    pub fn read_f64(&mut self) -> Result<Ieee64> {
603
2.21M
        let value = self.read_u64()?;
604
2.21M
        Ok(Ieee64(value))
605
2.21M
    }
606
607
    /// (internal) Reads a fixed-size WebAssembly string from the module.
608
3.42M
    fn internal_read_string(&mut self, len: usize) -> Result<&'a str> {
609
3.42M
        let bytes = self.read_bytes(len)?;
610
3.42M
        str::from_utf8(bytes)
611
3.42M
            .map_err(|_| Error::new("malformed UTF-8 encoding", self.original_position() - 1))
612
3.42M
    }
613
614
    /// Reads a WebAssembly string from the module.
615
    ///
616
    /// # Errors
617
    ///
618
    /// If `BinaryReader` has less than up to four bytes remaining, the string's
619
    /// length exceeds the remaining bytes, the string's length exceeds
620
    /// `limits::MAX_WASM_STRING_SIZE`, or the string contains invalid utf-8.
621
3.41M
    pub fn read_string(&mut self) -> Result<&'a str> {
622
3.41M
        let len = self.read_var_u32()? as usize;
623
3.41M
        if len > MAX_WASM_STRING_SIZE {
624
0
            return Err(Error::new(
625
0
                "string size out of bounds",
626
0
                self.original_position() - 1,
627
0
            ));
628
3.41M
        }
629
3.41M
        return self.internal_read_string(len);
630
3.41M
    }
631
632
    /// Reads a unlimited WebAssembly string from the module.
633
    ///
634
    /// Note that this is similar to [`BinaryReader::read_string`] except that
635
    /// it will not limit the size of the returned string by
636
    /// `limits::MAX_WASM_STRING_SIZE`.
637
9.72k
    pub fn read_unlimited_string(&mut self) -> Result<&'a str> {
638
9.72k
        let len = self.read_var_u32()? as usize;
639
9.72k
        return self.internal_read_string(len);
640
9.72k
    }
641
642
    #[cold]
643
0
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
0
        Err(Self::invalid_leading_byte_error(
645
0
            byte,
646
0
            desc,
647
0
            self.original_position() - 1,
648
0
        ))
649
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::<()>
650
651
0
    pub(crate) fn invalid_leading_byte_error(byte: u8, desc: &str, offset: u64) -> Error {
652
0
        format_err!(offset, "invalid leading byte (0x{byte:x}) for {desc}")
653
0
    }
654
655
23.5M
    pub(crate) fn peek(&self) -> Result<u8> {
656
23.5M
        self.ensure_has_byte()?;
657
23.5M
        Ok(self.buffer[self.position])
658
23.5M
    }
659
660
2.05M
    pub(crate) fn peek_bytes(&self, len: usize) -> Result<&[u8]> {
661
2.05M
        let start = self.position;
662
2.05M
        let end = self.ensure_has_bytes(len)?;
663
1.01M
        Ok(&self.buffer[start..end])
664
2.05M
    }
665
666
3.59M
    pub(crate) fn read_block_type(&mut self) -> Result<BlockType> {
667
3.59M
        let b = self.peek()?;
668
669
        // Block types are encoded as either 0x40, a `valtype`, or `s33`. All
670
        // current `valtype` encodings are negative numbers when encoded with
671
        // sleb128, but it's also required that valtype encodings are in their
672
        // canonical form. For example an overlong encoding of -1 as `0xff 0x7f`
673
        // is not valid and it is required to be `0x7f`. This means that we
674
        // can't simply match on the `s33` that pops out below since reading the
675
        // whole `s33` might read an overlong encoding.
676
        //
677
        // To test for this the first byte `b` is inspected. The highest bit,
678
        // the continuation bit in LEB128 encoding, must be clear. The next bit,
679
        // the sign bit, must be set to indicate that the number is negative. If
680
        // these two conditions hold then we're guaranteed that this is a
681
        // negative number.
682
        //
683
        // After this a value type is read directly instead of looking for an
684
        // indexed value type.
685
3.59M
        if b & 0x80 == 0 && b & 0x40 != 0 {
686
3.43M
            if b == 0x40 {
687
1.92M
                self.position += 1;
688
1.92M
                return Ok(BlockType::Empty);
689
1.50M
            }
690
1.50M
            return Ok(BlockType::Type(self.read()?));
691
164k
        }
692
693
        // Not empty or a singular type, so read the function type index
694
164k
        let idx = self.read_var_s33()?;
695
164k
        match u32::try_from(idx) {
696
164k
            Ok(idx) => Ok(BlockType::FuncType(idx)),
697
            Err(_) => {
698
1
                return Err(Error::new(
699
1
                    "invalid function type",
700
1
                    self.original_position(),
701
1
                ));
702
            }
703
        }
704
3.59M
    }
705
706
    /// Returns whether there is an `end` opcode followed by eof remaining in
707
    /// this reader.
708
9.81M
    pub fn is_end_then_eof(&self) -> bool {
709
9.81M
        self.remaining_buffer() == &[0x0b]
710
9.81M
    }
711
712
176k
    pub(crate) fn read_header_version(&mut self) -> Result<u32> {
713
176k
        let magic_number = self.read_bytes(4)?;
714
141k
        if magic_number != WASM_MAGIC_NUMBER {
715
98
            return Err(Error::new(
716
98
                format!(
717
98
                    "magic header not detected: bad magic number - expected={WASM_MAGIC_NUMBER:#x?} actual={magic_number:#x?}"
718
98
                ),
719
98
                self.original_position() - 4,
720
98
            ));
721
141k
        }
722
141k
        self.read_u32()
723
176k
    }
724
}
725
726
// See documentation on `BinaryReader::features` for more on what's going on
727
// here.
728
macro_rules! define_feature_accessor {
729
    ($feature:ident = $default:expr) => {
730
        impl BinaryReader<'_> {
731
            #[inline]
732
            #[allow(dead_code)]
733
3.84M
            pub(crate) fn $feature(&self) -> bool {
734
                #[cfg(feature = "features")]
735
                {
736
3.84M
                    self.features.$feature()
737
                }
738
                #[cfg(not(feature = "features"))]
739
                {
740
                    true
741
                }
742
3.84M
            }
<wasmparser::binary_reader::BinaryReader>::call_indirect_overlong
Line
Count
Source
733
2.93k
            pub(crate) fn $feature(&self) -> bool {
734
                #[cfg(feature = "features")]
735
                {
736
2.93k
                    self.features.$feature()
737
                }
738
                #[cfg(not(feature = "features"))]
739
                {
740
                    true
741
                }
742
2.93k
            }
<wasmparser::binary_reader::BinaryReader>::cm_implements
Line
Count
Source
733
251k
            pub(crate) fn $feature(&self) -> bool {
734
                #[cfg(feature = "features")]
735
                {
736
251k
                    self.features.$feature()
737
                }
738
                #[cfg(not(feature = "features"))]
739
                {
740
                    true
741
                }
742
251k
            }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_canon_names
<wasmparser::binary_reader::BinaryReader>::multi_memory
Line
Count
Source
733
2.12M
            pub(crate) fn $feature(&self) -> bool {
734
                #[cfg(feature = "features")]
735
                {
736
2.12M
                    self.features.$feature()
737
                }
738
                #[cfg(not(feature = "features"))]
739
                {
740
                    true
741
                }
742
2.12M
            }
<wasmparser::binary_reader::BinaryReader>::memory64
Line
Count
Source
733
1.11M
            pub(crate) fn $feature(&self) -> bool {
734
                #[cfg(feature = "features")]
735
                {
736
1.11M
                    self.features.$feature()
737
                }
738
                #[cfg(not(feature = "features"))]
739
                {
740
                    true
741
                }
742
1.11M
            }
<wasmparser::binary_reader::BinaryReader>::gc
Line
Count
Source
733
359k
            pub(crate) fn $feature(&self) -> bool {
734
                #[cfg(feature = "features")]
735
                {
736
359k
                    self.features.$feature()
737
                }
738
                #[cfg(not(feature = "features"))]
739
                {
740
                    true
741
                }
742
359k
            }
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>::cm_forward
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_accessors
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>::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
743
        }
744
    };
745
}
746
747
super::features::foreach_wasm_feature!(define_feature_accessor);
748
749
/// Iterator returned from [`BinaryReader::read_iter`].
750
pub struct BinaryReaderIter<'a, 'me, T: FromReader<'a>> {
751
    remaining: usize,
752
    pub(crate) reader: &'me mut BinaryReader<'a>,
753
    _marker: marker::PhantomData<T>,
754
}
755
756
impl<'a, T> Iterator for BinaryReaderIter<'a, '_, T>
757
where
758
    T: FromReader<'a>,
759
{
760
    type Item = Result<T>;
761
762
18.4M
    fn next(&mut self) -> Option<Result<T>> {
763
18.4M
        if self.remaining == 0 {
764
5.30M
            None
765
        } else {
766
13.1M
            let ret = self.reader.read::<T>();
767
13.1M
            if ret.is_err() {
768
0
                self.remaining = 0;
769
13.1M
            } else {
770
13.1M
                self.remaining -= 1;
771
13.1M
            }
772
13.1M
            Some(ret)
773
        }
774
18.4M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::SubType> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
1.42M
    fn next(&mut self) -> Option<Result<T>> {
763
1.42M
        if self.remaining == 0 {
764
495k
            None
765
        } else {
766
930k
            let ret = self.reader.read::<T>();
767
930k
            if ret.is_err() {
768
0
                self.remaining = 0;
769
930k
            } else {
770
930k
                self.remaining -= 1;
771
930k
            }
772
930k
            Some(ret)
773
        }
774
1.42M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::ValType> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
7.33M
    fn next(&mut self) -> Option<Result<T>> {
763
7.33M
        if self.remaining == 0 {
764
1.72M
            None
765
        } else {
766
5.61M
            let ret = self.reader.read::<T>();
767
5.61M
            if ret.is_err() {
768
0
                self.remaining = 0;
769
5.61M
            } else {
770
5.61M
                self.remaining -= 1;
771
5.61M
            }
772
5.61M
            Some(ret)
773
        }
774
7.33M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::FieldType> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
1.72M
    fn next(&mut self) -> Option<Result<T>> {
763
1.72M
        if self.remaining == 0 {
764
346k
            None
765
        } else {
766
1.37M
            let ret = self.reader.read::<T>();
767
1.37M
            if ret.is_err() {
768
0
                self.remaining = 0;
769
1.37M
            } else {
770
1.37M
                self.remaining -= 1;
771
1.37M
            }
772
1.37M
            Some(ret)
773
        }
774
1.72M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::exports::Export> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
59.7k
    fn next(&mut self) -> Option<Result<T>> {
763
59.7k
        if self.remaining == 0 {
764
17.9k
            None
765
        } else {
766
41.8k
            let ret = self.reader.read::<T>();
767
41.8k
            if ret.is_err() {
768
0
                self.remaining = 0;
769
41.8k
            } else {
770
41.8k
                self.remaining -= 1;
771
41.8k
            }
772
41.8k
            Some(ret)
773
        }
774
59.7k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Catch> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
4.10M
    fn next(&mut self) -> Option<Result<T>> {
763
4.10M
        if self.remaining == 0 {
764
1.29M
            None
765
        } else {
766
2.81M
            let ret = self.reader.read::<T>();
767
2.81M
            if ret.is_err() {
768
0
                self.remaining = 0;
769
2.81M
            } else {
770
2.81M
                self.remaining -= 1;
771
2.81M
            }
772
2.81M
            Some(ret)
773
        }
774
4.10M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Handle> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
16
    fn next(&mut self) -> Option<Result<T>> {
763
16
        if self.remaining == 0 {
764
16
            None
765
        } else {
766
0
            let ret = self.reader.read::<T>();
767
0
            if ret.is_err() {
768
0
                self.remaining = 0;
769
0
            } else {
770
0
                self.remaining -= 1;
771
0
            }
772
0
            Some(ret)
773
        }
774
16
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::canonicals::CanonicalOption> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
43.5k
    fn next(&mut self) -> Option<Result<T>> {
763
43.5k
        if self.remaining == 0 {
764
27.1k
            None
765
        } else {
766
16.3k
            let ret = self.reader.read::<T>();
767
16.3k
            if ret.is_err() {
768
0
                self.remaining = 0;
769
16.3k
            } else {
770
16.3k
                self.remaining -= 1;
771
16.3k
            }
772
16.3k
            Some(ret)
773
        }
774
43.5k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::VariantCase> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
55.2k
    fn next(&mut self) -> Option<Result<T>> {
763
55.2k
        if self.remaining == 0 {
764
16.0k
            None
765
        } else {
766
39.1k
            let ret = self.reader.read::<T>();
767
39.1k
            if ret.is_err() {
768
0
                self.remaining = 0;
769
39.1k
            } else {
770
39.1k
                self.remaining -= 1;
771
39.1k
            }
772
39.1k
            Some(ret)
773
        }
774
55.2k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ComponentValType> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
429k
    fn next(&mut self) -> Option<Result<T>> {
763
429k
        if self.remaining == 0 {
764
146k
            None
765
        } else {
766
283k
            let ret = self.reader.read::<T>();
767
283k
            if ret.is_err() {
768
0
                self.remaining = 0;
769
283k
            } else {
770
283k
                self.remaining -= 1;
771
283k
            }
772
283k
            Some(ret)
773
        }
774
429k
    }
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::instances::InstantiationArg> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
65.0k
    fn next(&mut self) -> Option<Result<T>> {
763
65.0k
        if self.remaining == 0 {
764
43.8k
            None
765
        } else {
766
21.1k
            let ret = self.reader.read::<T>();
767
21.1k
            if ret.is_err() {
768
0
                self.remaining = 0;
769
21.1k
            } else {
770
21.1k
                self.remaining -= 1;
771
21.1k
            }
772
21.1k
            Some(ret)
773
        }
774
65.0k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::ComponentInstantiationArg> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
35.6k
    fn next(&mut self) -> Option<Result<T>> {
763
35.6k
        if self.remaining == 0 {
764
26.9k
            None
765
        } else {
766
8.70k
            let ret = self.reader.read::<T>();
767
8.70k
            if ret.is_err() {
768
0
                self.remaining = 0;
769
8.70k
            } else {
770
8.70k
                self.remaining -= 1;
771
8.70k
            }
772
8.70k
            Some(ret)
773
        }
774
35.6k
    }
<wasmparser::binary_reader::BinaryReaderIter<&str> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
1.85M
    fn next(&mut self) -> Option<Result<T>> {
763
1.85M
        if self.remaining == 0 {
764
343k
            None
765
        } else {
766
1.50M
            let ret = self.reader.read::<T>();
767
1.50M
            if ret.is_err() {
768
0
                self.remaining = 0;
769
1.50M
            } else {
770
1.50M
                self.remaining -= 1;
771
1.50M
            }
772
1.50M
            Some(ret)
773
        }
774
1.85M
    }
<wasmparser::binary_reader::BinaryReaderIter<(&str, wasmparser::readers::component::types::ComponentValType)> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
310k
    fn next(&mut self) -> Option<Result<T>> {
763
310k
        if self.remaining == 0 {
764
106k
            None
765
        } else {
766
204k
            let ret = self.reader.read::<T>();
767
204k
            if ret.is_err() {
768
0
                self.remaining = 0;
769
204k
            } else {
770
204k
                self.remaining -= 1;
771
204k
            }
772
204k
            Some(ret)
773
        }
774
310k
    }
<wasmparser::binary_reader::BinaryReaderIter<u32> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
984k
    fn next(&mut self) -> Option<Result<T>> {
763
984k
        if self.remaining == 0 {
764
718k
            None
765
        } else {
766
266k
            let ret = self.reader.read::<T>();
767
266k
            if ret.is_err() {
768
0
                self.remaining = 0;
769
266k
            } else {
770
266k
                self.remaining -= 1;
771
266k
            }
772
266k
            Some(ret)
773
        }
774
984k
    }
775
776
3.81M
    fn size_hint(&self) -> (usize, Option<usize>) {
777
3.81M
        (self.remaining, Some(self.remaining))
778
3.81M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::SubType> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
247k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
247k
        (self.remaining, Some(self.remaining))
778
247k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::ValType> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
1.28M
    fn size_hint(&self) -> (usize, Option<usize>) {
777
1.28M
        (self.remaining, Some(self.remaining))
778
1.28M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::FieldType> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
370k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
370k
        (self.remaining, Some(self.remaining))
778
370k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::exports::Export> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
13.4k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
13.4k
        (self.remaining, Some(self.remaining))
778
13.4k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Catch> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
956k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
956k
        (self.remaining, Some(self.remaining))
778
956k
    }
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
776
10.1k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
10.1k
        (self.remaining, Some(self.remaining))
778
10.1k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::VariantCase> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
13.1k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
13.1k
        (self.remaining, Some(self.remaining))
778
13.1k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ComponentValType> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
97.6k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
97.6k
        (self.remaining, Some(self.remaining))
778
97.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::instances::InstantiationArg> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
13.4k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
13.4k
        (self.remaining, Some(self.remaining))
778
13.4k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::ComponentInstantiationArg> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
4.14k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
4.14k
        (self.remaining, Some(self.remaining))
778
4.14k
    }
<wasmparser::binary_reader::BinaryReaderIter<&str> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
464k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
464k
        (self.remaining, Some(self.remaining))
778
464k
    }
<wasmparser::binary_reader::BinaryReaderIter<(&str, wasmparser::readers::component::types::ComponentValType)> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
73.8k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
73.8k
        (self.remaining, Some(self.remaining))
778
73.8k
    }
<wasmparser::binary_reader::BinaryReaderIter<u32> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
266k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
266k
        (self.remaining, Some(self.remaining))
778
266k
    }
779
}
780
781
impl<'a, T> Drop for BinaryReaderIter<'a, '_, T>
782
where
783
    T: FromReader<'a>,
784
{
785
2.65M
    fn drop(&mut self) {
786
2.65M
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
2.65M
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::SubType> as core::ops::drop::Drop>::drop
Line
Count
Source
785
247k
    fn drop(&mut self) {
786
247k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
247k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::ValType> as core::ops::drop::Drop>::drop
Line
Count
Source
785
861k
    fn drop(&mut self) {
786
861k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
861k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::FieldType> as core::ops::drop::Drop>::drop
Line
Count
Source
785
173k
    fn drop(&mut self) {
786
173k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
173k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::exports::Export> as core::ops::drop::Drop>::drop
Line
Count
Source
785
8.95k
    fn drop(&mut self) {
786
8.95k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
8.95k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Catch> as core::ops::drop::Drop>::drop
Line
Count
Source
785
647k
    fn drop(&mut self) {
786
647k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
647k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Handle> as core::ops::drop::Drop>::drop
Line
Count
Source
785
8
    fn drop(&mut self) {
786
8
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
8
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::canonicals::CanonicalOption> as core::ops::drop::Drop>::drop
Line
Count
Source
785
13.5k
    fn drop(&mut self) {
786
13.5k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
13.5k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::VariantCase> as core::ops::drop::Drop>::drop
Line
Count
Source
785
8.01k
    fn drop(&mut self) {
786
8.01k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
8.01k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ComponentValType> as core::ops::drop::Drop>::drop
Line
Count
Source
785
73.3k
    fn drop(&mut self) {
786
73.3k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
73.3k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ModuleTypeDeclaration> as core::ops::drop::Drop>::drop
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::InstantiationArg> as core::ops::drop::Drop>::drop
Line
Count
Source
785
21.9k
    fn drop(&mut self) {
786
21.9k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
21.9k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::ComponentInstantiationArg> as core::ops::drop::Drop>::drop
Line
Count
Source
785
13.4k
    fn drop(&mut self) {
786
13.4k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
13.4k
    }
<wasmparser::binary_reader::BinaryReaderIter<&str> as core::ops::drop::Drop>::drop
Line
Count
Source
785
171k
    fn drop(&mut self) {
786
171k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
171k
    }
<wasmparser::binary_reader::BinaryReaderIter<(&str, wasmparser::readers::component::types::ComponentValType)> as core::ops::drop::Drop>::drop
Line
Count
Source
785
53.3k
    fn drop(&mut self) {
786
53.3k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
53.3k
    }
<wasmparser::binary_reader::BinaryReaderIter<u32> as core::ops::drop::Drop>::drop
Line
Count
Source
785
359k
    fn drop(&mut self) {
786
359k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
359k
    }
790
}
791
792
impl<'a> BinaryReader<'a> {
793
    /// Function that must be called after the last opcode in an expression (instruction sequence)
794
    /// has been processed. Returns an error if there is extra data after the operators.
795
561k
    pub fn finish_expression(&self, stack: &impl FrameStack) -> Result<()> {
796
561k
        if stack.current_frame().is_some() {
797
32
            bail!(
798
32
                self.original_position(),
799
                "control frames remain at end of function body or expression"
800
            );
801
561k
        }
802
561k
        if !self.eof() {
803
0
            bail!(
804
0
                self.original_position(),
805
                "unexpected data at the end of operators"
806
            );
807
561k
        }
808
561k
        Ok(())
809
561k
    }
<wasmparser::binary_reader::BinaryReader>::finish_expression::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>
Line
Count
Source
795
336k
    pub fn finish_expression(&self, stack: &impl FrameStack) -> Result<()> {
796
336k
        if stack.current_frame().is_some() {
797
0
            bail!(
798
0
                self.original_position(),
799
                "control frames remain at end of function body or expression"
800
            );
801
336k
        }
802
336k
        if !self.eof() {
803
0
            bail!(
804
0
                self.original_position(),
805
                "unexpected data at the end of operators"
806
            );
807
336k
        }
808
336k
        Ok(())
809
336k
    }
<wasmparser::binary_reader::BinaryReader>::finish_expression::<wasmparser::readers::core::operators::OperatorsReader>
Line
Count
Source
795
225k
    pub fn finish_expression(&self, stack: &impl FrameStack) -> Result<()> {
796
225k
        if stack.current_frame().is_some() {
797
32
            bail!(
798
32
                self.original_position(),
799
                "control frames remain at end of function body or expression"
800
            );
801
225k
        }
802
225k
        if !self.eof() {
803
0
            bail!(
804
0
                self.original_position(),
805
                "unexpected data at the end of operators"
806
            );
807
225k
        }
808
225k
        Ok(())
809
225k
    }
810
811
    #[inline]
812
32.0k
    fn expect_frame(&mut self, stack: &impl FrameStack, k: FrameKind, found: &str) -> Result<()> {
813
32.0k
        if stack.current_frame() == Some(k) {
814
32.0k
            return Ok(());
815
7
        }
816
7
        bail!(
817
7
            self.original_position(),
818
            "`{}` found outside `{:?}` block",
819
            found,
820
            k
821
        );
822
32.0k
    }
<wasmparser::binary_reader::BinaryReader>::expect_frame::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>
Line
Count
Source
812
7.78k
    fn expect_frame(&mut self, stack: &impl FrameStack, k: FrameKind, found: &str) -> Result<()> {
813
7.78k
        if stack.current_frame() == Some(k) {
814
7.77k
            return Ok(());
815
7
        }
816
7
        bail!(
817
7
            self.original_position(),
818
            "`{}` found outside `{:?}` block",
819
            found,
820
            k
821
        );
822
7.78k
    }
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
812
17.2k
    fn expect_frame(&mut self, stack: &impl FrameStack, k: FrameKind, found: &str) -> Result<()> {
813
17.2k
        if stack.current_frame() == Some(k) {
814
17.2k
            return Ok(());
815
0
        }
816
0
        bail!(
817
0
            self.original_position(),
818
            "`{}` found outside `{:?}` block",
819
            found,
820
            k
821
        );
822
17.2k
    }
<wasmparser::binary_reader::BinaryReader>::expect_frame::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
812
7.02k
    fn expect_frame(&mut self, stack: &impl FrameStack, k: FrameKind, found: &str) -> Result<()> {
813
7.02k
        if stack.current_frame() == Some(k) {
814
7.02k
            return Ok(());
815
0
        }
816
0
        bail!(
817
0
            self.original_position(),
818
            "`{}` found outside `{:?}` block",
819
            found,
820
            k
821
        );
822
7.02k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::expect_frame::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::expect_frame::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
823
824
    /// Visit the next available operator with the specified [`VisitOperator`] instance
825
    /// that is also a [`FrameStack`].
826
    ///
827
    /// See the documentation for [`OperatorsReader::visit_operator`] for a version that
828
    /// does not require the visitor to implement [`FrameStack`].
829
48.2M
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
830
48.2M
    where
831
48.2M
        T: VisitOperator<'a> + FrameStack,
832
    {
833
48.2M
        if visitor.current_frame().is_none() {
834
0
            bail!(
835
0
                self.original_position(),
836
                "operators remaining after end of function body or expression"
837
            );
838
48.2M
        }
839
48.2M
        let pos = self.original_position();
840
48.2M
        let code = self.read_u8()?;
841
48.2M
        Ok(match code {
842
128k
            0x00 => visitor.visit_unreachable(),
843
174k
            0x01 => visitor.visit_nop(),
844
1.64M
            0x02 => visitor.visit_block(self.read_block_type()?),
845
462k
            0x03 => visitor.visit_loop(self.read_block_type()?),
846
841k
            0x04 => visitor.visit_if(self.read_block_type()?),
847
            0x05 => {
848
32.0k
                self.expect_frame(visitor, FrameKind::If, "else")?;
849
32.0k
                visitor.visit_else()
850
            }
851
            0x06 => {
852
                #[cfg(feature = "features")]
853
7
                require_feature::legacy_exceptions(
854
7
                    self.features,
855
                    "legacy_exceptions feature required for try instruction",
856
7
                    pos,
857
0
                )?;
858
7
                visitor.visit_try(self.read_block_type()?)
859
            }
860
            0x07 => {
861
                #[cfg(feature = "features")]
862
1
                require_feature::legacy_exceptions(
863
1
                    self.features,
864
                    "legacy_exceptions feature required for catch instruction",
865
1
                    pos,
866
0
                )?;
867
1
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
868
0
                    Ok(()) => (),
869
1
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
870
                }
871
0
                visitor.visit_catch(self.read_var_u32()?)
872
            }
873
5.43k
            0x08 => visitor.visit_throw(self.read_var_u32()?),
874
30
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
875
16.6k
            0x0a => visitor.visit_throw_ref(),
876
4.99M
            0x0b => visitor.visit_end(),
877
879k
            0x0c => visitor.visit_br(self.read_var_u32()?),
878
558k
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
879
14.9k
            0x0e => visitor.visit_br_table(self.read_br_table()?),
880
8.66k
            0x0f => visitor.visit_return(),
881
159k
            0x10 => visitor.visit_call(self.read_var_u32()?),
882
            0x11 => {
883
2.93k
                let index = self.read_var_u32()?;
884
2.93k
                let table = self.read_call_indirect_table_immediate()?;
885
2.93k
                visitor.visit_call_indirect(index, table)
886
            }
887
27.6k
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
888
236
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
889
3
            0x14 => visitor.visit_call_ref(self.read()?),
890
1.07k
            0x15 => visitor.visit_return_call_ref(self.read()?),
891
            0x18 => {
892
2
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
893
1
                visitor.visit_delegate(self.read_var_u32()?)
894
            }
895
            0x19 => {
896
                #[cfg(feature = "features")]
897
1
                require_feature::legacy_exceptions(
898
1
                    self.features,
899
                    "legacy_exceptions feature required for catch_all instruction",
900
1
                    pos,
901
0
                )?;
902
1
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch_all") {
903
0
                    Ok(()) => (),
904
1
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch_all")?,
905
                }
906
0
                visitor.visit_catch_all()
907
            }
908
1.07M
            0x1a => visitor.visit_drop(),
909
253k
            0x1b => visitor.visit_select(),
910
            0x1c => {
911
564
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
912
563
                if result_count == 1 {
913
563
                    visitor.visit_typed_select(self.read()?)
914
                } else {
915
0
                    let mut results = Vec::new();
916
0
                    results.reserve_exact(result_count);
917
0
                    for _ in 0..result_count {
918
0
                        results.push(self.read()?);
919
                    }
920
0
                    visitor.visit_typed_select_multi(results)
921
                }
922
            }
923
647k
            0x1f => visitor.visit_try_table(self.read()?),
924
925
3.53M
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
926
1.74M
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
927
828k
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
928
2.09M
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
929
1.92M
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
930
1.59k
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
931
124
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
932
933
29.4k
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
934
41.7k
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
935
21.2k
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
936
15.1k
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
937
29.6k
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
938
20.5k
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
939
25.4k
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
940
19.7k
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
941
23.0k
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
942
26.0k
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
943
41.5k
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
944
249k
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
945
26.1k
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
946
29.4k
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
947
1.82k
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
948
1.68k
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
949
693
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
950
715
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
951
1.70k
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
952
1.25k
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
953
3.55k
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
954
1.27k
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
955
3.55k
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
956
            0x3f => {
957
617k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
958
617k
                visitor.visit_memory_size(mem)
959
            }
960
            0x40 => {
961
44.6k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
962
44.5k
                visitor.visit_memory_grow(mem)
963
            }
964
965
1.44M
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
966
4.59M
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
967
2.89M
            0x43 => visitor.visit_f32_const(self.read_f32()?),
968
2.21M
            0x44 => visitor.visit_f64_const(self.read_f64()?),
969
970
288k
            0x45 => visitor.visit_i32_eqz(),
971
6.46k
            0x46 => visitor.visit_i32_eq(),
972
12.7k
            0x47 => visitor.visit_i32_ne(),
973
5.39k
            0x48 => visitor.visit_i32_lt_s(),
974
5.83k
            0x49 => visitor.visit_i32_lt_u(),
975
2.75k
            0x4a => visitor.visit_i32_gt_s(),
976
2.69k
            0x4b => visitor.visit_i32_gt_u(),
977
98.0k
            0x4c => visitor.visit_i32_le_s(),
978
84.2k
            0x4d => visitor.visit_i32_le_u(),
979
2.43k
            0x4e => visitor.visit_i32_ge_s(),
980
6.57k
            0x4f => visitor.visit_i32_ge_u(),
981
46.5k
            0x50 => visitor.visit_i64_eqz(),
982
1.40k
            0x51 => visitor.visit_i64_eq(),
983
8.66k
            0x52 => visitor.visit_i64_ne(),
984
2.23k
            0x53 => visitor.visit_i64_lt_s(),
985
2.09k
            0x54 => visitor.visit_i64_lt_u(),
986
4.35k
            0x55 => visitor.visit_i64_gt_s(),
987
2.20k
            0x56 => visitor.visit_i64_gt_u(),
988
191k
            0x57 => visitor.visit_i64_le_s(),
989
190k
            0x58 => visitor.visit_i64_le_u(),
990
2.68k
            0x59 => visitor.visit_i64_ge_s(),
991
2.90k
            0x5a => visitor.visit_i64_ge_u(),
992
550k
            0x5b => visitor.visit_f32_eq(),
993
212k
            0x5c => visitor.visit_f32_ne(),
994
211k
            0x5d => visitor.visit_f32_lt(),
995
211k
            0x5e => visitor.visit_f32_gt(),
996
2.18k
            0x5f => visitor.visit_f32_le(),
997
933
            0x60 => visitor.visit_f32_ge(),
998
211k
            0x61 => visitor.visit_f64_eq(),
999
59.8k
            0x62 => visitor.visit_f64_ne(),
1000
58.6k
            0x63 => visitor.visit_f64_lt(),
1001
58.8k
            0x64 => visitor.visit_f64_gt(),
1002
556
            0x65 => visitor.visit_f64_le(),
1003
712
            0x66 => visitor.visit_f64_ge(),
1004
127k
            0x67 => visitor.visit_i32_clz(),
1005
81.1k
            0x68 => visitor.visit_i32_ctz(),
1006
75.8k
            0x69 => visitor.visit_i32_popcnt(),
1007
148k
            0x6a => visitor.visit_i32_add(),
1008
13.8k
            0x6b => visitor.visit_i32_sub(),
1009
369k
            0x6c => visitor.visit_i32_mul(),
1010
1.91k
            0x6d => visitor.visit_i32_div_s(),
1011
21.0k
            0x6e => visitor.visit_i32_div_u(),
1012
3.03k
            0x6f => visitor.visit_i32_rem_s(),
1013
2.82k
            0x70 => visitor.visit_i32_rem_u(),
1014
2.82k
            0x71 => visitor.visit_i32_and(),
1015
543k
            0x72 => visitor.visit_i32_or(),
1016
605k
            0x73 => visitor.visit_i32_xor(),
1017
1.80k
            0x74 => visitor.visit_i32_shl(),
1018
2.03k
            0x75 => visitor.visit_i32_shr_s(),
1019
3.42k
            0x76 => visitor.visit_i32_shr_u(),
1020
1.64k
            0x77 => visitor.visit_i32_rotl(),
1021
2.39k
            0x78 => visitor.visit_i32_rotr(),
1022
168k
            0x79 => visitor.visit_i64_clz(),
1023
213k
            0x7a => visitor.visit_i64_ctz(),
1024
221k
            0x7b => visitor.visit_i64_popcnt(),
1025
984k
            0x7c => visitor.visit_i64_add(),
1026
26.9k
            0x7d => visitor.visit_i64_sub(),
1027
667k
            0x7e => visitor.visit_i64_mul(),
1028
1.90k
            0x7f => visitor.visit_i64_div_s(),
1029
4.24k
            0x80 => visitor.visit_i64_div_u(),
1030
3.76k
            0x81 => visitor.visit_i64_rem_s(),
1031
2.61k
            0x82 => visitor.visit_i64_rem_u(),
1032
3.20k
            0x83 => visitor.visit_i64_and(),
1033
10.3k
            0x84 => visitor.visit_i64_or(),
1034
1.06M
            0x85 => visitor.visit_i64_xor(),
1035
3.76k
            0x86 => visitor.visit_i64_shl(),
1036
18.9k
            0x87 => visitor.visit_i64_shr_s(),
1037
21.2k
            0x88 => visitor.visit_i64_shr_u(),
1038
1.90k
            0x89 => visitor.visit_i64_rotl(),
1039
2.48k
            0x8a => visitor.visit_i64_rotr(),
1040
52.7k
            0x8b => visitor.visit_f32_abs(),
1041
36.2k
            0x8c => visitor.visit_f32_neg(),
1042
43.8k
            0x8d => visitor.visit_f32_ceil(),
1043
40.5k
            0x8e => visitor.visit_f32_floor(),
1044
17.2k
            0x8f => visitor.visit_f32_trunc(),
1045
13.2k
            0x90 => visitor.visit_f32_nearest(),
1046
18.2k
            0x91 => visitor.visit_f32_sqrt(),
1047
2.37k
            0x92 => visitor.visit_f32_add(),
1048
1.25k
            0x93 => visitor.visit_f32_sub(),
1049
894
            0x94 => visitor.visit_f32_mul(),
1050
507
            0x95 => visitor.visit_f32_div(),
1051
1.61k
            0x96 => visitor.visit_f32_min(),
1052
801
            0x97 => visitor.visit_f32_max(),
1053
473
            0x98 => visitor.visit_f32_copysign(),
1054
18.4k
            0x99 => visitor.visit_f64_abs(),
1055
33.9k
            0x9a => visitor.visit_f64_neg(),
1056
18.9k
            0x9b => visitor.visit_f64_ceil(),
1057
15.7k
            0x9c => visitor.visit_f64_floor(),
1058
18.1k
            0x9d => visitor.visit_f64_trunc(),
1059
16.2k
            0x9e => visitor.visit_f64_nearest(),
1060
20.1k
            0x9f => visitor.visit_f64_sqrt(),
1061
1.37k
            0xa0 => visitor.visit_f64_add(),
1062
1.02k
            0xa1 => visitor.visit_f64_sub(),
1063
1.36k
            0xa2 => visitor.visit_f64_mul(),
1064
2.11k
            0xa3 => visitor.visit_f64_div(),
1065
1.10k
            0xa4 => visitor.visit_f64_min(),
1066
1.09k
            0xa5 => visitor.visit_f64_max(),
1067
869
            0xa6 => visitor.visit_f64_copysign(),
1068
89.0k
            0xa7 => visitor.visit_i32_wrap_i64(),
1069
5.71k
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1070
171k
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1071
12.7k
            0xaa => visitor.visit_i32_trunc_f64_s(),
1072
29.7k
            0xab => visitor.visit_i32_trunc_f64_u(),
1073
28.3k
            0xac => visitor.visit_i64_extend_i32_s(),
1074
66.1k
            0xad => visitor.visit_i64_extend_i32_u(),
1075
31.8k
            0xae => visitor.visit_i64_trunc_f32_s(),
1076
6.98k
            0xaf => visitor.visit_i64_trunc_f32_u(),
1077
9.38k
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1078
11.6k
            0xb1 => visitor.visit_i64_trunc_f64_u(),
1079
13.9k
            0xb2 => visitor.visit_f32_convert_i32_s(),
1080
184k
            0xb3 => visitor.visit_f32_convert_i32_u(),
1081
9.03k
            0xb4 => visitor.visit_f32_convert_i64_s(),
1082
15.6k
            0xb5 => visitor.visit_f32_convert_i64_u(),
1083
21.1k
            0xb6 => visitor.visit_f32_demote_f64(),
1084
27.7k
            0xb7 => visitor.visit_f64_convert_i32_s(),
1085
18.9k
            0xb8 => visitor.visit_f64_convert_i32_u(),
1086
25.3k
            0xb9 => visitor.visit_f64_convert_i64_s(),
1087
25.1k
            0xba => visitor.visit_f64_convert_i64_u(),
1088
23.1k
            0xbb => visitor.visit_f64_promote_f32(),
1089
228k
            0xbc => visitor.visit_i32_reinterpret_f32(),
1090
374k
            0xbd => visitor.visit_i64_reinterpret_f64(),
1091
27.4k
            0xbe => visitor.visit_f32_reinterpret_i32(),
1092
6.55k
            0xbf => visitor.visit_f64_reinterpret_i64(),
1093
1094
144k
            0xc0 => visitor.visit_i32_extend8_s(),
1095
67.4k
            0xc1 => visitor.visit_i32_extend16_s(),
1096
61.9k
            0xc2 => visitor.visit_i64_extend8_s(),
1097
75.5k
            0xc3 => visitor.visit_i64_extend16_s(),
1098
44.8k
            0xc4 => visitor.visit_i64_extend32_s(),
1099
1100
472k
            0xd0 => visitor.visit_ref_null(self.read()?),
1101
16.6k
            0xd1 => visitor.visit_ref_is_null(),
1102
51.0k
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1103
6.97k
            0xd3 => visitor.visit_ref_eq(),
1104
51.7k
            0xd4 => visitor.visit_ref_as_non_null(),
1105
69.4k
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1106
2.49k
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1107
1108
2
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1109
1
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1110
6
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1111
0
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1112
            0xe4 => {
1113
9
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1114
            }
1115
1
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1116
0
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1117
1118
178k
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1119
884k
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1120
            0xfd => {
1121
                #[cfg(feature = "simd")]
1122
1.26M
                if let Some(mut visitor) = visitor.simd_visitor() {
1123
1.26M
                    return self.visit_0xfd_operator(pos, &mut visitor);
1124
0
                }
1125
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1126
            }
1127
512k
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1128
1129
31
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1130
        })
1131
48.2M
    }
<wasmparser::binary_reader::BinaryReader>::visit_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>
Line
Count
Source
829
8.67M
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
830
8.67M
    where
831
8.67M
        T: VisitOperator<'a> + FrameStack,
832
    {
833
8.67M
        if visitor.current_frame().is_none() {
834
0
            bail!(
835
0
                self.original_position(),
836
                "operators remaining after end of function body or expression"
837
            );
838
8.67M
        }
839
8.67M
        let pos = self.original_position();
840
8.67M
        let code = self.read_u8()?;
841
8.67M
        Ok(match code {
842
36.0k
            0x00 => visitor.visit_unreachable(),
843
24.5k
            0x01 => visitor.visit_nop(),
844
385k
            0x02 => visitor.visit_block(self.read_block_type()?),
845
49.8k
            0x03 => visitor.visit_loop(self.read_block_type()?),
846
50.3k
            0x04 => visitor.visit_if(self.read_block_type()?),
847
            0x05 => {
848
7.77k
                self.expect_frame(visitor, FrameKind::If, "else")?;
849
7.77k
                visitor.visit_else()
850
            }
851
            0x06 => {
852
                #[cfg(feature = "features")]
853
6
                require_feature::legacy_exceptions(
854
6
                    self.features,
855
                    "legacy_exceptions feature required for try instruction",
856
6
                    pos,
857
0
                )?;
858
6
                visitor.visit_try(self.read_block_type()?)
859
            }
860
            0x07 => {
861
                #[cfg(feature = "features")]
862
1
                require_feature::legacy_exceptions(
863
1
                    self.features,
864
                    "legacy_exceptions feature required for catch instruction",
865
1
                    pos,
866
0
                )?;
867
1
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
868
0
                    Ok(()) => (),
869
1
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
870
                }
871
0
                visitor.visit_catch(self.read_var_u32()?)
872
            }
873
2.66k
            0x08 => visitor.visit_throw(self.read_var_u32()?),
874
30
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
875
113
            0x0a => visitor.visit_throw_ref(),
876
574k
            0x0b => visitor.visit_end(),
877
187k
            0x0c => visitor.visit_br(self.read_var_u32()?),
878
159k
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
879
3.83k
            0x0e => visitor.visit_br_table(self.read_br_table()?),
880
2.07k
            0x0f => visitor.visit_return(),
881
20.0k
            0x10 => visitor.visit_call(self.read_var_u32()?),
882
            0x11 => {
883
578
                let index = self.read_var_u32()?;
884
578
                let table = self.read_call_indirect_table_immediate()?;
885
578
                visitor.visit_call_indirect(index, table)
886
            }
887
5.36k
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
888
100
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
889
1
            0x14 => visitor.visit_call_ref(self.read()?),
890
4
            0x15 => visitor.visit_return_call_ref(self.read()?),
891
            0x18 => {
892
2
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
893
1
                visitor.visit_delegate(self.read_var_u32()?)
894
            }
895
            0x19 => {
896
                #[cfg(feature = "features")]
897
1
                require_feature::legacy_exceptions(
898
1
                    self.features,
899
                    "legacy_exceptions feature required for catch_all instruction",
900
1
                    pos,
901
0
                )?;
902
1
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch_all") {
903
0
                    Ok(()) => (),
904
1
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch_all")?,
905
                }
906
0
                visitor.visit_catch_all()
907
            }
908
161k
            0x1a => visitor.visit_drop(),
909
37.5k
            0x1b => visitor.visit_select(),
910
            0x1c => {
911
22
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
912
21
                if result_count == 1 {
913
21
                    visitor.visit_typed_select(self.read()?)
914
                } else {
915
0
                    let mut results = Vec::new();
916
0
                    results.reserve_exact(result_count);
917
0
                    for _ in 0..result_count {
918
0
                        results.push(self.read()?);
919
                    }
920
0
                    visitor.visit_typed_select_multi(results)
921
                }
922
            }
923
89.6k
            0x1f => visitor.visit_try_table(self.read()?),
924
925
576k
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
926
304k
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
927
187k
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
928
447k
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
929
408k
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
930
618
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
931
51
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
932
933
9.42k
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
934
9.43k
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
935
7.66k
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
936
4.27k
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
937
6.85k
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
938
6.19k
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
939
7.50k
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
940
4.64k
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
941
5.67k
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
942
5.07k
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
943
15.3k
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
944
4.45k
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
945
9.39k
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
946
4.49k
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
947
428
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
948
530
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
949
334
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
950
297
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
951
1.10k
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
952
279
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
953
422
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
954
452
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
955
224
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
956
            0x3f => {
957
102k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
958
102k
                visitor.visit_memory_size(mem)
959
            }
960
            0x40 => {
961
10.8k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
962
10.8k
                visitor.visit_memory_grow(mem)
963
            }
964
965
238k
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
966
1.15M
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
967
147k
            0x43 => visitor.visit_f32_const(self.read_f32()?),
968
510k
            0x44 => visitor.visit_f64_const(self.read_f64()?),
969
970
19.2k
            0x45 => visitor.visit_i32_eqz(),
971
2.01k
            0x46 => visitor.visit_i32_eq(),
972
2.30k
            0x47 => visitor.visit_i32_ne(),
973
1.92k
            0x48 => visitor.visit_i32_lt_s(),
974
1.80k
            0x49 => visitor.visit_i32_lt_u(),
975
1.00k
            0x4a => visitor.visit_i32_gt_s(),
976
507
            0x4b => visitor.visit_i32_gt_u(),
977
19.1k
            0x4c => visitor.visit_i32_le_s(),
978
19.4k
            0x4d => visitor.visit_i32_le_u(),
979
492
            0x4e => visitor.visit_i32_ge_s(),
980
796
            0x4f => visitor.visit_i32_ge_u(),
981
10.0k
            0x50 => visitor.visit_i64_eqz(),
982
330
            0x51 => visitor.visit_i64_eq(),
983
1.87k
            0x52 => visitor.visit_i64_ne(),
984
574
            0x53 => visitor.visit_i64_lt_s(),
985
436
            0x54 => visitor.visit_i64_lt_u(),
986
571
            0x55 => visitor.visit_i64_gt_s(),
987
382
            0x56 => visitor.visit_i64_gt_u(),
988
58.3k
            0x57 => visitor.visit_i64_le_s(),
989
59.0k
            0x58 => visitor.visit_i64_le_u(),
990
530
            0x59 => visitor.visit_i64_ge_s(),
991
446
            0x5a => visitor.visit_i64_ge_u(),
992
22.2k
            0x5b => visitor.visit_f32_eq(),
993
5.43k
            0x5c => visitor.visit_f32_ne(),
994
4.09k
            0x5d => visitor.visit_f32_lt(),
995
4.09k
            0x5e => visitor.visit_f32_gt(),
996
1.64k
            0x5f => visitor.visit_f32_le(),
997
237
            0x60 => visitor.visit_f32_ge(),
998
43.9k
            0x61 => visitor.visit_f64_eq(),
999
10.3k
            0x62 => visitor.visit_f64_ne(),
1000
10.1k
            0x63 => visitor.visit_f64_lt(),
1001
10.2k
            0x64 => visitor.visit_f64_gt(),
1002
247
            0x65 => visitor.visit_f64_le(),
1003
277
            0x66 => visitor.visit_f64_ge(),
1004
18.3k
            0x67 => visitor.visit_i32_clz(),
1005
18.8k
            0x68 => visitor.visit_i32_ctz(),
1006
12.5k
            0x69 => visitor.visit_i32_popcnt(),
1007
31.4k
            0x6a => visitor.visit_i32_add(),
1008
1.81k
            0x6b => visitor.visit_i32_sub(),
1009
42.3k
            0x6c => visitor.visit_i32_mul(),
1010
465
            0x6d => visitor.visit_i32_div_s(),
1011
611
            0x6e => visitor.visit_i32_div_u(),
1012
617
            0x6f => visitor.visit_i32_rem_s(),
1013
780
            0x70 => visitor.visit_i32_rem_u(),
1014
578
            0x71 => visitor.visit_i32_and(),
1015
30.0k
            0x72 => visitor.visit_i32_or(),
1016
141k
            0x73 => visitor.visit_i32_xor(),
1017
405
            0x74 => visitor.visit_i32_shl(),
1018
399
            0x75 => visitor.visit_i32_shr_s(),
1019
504
            0x76 => visitor.visit_i32_shr_u(),
1020
610
            0x77 => visitor.visit_i32_rotl(),
1021
484
            0x78 => visitor.visit_i32_rotr(),
1022
42.6k
            0x79 => visitor.visit_i64_clz(),
1023
77.3k
            0x7a => visitor.visit_i64_ctz(),
1024
77.0k
            0x7b => visitor.visit_i64_popcnt(),
1025
90.5k
            0x7c => visitor.visit_i64_add(),
1026
2.08k
            0x7d => visitor.visit_i64_sub(),
1027
108k
            0x7e => visitor.visit_i64_mul(),
1028
335
            0x7f => visitor.visit_i64_div_s(),
1029
654
            0x80 => visitor.visit_i64_div_u(),
1030
966
            0x81 => visitor.visit_i64_rem_s(),
1031
591
            0x82 => visitor.visit_i64_rem_u(),
1032
622
            0x83 => visitor.visit_i64_and(),
1033
333
            0x84 => visitor.visit_i64_or(),
1034
194k
            0x85 => visitor.visit_i64_xor(),
1035
981
            0x86 => visitor.visit_i64_shl(),
1036
8.96k
            0x87 => visitor.visit_i64_shr_s(),
1037
259
            0x88 => visitor.visit_i64_shr_u(),
1038
472
            0x89 => visitor.visit_i64_rotl(),
1039
561
            0x8a => visitor.visit_i64_rotr(),
1040
4.39k
            0x8b => visitor.visit_f32_abs(),
1041
6.67k
            0x8c => visitor.visit_f32_neg(),
1042
2.37k
            0x8d => visitor.visit_f32_ceil(),
1043
2.29k
            0x8e => visitor.visit_f32_floor(),
1044
4.03k
            0x8f => visitor.visit_f32_trunc(),
1045
2.35k
            0x90 => visitor.visit_f32_nearest(),
1046
2.09k
            0x91 => visitor.visit_f32_sqrt(),
1047
246
            0x92 => visitor.visit_f32_add(),
1048
98
            0x93 => visitor.visit_f32_sub(),
1049
161
            0x94 => visitor.visit_f32_mul(),
1050
86
            0x95 => visitor.visit_f32_div(),
1051
225
            0x96 => visitor.visit_f32_min(),
1052
285
            0x97 => visitor.visit_f32_max(),
1053
99
            0x98 => visitor.visit_f32_copysign(),
1054
3.26k
            0x99 => visitor.visit_f64_abs(),
1055
5.50k
            0x9a => visitor.visit_f64_neg(),
1056
3.62k
            0x9b => visitor.visit_f64_ceil(),
1057
3.48k
            0x9c => visitor.visit_f64_floor(),
1058
4.03k
            0x9d => visitor.visit_f64_trunc(),
1059
3.56k
            0x9e => visitor.visit_f64_nearest(),
1060
4.28k
            0x9f => visitor.visit_f64_sqrt(),
1061
149
            0xa0 => visitor.visit_f64_add(),
1062
166
            0xa1 => visitor.visit_f64_sub(),
1063
249
            0xa2 => visitor.visit_f64_mul(),
1064
184
            0xa3 => visitor.visit_f64_div(),
1065
388
            0xa4 => visitor.visit_f64_min(),
1066
92
            0xa5 => visitor.visit_f64_max(),
1067
88
            0xa6 => visitor.visit_f64_copysign(),
1068
12.9k
            0xa7 => visitor.visit_i32_wrap_i64(),
1069
908
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1070
1.27k
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1071
3.77k
            0xaa => visitor.visit_i32_trunc_f64_s(),
1072
2.58k
            0xab => visitor.visit_i32_trunc_f64_u(),
1073
6.94k
            0xac => visitor.visit_i64_extend_i32_s(),
1074
8.92k
            0xad => visitor.visit_i64_extend_i32_u(),
1075
1.20k
            0xae => visitor.visit_i64_trunc_f32_s(),
1076
1.48k
            0xaf => visitor.visit_i64_trunc_f32_u(),
1077
1.91k
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1078
2.98k
            0xb1 => visitor.visit_i64_trunc_f64_u(),
1079
3.64k
            0xb2 => visitor.visit_f32_convert_i32_s(),
1080
5.36k
            0xb3 => visitor.visit_f32_convert_i32_u(),
1081
1.74k
            0xb4 => visitor.visit_f32_convert_i64_s(),
1082
2.38k
            0xb5 => visitor.visit_f32_convert_i64_u(),
1083
3.01k
            0xb6 => visitor.visit_f32_demote_f64(),
1084
4.88k
            0xb7 => visitor.visit_f64_convert_i32_s(),
1085
6.24k
            0xb8 => visitor.visit_f64_convert_i32_u(),
1086
1.30k
            0xb9 => visitor.visit_f64_convert_i64_s(),
1087
3.35k
            0xba => visitor.visit_f64_convert_i64_u(),
1088
5.40k
            0xbb => visitor.visit_f64_promote_f32(),
1089
73.2k
            0xbc => visitor.visit_i32_reinterpret_f32(),
1090
107k
            0xbd => visitor.visit_i64_reinterpret_f64(),
1091
6.83k
            0xbe => visitor.visit_f32_reinterpret_i32(),
1092
876
            0xbf => visitor.visit_f64_reinterpret_i64(),
1093
1094
26.6k
            0xc0 => visitor.visit_i32_extend8_s(),
1095
18.8k
            0xc1 => visitor.visit_i32_extend16_s(),
1096
21.3k
            0xc2 => visitor.visit_i64_extend8_s(),
1097
30.9k
            0xc3 => visitor.visit_i64_extend16_s(),
1098
13.5k
            0xc4 => visitor.visit_i64_extend32_s(),
1099
1100
124k
            0xd0 => visitor.visit_ref_null(self.read()?),
1101
6.17k
            0xd1 => visitor.visit_ref_is_null(),
1102
3.04k
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1103
3.48k
            0xd3 => visitor.visit_ref_eq(),
1104
25.6k
            0xd4 => visitor.visit_ref_as_non_null(),
1105
34.0k
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1106
1.24k
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1107
1108
1
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1109
1
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1110
6
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1111
0
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1112
            0xe4 => {
1113
8
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1114
            }
1115
1
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1116
0
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1117
1118
79.9k
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1119
196k
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1120
            0xfd => {
1121
                #[cfg(feature = "simd")]
1122
340k
                if let Some(mut visitor) = visitor.simd_visitor() {
1123
340k
                    return self.visit_0xfd_operator(pos, &mut visitor);
1124
0
                }
1125
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1126
            }
1127
207k
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1128
1129
27
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1130
        })
1131
8.67M
    }
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
829
25.9M
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
830
25.9M
    where
831
25.9M
        T: VisitOperator<'a> + FrameStack,
832
    {
833
25.9M
        if visitor.current_frame().is_none() {
834
0
            bail!(
835
0
                self.original_position(),
836
                "operators remaining after end of function body or expression"
837
            );
838
25.9M
        }
839
25.9M
        let pos = self.original_position();
840
25.9M
        let code = self.read_u8()?;
841
25.9M
        Ok(match code {
842
66.8k
            0x00 => visitor.visit_unreachable(),
843
133k
            0x01 => visitor.visit_nop(),
844
925k
            0x02 => visitor.visit_block(self.read_block_type()?),
845
369k
            0x03 => visitor.visit_loop(self.read_block_type()?),
846
628k
            0x04 => visitor.visit_if(self.read_block_type()?),
847
            0x05 => {
848
17.2k
                self.expect_frame(visitor, FrameKind::If, "else")?;
849
17.2k
                visitor.visit_else()
850
            }
851
            0x06 => {
852
                #[cfg(feature = "features")]
853
0
                require_feature::legacy_exceptions(
854
0
                    self.features,
855
                    "legacy_exceptions feature required for try instruction",
856
0
                    pos,
857
0
                )?;
858
0
                visitor.visit_try(self.read_block_type()?)
859
            }
860
            0x07 => {
861
                #[cfg(feature = "features")]
862
0
                require_feature::legacy_exceptions(
863
0
                    self.features,
864
                    "legacy_exceptions feature required for catch instruction",
865
0
                    pos,
866
0
                )?;
867
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
868
0
                    Ok(()) => (),
869
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
870
                }
871
0
                visitor.visit_catch(self.read_var_u32()?)
872
            }
873
1.34k
            0x08 => visitor.visit_throw(self.read_var_u32()?),
874
0
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
875
11.1k
            0x0a => visitor.visit_throw_ref(),
876
2.71M
            0x0b => visitor.visit_end(),
877
518k
            0x0c => visitor.visit_br(self.read_var_u32()?),
878
262k
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
879
6.43k
            0x0e => visitor.visit_br_table(self.read_br_table()?),
880
4.79k
            0x0f => visitor.visit_return(),
881
123k
            0x10 => visitor.visit_call(self.read_var_u32()?),
882
            0x11 => {
883
1.96k
                let index = self.read_var_u32()?;
884
1.96k
                let table = self.read_call_indirect_table_immediate()?;
885
1.96k
                visitor.visit_call_indirect(index, table)
886
            }
887
15.3k
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
888
85
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
889
0
            0x14 => visitor.visit_call_ref(self.read()?),
890
1.06k
            0x15 => visitor.visit_return_call_ref(self.read()?),
891
            0x18 => {
892
0
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
893
0
                visitor.visit_delegate(self.read_var_u32()?)
894
            }
895
            0x19 => {
896
                #[cfg(feature = "features")]
897
0
                require_feature::legacy_exceptions(
898
0
                    self.features,
899
                    "legacy_exceptions feature required for catch_all instruction",
900
0
                    pos,
901
0
                )?;
902
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch_all") {
903
0
                    Ok(()) => (),
904
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch_all")?,
905
                }
906
0
                visitor.visit_catch_all()
907
            }
908
785k
            0x1a => visitor.visit_drop(),
909
142k
            0x1b => visitor.visit_select(),
910
            0x1c => {
911
525
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
912
525
                if result_count == 1 {
913
525
                    visitor.visit_typed_select(self.read()?)
914
                } else {
915
0
                    let mut results = Vec::new();
916
0
                    results.reserve_exact(result_count);
917
0
                    for _ in 0..result_count {
918
0
                        results.push(self.read()?);
919
                    }
920
0
                    visitor.visit_typed_select_multi(results)
921
                }
922
            }
923
456k
            0x1f => visitor.visit_try_table(self.read()?),
924
925
2.14M
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
926
1.04M
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
927
438k
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
928
1.23M
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
929
1.17M
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
930
614
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
931
55
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
932
933
12.5k
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
934
24.8k
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
935
6.81k
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
936
7.48k
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
937
16.3k
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
938
9.63k
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
939
12.3k
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
940
10.1k
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
941
11.5k
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
942
15.9k
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
943
16.7k
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
944
240k
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
945
10.5k
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
946
19.0k
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
947
1.11k
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
948
828
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
949
222
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
950
269
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
951
307
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
952
522
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
953
2.64k
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
954
571
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
955
3.14k
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
956
            0x3f => {
957
425k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
958
425k
                visitor.visit_memory_size(mem)
959
            }
960
            0x40 => {
961
23.2k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
962
23.2k
                visitor.visit_memory_grow(mem)
963
            }
964
965
502k
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
966
1.27M
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
967
2.15M
            0x43 => visitor.visit_f32_const(self.read_f32()?),
968
1.12M
            0x44 => visitor.visit_f64_const(self.read_f64()?),
969
970
228k
            0x45 => visitor.visit_i32_eqz(),
971
2.92k
            0x46 => visitor.visit_i32_eq(),
972
8.69k
            0x47 => visitor.visit_i32_ne(),
973
2.24k
            0x48 => visitor.visit_i32_lt_s(),
974
2.77k
            0x49 => visitor.visit_i32_lt_u(),
975
1.07k
            0x4a => visitor.visit_i32_gt_s(),
976
1.70k
            0x4b => visitor.visit_i32_gt_u(),
977
44.7k
            0x4c => visitor.visit_i32_le_s(),
978
37.5k
            0x4d => visitor.visit_i32_le_u(),
979
1.45k
            0x4e => visitor.visit_i32_ge_s(),
980
3.54k
            0x4f => visitor.visit_i32_ge_u(),
981
23.9k
            0x50 => visitor.visit_i64_eqz(),
982
811
            0x51 => visitor.visit_i64_eq(),
983
4.40k
            0x52 => visitor.visit_i64_ne(),
984
1.14k
            0x53 => visitor.visit_i64_lt_s(),
985
1.24k
            0x54 => visitor.visit_i64_lt_u(),
986
2.98k
            0x55 => visitor.visit_i64_gt_s(),
987
1.06k
            0x56 => visitor.visit_i64_gt_u(),
988
92.2k
            0x57 => visitor.visit_i64_le_s(),
989
90.2k
            0x58 => visitor.visit_i64_le_u(),
990
1.48k
            0x59 => visitor.visit_i64_ge_s(),
991
917
            0x5a => visitor.visit_i64_ge_u(),
992
416k
            0x5b => visitor.visit_f32_eq(),
993
168k
            0x5c => visitor.visit_f32_ne(),
994
168k
            0x5d => visitor.visit_f32_lt(),
995
168k
            0x5e => visitor.visit_f32_gt(),
996
321
            0x5f => visitor.visit_f32_le(),
997
505
            0x60 => visitor.visit_f32_ge(),
998
115k
            0x61 => visitor.visit_f64_eq(),
999
36.4k
            0x62 => visitor.visit_f64_ne(),
1000
35.3k
            0x63 => visitor.visit_f64_lt(),
1001
35.4k
            0x64 => visitor.visit_f64_gt(),
1002
157
            0x65 => visitor.visit_f64_le(),
1003
296
            0x66 => visitor.visit_f64_ge(),
1004
86.2k
            0x67 => visitor.visit_i32_clz(),
1005
42.6k
            0x68 => visitor.visit_i32_ctz(),
1006
39.8k
            0x69 => visitor.visit_i32_popcnt(),
1007
37.0k
            0x6a => visitor.visit_i32_add(),
1008
2.05k
            0x6b => visitor.visit_i32_sub(),
1009
36.9k
            0x6c => visitor.visit_i32_mul(),
1010
1.01k
            0x6d => visitor.visit_i32_div_s(),
1011
10.2k
            0x6e => visitor.visit_i32_div_u(),
1012
1.91k
            0x6f => visitor.visit_i32_rem_s(),
1013
1.13k
            0x70 => visitor.visit_i32_rem_u(),
1014
1.76k
            0x71 => visitor.visit_i32_and(),
1015
408k
            0x72 => visitor.visit_i32_or(),
1016
337k
            0x73 => visitor.visit_i32_xor(),
1017
1.03k
            0x74 => visitor.visit_i32_shl(),
1018
1.17k
            0x75 => visitor.visit_i32_shr_s(),
1019
1.80k
            0x76 => visitor.visit_i32_shr_u(),
1020
758
            0x77 => visitor.visit_i32_rotl(),
1021
1.21k
            0x78 => visitor.visit_i32_rotr(),
1022
82.6k
            0x79 => visitor.visit_i64_clz(),
1023
88.2k
            0x7a => visitor.visit_i64_ctz(),
1024
92.8k
            0x7b => visitor.visit_i64_popcnt(),
1025
93.4k
            0x7c => visitor.visit_i64_add(),
1026
13.6k
            0x7d => visitor.visit_i64_sub(),
1027
90.5k
            0x7e => visitor.visit_i64_mul(),
1028
922
            0x7f => visitor.visit_i64_div_s(),
1029
2.61k
            0x80 => visitor.visit_i64_div_u(),
1030
1.94k
            0x81 => visitor.visit_i64_rem_s(),
1031
1.28k
            0x82 => visitor.visit_i64_rem_u(),
1032
1.87k
            0x83 => visitor.visit_i64_and(),
1033
9.33k
            0x84 => visitor.visit_i64_or(),
1034
705k
            0x85 => visitor.visit_i64_xor(),
1035
1.99k
            0x86 => visitor.visit_i64_shl(),
1036
5.17k
            0x87 => visitor.visit_i64_shr_s(),
1037
19.0k
            0x88 => visitor.visit_i64_shr_u(),
1038
766
            0x89 => visitor.visit_i64_rotl(),
1039
874
            0x8a => visitor.visit_i64_rotr(),
1040
37.8k
            0x8b => visitor.visit_f32_abs(),
1041
20.7k
            0x8c => visitor.visit_f32_neg(),
1042
27.4k
            0x8d => visitor.visit_f32_ceil(),
1043
35.1k
            0x8e => visitor.visit_f32_floor(),
1044
8.47k
            0x8f => visitor.visit_f32_trunc(),
1045
6.57k
            0x90 => visitor.visit_f32_nearest(),
1046
8.71k
            0x91 => visitor.visit_f32_sqrt(),
1047
1.70k
            0x92 => visitor.visit_f32_add(),
1048
963
            0x93 => visitor.visit_f32_sub(),
1049
445
            0x94 => visitor.visit_f32_mul(),
1050
272
            0x95 => visitor.visit_f32_div(),
1051
1.09k
            0x96 => visitor.visit_f32_min(),
1052
290
            0x97 => visitor.visit_f32_max(),
1053
250
            0x98 => visitor.visit_f32_copysign(),
1054
11.1k
            0x99 => visitor.visit_f64_abs(),
1055
12.0k
            0x9a => visitor.visit_f64_neg(),
1056
10.1k
            0x9b => visitor.visit_f64_ceil(),
1057
6.93k
            0x9c => visitor.visit_f64_floor(),
1058
9.27k
            0x9d => visitor.visit_f64_trunc(),
1059
8.95k
            0x9e => visitor.visit_f64_nearest(),
1060
9.18k
            0x9f => visitor.visit_f64_sqrt(),
1061
895
            0xa0 => visitor.visit_f64_add(),
1062
535
            0xa1 => visitor.visit_f64_sub(),
1063
865
            0xa2 => visitor.visit_f64_mul(),
1064
1.66k
            0xa3 => visitor.visit_f64_div(),
1065
401
            0xa4 => visitor.visit_f64_min(),
1066
848
            0xa5 => visitor.visit_f64_max(),
1067
593
            0xa6 => visitor.visit_f64_copysign(),
1068
40.1k
            0xa7 => visitor.visit_i32_wrap_i64(),
1069
2.96k
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1070
137k
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1071
5.44k
            0xaa => visitor.visit_i32_trunc_f64_s(),
1072
21.7k
            0xab => visitor.visit_i32_trunc_f64_u(),
1073
13.5k
            0xac => visitor.visit_i64_extend_i32_s(),
1074
43.7k
            0xad => visitor.visit_i64_extend_i32_u(),
1075
27.4k
            0xae => visitor.visit_i64_trunc_f32_s(),
1076
3.27k
            0xaf => visitor.visit_i64_trunc_f32_u(),
1077
4.90k
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1078
6.15k
            0xb1 => visitor.visit_i64_trunc_f64_u(),
1079
6.61k
            0xb2 => visitor.visit_f32_convert_i32_s(),
1080
143k
            0xb3 => visitor.visit_f32_convert_i32_u(),
1081
5.21k
            0xb4 => visitor.visit_f32_convert_i64_s(),
1082
7.75k
            0xb5 => visitor.visit_f32_convert_i64_u(),
1083
13.4k
            0xb6 => visitor.visit_f32_demote_f64(),
1084
19.2k
            0xb7 => visitor.visit_f64_convert_i32_s(),
1085
8.02k
            0xb8 => visitor.visit_f64_convert_i32_u(),
1086
19.0k
            0xb9 => visitor.visit_f64_convert_i64_s(),
1087
13.8k
            0xba => visitor.visit_f64_convert_i64_u(),
1088
13.2k
            0xbb => visitor.visit_f64_promote_f32(),
1089
104k
            0xbc => visitor.visit_i32_reinterpret_f32(),
1090
176k
            0xbd => visitor.visit_i64_reinterpret_f64(),
1091
15.4k
            0xbe => visitor.visit_f32_reinterpret_i32(),
1092
3.89k
            0xbf => visitor.visit_f64_reinterpret_i64(),
1093
1094
101k
            0xc0 => visitor.visit_i32_extend8_s(),
1095
32.9k
            0xc1 => visitor.visit_i32_extend16_s(),
1096
27.2k
            0xc2 => visitor.visit_i64_extend8_s(),
1097
28.4k
            0xc3 => visitor.visit_i64_extend16_s(),
1098
20.8k
            0xc4 => visitor.visit_i64_extend32_s(),
1099
1100
212k
            0xd0 => visitor.visit_ref_null(self.read()?),
1101
6.42k
            0xd1 => visitor.visit_ref_is_null(),
1102
4.81k
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1103
1.74k
            0xd3 => visitor.visit_ref_eq(),
1104
13.1k
            0xd4 => visitor.visit_ref_as_non_null(),
1105
16.9k
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1106
623
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1107
1108
0
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1109
0
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1110
0
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1111
0
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1112
            0xe4 => {
1113
0
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1114
            }
1115
0
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1116
0
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1117
1118
35.7k
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1119
478k
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1120
            0xfd => {
1121
                #[cfg(feature = "simd")]
1122
619k
                if let Some(mut visitor) = visitor.simd_visitor() {
1123
619k
                    return self.visit_0xfd_operator(pos, &mut visitor);
1124
0
                }
1125
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1126
            }
1127
169k
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1128
1129
0
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1130
        })
1131
25.9M
    }
<wasmparser::binary_reader::BinaryReader>::visit_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
829
9.65M
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
830
9.65M
    where
831
9.65M
        T: VisitOperator<'a> + FrameStack,
832
    {
833
9.65M
        if visitor.current_frame().is_none() {
834
0
            bail!(
835
0
                self.original_position(),
836
                "operators remaining after end of function body or expression"
837
            );
838
9.65M
        }
839
9.65M
        let pos = self.original_position();
840
9.65M
        let code = self.read_u8()?;
841
9.65M
        Ok(match code {
842
25.6k
            0x00 => visitor.visit_unreachable(),
843
16.8k
            0x01 => visitor.visit_nop(),
844
335k
            0x02 => visitor.visit_block(self.read_block_type()?),
845
43.2k
            0x03 => visitor.visit_loop(self.read_block_type()?),
846
163k
            0x04 => visitor.visit_if(self.read_block_type()?),
847
            0x05 => {
848
7.02k
                self.expect_frame(visitor, FrameKind::If, "else")?;
849
7.02k
                visitor.visit_else()
850
            }
851
            0x06 => {
852
                #[cfg(feature = "features")]
853
1
                require_feature::legacy_exceptions(
854
1
                    self.features,
855
                    "legacy_exceptions feature required for try instruction",
856
1
                    pos,
857
0
                )?;
858
1
                visitor.visit_try(self.read_block_type()?)
859
            }
860
            0x07 => {
861
                #[cfg(feature = "features")]
862
0
                require_feature::legacy_exceptions(
863
0
                    self.features,
864
                    "legacy_exceptions feature required for catch instruction",
865
0
                    pos,
866
0
                )?;
867
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
868
0
                    Ok(()) => (),
869
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
870
                }
871
0
                visitor.visit_catch(self.read_var_u32()?)
872
            }
873
1.41k
            0x08 => visitor.visit_throw(self.read_var_u32()?),
874
0
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
875
5.42k
            0x0a => visitor.visit_throw_ref(),
876
920k
            0x0b => visitor.visit_end(),
877
173k
            0x0c => visitor.visit_br(self.read_var_u32()?),
878
136k
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
879
4.71k
            0x0e => visitor.visit_br_table(self.read_br_table()?),
880
1.79k
            0x0f => visitor.visit_return(),
881
15.8k
            0x10 => visitor.visit_call(self.read_var_u32()?),
882
            0x11 => {
883
389
                let index = self.read_var_u32()?;
884
389
                let table = self.read_call_indirect_table_immediate()?;
885
389
                visitor.visit_call_indirect(index, table)
886
            }
887
6.95k
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
888
51
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
889
2
            0x14 => visitor.visit_call_ref(self.read()?),
890
3
            0x15 => visitor.visit_return_call_ref(self.read()?),
891
            0x18 => {
892
0
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
893
0
                visitor.visit_delegate(self.read_var_u32()?)
894
            }
895
            0x19 => {
896
                #[cfg(feature = "features")]
897
0
                require_feature::legacy_exceptions(
898
0
                    self.features,
899
                    "legacy_exceptions feature required for catch_all instruction",
900
0
                    pos,
901
0
                )?;
902
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch_all") {
903
0
                    Ok(()) => (),
904
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch_all")?,
905
                }
906
0
                visitor.visit_catch_all()
907
            }
908
123k
            0x1a => visitor.visit_drop(),
909
74.0k
            0x1b => visitor.visit_select(),
910
            0x1c => {
911
17
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
912
17
                if result_count == 1 {
913
17
                    visitor.visit_typed_select(self.read()?)
914
                } else {
915
0
                    let mut results = Vec::new();
916
0
                    results.reserve_exact(result_count);
917
0
                    for _ in 0..result_count {
918
0
                        results.push(self.read()?);
919
                    }
920
0
                    visitor.visit_typed_select_multi(results)
921
                }
922
            }
923
101k
            0x1f => visitor.visit_try_table(self.read()?),
924
925
810k
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
926
393k
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
927
202k
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
928
387k
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
929
342k
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
930
367
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
931
18
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
932
933
7.54k
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
934
7.46k
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
935
6.77k
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
936
3.38k
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
937
6.43k
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
938
4.69k
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
939
5.53k
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
940
4.93k
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
941
5.84k
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
942
5.01k
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
943
9.47k
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
944
3.86k
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
945
6.24k
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
946
5.89k
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
947
282
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
948
329
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
949
137
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
950
149
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
951
287
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
952
456
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
953
482
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
954
256
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
955
185
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
956
            0x3f => {
957
89.4k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
958
89.4k
                visitor.visit_memory_size(mem)
959
            }
960
            0x40 => {
961
10.5k
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
962
10.5k
                visitor.visit_memory_grow(mem)
963
            }
964
965
328k
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
966
997k
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
967
432k
            0x43 => visitor.visit_f32_const(self.read_f32()?),
968
448k
            0x44 => visitor.visit_f64_const(self.read_f64()?),
969
970
40.6k
            0x45 => visitor.visit_i32_eqz(),
971
1.51k
            0x46 => visitor.visit_i32_eq(),
972
1.72k
            0x47 => visitor.visit_i32_ne(),
973
1.22k
            0x48 => visitor.visit_i32_lt_s(),
974
1.25k
            0x49 => visitor.visit_i32_lt_u(),
975
680
            0x4a => visitor.visit_i32_gt_s(),
976
482
            0x4b => visitor.visit_i32_gt_u(),
977
34.1k
            0x4c => visitor.visit_i32_le_s(),
978
27.2k
            0x4d => visitor.visit_i32_le_u(),
979
493
            0x4e => visitor.visit_i32_ge_s(),
980
2.23k
            0x4f => visitor.visit_i32_ge_u(),
981
12.5k
            0x50 => visitor.visit_i64_eqz(),
982
267
            0x51 => visitor.visit_i64_eq(),
983
2.38k
            0x52 => visitor.visit_i64_ne(),
984
514
            0x53 => visitor.visit_i64_lt_s(),
985
409
            0x54 => visitor.visit_i64_lt_u(),
986
797
            0x55 => visitor.visit_i64_gt_s(),
987
759
            0x56 => visitor.visit_i64_gt_u(),
988
40.8k
            0x57 => visitor.visit_i64_le_s(),
989
40.9k
            0x58 => visitor.visit_i64_le_u(),
990
675
            0x59 => visitor.visit_i64_ge_s(),
991
1.54k
            0x5a => visitor.visit_i64_ge_u(),
992
111k
            0x5b => visitor.visit_f32_eq(),
993
38.9k
            0x5c => visitor.visit_f32_ne(),
994
39.0k
            0x5d => visitor.visit_f32_lt(),
995
38.9k
            0x5e => visitor.visit_f32_gt(),
996
223
            0x5f => visitor.visit_f32_le(),
997
191
            0x60 => visitor.visit_f32_ge(),
998
52.7k
            0x61 => visitor.visit_f64_eq(),
999
13.1k
            0x62 => visitor.visit_f64_ne(),
1000
13.1k
            0x63 => visitor.visit_f64_lt(),
1001
13.1k
            0x64 => visitor.visit_f64_gt(),
1002
152
            0x65 => visitor.visit_f64_le(),
1003
139
            0x66 => visitor.visit_f64_ge(),
1004
22.9k
            0x67 => visitor.visit_i32_clz(),
1005
19.6k
            0x68 => visitor.visit_i32_ctz(),
1006
23.4k
            0x69 => visitor.visit_i32_popcnt(),
1007
38.1k
            0x6a => visitor.visit_i32_add(),
1008
3.55k
            0x6b => visitor.visit_i32_sub(),
1009
84.4k
            0x6c => visitor.visit_i32_mul(),
1010
434
            0x6d => visitor.visit_i32_div_s(),
1011
10.1k
            0x6e => visitor.visit_i32_div_u(),
1012
494
            0x6f => visitor.visit_i32_rem_s(),
1013
906
            0x70 => visitor.visit_i32_rem_u(),
1014
488
            0x71 => visitor.visit_i32_and(),
1015
104k
            0x72 => visitor.visit_i32_or(),
1016
125k
            0x73 => visitor.visit_i32_xor(),
1017
365
            0x74 => visitor.visit_i32_shl(),
1018
462
            0x75 => visitor.visit_i32_shr_s(),
1019
1.10k
            0x76 => visitor.visit_i32_shr_u(),
1020
274
            0x77 => visitor.visit_i32_rotl(),
1021
701
            0x78 => visitor.visit_i32_rotr(),
1022
43.2k
            0x79 => visitor.visit_i64_clz(),
1023
48.2k
            0x7a => visitor.visit_i64_ctz(),
1024
51.7k
            0x7b => visitor.visit_i64_popcnt(),
1025
220k
            0x7c => visitor.visit_i64_add(),
1026
3.15k
            0x7d => visitor.visit_i64_sub(),
1027
131k
            0x7e => visitor.visit_i64_mul(),
1028
645
            0x7f => visitor.visit_i64_div_s(),
1029
976
            0x80 => visitor.visit_i64_div_u(),
1030
850
            0x81 => visitor.visit_i64_rem_s(),
1031
747
            0x82 => visitor.visit_i64_rem_u(),
1032
710
            0x83 => visitor.visit_i64_and(),
1033
699
            0x84 => visitor.visit_i64_or(),
1034
161k
            0x85 => visitor.visit_i64_xor(),
1035
789
            0x86 => visitor.visit_i64_shl(),
1036
4.77k
            0x87 => visitor.visit_i64_shr_s(),
1037
1.87k
            0x88 => visitor.visit_i64_shr_u(),
1038
664
            0x89 => visitor.visit_i64_rotl(),
1039
1.04k
            0x8a => visitor.visit_i64_rotr(),
1040
10.5k
            0x8b => visitor.visit_f32_abs(),
1041
8.85k
            0x8c => visitor.visit_f32_neg(),
1042
14.0k
            0x8d => visitor.visit_f32_ceil(),
1043
3.07k
            0x8e => visitor.visit_f32_floor(),
1044
4.74k
            0x8f => visitor.visit_f32_trunc(),
1045
4.34k
            0x90 => visitor.visit_f32_nearest(),
1046
7.41k
            0x91 => visitor.visit_f32_sqrt(),
1047
424
            0x92 => visitor.visit_f32_add(),
1048
195
            0x93 => visitor.visit_f32_sub(),
1049
288
            0x94 => visitor.visit_f32_mul(),
1050
149
            0x95 => visitor.visit_f32_div(),
1051
297
            0x96 => visitor.visit_f32_min(),
1052
226
            0x97 => visitor.visit_f32_max(),
1053
124
            0x98 => visitor.visit_f32_copysign(),
1054
4.02k
            0x99 => visitor.visit_f64_abs(),
1055
16.4k
            0x9a => visitor.visit_f64_neg(),
1056
5.20k
            0x9b => visitor.visit_f64_ceil(),
1057
5.33k
            0x9c => visitor.visit_f64_floor(),
1058
4.88k
            0x9d => visitor.visit_f64_trunc(),
1059
3.69k
            0x9e => visitor.visit_f64_nearest(),
1060
6.68k
            0x9f => visitor.visit_f64_sqrt(),
1061
328
            0xa0 => visitor.visit_f64_add(),
1062
324
            0xa1 => visitor.visit_f64_sub(),
1063
249
            0xa2 => visitor.visit_f64_mul(),
1064
266
            0xa3 => visitor.visit_f64_div(),
1065
317
            0xa4 => visitor.visit_f64_min(),
1066
157
            0xa5 => visitor.visit_f64_max(),
1067
188
            0xa6 => visitor.visit_f64_copysign(),
1068
35.9k
            0xa7 => visitor.visit_i32_wrap_i64(),
1069
1.83k
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1070
32.8k
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1071
3.53k
            0xaa => visitor.visit_i32_trunc_f64_s(),
1072
5.42k
            0xab => visitor.visit_i32_trunc_f64_u(),
1073
7.85k
            0xac => visitor.visit_i64_extend_i32_s(),
1074
13.4k
            0xad => visitor.visit_i64_extend_i32_u(),
1075
3.11k
            0xae => visitor.visit_i64_trunc_f32_s(),
1076
2.23k
            0xaf => visitor.visit_i64_trunc_f32_u(),
1077
2.56k
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1078
2.53k
            0xb1 => visitor.visit_i64_trunc_f64_u(),
1079
3.73k
            0xb2 => visitor.visit_f32_convert_i32_s(),
1080
36.2k
            0xb3 => visitor.visit_f32_convert_i32_u(),
1081
2.07k
            0xb4 => visitor.visit_f32_convert_i64_s(),
1082
5.52k
            0xb5 => visitor.visit_f32_convert_i64_u(),
1083
4.70k
            0xb6 => visitor.visit_f32_demote_f64(),
1084
3.68k
            0xb7 => visitor.visit_f64_convert_i32_s(),
1085
4.70k
            0xb8 => visitor.visit_f64_convert_i32_u(),
1086
4.97k
            0xb9 => visitor.visit_f64_convert_i64_s(),
1087
7.98k
            0xba => visitor.visit_f64_convert_i64_u(),
1088
4.44k
            0xbb => visitor.visit_f64_promote_f32(),
1089
49.9k
            0xbc => visitor.visit_i32_reinterpret_f32(),
1090
90.6k
            0xbd => visitor.visit_i64_reinterpret_f64(),
1091
5.16k
            0xbe => visitor.visit_f32_reinterpret_i32(),
1092
1.78k
            0xbf => visitor.visit_f64_reinterpret_i64(),
1093
1094
16.3k
            0xc0 => visitor.visit_i32_extend8_s(),
1095
15.7k
            0xc1 => visitor.visit_i32_extend16_s(),
1096
13.3k
            0xc2 => visitor.visit_i64_extend8_s(),
1097
16.0k
            0xc3 => visitor.visit_i64_extend16_s(),
1098
10.4k
            0xc4 => visitor.visit_i64_extend32_s(),
1099
1100
98.4k
            0xd0 => visitor.visit_ref_null(self.read()?),
1101
4.07k
            0xd1 => visitor.visit_ref_is_null(),
1102
8.94k
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1103
1.75k
            0xd3 => visitor.visit_ref_eq(),
1104
12.9k
            0xd4 => visitor.visit_ref_as_non_null(),
1105
18.4k
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1106
630
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1107
1108
1
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1109
0
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1110
0
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1111
0
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1112
            0xe4 => {
1113
1
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1114
            }
1115
0
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1116
0
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1117
1118
43.7k
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1119
209k
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1120
            0xfd => {
1121
                #[cfg(feature = "simd")]
1122
279k
                if let Some(mut visitor) = visitor.simd_visitor() {
1123
279k
                    return self.visit_0xfd_operator(pos, &mut visitor);
1124
0
                }
1125
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1126
            }
1127
136k
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1128
1129
4
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1130
        })
1131
9.65M
    }
<wasmparser::binary_reader::BinaryReader>::visit_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>
Line
Count
Source
829
2.77M
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
830
2.77M
    where
831
2.77M
        T: VisitOperator<'a> + FrameStack,
832
    {
833
2.77M
        if visitor.current_frame().is_none() {
834
0
            bail!(
835
0
                self.original_position(),
836
                "operators remaining after end of function body or expression"
837
            );
838
2.77M
        }
839
2.77M
        let pos = self.original_position();
840
2.77M
        let code = self.read_u8()?;
841
2.77M
        Ok(match code {
842
0
            0x00 => visitor.visit_unreachable(),
843
0
            0x01 => visitor.visit_nop(),
844
0
            0x02 => visitor.visit_block(self.read_block_type()?),
845
0
            0x03 => visitor.visit_loop(self.read_block_type()?),
846
0
            0x04 => visitor.visit_if(self.read_block_type()?),
847
            0x05 => {
848
0
                self.expect_frame(visitor, FrameKind::If, "else")?;
849
0
                visitor.visit_else()
850
            }
851
            0x06 => {
852
                #[cfg(feature = "features")]
853
0
                require_feature::legacy_exceptions(
854
0
                    self.features,
855
                    "legacy_exceptions feature required for try instruction",
856
0
                    pos,
857
0
                )?;
858
0
                visitor.visit_try(self.read_block_type()?)
859
            }
860
            0x07 => {
861
                #[cfg(feature = "features")]
862
0
                require_feature::legacy_exceptions(
863
0
                    self.features,
864
                    "legacy_exceptions feature required for catch instruction",
865
0
                    pos,
866
0
                )?;
867
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
868
0
                    Ok(()) => (),
869
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
870
                }
871
0
                visitor.visit_catch(self.read_var_u32()?)
872
            }
873
0
            0x08 => visitor.visit_throw(self.read_var_u32()?),
874
0
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
875
0
            0x0a => visitor.visit_throw_ref(),
876
538k
            0x0b => visitor.visit_end(),
877
0
            0x0c => visitor.visit_br(self.read_var_u32()?),
878
0
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
879
0
            0x0e => visitor.visit_br_table(self.read_br_table()?),
880
0
            0x0f => visitor.visit_return(),
881
0
            0x10 => visitor.visit_call(self.read_var_u32()?),
882
            0x11 => {
883
0
                let index = self.read_var_u32()?;
884
0
                let table = self.read_call_indirect_table_immediate()?;
885
0
                visitor.visit_call_indirect(index, table)
886
            }
887
0
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
888
0
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
889
0
            0x14 => visitor.visit_call_ref(self.read()?),
890
0
            0x15 => visitor.visit_return_call_ref(self.read()?),
891
            0x18 => {
892
0
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
893
0
                visitor.visit_delegate(self.read_var_u32()?)
894
            }
895
            0x19 => {
896
                #[cfg(feature = "features")]
897
0
                require_feature::legacy_exceptions(
898
0
                    self.features,
899
                    "legacy_exceptions feature required for catch_all instruction",
900
0
                    pos,
901
0
                )?;
902
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch_all") {
903
0
                    Ok(()) => (),
904
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch_all")?,
905
                }
906
0
                visitor.visit_catch_all()
907
            }
908
0
            0x1a => visitor.visit_drop(),
909
0
            0x1b => visitor.visit_select(),
910
            0x1c => {
911
0
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
912
0
                if result_count == 1 {
913
0
                    visitor.visit_typed_select(self.read()?)
914
                } else {
915
0
                    let mut results = Vec::new();
916
0
                    results.reserve_exact(result_count);
917
0
                    for _ in 0..result_count {
918
0
                        results.push(self.read()?);
919
                    }
920
0
                    visitor.visit_typed_select_multi(results)
921
                }
922
            }
923
0
            0x1f => visitor.visit_try_table(self.read()?),
924
925
0
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
926
0
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
927
0
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
928
19.0k
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
929
0
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
930
0
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
931
0
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
932
933
0
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
934
0
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
935
0
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
936
0
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
937
0
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
938
0
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
939
0
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
940
0
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
941
0
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
942
0
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
943
0
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
944
0
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
945
0
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
946
0
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
947
0
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
948
0
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
949
0
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
950
0
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
951
0
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
952
0
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
953
0
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
954
0
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
955
0
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
956
            0x3f => {
957
0
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
958
0
                visitor.visit_memory_size(mem)
959
            }
960
            0x40 => {
961
0
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
962
0
                visitor.visit_memory_grow(mem)
963
            }
964
965
268k
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
966
823k
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
967
107k
            0x43 => visitor.visit_f32_const(self.read_f32()?),
968
94.3k
            0x44 => visitor.visit_f64_const(self.read_f64()?),
969
970
0
            0x45 => visitor.visit_i32_eqz(),
971
0
            0x46 => visitor.visit_i32_eq(),
972
0
            0x47 => visitor.visit_i32_ne(),
973
0
            0x48 => visitor.visit_i32_lt_s(),
974
0
            0x49 => visitor.visit_i32_lt_u(),
975
0
            0x4a => visitor.visit_i32_gt_s(),
976
0
            0x4b => visitor.visit_i32_gt_u(),
977
0
            0x4c => visitor.visit_i32_le_s(),
978
0
            0x4d => visitor.visit_i32_le_u(),
979
0
            0x4e => visitor.visit_i32_ge_s(),
980
0
            0x4f => visitor.visit_i32_ge_u(),
981
0
            0x50 => visitor.visit_i64_eqz(),
982
0
            0x51 => visitor.visit_i64_eq(),
983
0
            0x52 => visitor.visit_i64_ne(),
984
0
            0x53 => visitor.visit_i64_lt_s(),
985
0
            0x54 => visitor.visit_i64_lt_u(),
986
0
            0x55 => visitor.visit_i64_gt_s(),
987
0
            0x56 => visitor.visit_i64_gt_u(),
988
0
            0x57 => visitor.visit_i64_le_s(),
989
0
            0x58 => visitor.visit_i64_le_u(),
990
0
            0x59 => visitor.visit_i64_ge_s(),
991
0
            0x5a => visitor.visit_i64_ge_u(),
992
0
            0x5b => visitor.visit_f32_eq(),
993
0
            0x5c => visitor.visit_f32_ne(),
994
0
            0x5d => visitor.visit_f32_lt(),
995
0
            0x5e => visitor.visit_f32_gt(),
996
0
            0x5f => visitor.visit_f32_le(),
997
0
            0x60 => visitor.visit_f32_ge(),
998
0
            0x61 => visitor.visit_f64_eq(),
999
0
            0x62 => visitor.visit_f64_ne(),
1000
0
            0x63 => visitor.visit_f64_lt(),
1001
0
            0x64 => visitor.visit_f64_gt(),
1002
0
            0x65 => visitor.visit_f64_le(),
1003
0
            0x66 => visitor.visit_f64_ge(),
1004
0
            0x67 => visitor.visit_i32_clz(),
1005
0
            0x68 => visitor.visit_i32_ctz(),
1006
0
            0x69 => visitor.visit_i32_popcnt(),
1007
30.4k
            0x6a => visitor.visit_i32_add(),
1008
4.63k
            0x6b => visitor.visit_i32_sub(),
1009
146k
            0x6c => visitor.visit_i32_mul(),
1010
0
            0x6d => visitor.visit_i32_div_s(),
1011
0
            0x6e => visitor.visit_i32_div_u(),
1012
0
            0x6f => visitor.visit_i32_rem_s(),
1013
0
            0x70 => visitor.visit_i32_rem_u(),
1014
0
            0x71 => visitor.visit_i32_and(),
1015
0
            0x72 => visitor.visit_i32_or(),
1016
0
            0x73 => visitor.visit_i32_xor(),
1017
0
            0x74 => visitor.visit_i32_shl(),
1018
0
            0x75 => visitor.visit_i32_shr_s(),
1019
0
            0x76 => visitor.visit_i32_shr_u(),
1020
0
            0x77 => visitor.visit_i32_rotl(),
1021
0
            0x78 => visitor.visit_i32_rotr(),
1022
0
            0x79 => visitor.visit_i64_clz(),
1023
0
            0x7a => visitor.visit_i64_ctz(),
1024
0
            0x7b => visitor.visit_i64_popcnt(),
1025
412k
            0x7c => visitor.visit_i64_add(),
1026
5.68k
            0x7d => visitor.visit_i64_sub(),
1027
236k
            0x7e => visitor.visit_i64_mul(),
1028
0
            0x7f => visitor.visit_i64_div_s(),
1029
0
            0x80 => visitor.visit_i64_div_u(),
1030
0
            0x81 => visitor.visit_i64_rem_s(),
1031
0
            0x82 => visitor.visit_i64_rem_u(),
1032
0
            0x83 => visitor.visit_i64_and(),
1033
0
            0x84 => visitor.visit_i64_or(),
1034
0
            0x85 => visitor.visit_i64_xor(),
1035
0
            0x86 => visitor.visit_i64_shl(),
1036
0
            0x87 => visitor.visit_i64_shr_s(),
1037
0
            0x88 => visitor.visit_i64_shr_u(),
1038
0
            0x89 => visitor.visit_i64_rotl(),
1039
0
            0x8a => visitor.visit_i64_rotr(),
1040
0
            0x8b => visitor.visit_f32_abs(),
1041
0
            0x8c => visitor.visit_f32_neg(),
1042
0
            0x8d => visitor.visit_f32_ceil(),
1043
0
            0x8e => visitor.visit_f32_floor(),
1044
0
            0x8f => visitor.visit_f32_trunc(),
1045
0
            0x90 => visitor.visit_f32_nearest(),
1046
0
            0x91 => visitor.visit_f32_sqrt(),
1047
0
            0x92 => visitor.visit_f32_add(),
1048
0
            0x93 => visitor.visit_f32_sub(),
1049
0
            0x94 => visitor.visit_f32_mul(),
1050
0
            0x95 => visitor.visit_f32_div(),
1051
0
            0x96 => visitor.visit_f32_min(),
1052
0
            0x97 => visitor.visit_f32_max(),
1053
0
            0x98 => visitor.visit_f32_copysign(),
1054
0
            0x99 => visitor.visit_f64_abs(),
1055
0
            0x9a => visitor.visit_f64_neg(),
1056
0
            0x9b => visitor.visit_f64_ceil(),
1057
0
            0x9c => visitor.visit_f64_floor(),
1058
0
            0x9d => visitor.visit_f64_trunc(),
1059
0
            0x9e => visitor.visit_f64_nearest(),
1060
0
            0x9f => visitor.visit_f64_sqrt(),
1061
0
            0xa0 => visitor.visit_f64_add(),
1062
0
            0xa1 => visitor.visit_f64_sub(),
1063
0
            0xa2 => visitor.visit_f64_mul(),
1064
0
            0xa3 => visitor.visit_f64_div(),
1065
0
            0xa4 => visitor.visit_f64_min(),
1066
0
            0xa5 => visitor.visit_f64_max(),
1067
0
            0xa6 => visitor.visit_f64_copysign(),
1068
0
            0xa7 => visitor.visit_i32_wrap_i64(),
1069
0
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1070
0
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1071
0
            0xaa => visitor.visit_i32_trunc_f64_s(),
1072
0
            0xab => visitor.visit_i32_trunc_f64_u(),
1073
0
            0xac => visitor.visit_i64_extend_i32_s(),
1074
0
            0xad => visitor.visit_i64_extend_i32_u(),
1075
0
            0xae => visitor.visit_i64_trunc_f32_s(),
1076
0
            0xaf => visitor.visit_i64_trunc_f32_u(),
1077
0
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1078
0
            0xb1 => visitor.visit_i64_trunc_f64_u(),
1079
0
            0xb2 => visitor.visit_f32_convert_i32_s(),
1080
0
            0xb3 => visitor.visit_f32_convert_i32_u(),
1081
0
            0xb4 => visitor.visit_f32_convert_i64_s(),
1082
0
            0xb5 => visitor.visit_f32_convert_i64_u(),
1083
0
            0xb6 => visitor.visit_f32_demote_f64(),
1084
0
            0xb7 => visitor.visit_f64_convert_i32_s(),
1085
0
            0xb8 => visitor.visit_f64_convert_i32_u(),
1086
0
            0xb9 => visitor.visit_f64_convert_i64_s(),
1087
0
            0xba => visitor.visit_f64_convert_i64_u(),
1088
0
            0xbb => visitor.visit_f64_promote_f32(),
1089
0
            0xbc => visitor.visit_i32_reinterpret_f32(),
1090
0
            0xbd => visitor.visit_i64_reinterpret_f64(),
1091
0
            0xbe => visitor.visit_f32_reinterpret_i32(),
1092
0
            0xbf => visitor.visit_f64_reinterpret_i64(),
1093
1094
0
            0xc0 => visitor.visit_i32_extend8_s(),
1095
0
            0xc1 => visitor.visit_i32_extend16_s(),
1096
0
            0xc2 => visitor.visit_i64_extend8_s(),
1097
0
            0xc3 => visitor.visit_i64_extend16_s(),
1098
0
            0xc4 => visitor.visit_i64_extend32_s(),
1099
1100
26.4k
            0xd0 => visitor.visit_ref_null(self.read()?),
1101
0
            0xd1 => visitor.visit_ref_is_null(),
1102
22.5k
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1103
0
            0xd3 => visitor.visit_ref_eq(),
1104
0
            0xd4 => visitor.visit_ref_as_non_null(),
1105
0
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1106
0
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1107
1108
0
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1109
0
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1110
0
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1111
0
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1112
            0xe4 => {
1113
0
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1114
            }
1115
0
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1116
0
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1117
1118
14.2k
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1119
0
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1120
            0xfd => {
1121
                #[cfg(feature = "simd")]
1122
17.9k
                if let Some(mut visitor) = visitor.simd_visitor() {
1123
17.9k
                    return self.visit_0xfd_operator(pos, &mut visitor);
1124
0
                }
1125
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1126
            }
1127
14
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1128
1129
0
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1130
        })
1131
2.77M
    }
<wasmparser::binary_reader::BinaryReader>::visit_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
Line
Count
Source
829
1.17M
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
830
1.17M
    where
831
1.17M
        T: VisitOperator<'a> + FrameStack,
832
    {
833
1.17M
        if visitor.current_frame().is_none() {
834
0
            bail!(
835
0
                self.original_position(),
836
                "operators remaining after end of function body or expression"
837
            );
838
1.17M
        }
839
1.17M
        let pos = self.original_position();
840
1.17M
        let code = self.read_u8()?;
841
1.17M
        Ok(match code {
842
0
            0x00 => visitor.visit_unreachable(),
843
0
            0x01 => visitor.visit_nop(),
844
0
            0x02 => visitor.visit_block(self.read_block_type()?),
845
0
            0x03 => visitor.visit_loop(self.read_block_type()?),
846
0
            0x04 => visitor.visit_if(self.read_block_type()?),
847
            0x05 => {
848
0
                self.expect_frame(visitor, FrameKind::If, "else")?;
849
0
                visitor.visit_else()
850
            }
851
            0x06 => {
852
                #[cfg(feature = "features")]
853
0
                require_feature::legacy_exceptions(
854
0
                    self.features,
855
                    "legacy_exceptions feature required for try instruction",
856
0
                    pos,
857
0
                )?;
858
0
                visitor.visit_try(self.read_block_type()?)
859
            }
860
            0x07 => {
861
                #[cfg(feature = "features")]
862
0
                require_feature::legacy_exceptions(
863
0
                    self.features,
864
                    "legacy_exceptions feature required for catch instruction",
865
0
                    pos,
866
0
                )?;
867
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
868
0
                    Ok(()) => (),
869
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
870
                }
871
0
                visitor.visit_catch(self.read_var_u32()?)
872
            }
873
0
            0x08 => visitor.visit_throw(self.read_var_u32()?),
874
0
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
875
0
            0x0a => visitor.visit_throw_ref(),
876
241k
            0x0b => visitor.visit_end(),
877
0
            0x0c => visitor.visit_br(self.read_var_u32()?),
878
0
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
879
0
            0x0e => visitor.visit_br_table(self.read_br_table()?),
880
0
            0x0f => visitor.visit_return(),
881
0
            0x10 => visitor.visit_call(self.read_var_u32()?),
882
            0x11 => {
883
0
                let index = self.read_var_u32()?;
884
0
                let table = self.read_call_indirect_table_immediate()?;
885
0
                visitor.visit_call_indirect(index, table)
886
            }
887
0
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
888
0
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
889
0
            0x14 => visitor.visit_call_ref(self.read()?),
890
0
            0x15 => visitor.visit_return_call_ref(self.read()?),
891
            0x18 => {
892
0
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
893
0
                visitor.visit_delegate(self.read_var_u32()?)
894
            }
895
            0x19 => {
896
                #[cfg(feature = "features")]
897
0
                require_feature::legacy_exceptions(
898
0
                    self.features,
899
                    "legacy_exceptions feature required for catch_all instruction",
900
0
                    pos,
901
0
                )?;
902
0
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch_all") {
903
0
                    Ok(()) => (),
904
0
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch_all")?,
905
                }
906
0
                visitor.visit_catch_all()
907
            }
908
0
            0x1a => visitor.visit_drop(),
909
0
            0x1b => visitor.visit_select(),
910
            0x1c => {
911
0
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
912
0
                if result_count == 1 {
913
0
                    visitor.visit_typed_select(self.read()?)
914
                } else {
915
0
                    let mut results = Vec::new();
916
0
                    results.reserve_exact(result_count);
917
0
                    for _ in 0..result_count {
918
0
                        results.push(self.read()?);
919
                    }
920
0
                    visitor.visit_typed_select_multi(results)
921
                }
922
            }
923
0
            0x1f => visitor.visit_try_table(self.read()?),
924
925
0
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
926
0
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
927
0
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
928
6.40k
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
929
0
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
930
0
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
931
0
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
932
933
0
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
934
0
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
935
0
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
936
0
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
937
0
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
938
0
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
939
0
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
940
0
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
941
0
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
942
0
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
943
0
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
944
0
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
945
0
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
946
0
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
947
0
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
948
0
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
949
0
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
950
0
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
951
0
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
952
0
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
953
0
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
954
0
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
955
0
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
956
            0x3f => {
957
0
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
958
0
                visitor.visit_memory_size(mem)
959
            }
960
            0x40 => {
961
0
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
962
0
                visitor.visit_memory_grow(mem)
963
            }
964
965
110k
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
966
350k
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
967
50.6k
            0x43 => visitor.visit_f32_const(self.read_f32()?),
968
39.3k
            0x44 => visitor.visit_f64_const(self.read_f64()?),
969
970
0
            0x45 => visitor.visit_i32_eqz(),
971
0
            0x46 => visitor.visit_i32_eq(),
972
0
            0x47 => visitor.visit_i32_ne(),
973
0
            0x48 => visitor.visit_i32_lt_s(),
974
0
            0x49 => visitor.visit_i32_lt_u(),
975
0
            0x4a => visitor.visit_i32_gt_s(),
976
0
            0x4b => visitor.visit_i32_gt_u(),
977
0
            0x4c => visitor.visit_i32_le_s(),
978
0
            0x4d => visitor.visit_i32_le_u(),
979
0
            0x4e => visitor.visit_i32_ge_s(),
980
0
            0x4f => visitor.visit_i32_ge_u(),
981
0
            0x50 => visitor.visit_i64_eqz(),
982
0
            0x51 => visitor.visit_i64_eq(),
983
0
            0x52 => visitor.visit_i64_ne(),
984
0
            0x53 => visitor.visit_i64_lt_s(),
985
0
            0x54 => visitor.visit_i64_lt_u(),
986
0
            0x55 => visitor.visit_i64_gt_s(),
987
0
            0x56 => visitor.visit_i64_gt_u(),
988
0
            0x57 => visitor.visit_i64_le_s(),
989
0
            0x58 => visitor.visit_i64_le_u(),
990
0
            0x59 => visitor.visit_i64_ge_s(),
991
0
            0x5a => visitor.visit_i64_ge_u(),
992
0
            0x5b => visitor.visit_f32_eq(),
993
0
            0x5c => visitor.visit_f32_ne(),
994
0
            0x5d => visitor.visit_f32_lt(),
995
0
            0x5e => visitor.visit_f32_gt(),
996
0
            0x5f => visitor.visit_f32_le(),
997
0
            0x60 => visitor.visit_f32_ge(),
998
0
            0x61 => visitor.visit_f64_eq(),
999
0
            0x62 => visitor.visit_f64_ne(),
1000
0
            0x63 => visitor.visit_f64_lt(),
1001
0
            0x64 => visitor.visit_f64_gt(),
1002
0
            0x65 => visitor.visit_f64_le(),
1003
0
            0x66 => visitor.visit_f64_ge(),
1004
0
            0x67 => visitor.visit_i32_clz(),
1005
0
            0x68 => visitor.visit_i32_ctz(),
1006
0
            0x69 => visitor.visit_i32_popcnt(),
1007
11.0k
            0x6a => visitor.visit_i32_add(),
1008
1.77k
            0x6b => visitor.visit_i32_sub(),
1009
58.3k
            0x6c => visitor.visit_i32_mul(),
1010
0
            0x6d => visitor.visit_i32_div_s(),
1011
0
            0x6e => visitor.visit_i32_div_u(),
1012
0
            0x6f => visitor.visit_i32_rem_s(),
1013
0
            0x70 => visitor.visit_i32_rem_u(),
1014
0
            0x71 => visitor.visit_i32_and(),
1015
0
            0x72 => visitor.visit_i32_or(),
1016
0
            0x73 => visitor.visit_i32_xor(),
1017
0
            0x74 => visitor.visit_i32_shl(),
1018
0
            0x75 => visitor.visit_i32_shr_s(),
1019
0
            0x76 => visitor.visit_i32_shr_u(),
1020
0
            0x77 => visitor.visit_i32_rotl(),
1021
0
            0x78 => visitor.visit_i32_rotr(),
1022
0
            0x79 => visitor.visit_i64_clz(),
1023
0
            0x7a => visitor.visit_i64_ctz(),
1024
0
            0x7b => visitor.visit_i64_popcnt(),
1025
167k
            0x7c => visitor.visit_i64_add(),
1026
2.39k
            0x7d => visitor.visit_i64_sub(),
1027
101k
            0x7e => visitor.visit_i64_mul(),
1028
0
            0x7f => visitor.visit_i64_div_s(),
1029
0
            0x80 => visitor.visit_i64_div_u(),
1030
0
            0x81 => visitor.visit_i64_rem_s(),
1031
0
            0x82 => visitor.visit_i64_rem_u(),
1032
0
            0x83 => visitor.visit_i64_and(),
1033
0
            0x84 => visitor.visit_i64_or(),
1034
0
            0x85 => visitor.visit_i64_xor(),
1035
0
            0x86 => visitor.visit_i64_shl(),
1036
0
            0x87 => visitor.visit_i64_shr_s(),
1037
0
            0x88 => visitor.visit_i64_shr_u(),
1038
0
            0x89 => visitor.visit_i64_rotl(),
1039
0
            0x8a => visitor.visit_i64_rotr(),
1040
0
            0x8b => visitor.visit_f32_abs(),
1041
0
            0x8c => visitor.visit_f32_neg(),
1042
0
            0x8d => visitor.visit_f32_ceil(),
1043
0
            0x8e => visitor.visit_f32_floor(),
1044
0
            0x8f => visitor.visit_f32_trunc(),
1045
0
            0x90 => visitor.visit_f32_nearest(),
1046
0
            0x91 => visitor.visit_f32_sqrt(),
1047
0
            0x92 => visitor.visit_f32_add(),
1048
0
            0x93 => visitor.visit_f32_sub(),
1049
0
            0x94 => visitor.visit_f32_mul(),
1050
0
            0x95 => visitor.visit_f32_div(),
1051
0
            0x96 => visitor.visit_f32_min(),
1052
0
            0x97 => visitor.visit_f32_max(),
1053
0
            0x98 => visitor.visit_f32_copysign(),
1054
0
            0x99 => visitor.visit_f64_abs(),
1055
0
            0x9a => visitor.visit_f64_neg(),
1056
0
            0x9b => visitor.visit_f64_ceil(),
1057
0
            0x9c => visitor.visit_f64_floor(),
1058
0
            0x9d => visitor.visit_f64_trunc(),
1059
0
            0x9e => visitor.visit_f64_nearest(),
1060
0
            0x9f => visitor.visit_f64_sqrt(),
1061
0
            0xa0 => visitor.visit_f64_add(),
1062
0
            0xa1 => visitor.visit_f64_sub(),
1063
0
            0xa2 => visitor.visit_f64_mul(),
1064
0
            0xa3 => visitor.visit_f64_div(),
1065
0
            0xa4 => visitor.visit_f64_min(),
1066
0
            0xa5 => visitor.visit_f64_max(),
1067
0
            0xa6 => visitor.visit_f64_copysign(),
1068
0
            0xa7 => visitor.visit_i32_wrap_i64(),
1069
0
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1070
0
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1071
0
            0xaa => visitor.visit_i32_trunc_f64_s(),
1072
0
            0xab => visitor.visit_i32_trunc_f64_u(),
1073
0
            0xac => visitor.visit_i64_extend_i32_s(),
1074
0
            0xad => visitor.visit_i64_extend_i32_u(),
1075
0
            0xae => visitor.visit_i64_trunc_f32_s(),
1076
0
            0xaf => visitor.visit_i64_trunc_f32_u(),
1077
0
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1078
0
            0xb1 => visitor.visit_i64_trunc_f64_u(),
1079
0
            0xb2 => visitor.visit_f32_convert_i32_s(),
1080
0
            0xb3 => visitor.visit_f32_convert_i32_u(),
1081
0
            0xb4 => visitor.visit_f32_convert_i64_s(),
1082
0
            0xb5 => visitor.visit_f32_convert_i64_u(),
1083
0
            0xb6 => visitor.visit_f32_demote_f64(),
1084
0
            0xb7 => visitor.visit_f64_convert_i32_s(),
1085
0
            0xb8 => visitor.visit_f64_convert_i32_u(),
1086
0
            0xb9 => visitor.visit_f64_convert_i64_s(),
1087
0
            0xba => visitor.visit_f64_convert_i64_u(),
1088
0
            0xbb => visitor.visit_f64_promote_f32(),
1089
0
            0xbc => visitor.visit_i32_reinterpret_f32(),
1090
0
            0xbd => visitor.visit_i64_reinterpret_f64(),
1091
0
            0xbe => visitor.visit_f32_reinterpret_i32(),
1092
0
            0xbf => visitor.visit_f64_reinterpret_i64(),
1093
1094
0
            0xc0 => visitor.visit_i32_extend8_s(),
1095
0
            0xc1 => visitor.visit_i32_extend16_s(),
1096
0
            0xc2 => visitor.visit_i64_extend8_s(),
1097
0
            0xc3 => visitor.visit_i64_extend16_s(),
1098
0
            0xc4 => visitor.visit_i64_extend32_s(),
1099
1100
10.2k
            0xd0 => visitor.visit_ref_null(self.read()?),
1101
0
            0xd1 => visitor.visit_ref_is_null(),
1102
11.6k
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1103
0
            0xd3 => visitor.visit_ref_eq(),
1104
0
            0xd4 => visitor.visit_ref_as_non_null(),
1105
0
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1106
0
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1107
1108
0
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1109
0
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1110
0
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1111
0
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1112
            0xe4 => {
1113
0
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1114
            }
1115
0
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1116
0
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1117
1118
4.35k
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1119
0
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1120
            0xfd => {
1121
                #[cfg(feature = "simd")]
1122
7.18k
                if let Some(mut visitor) = visitor.simd_visitor() {
1123
7.18k
                    return self.visit_0xfd_operator(pos, &mut visitor);
1124
0
                }
1125
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1126
            }
1127
5
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1128
1129
0
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1130
        })
1131
1.17M
    }
1132
1133
178k
    fn visit_0xfb_operator<T>(
1134
178k
        &mut self,
1135
178k
        pos: u64,
1136
178k
        visitor: &mut T,
1137
178k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1138
178k
    where
1139
178k
        T: VisitOperator<'a>,
1140
    {
1141
178k
        let code = self.read_var_u32()?;
1142
178k
        Ok(match code {
1143
            0x0 => {
1144
7.59k
                let type_index = self.read_var_u32()?;
1145
7.59k
                visitor.visit_struct_new(type_index)
1146
            }
1147
            0x01 => {
1148
58.1k
                let type_index = self.read_var_u32()?;
1149
58.1k
                visitor.visit_struct_new_default(type_index)
1150
            }
1151
            0x02 => {
1152
120
                let type_index = self.read_var_u32()?;
1153
120
                let field_index = self.read_var_u32()?;
1154
120
                visitor.visit_struct_get(type_index, field_index)
1155
            }
1156
            0x03 => {
1157
200
                let type_index = self.read_var_u32()?;
1158
200
                let field_index = self.read_var_u32()?;
1159
200
                visitor.visit_struct_get_s(type_index, field_index)
1160
            }
1161
            0x04 => {
1162
28
                let type_index = self.read_var_u32()?;
1163
28
                let field_index = self.read_var_u32()?;
1164
28
                visitor.visit_struct_get_u(type_index, field_index)
1165
            }
1166
            0x05 => {
1167
676
                let type_index = self.read_var_u32()?;
1168
676
                let field_index = self.read_var_u32()?;
1169
676
                visitor.visit_struct_set(type_index, field_index)
1170
            }
1171
            0x06 => {
1172
3.89k
                let type_index = self.read_var_u32()?;
1173
3.89k
                visitor.visit_array_new(type_index)
1174
            }
1175
            0x07 => {
1176
27.4k
                let type_index = self.read_var_u32()?;
1177
27.4k
                visitor.visit_array_new_default(type_index)
1178
            }
1179
            0x08 => {
1180
23.5k
                let type_index = self.read_var_u32()?;
1181
23.5k
                let n = self.read_var_u32()?;
1182
23.5k
                visitor.visit_array_new_fixed(type_index, n)
1183
            }
1184
            0x09 => {
1185
252
                let type_index = self.read_var_u32()?;
1186
252
                let data_index = self.read_var_u32()?;
1187
252
                visitor.visit_array_new_data(type_index, data_index)
1188
            }
1189
            0x0a => {
1190
0
                let type_index = self.read_var_u32()?;
1191
0
                let elem_index = self.read_var_u32()?;
1192
0
                visitor.visit_array_new_elem(type_index, elem_index)
1193
            }
1194
            0x0b => {
1195
0
                let type_index = self.read_var_u32()?;
1196
0
                visitor.visit_array_get(type_index)
1197
            }
1198
            0x0c => {
1199
160
                let type_index = self.read_var_u32()?;
1200
160
                visitor.visit_array_get_s(type_index)
1201
            }
1202
            0x0d => {
1203
32
                let type_index = self.read_var_u32()?;
1204
32
                visitor.visit_array_get_u(type_index)
1205
            }
1206
            0x0e => {
1207
12
                let type_index = self.read_var_u32()?;
1208
12
                visitor.visit_array_set(type_index)
1209
            }
1210
2.58k
            0x0f => visitor.visit_array_len(),
1211
            0x10 => {
1212
84
                let type_index = self.read_var_u32()?;
1213
84
                visitor.visit_array_fill(type_index)
1214
            }
1215
            0x11 => {
1216
32
                let type_index_dst = self.read_var_u32()?;
1217
32
                let type_index_src = self.read_var_u32()?;
1218
32
                visitor.visit_array_copy(type_index_dst, type_index_src)
1219
            }
1220
            0x12 => {
1221
0
                let type_index = self.read_var_u32()?;
1222
0
                let data_index = self.read_var_u32()?;
1223
0
                visitor.visit_array_init_data(type_index, data_index)
1224
            }
1225
            0x13 => {
1226
0
                let type_index = self.read_var_u32()?;
1227
0
                let elem_index = self.read_var_u32()?;
1228
0
                visitor.visit_array_init_elem(type_index, elem_index)
1229
            }
1230
11.9k
            0x14 => visitor.visit_ref_test_non_null(self.read()?),
1231
1.28k
            0x15 => visitor.visit_ref_test_nullable(self.read()?),
1232
2.64k
            0x16 => visitor.visit_ref_cast_non_null(self.read()?),
1233
2.53k
            0x17 => visitor.visit_ref_cast_nullable(self.read()?),
1234
            0x18 => {
1235
620
                let pos = self.original_position();
1236
620
                let cast_flags = self.read_u8()?;
1237
620
                let relative_depth = self.read_var_u32()?;
1238
620
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1239
0
                    0b00 => (false, false),
1240
0
                    0b01 => (true, false),
1241
0
                    0b10 => (false, true),
1242
620
                    0b11 => (true, true),
1243
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1244
                };
1245
620
                let from_heap_type = self.read()?;
1246
620
                let from_ref_type =
1247
620
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1248
0
                        format_err!(pos, "implementation error: type index too large")
1249
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::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>::{closure#0}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#0}
1250
620
                let to_heap_type = self.read()?;
1251
620
                let to_ref_type =
1252
620
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1253
0
                        format_err!(pos, "implementation error: type index too large")
1254
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::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>::{closure#1}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#1}
1255
620
                visitor.visit_br_on_cast(relative_depth, from_ref_type, to_ref_type)
1256
            }
1257
            0x19 => {
1258
1.91k
                let pos = self.original_position();
1259
1.91k
                let cast_flags = self.read_u8()?;
1260
1.91k
                let relative_depth = self.read_var_u32()?;
1261
1.91k
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1262
636
                    0 => (false, false),
1263
0
                    1 => (true, false),
1264
0
                    2 => (false, true),
1265
1.28k
                    3 => (true, true),
1266
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1267
                };
1268
1.91k
                let from_heap_type = self.read()?;
1269
1.91k
                let from_ref_type =
1270
1.91k
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1271
0
                        format_err!(pos, "implementation error: type index too large")
1272
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::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>::{closure#2}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#2}
1273
1.91k
                let to_heap_type = self.read()?;
1274
1.91k
                let to_ref_type =
1275
1.91k
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1276
0
                        format_err!(pos, "implementation error: type index too large")
1277
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::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>::{closure#3}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#3}
1278
1.91k
                visitor.visit_br_on_cast_fail(relative_depth, from_ref_type, to_ref_type)
1279
            }
1280
1281
4.07k
            0x1a => visitor.visit_any_convert_extern(),
1282
13.0k
            0x1b => visitor.visit_extern_convert_any(),
1283
1284
14.8k
            0x1c => visitor.visit_ref_i31(),
1285
169
            0x1d => visitor.visit_i31_get_s(),
1286
54
            0x1e => visitor.visit_i31_get_u(),
1287
1288
            0x20 => {
1289
0
                let type_index = self.read_var_u32()?;
1290
0
                visitor.visit_struct_new_desc(type_index)
1291
            }
1292
            0x21 => {
1293
0
                let type_index = self.read_var_u32()?;
1294
0
                visitor.visit_struct_new_default_desc(type_index)
1295
            }
1296
0
            0x22 => visitor.visit_ref_get_desc(self.read()?),
1297
0
            0x23 => visitor.visit_ref_cast_desc_eq_non_null(self.read()?),
1298
0
            0x24 => visitor.visit_ref_cast_desc_eq_nullable(self.read()?),
1299
            0x25 => {
1300
0
                let pos = self.original_position();
1301
0
                let cast_flags = self.read_u8()?;
1302
0
                let relative_depth = self.read_var_u32()?;
1303
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1304
0
                    0b00 => (false, false),
1305
0
                    0b01 => (true, false),
1306
0
                    0b10 => (false, true),
1307
0
                    0b11 => (true, true),
1308
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1309
                };
1310
0
                let from_heap_type = self.read()?;
1311
0
                let from_ref_type =
1312
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1313
0
                        format_err!(pos, "implementation error: type index too large")
1314
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::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>::{closure#4}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#4}
1315
0
                let to_heap_type = self.read()?;
1316
0
                let to_ref_type =
1317
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1318
0
                        format_err!(pos, "implementation error: type index too large")
1319
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::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>::{closure#5}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#5}
1320
0
                visitor.visit_br_on_cast_desc_eq(relative_depth, from_ref_type, to_ref_type)
1321
            }
1322
            0x26 => {
1323
0
                let pos = self.original_position();
1324
0
                let cast_flags = self.read_u8()?;
1325
0
                let relative_depth = self.read_var_u32()?;
1326
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1327
0
                    0 => (false, false),
1328
0
                    1 => (true, false),
1329
0
                    2 => (false, true),
1330
0
                    3 => (true, true),
1331
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1332
                };
1333
0
                let from_heap_type = self.read()?;
1334
0
                let from_ref_type =
1335
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1336
0
                        format_err!(pos, "implementation error: type index too large")
1337
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::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>::{closure#6}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#6}
1338
0
                let to_heap_type = self.read()?;
1339
0
                let to_ref_type =
1340
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1341
0
                        format_err!(pos, "implementation error: type index too large")
1342
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::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>::{closure#7}
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#7}
1343
0
                visitor.visit_br_on_cast_desc_eq_fail(relative_depth, from_ref_type, to_ref_type)
1344
            }
1345
1346
0
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1347
        })
1348
178k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>
Line
Count
Source
1133
79.9k
    fn visit_0xfb_operator<T>(
1134
79.9k
        &mut self,
1135
79.9k
        pos: u64,
1136
79.9k
        visitor: &mut T,
1137
79.9k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1138
79.9k
    where
1139
79.9k
        T: VisitOperator<'a>,
1140
    {
1141
79.9k
        let code = self.read_var_u32()?;
1142
79.9k
        Ok(match code {
1143
            0x0 => {
1144
3.36k
                let type_index = self.read_var_u32()?;
1145
3.36k
                visitor.visit_struct_new(type_index)
1146
            }
1147
            0x01 => {
1148
26.9k
                let type_index = self.read_var_u32()?;
1149
26.9k
                visitor.visit_struct_new_default(type_index)
1150
            }
1151
            0x02 => {
1152
60
                let type_index = self.read_var_u32()?;
1153
60
                let field_index = self.read_var_u32()?;
1154
60
                visitor.visit_struct_get(type_index, field_index)
1155
            }
1156
            0x03 => {
1157
100
                let type_index = self.read_var_u32()?;
1158
100
                let field_index = self.read_var_u32()?;
1159
100
                visitor.visit_struct_get_s(type_index, field_index)
1160
            }
1161
            0x04 => {
1162
14
                let type_index = self.read_var_u32()?;
1163
14
                let field_index = self.read_var_u32()?;
1164
14
                visitor.visit_struct_get_u(type_index, field_index)
1165
            }
1166
            0x05 => {
1167
336
                let type_index = self.read_var_u32()?;
1168
336
                let field_index = self.read_var_u32()?;
1169
336
                visitor.visit_struct_set(type_index, field_index)
1170
            }
1171
            0x06 => {
1172
1.21k
                let type_index = self.read_var_u32()?;
1173
1.21k
                visitor.visit_array_new(type_index)
1174
            }
1175
            0x07 => {
1176
9.84k
                let type_index = self.read_var_u32()?;
1177
9.84k
                visitor.visit_array_new_default(type_index)
1178
            }
1179
            0x08 => {
1180
10.6k
                let type_index = self.read_var_u32()?;
1181
10.6k
                let n = self.read_var_u32()?;
1182
10.6k
                visitor.visit_array_new_fixed(type_index, n)
1183
            }
1184
            0x09 => {
1185
126
                let type_index = self.read_var_u32()?;
1186
126
                let data_index = self.read_var_u32()?;
1187
126
                visitor.visit_array_new_data(type_index, data_index)
1188
            }
1189
            0x0a => {
1190
0
                let type_index = self.read_var_u32()?;
1191
0
                let elem_index = self.read_var_u32()?;
1192
0
                visitor.visit_array_new_elem(type_index, elem_index)
1193
            }
1194
            0x0b => {
1195
0
                let type_index = self.read_var_u32()?;
1196
0
                visitor.visit_array_get(type_index)
1197
            }
1198
            0x0c => {
1199
80
                let type_index = self.read_var_u32()?;
1200
80
                visitor.visit_array_get_s(type_index)
1201
            }
1202
            0x0d => {
1203
16
                let type_index = self.read_var_u32()?;
1204
16
                visitor.visit_array_get_u(type_index)
1205
            }
1206
            0x0e => {
1207
6
                let type_index = self.read_var_u32()?;
1208
6
                visitor.visit_array_set(type_index)
1209
            }
1210
1.27k
            0x0f => visitor.visit_array_len(),
1211
            0x10 => {
1212
42
                let type_index = self.read_var_u32()?;
1213
42
                visitor.visit_array_fill(type_index)
1214
            }
1215
            0x11 => {
1216
16
                let type_index_dst = self.read_var_u32()?;
1217
16
                let type_index_src = self.read_var_u32()?;
1218
16
                visitor.visit_array_copy(type_index_dst, type_index_src)
1219
            }
1220
            0x12 => {
1221
0
                let type_index = self.read_var_u32()?;
1222
0
                let data_index = self.read_var_u32()?;
1223
0
                visitor.visit_array_init_data(type_index, data_index)
1224
            }
1225
            0x13 => {
1226
0
                let type_index = self.read_var_u32()?;
1227
0
                let elem_index = self.read_var_u32()?;
1228
0
                visitor.visit_array_init_elem(type_index, elem_index)
1229
            }
1230
5.94k
            0x14 => visitor.visit_ref_test_non_null(self.read()?),
1231
623
            0x15 => visitor.visit_ref_test_nullable(self.read()?),
1232
1.32k
            0x16 => visitor.visit_ref_cast_non_null(self.read()?),
1233
1.26k
            0x17 => visitor.visit_ref_cast_nullable(self.read()?),
1234
            0x18 => {
1235
308
                let pos = self.original_position();
1236
308
                let cast_flags = self.read_u8()?;
1237
308
                let relative_depth = self.read_var_u32()?;
1238
308
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1239
0
                    0b00 => (false, false),
1240
0
                    0b01 => (true, false),
1241
0
                    0b10 => (false, true),
1242
308
                    0b11 => (true, true),
1243
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1244
                };
1245
308
                let from_heap_type = self.read()?;
1246
308
                let from_ref_type =
1247
308
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1248
                        format_err!(pos, "implementation error: type index too large")
1249
0
                    })?;
1250
308
                let to_heap_type = self.read()?;
1251
308
                let to_ref_type =
1252
308
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1253
                        format_err!(pos, "implementation error: type index too large")
1254
0
                    })?;
1255
308
                visitor.visit_br_on_cast(relative_depth, from_ref_type, to_ref_type)
1256
            }
1257
            0x19 => {
1258
958
                let pos = self.original_position();
1259
958
                let cast_flags = self.read_u8()?;
1260
958
                let relative_depth = self.read_var_u32()?;
1261
958
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1262
318
                    0 => (false, false),
1263
0
                    1 => (true, false),
1264
0
                    2 => (false, true),
1265
640
                    3 => (true, true),
1266
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1267
                };
1268
958
                let from_heap_type = self.read()?;
1269
958
                let from_ref_type =
1270
958
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1271
                        format_err!(pos, "implementation error: type index too large")
1272
0
                    })?;
1273
958
                let to_heap_type = self.read()?;
1274
958
                let to_ref_type =
1275
958
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1276
                        format_err!(pos, "implementation error: type index too large")
1277
0
                    })?;
1278
958
                visitor.visit_br_on_cast_fail(relative_depth, from_ref_type, to_ref_type)
1279
            }
1280
1281
1.96k
            0x1a => visitor.visit_any_convert_extern(),
1282
6.22k
            0x1b => visitor.visit_extern_convert_any(),
1283
1284
7.24k
            0x1c => visitor.visit_ref_i31(),
1285
82
            0x1d => visitor.visit_i31_get_s(),
1286
28
            0x1e => visitor.visit_i31_get_u(),
1287
1288
            0x20 => {
1289
0
                let type_index = self.read_var_u32()?;
1290
0
                visitor.visit_struct_new_desc(type_index)
1291
            }
1292
            0x21 => {
1293
0
                let type_index = self.read_var_u32()?;
1294
0
                visitor.visit_struct_new_default_desc(type_index)
1295
            }
1296
0
            0x22 => visitor.visit_ref_get_desc(self.read()?),
1297
0
            0x23 => visitor.visit_ref_cast_desc_eq_non_null(self.read()?),
1298
0
            0x24 => visitor.visit_ref_cast_desc_eq_nullable(self.read()?),
1299
            0x25 => {
1300
0
                let pos = self.original_position();
1301
0
                let cast_flags = self.read_u8()?;
1302
0
                let relative_depth = self.read_var_u32()?;
1303
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1304
0
                    0b00 => (false, false),
1305
0
                    0b01 => (true, false),
1306
0
                    0b10 => (false, true),
1307
0
                    0b11 => (true, true),
1308
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1309
                };
1310
0
                let from_heap_type = self.read()?;
1311
0
                let from_ref_type =
1312
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1313
                        format_err!(pos, "implementation error: type index too large")
1314
0
                    })?;
1315
0
                let to_heap_type = self.read()?;
1316
0
                let to_ref_type =
1317
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1318
                        format_err!(pos, "implementation error: type index too large")
1319
0
                    })?;
1320
0
                visitor.visit_br_on_cast_desc_eq(relative_depth, from_ref_type, to_ref_type)
1321
            }
1322
            0x26 => {
1323
0
                let pos = self.original_position();
1324
0
                let cast_flags = self.read_u8()?;
1325
0
                let relative_depth = self.read_var_u32()?;
1326
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1327
0
                    0 => (false, false),
1328
0
                    1 => (true, false),
1329
0
                    2 => (false, true),
1330
0
                    3 => (true, true),
1331
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1332
                };
1333
0
                let from_heap_type = self.read()?;
1334
0
                let from_ref_type =
1335
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1336
                        format_err!(pos, "implementation error: type index too large")
1337
0
                    })?;
1338
0
                let to_heap_type = self.read()?;
1339
0
                let to_ref_type =
1340
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1341
                        format_err!(pos, "implementation error: type index too large")
1342
0
                    })?;
1343
0
                visitor.visit_br_on_cast_desc_eq_fail(relative_depth, from_ref_type, to_ref_type)
1344
            }
1345
1346
0
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1347
        })
1348
79.9k
    }
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
1133
35.7k
    fn visit_0xfb_operator<T>(
1134
35.7k
        &mut self,
1135
35.7k
        pos: u64,
1136
35.7k
        visitor: &mut T,
1137
35.7k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1138
35.7k
    where
1139
35.7k
        T: VisitOperator<'a>,
1140
    {
1141
35.7k
        let code = self.read_var_u32()?;
1142
35.7k
        Ok(match code {
1143
            0x0 => {
1144
1.44k
                let type_index = self.read_var_u32()?;
1145
1.44k
                visitor.visit_struct_new(type_index)
1146
            }
1147
            0x01 => {
1148
12.4k
                let type_index = self.read_var_u32()?;
1149
12.4k
                visitor.visit_struct_new_default(type_index)
1150
            }
1151
            0x02 => {
1152
30
                let type_index = self.read_var_u32()?;
1153
30
                let field_index = self.read_var_u32()?;
1154
30
                visitor.visit_struct_get(type_index, field_index)
1155
            }
1156
            0x03 => {
1157
50
                let type_index = self.read_var_u32()?;
1158
50
                let field_index = self.read_var_u32()?;
1159
50
                visitor.visit_struct_get_s(type_index, field_index)
1160
            }
1161
            0x04 => {
1162
7
                let type_index = self.read_var_u32()?;
1163
7
                let field_index = self.read_var_u32()?;
1164
7
                visitor.visit_struct_get_u(type_index, field_index)
1165
            }
1166
            0x05 => {
1167
168
                let type_index = self.read_var_u32()?;
1168
168
                let field_index = self.read_var_u32()?;
1169
168
                visitor.visit_struct_set(type_index, field_index)
1170
            }
1171
            0x06 => {
1172
134
                let type_index = self.read_var_u32()?;
1173
134
                visitor.visit_array_new(type_index)
1174
            }
1175
            0x07 => {
1176
3.19k
                let type_index = self.read_var_u32()?;
1177
3.19k
                visitor.visit_array_new_default(type_index)
1178
            }
1179
            0x08 => {
1180
4.65k
                let type_index = self.read_var_u32()?;
1181
4.65k
                let n = self.read_var_u32()?;
1182
4.65k
                visitor.visit_array_new_fixed(type_index, n)
1183
            }
1184
            0x09 => {
1185
63
                let type_index = self.read_var_u32()?;
1186
63
                let data_index = self.read_var_u32()?;
1187
63
                visitor.visit_array_new_data(type_index, data_index)
1188
            }
1189
            0x0a => {
1190
0
                let type_index = self.read_var_u32()?;
1191
0
                let elem_index = self.read_var_u32()?;
1192
0
                visitor.visit_array_new_elem(type_index, elem_index)
1193
            }
1194
            0x0b => {
1195
0
                let type_index = self.read_var_u32()?;
1196
0
                visitor.visit_array_get(type_index)
1197
            }
1198
            0x0c => {
1199
40
                let type_index = self.read_var_u32()?;
1200
40
                visitor.visit_array_get_s(type_index)
1201
            }
1202
            0x0d => {
1203
8
                let type_index = self.read_var_u32()?;
1204
8
                visitor.visit_array_get_u(type_index)
1205
            }
1206
            0x0e => {
1207
3
                let type_index = self.read_var_u32()?;
1208
3
                visitor.visit_array_set(type_index)
1209
            }
1210
634
            0x0f => visitor.visit_array_len(),
1211
            0x10 => {
1212
21
                let type_index = self.read_var_u32()?;
1213
21
                visitor.visit_array_fill(type_index)
1214
            }
1215
            0x11 => {
1216
8
                let type_index_dst = self.read_var_u32()?;
1217
8
                let type_index_src = self.read_var_u32()?;
1218
8
                visitor.visit_array_copy(type_index_dst, type_index_src)
1219
            }
1220
            0x12 => {
1221
0
                let type_index = self.read_var_u32()?;
1222
0
                let data_index = self.read_var_u32()?;
1223
0
                visitor.visit_array_init_data(type_index, data_index)
1224
            }
1225
            0x13 => {
1226
0
                let type_index = self.read_var_u32()?;
1227
0
                let elem_index = self.read_var_u32()?;
1228
0
                visitor.visit_array_init_elem(type_index, elem_index)
1229
            }
1230
2.99k
            0x14 => visitor.visit_ref_test_non_null(self.read()?),
1231
348
            0x15 => visitor.visit_ref_test_nullable(self.read()?),
1232
661
            0x16 => visitor.visit_ref_cast_non_null(self.read()?),
1233
634
            0x17 => visitor.visit_ref_cast_nullable(self.read()?),
1234
            0x18 => {
1235
154
                let pos = self.original_position();
1236
154
                let cast_flags = self.read_u8()?;
1237
154
                let relative_depth = self.read_var_u32()?;
1238
154
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1239
0
                    0b00 => (false, false),
1240
0
                    0b01 => (true, false),
1241
0
                    0b10 => (false, true),
1242
154
                    0b11 => (true, true),
1243
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1244
                };
1245
154
                let from_heap_type = self.read()?;
1246
154
                let from_ref_type =
1247
154
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1248
                        format_err!(pos, "implementation error: type index too large")
1249
0
                    })?;
1250
154
                let to_heap_type = self.read()?;
1251
154
                let to_ref_type =
1252
154
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1253
                        format_err!(pos, "implementation error: type index too large")
1254
0
                    })?;
1255
154
                visitor.visit_br_on_cast(relative_depth, from_ref_type, to_ref_type)
1256
            }
1257
            0x19 => {
1258
479
                let pos = self.original_position();
1259
479
                let cast_flags = self.read_u8()?;
1260
479
                let relative_depth = self.read_var_u32()?;
1261
479
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1262
159
                    0 => (false, false),
1263
0
                    1 => (true, false),
1264
0
                    2 => (false, true),
1265
320
                    3 => (true, true),
1266
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1267
                };
1268
479
                let from_heap_type = self.read()?;
1269
479
                let from_ref_type =
1270
479
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1271
                        format_err!(pos, "implementation error: type index too large")
1272
0
                    })?;
1273
479
                let to_heap_type = self.read()?;
1274
479
                let to_ref_type =
1275
479
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1276
                        format_err!(pos, "implementation error: type index too large")
1277
0
                    })?;
1278
479
                visitor.visit_br_on_cast_fail(relative_depth, from_ref_type, to_ref_type)
1279
            }
1280
1281
966
            0x1a => visitor.visit_any_convert_extern(),
1282
2.99k
            0x1b => visitor.visit_extern_convert_any(),
1283
1284
3.58k
            0x1c => visitor.visit_ref_i31(),
1285
41
            0x1d => visitor.visit_i31_get_s(),
1286
13
            0x1e => visitor.visit_i31_get_u(),
1287
1288
            0x20 => {
1289
0
                let type_index = self.read_var_u32()?;
1290
0
                visitor.visit_struct_new_desc(type_index)
1291
            }
1292
            0x21 => {
1293
0
                let type_index = self.read_var_u32()?;
1294
0
                visitor.visit_struct_new_default_desc(type_index)
1295
            }
1296
0
            0x22 => visitor.visit_ref_get_desc(self.read()?),
1297
0
            0x23 => visitor.visit_ref_cast_desc_eq_non_null(self.read()?),
1298
0
            0x24 => visitor.visit_ref_cast_desc_eq_nullable(self.read()?),
1299
            0x25 => {
1300
0
                let pos = self.original_position();
1301
0
                let cast_flags = self.read_u8()?;
1302
0
                let relative_depth = self.read_var_u32()?;
1303
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1304
0
                    0b00 => (false, false),
1305
0
                    0b01 => (true, false),
1306
0
                    0b10 => (false, true),
1307
0
                    0b11 => (true, true),
1308
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1309
                };
1310
0
                let from_heap_type = self.read()?;
1311
0
                let from_ref_type =
1312
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1313
                        format_err!(pos, "implementation error: type index too large")
1314
0
                    })?;
1315
0
                let to_heap_type = self.read()?;
1316
0
                let to_ref_type =
1317
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1318
                        format_err!(pos, "implementation error: type index too large")
1319
0
                    })?;
1320
0
                visitor.visit_br_on_cast_desc_eq(relative_depth, from_ref_type, to_ref_type)
1321
            }
1322
            0x26 => {
1323
0
                let pos = self.original_position();
1324
0
                let cast_flags = self.read_u8()?;
1325
0
                let relative_depth = self.read_var_u32()?;
1326
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1327
0
                    0 => (false, false),
1328
0
                    1 => (true, false),
1329
0
                    2 => (false, true),
1330
0
                    3 => (true, true),
1331
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1332
                };
1333
0
                let from_heap_type = self.read()?;
1334
0
                let from_ref_type =
1335
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1336
                        format_err!(pos, "implementation error: type index too large")
1337
0
                    })?;
1338
0
                let to_heap_type = self.read()?;
1339
0
                let to_ref_type =
1340
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1341
                        format_err!(pos, "implementation error: type index too large")
1342
0
                    })?;
1343
0
                visitor.visit_br_on_cast_desc_eq_fail(relative_depth, from_ref_type, to_ref_type)
1344
            }
1345
1346
0
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1347
        })
1348
35.7k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
1133
43.7k
    fn visit_0xfb_operator<T>(
1134
43.7k
        &mut self,
1135
43.7k
        pos: u64,
1136
43.7k
        visitor: &mut T,
1137
43.7k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1138
43.7k
    where
1139
43.7k
        T: VisitOperator<'a>,
1140
    {
1141
43.7k
        let code = self.read_var_u32()?;
1142
43.7k
        Ok(match code {
1143
            0x0 => {
1144
1.85k
                let type_index = self.read_var_u32()?;
1145
1.85k
                visitor.visit_struct_new(type_index)
1146
            }
1147
            0x01 => {
1148
14.7k
                let type_index = self.read_var_u32()?;
1149
14.7k
                visitor.visit_struct_new_default(type_index)
1150
            }
1151
            0x02 => {
1152
30
                let type_index = self.read_var_u32()?;
1153
30
                let field_index = self.read_var_u32()?;
1154
30
                visitor.visit_struct_get(type_index, field_index)
1155
            }
1156
            0x03 => {
1157
50
                let type_index = self.read_var_u32()?;
1158
50
                let field_index = self.read_var_u32()?;
1159
50
                visitor.visit_struct_get_s(type_index, field_index)
1160
            }
1161
            0x04 => {
1162
7
                let type_index = self.read_var_u32()?;
1163
7
                let field_index = self.read_var_u32()?;
1164
7
                visitor.visit_struct_get_u(type_index, field_index)
1165
            }
1166
            0x05 => {
1167
172
                let type_index = self.read_var_u32()?;
1168
172
                let field_index = self.read_var_u32()?;
1169
172
                visitor.visit_struct_set(type_index, field_index)
1170
            }
1171
            0x06 => {
1172
636
                let type_index = self.read_var_u32()?;
1173
636
                visitor.visit_array_new(type_index)
1174
            }
1175
            0x07 => {
1176
6.38k
                let type_index = self.read_var_u32()?;
1177
6.38k
                visitor.visit_array_new_default(type_index)
1178
            }
1179
            0x08 => {
1180
5.67k
                let type_index = self.read_var_u32()?;
1181
5.67k
                let n = self.read_var_u32()?;
1182
5.67k
                visitor.visit_array_new_fixed(type_index, n)
1183
            }
1184
            0x09 => {
1185
63
                let type_index = self.read_var_u32()?;
1186
63
                let data_index = self.read_var_u32()?;
1187
63
                visitor.visit_array_new_data(type_index, data_index)
1188
            }
1189
            0x0a => {
1190
0
                let type_index = self.read_var_u32()?;
1191
0
                let elem_index = self.read_var_u32()?;
1192
0
                visitor.visit_array_new_elem(type_index, elem_index)
1193
            }
1194
            0x0b => {
1195
0
                let type_index = self.read_var_u32()?;
1196
0
                visitor.visit_array_get(type_index)
1197
            }
1198
            0x0c => {
1199
40
                let type_index = self.read_var_u32()?;
1200
40
                visitor.visit_array_get_s(type_index)
1201
            }
1202
            0x0d => {
1203
8
                let type_index = self.read_var_u32()?;
1204
8
                visitor.visit_array_get_u(type_index)
1205
            }
1206
            0x0e => {
1207
3
                let type_index = self.read_var_u32()?;
1208
3
                visitor.visit_array_set(type_index)
1209
            }
1210
677
            0x0f => visitor.visit_array_len(),
1211
            0x10 => {
1212
21
                let type_index = self.read_var_u32()?;
1213
21
                visitor.visit_array_fill(type_index)
1214
            }
1215
            0x11 => {
1216
8
                let type_index_dst = self.read_var_u32()?;
1217
8
                let type_index_src = self.read_var_u32()?;
1218
8
                visitor.visit_array_copy(type_index_dst, type_index_src)
1219
            }
1220
            0x12 => {
1221
0
                let type_index = self.read_var_u32()?;
1222
0
                let data_index = self.read_var_u32()?;
1223
0
                visitor.visit_array_init_data(type_index, data_index)
1224
            }
1225
            0x13 => {
1226
0
                let type_index = self.read_var_u32()?;
1227
0
                let elem_index = self.read_var_u32()?;
1228
0
                visitor.visit_array_init_elem(type_index, elem_index)
1229
            }
1230
3.06k
            0x14 => visitor.visit_ref_test_non_null(self.read()?),
1231
316
            0x15 => visitor.visit_ref_test_nullable(self.read()?),
1232
661
            0x16 => visitor.visit_ref_cast_non_null(self.read()?),
1233
635
            0x17 => visitor.visit_ref_cast_nullable(self.read()?),
1234
            0x18 => {
1235
158
                let pos = self.original_position();
1236
158
                let cast_flags = self.read_u8()?;
1237
158
                let relative_depth = self.read_var_u32()?;
1238
158
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1239
0
                    0b00 => (false, false),
1240
0
                    0b01 => (true, false),
1241
0
                    0b10 => (false, true),
1242
158
                    0b11 => (true, true),
1243
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1244
                };
1245
158
                let from_heap_type = self.read()?;
1246
158
                let from_ref_type =
1247
158
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1248
                        format_err!(pos, "implementation error: type index too large")
1249
0
                    })?;
1250
158
                let to_heap_type = self.read()?;
1251
158
                let to_ref_type =
1252
158
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1253
                        format_err!(pos, "implementation error: type index too large")
1254
0
                    })?;
1255
158
                visitor.visit_br_on_cast(relative_depth, from_ref_type, to_ref_type)
1256
            }
1257
            0x19 => {
1258
479
                let pos = self.original_position();
1259
479
                let cast_flags = self.read_u8()?;
1260
479
                let relative_depth = self.read_var_u32()?;
1261
479
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1262
159
                    0 => (false, false),
1263
0
                    1 => (true, false),
1264
0
                    2 => (false, true),
1265
320
                    3 => (true, true),
1266
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1267
                };
1268
479
                let from_heap_type = self.read()?;
1269
479
                let from_ref_type =
1270
479
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1271
                        format_err!(pos, "implementation error: type index too large")
1272
0
                    })?;
1273
479
                let to_heap_type = self.read()?;
1274
479
                let to_ref_type =
1275
479
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1276
                        format_err!(pos, "implementation error: type index too large")
1277
0
                    })?;
1278
479
                visitor.visit_br_on_cast_fail(relative_depth, from_ref_type, to_ref_type)
1279
            }
1280
1281
1.02k
            0x1a => visitor.visit_any_convert_extern(),
1282
3.27k
            0x1b => visitor.visit_extern_convert_any(),
1283
1284
3.69k
            0x1c => visitor.visit_ref_i31(),
1285
46
            0x1d => visitor.visit_i31_get_s(),
1286
13
            0x1e => visitor.visit_i31_get_u(),
1287
1288
            0x20 => {
1289
0
                let type_index = self.read_var_u32()?;
1290
0
                visitor.visit_struct_new_desc(type_index)
1291
            }
1292
            0x21 => {
1293
0
                let type_index = self.read_var_u32()?;
1294
0
                visitor.visit_struct_new_default_desc(type_index)
1295
            }
1296
0
            0x22 => visitor.visit_ref_get_desc(self.read()?),
1297
0
            0x23 => visitor.visit_ref_cast_desc_eq_non_null(self.read()?),
1298
0
            0x24 => visitor.visit_ref_cast_desc_eq_nullable(self.read()?),
1299
            0x25 => {
1300
0
                let pos = self.original_position();
1301
0
                let cast_flags = self.read_u8()?;
1302
0
                let relative_depth = self.read_var_u32()?;
1303
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1304
0
                    0b00 => (false, false),
1305
0
                    0b01 => (true, false),
1306
0
                    0b10 => (false, true),
1307
0
                    0b11 => (true, true),
1308
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1309
                };
1310
0
                let from_heap_type = self.read()?;
1311
0
                let from_ref_type =
1312
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1313
                        format_err!(pos, "implementation error: type index too large")
1314
0
                    })?;
1315
0
                let to_heap_type = self.read()?;
1316
0
                let to_ref_type =
1317
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1318
                        format_err!(pos, "implementation error: type index too large")
1319
0
                    })?;
1320
0
                visitor.visit_br_on_cast_desc_eq(relative_depth, from_ref_type, to_ref_type)
1321
            }
1322
            0x26 => {
1323
0
                let pos = self.original_position();
1324
0
                let cast_flags = self.read_u8()?;
1325
0
                let relative_depth = self.read_var_u32()?;
1326
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1327
0
                    0 => (false, false),
1328
0
                    1 => (true, false),
1329
0
                    2 => (false, true),
1330
0
                    3 => (true, true),
1331
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1332
                };
1333
0
                let from_heap_type = self.read()?;
1334
0
                let from_ref_type =
1335
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1336
                        format_err!(pos, "implementation error: type index too large")
1337
0
                    })?;
1338
0
                let to_heap_type = self.read()?;
1339
0
                let to_ref_type =
1340
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1341
                        format_err!(pos, "implementation error: type index too large")
1342
0
                    })?;
1343
0
                visitor.visit_br_on_cast_desc_eq_fail(relative_depth, from_ref_type, to_ref_type)
1344
            }
1345
1346
0
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1347
        })
1348
43.7k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>
Line
Count
Source
1133
14.2k
    fn visit_0xfb_operator<T>(
1134
14.2k
        &mut self,
1135
14.2k
        pos: u64,
1136
14.2k
        visitor: &mut T,
1137
14.2k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1138
14.2k
    where
1139
14.2k
        T: VisitOperator<'a>,
1140
    {
1141
14.2k
        let code = self.read_var_u32()?;
1142
14.2k
        Ok(match code {
1143
            0x0 => {
1144
695
                let type_index = self.read_var_u32()?;
1145
695
                visitor.visit_struct_new(type_index)
1146
            }
1147
            0x01 => {
1148
3.10k
                let type_index = self.read_var_u32()?;
1149
3.10k
                visitor.visit_struct_new_default(type_index)
1150
            }
1151
            0x02 => {
1152
0
                let type_index = self.read_var_u32()?;
1153
0
                let field_index = self.read_var_u32()?;
1154
0
                visitor.visit_struct_get(type_index, field_index)
1155
            }
1156
            0x03 => {
1157
0
                let type_index = self.read_var_u32()?;
1158
0
                let field_index = self.read_var_u32()?;
1159
0
                visitor.visit_struct_get_s(type_index, field_index)
1160
            }
1161
            0x04 => {
1162
0
                let type_index = self.read_var_u32()?;
1163
0
                let field_index = self.read_var_u32()?;
1164
0
                visitor.visit_struct_get_u(type_index, field_index)
1165
            }
1166
            0x05 => {
1167
0
                let type_index = self.read_var_u32()?;
1168
0
                let field_index = self.read_var_u32()?;
1169
0
                visitor.visit_struct_set(type_index, field_index)
1170
            }
1171
            0x06 => {
1172
1.43k
                let type_index = self.read_var_u32()?;
1173
1.43k
                visitor.visit_array_new(type_index)
1174
            }
1175
            0x07 => {
1176
6.34k
                let type_index = self.read_var_u32()?;
1177
6.34k
                visitor.visit_array_new_default(type_index)
1178
            }
1179
            0x08 => {
1180
1.94k
                let type_index = self.read_var_u32()?;
1181
1.94k
                let n = self.read_var_u32()?;
1182
1.94k
                visitor.visit_array_new_fixed(type_index, n)
1183
            }
1184
            0x09 => {
1185
0
                let type_index = self.read_var_u32()?;
1186
0
                let data_index = self.read_var_u32()?;
1187
0
                visitor.visit_array_new_data(type_index, data_index)
1188
            }
1189
            0x0a => {
1190
0
                let type_index = self.read_var_u32()?;
1191
0
                let elem_index = self.read_var_u32()?;
1192
0
                visitor.visit_array_new_elem(type_index, elem_index)
1193
            }
1194
            0x0b => {
1195
0
                let type_index = self.read_var_u32()?;
1196
0
                visitor.visit_array_get(type_index)
1197
            }
1198
            0x0c => {
1199
0
                let type_index = self.read_var_u32()?;
1200
0
                visitor.visit_array_get_s(type_index)
1201
            }
1202
            0x0d => {
1203
0
                let type_index = self.read_var_u32()?;
1204
0
                visitor.visit_array_get_u(type_index)
1205
            }
1206
            0x0e => {
1207
0
                let type_index = self.read_var_u32()?;
1208
0
                visitor.visit_array_set(type_index)
1209
            }
1210
0
            0x0f => visitor.visit_array_len(),
1211
            0x10 => {
1212
0
                let type_index = self.read_var_u32()?;
1213
0
                visitor.visit_array_fill(type_index)
1214
            }
1215
            0x11 => {
1216
0
                let type_index_dst = self.read_var_u32()?;
1217
0
                let type_index_src = self.read_var_u32()?;
1218
0
                visitor.visit_array_copy(type_index_dst, type_index_src)
1219
            }
1220
            0x12 => {
1221
0
                let type_index = self.read_var_u32()?;
1222
0
                let data_index = self.read_var_u32()?;
1223
0
                visitor.visit_array_init_data(type_index, data_index)
1224
            }
1225
            0x13 => {
1226
0
                let type_index = self.read_var_u32()?;
1227
0
                let elem_index = self.read_var_u32()?;
1228
0
                visitor.visit_array_init_elem(type_index, elem_index)
1229
            }
1230
0
            0x14 => visitor.visit_ref_test_non_null(self.read()?),
1231
0
            0x15 => visitor.visit_ref_test_nullable(self.read()?),
1232
0
            0x16 => visitor.visit_ref_cast_non_null(self.read()?),
1233
0
            0x17 => visitor.visit_ref_cast_nullable(self.read()?),
1234
            0x18 => {
1235
0
                let pos = self.original_position();
1236
0
                let cast_flags = self.read_u8()?;
1237
0
                let relative_depth = self.read_var_u32()?;
1238
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1239
0
                    0b00 => (false, false),
1240
0
                    0b01 => (true, false),
1241
0
                    0b10 => (false, true),
1242
0
                    0b11 => (true, true),
1243
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1244
                };
1245
0
                let from_heap_type = self.read()?;
1246
0
                let from_ref_type =
1247
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1248
                        format_err!(pos, "implementation error: type index too large")
1249
0
                    })?;
1250
0
                let to_heap_type = self.read()?;
1251
0
                let to_ref_type =
1252
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1253
                        format_err!(pos, "implementation error: type index too large")
1254
0
                    })?;
1255
0
                visitor.visit_br_on_cast(relative_depth, from_ref_type, to_ref_type)
1256
            }
1257
            0x19 => {
1258
0
                let pos = self.original_position();
1259
0
                let cast_flags = self.read_u8()?;
1260
0
                let relative_depth = self.read_var_u32()?;
1261
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1262
0
                    0 => (false, false),
1263
0
                    1 => (true, false),
1264
0
                    2 => (false, true),
1265
0
                    3 => (true, true),
1266
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1267
                };
1268
0
                let from_heap_type = self.read()?;
1269
0
                let from_ref_type =
1270
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1271
                        format_err!(pos, "implementation error: type index too large")
1272
0
                    })?;
1273
0
                let to_heap_type = self.read()?;
1274
0
                let to_ref_type =
1275
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1276
                        format_err!(pos, "implementation error: type index too large")
1277
0
                    })?;
1278
0
                visitor.visit_br_on_cast_fail(relative_depth, from_ref_type, to_ref_type)
1279
            }
1280
1281
91
            0x1a => visitor.visit_any_convert_extern(),
1282
414
            0x1b => visitor.visit_extern_convert_any(),
1283
1284
263
            0x1c => visitor.visit_ref_i31(),
1285
0
            0x1d => visitor.visit_i31_get_s(),
1286
0
            0x1e => visitor.visit_i31_get_u(),
1287
1288
            0x20 => {
1289
0
                let type_index = self.read_var_u32()?;
1290
0
                visitor.visit_struct_new_desc(type_index)
1291
            }
1292
            0x21 => {
1293
0
                let type_index = self.read_var_u32()?;
1294
0
                visitor.visit_struct_new_default_desc(type_index)
1295
            }
1296
0
            0x22 => visitor.visit_ref_get_desc(self.read()?),
1297
0
            0x23 => visitor.visit_ref_cast_desc_eq_non_null(self.read()?),
1298
0
            0x24 => visitor.visit_ref_cast_desc_eq_nullable(self.read()?),
1299
            0x25 => {
1300
0
                let pos = self.original_position();
1301
0
                let cast_flags = self.read_u8()?;
1302
0
                let relative_depth = self.read_var_u32()?;
1303
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1304
0
                    0b00 => (false, false),
1305
0
                    0b01 => (true, false),
1306
0
                    0b10 => (false, true),
1307
0
                    0b11 => (true, true),
1308
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1309
                };
1310
0
                let from_heap_type = self.read()?;
1311
0
                let from_ref_type =
1312
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1313
                        format_err!(pos, "implementation error: type index too large")
1314
0
                    })?;
1315
0
                let to_heap_type = self.read()?;
1316
0
                let to_ref_type =
1317
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1318
                        format_err!(pos, "implementation error: type index too large")
1319
0
                    })?;
1320
0
                visitor.visit_br_on_cast_desc_eq(relative_depth, from_ref_type, to_ref_type)
1321
            }
1322
            0x26 => {
1323
0
                let pos = self.original_position();
1324
0
                let cast_flags = self.read_u8()?;
1325
0
                let relative_depth = self.read_var_u32()?;
1326
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1327
0
                    0 => (false, false),
1328
0
                    1 => (true, false),
1329
0
                    2 => (false, true),
1330
0
                    3 => (true, true),
1331
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1332
                };
1333
0
                let from_heap_type = self.read()?;
1334
0
                let from_ref_type =
1335
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1336
                        format_err!(pos, "implementation error: type index too large")
1337
0
                    })?;
1338
0
                let to_heap_type = self.read()?;
1339
0
                let to_ref_type =
1340
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1341
                        format_err!(pos, "implementation error: type index too large")
1342
0
                    })?;
1343
0
                visitor.visit_br_on_cast_desc_eq_fail(relative_depth, from_ref_type, to_ref_type)
1344
            }
1345
1346
0
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1347
        })
1348
14.2k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
Line
Count
Source
1133
4.35k
    fn visit_0xfb_operator<T>(
1134
4.35k
        &mut self,
1135
4.35k
        pos: u64,
1136
4.35k
        visitor: &mut T,
1137
4.35k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1138
4.35k
    where
1139
4.35k
        T: VisitOperator<'a>,
1140
    {
1141
4.35k
        let code = self.read_var_u32()?;
1142
4.35k
        Ok(match code {
1143
            0x0 => {
1144
232
                let type_index = self.read_var_u32()?;
1145
232
                visitor.visit_struct_new(type_index)
1146
            }
1147
            0x01 => {
1148
1.01k
                let type_index = self.read_var_u32()?;
1149
1.01k
                visitor.visit_struct_new_default(type_index)
1150
            }
1151
            0x02 => {
1152
0
                let type_index = self.read_var_u32()?;
1153
0
                let field_index = self.read_var_u32()?;
1154
0
                visitor.visit_struct_get(type_index, field_index)
1155
            }
1156
            0x03 => {
1157
0
                let type_index = self.read_var_u32()?;
1158
0
                let field_index = self.read_var_u32()?;
1159
0
                visitor.visit_struct_get_s(type_index, field_index)
1160
            }
1161
            0x04 => {
1162
0
                let type_index = self.read_var_u32()?;
1163
0
                let field_index = self.read_var_u32()?;
1164
0
                visitor.visit_struct_get_u(type_index, field_index)
1165
            }
1166
            0x05 => {
1167
0
                let type_index = self.read_var_u32()?;
1168
0
                let field_index = self.read_var_u32()?;
1169
0
                visitor.visit_struct_set(type_index, field_index)
1170
            }
1171
            0x06 => {
1172
473
                let type_index = self.read_var_u32()?;
1173
473
                visitor.visit_array_new(type_index)
1174
            }
1175
            0x07 => {
1176
1.72k
                let type_index = self.read_var_u32()?;
1177
1.72k
                visitor.visit_array_new_default(type_index)
1178
            }
1179
            0x08 => {
1180
647
                let type_index = self.read_var_u32()?;
1181
647
                let n = self.read_var_u32()?;
1182
647
                visitor.visit_array_new_fixed(type_index, n)
1183
            }
1184
            0x09 => {
1185
0
                let type_index = self.read_var_u32()?;
1186
0
                let data_index = self.read_var_u32()?;
1187
0
                visitor.visit_array_new_data(type_index, data_index)
1188
            }
1189
            0x0a => {
1190
0
                let type_index = self.read_var_u32()?;
1191
0
                let elem_index = self.read_var_u32()?;
1192
0
                visitor.visit_array_new_elem(type_index, elem_index)
1193
            }
1194
            0x0b => {
1195
0
                let type_index = self.read_var_u32()?;
1196
0
                visitor.visit_array_get(type_index)
1197
            }
1198
            0x0c => {
1199
0
                let type_index = self.read_var_u32()?;
1200
0
                visitor.visit_array_get_s(type_index)
1201
            }
1202
            0x0d => {
1203
0
                let type_index = self.read_var_u32()?;
1204
0
                visitor.visit_array_get_u(type_index)
1205
            }
1206
            0x0e => {
1207
0
                let type_index = self.read_var_u32()?;
1208
0
                visitor.visit_array_set(type_index)
1209
            }
1210
0
            0x0f => visitor.visit_array_len(),
1211
            0x10 => {
1212
0
                let type_index = self.read_var_u32()?;
1213
0
                visitor.visit_array_fill(type_index)
1214
            }
1215
            0x11 => {
1216
0
                let type_index_dst = self.read_var_u32()?;
1217
0
                let type_index_src = self.read_var_u32()?;
1218
0
                visitor.visit_array_copy(type_index_dst, type_index_src)
1219
            }
1220
            0x12 => {
1221
0
                let type_index = self.read_var_u32()?;
1222
0
                let data_index = self.read_var_u32()?;
1223
0
                visitor.visit_array_init_data(type_index, data_index)
1224
            }
1225
            0x13 => {
1226
0
                let type_index = self.read_var_u32()?;
1227
0
                let elem_index = self.read_var_u32()?;
1228
0
                visitor.visit_array_init_elem(type_index, elem_index)
1229
            }
1230
0
            0x14 => visitor.visit_ref_test_non_null(self.read()?),
1231
0
            0x15 => visitor.visit_ref_test_nullable(self.read()?),
1232
0
            0x16 => visitor.visit_ref_cast_non_null(self.read()?),
1233
0
            0x17 => visitor.visit_ref_cast_nullable(self.read()?),
1234
            0x18 => {
1235
0
                let pos = self.original_position();
1236
0
                let cast_flags = self.read_u8()?;
1237
0
                let relative_depth = self.read_var_u32()?;
1238
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1239
0
                    0b00 => (false, false),
1240
0
                    0b01 => (true, false),
1241
0
                    0b10 => (false, true),
1242
0
                    0b11 => (true, true),
1243
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1244
                };
1245
0
                let from_heap_type = self.read()?;
1246
0
                let from_ref_type =
1247
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1248
                        format_err!(pos, "implementation error: type index too large")
1249
0
                    })?;
1250
0
                let to_heap_type = self.read()?;
1251
0
                let to_ref_type =
1252
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1253
                        format_err!(pos, "implementation error: type index too large")
1254
0
                    })?;
1255
0
                visitor.visit_br_on_cast(relative_depth, from_ref_type, to_ref_type)
1256
            }
1257
            0x19 => {
1258
0
                let pos = self.original_position();
1259
0
                let cast_flags = self.read_u8()?;
1260
0
                let relative_depth = self.read_var_u32()?;
1261
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1262
0
                    0 => (false, false),
1263
0
                    1 => (true, false),
1264
0
                    2 => (false, true),
1265
0
                    3 => (true, true),
1266
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1267
                };
1268
0
                let from_heap_type = self.read()?;
1269
0
                let from_ref_type =
1270
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1271
                        format_err!(pos, "implementation error: type index too large")
1272
0
                    })?;
1273
0
                let to_heap_type = self.read()?;
1274
0
                let to_ref_type =
1275
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1276
                        format_err!(pos, "implementation error: type index too large")
1277
0
                    })?;
1278
0
                visitor.visit_br_on_cast_fail(relative_depth, from_ref_type, to_ref_type)
1279
            }
1280
1281
31
            0x1a => visitor.visit_any_convert_extern(),
1282
138
            0x1b => visitor.visit_extern_convert_any(),
1283
1284
90
            0x1c => visitor.visit_ref_i31(),
1285
0
            0x1d => visitor.visit_i31_get_s(),
1286
0
            0x1e => visitor.visit_i31_get_u(),
1287
1288
            0x20 => {
1289
0
                let type_index = self.read_var_u32()?;
1290
0
                visitor.visit_struct_new_desc(type_index)
1291
            }
1292
            0x21 => {
1293
0
                let type_index = self.read_var_u32()?;
1294
0
                visitor.visit_struct_new_default_desc(type_index)
1295
            }
1296
0
            0x22 => visitor.visit_ref_get_desc(self.read()?),
1297
0
            0x23 => visitor.visit_ref_cast_desc_eq_non_null(self.read()?),
1298
0
            0x24 => visitor.visit_ref_cast_desc_eq_nullable(self.read()?),
1299
            0x25 => {
1300
0
                let pos = self.original_position();
1301
0
                let cast_flags = self.read_u8()?;
1302
0
                let relative_depth = self.read_var_u32()?;
1303
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1304
0
                    0b00 => (false, false),
1305
0
                    0b01 => (true, false),
1306
0
                    0b10 => (false, true),
1307
0
                    0b11 => (true, true),
1308
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1309
                };
1310
0
                let from_heap_type = self.read()?;
1311
0
                let from_ref_type =
1312
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1313
                        format_err!(pos, "implementation error: type index too large")
1314
0
                    })?;
1315
0
                let to_heap_type = self.read()?;
1316
0
                let to_ref_type =
1317
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1318
                        format_err!(pos, "implementation error: type index too large")
1319
0
                    })?;
1320
0
                visitor.visit_br_on_cast_desc_eq(relative_depth, from_ref_type, to_ref_type)
1321
            }
1322
            0x26 => {
1323
0
                let pos = self.original_position();
1324
0
                let cast_flags = self.read_u8()?;
1325
0
                let relative_depth = self.read_var_u32()?;
1326
0
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1327
0
                    0 => (false, false),
1328
0
                    1 => (true, false),
1329
0
                    2 => (false, true),
1330
0
                    3 => (true, true),
1331
0
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1332
                };
1333
0
                let from_heap_type = self.read()?;
1334
0
                let from_ref_type =
1335
0
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1336
                        format_err!(pos, "implementation error: type index too large")
1337
0
                    })?;
1338
0
                let to_heap_type = self.read()?;
1339
0
                let to_ref_type =
1340
0
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1341
                        format_err!(pos, "implementation error: type index too large")
1342
0
                    })?;
1343
0
                visitor.visit_br_on_cast_desc_eq_fail(relative_depth, from_ref_type, to_ref_type)
1344
            }
1345
1346
0
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1347
        })
1348
4.35k
    }
1349
1350
884k
    fn visit_0xfc_operator<T>(
1351
884k
        &mut self,
1352
884k
        pos: u64,
1353
884k
        visitor: &mut T,
1354
884k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1355
884k
    where
1356
884k
        T: VisitOperator<'a>,
1357
    {
1358
884k
        let code = self.read_var_u32()?;
1359
884k
        Ok(match code {
1360
21.9k
            0x00 => visitor.visit_i32_trunc_sat_f32_s(),
1361
10.0k
            0x01 => visitor.visit_i32_trunc_sat_f32_u(),
1362
31.0k
            0x02 => visitor.visit_i32_trunc_sat_f64_s(),
1363
13.6k
            0x03 => visitor.visit_i32_trunc_sat_f64_u(),
1364
11.0k
            0x04 => visitor.visit_i64_trunc_sat_f32_s(),
1365
14.0k
            0x05 => visitor.visit_i64_trunc_sat_f32_u(),
1366
16.4k
            0x06 => visitor.visit_i64_trunc_sat_f64_s(),
1367
13.0k
            0x07 => visitor.visit_i64_trunc_sat_f64_u(),
1368
1369
            0x08 => {
1370
4
                let segment = self.read_var_u32()?;
1371
4
                let mem = self.read_var_u32()?;
1372
4
                visitor.visit_memory_init(segment, mem)
1373
            }
1374
            0x09 => {
1375
279k
                let segment = self.read_var_u32()?;
1376
279k
                visitor.visit_data_drop(segment)
1377
            }
1378
            0x0a => {
1379
12
                let dst = self.read_var_u32()?;
1380
12
                let src = self.read_var_u32()?;
1381
12
                visitor.visit_memory_copy(dst, src)
1382
            }
1383
            0x0b => {
1384
16
                let mem = self.read_var_u32()?;
1385
16
                visitor.visit_memory_fill(mem)
1386
            }
1387
            0x0c => {
1388
33
                let segment = self.read_var_u32()?;
1389
33
                let table = self.read_var_u32()?;
1390
33
                visitor.visit_table_init(segment, table)
1391
            }
1392
            0x0d => {
1393
373k
                let segment = self.read_var_u32()?;
1394
373k
                visitor.visit_elem_drop(segment)
1395
            }
1396
            0x0e => {
1397
44
                let dst_table = self.read_var_u32()?;
1398
44
                let src_table = self.read_var_u32()?;
1399
44
                visitor.visit_table_copy(dst_table, src_table)
1400
            }
1401
1402
            0x0f => {
1403
1.80k
                let table = self.read_var_u32()?;
1404
1.80k
                visitor.visit_table_grow(table)
1405
            }
1406
            0x10 => {
1407
73.9k
                let table = self.read_var_u32()?;
1408
73.9k
                visitor.visit_table_size(table)
1409
            }
1410
1411
            0x11 => {
1412
41
                let table = self.read_var_u32()?;
1413
41
                visitor.visit_table_fill(table)
1414
            }
1415
1416
            0x12 => {
1417
0
                let mem = self.read_var_u32()?;
1418
0
                visitor.visit_memory_discard(mem)
1419
            }
1420
1421
131
            0x13 => visitor.visit_i64_add128(),
1422
61
            0x14 => visitor.visit_i64_sub128(),
1423
5.49k
            0x15 => visitor.visit_i64_mul_wide_s(),
1424
18.9k
            0x16 => visitor.visit_i64_mul_wide_u(),
1425
1426
1
            _ => bail!(pos, "unknown 0xfc subopcode: 0x{code:x}"),
1427
        })
1428
884k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfc_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>
Line
Count
Source
1350
196k
    fn visit_0xfc_operator<T>(
1351
196k
        &mut self,
1352
196k
        pos: u64,
1353
196k
        visitor: &mut T,
1354
196k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1355
196k
    where
1356
196k
        T: VisitOperator<'a>,
1357
    {
1358
196k
        let code = self.read_var_u32()?;
1359
196k
        Ok(match code {
1360
3.87k
            0x00 => visitor.visit_i32_trunc_sat_f32_s(),
1361
2.98k
            0x01 => visitor.visit_i32_trunc_sat_f32_u(),
1362
5.55k
            0x02 => visitor.visit_i32_trunc_sat_f64_s(),
1363
4.25k
            0x03 => visitor.visit_i32_trunc_sat_f64_u(),
1364
2.86k
            0x04 => visitor.visit_i64_trunc_sat_f32_s(),
1365
4.74k
            0x05 => visitor.visit_i64_trunc_sat_f32_u(),
1366
2.46k
            0x06 => visitor.visit_i64_trunc_sat_f64_s(),
1367
2.63k
            0x07 => visitor.visit_i64_trunc_sat_f64_u(),
1368
1369
            0x08 => {
1370
2
                let segment = self.read_var_u32()?;
1371
2
                let mem = self.read_var_u32()?;
1372
2
                visitor.visit_memory_init(segment, mem)
1373
            }
1374
            0x09 => {
1375
90.9k
                let segment = self.read_var_u32()?;
1376
90.9k
                visitor.visit_data_drop(segment)
1377
            }
1378
            0x0a => {
1379
0
                let dst = self.read_var_u32()?;
1380
0
                let src = self.read_var_u32()?;
1381
0
                visitor.visit_memory_copy(dst, src)
1382
            }
1383
            0x0b => {
1384
8
                let mem = self.read_var_u32()?;
1385
8
                visitor.visit_memory_fill(mem)
1386
            }
1387
            0x0c => {
1388
16
                let segment = self.read_var_u32()?;
1389
16
                let table = self.read_var_u32()?;
1390
16
                visitor.visit_table_init(segment, table)
1391
            }
1392
            0x0d => {
1393
48.8k
                let segment = self.read_var_u32()?;
1394
48.8k
                visitor.visit_elem_drop(segment)
1395
            }
1396
            0x0e => {
1397
20
                let dst_table = self.read_var_u32()?;
1398
20
                let src_table = self.read_var_u32()?;
1399
20
                visitor.visit_table_copy(dst_table, src_table)
1400
            }
1401
1402
            0x0f => {
1403
190
                let table = self.read_var_u32()?;
1404
190
                visitor.visit_table_grow(table)
1405
            }
1406
            0x10 => {
1407
19.3k
                let table = self.read_var_u32()?;
1408
19.3k
                visitor.visit_table_size(table)
1409
            }
1410
1411
            0x11 => {
1412
16
                let table = self.read_var_u32()?;
1413
16
                visitor.visit_table_fill(table)
1414
            }
1415
1416
            0x12 => {
1417
0
                let mem = self.read_var_u32()?;
1418
0
                visitor.visit_memory_discard(mem)
1419
            }
1420
1421
40
            0x13 => visitor.visit_i64_add128(),
1422
28
            0x14 => visitor.visit_i64_sub128(),
1423
810
            0x15 => visitor.visit_i64_mul_wide_s(),
1424
7.07k
            0x16 => visitor.visit_i64_mul_wide_u(),
1425
1426
1
            _ => bail!(pos, "unknown 0xfc subopcode: 0x{code:x}"),
1427
        })
1428
196k
    }
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
1350
478k
    fn visit_0xfc_operator<T>(
1351
478k
        &mut self,
1352
478k
        pos: u64,
1353
478k
        visitor: &mut T,
1354
478k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1355
478k
    where
1356
478k
        T: VisitOperator<'a>,
1357
    {
1358
478k
        let code = self.read_var_u32()?;
1359
478k
        Ok(match code {
1360
12.7k
            0x00 => visitor.visit_i32_trunc_sat_f32_s(),
1361
4.65k
            0x01 => visitor.visit_i32_trunc_sat_f32_u(),
1362
20.8k
            0x02 => visitor.visit_i32_trunc_sat_f64_s(),
1363
6.30k
            0x03 => visitor.visit_i32_trunc_sat_f64_u(),
1364
4.24k
            0x04 => visitor.visit_i64_trunc_sat_f32_s(),
1365
5.55k
            0x05 => visitor.visit_i64_trunc_sat_f32_u(),
1366
8.28k
            0x06 => visitor.visit_i64_trunc_sat_f64_s(),
1367
6.86k
            0x07 => visitor.visit_i64_trunc_sat_f64_u(),
1368
1369
            0x08 => {
1370
1
                let segment = self.read_var_u32()?;
1371
1
                let mem = self.read_var_u32()?;
1372
1
                visitor.visit_memory_init(segment, mem)
1373
            }
1374
            0x09 => {
1375
88.6k
                let segment = self.read_var_u32()?;
1376
88.6k
                visitor.visit_data_drop(segment)
1377
            }
1378
            0x0a => {
1379
11
                let dst = self.read_var_u32()?;
1380
11
                let src = self.read_var_u32()?;
1381
11
                visitor.visit_memory_copy(dst, src)
1382
            }
1383
            0x0b => {
1384
4
                let mem = self.read_var_u32()?;
1385
4
                visitor.visit_memory_fill(mem)
1386
            }
1387
            0x0c => {
1388
8
                let segment = self.read_var_u32()?;
1389
8
                let table = self.read_var_u32()?;
1390
8
                visitor.visit_table_init(segment, table)
1391
            }
1392
            0x0d => {
1393
280k
                let segment = self.read_var_u32()?;
1394
280k
                visitor.visit_elem_drop(segment)
1395
            }
1396
            0x0e => {
1397
11
                let dst_table = self.read_var_u32()?;
1398
11
                let src_table = self.read_var_u32()?;
1399
11
                visitor.visit_table_copy(dst_table, src_table)
1400
            }
1401
1402
            0x0f => {
1403
902
                let table = self.read_var_u32()?;
1404
902
                visitor.visit_table_grow(table)
1405
            }
1406
            0x10 => {
1407
31.8k
                let table = self.read_var_u32()?;
1408
31.8k
                visitor.visit_table_size(table)
1409
            }
1410
1411
            0x11 => {
1412
14
                let table = self.read_var_u32()?;
1413
14
                visitor.visit_table_fill(table)
1414
            }
1415
1416
            0x12 => {
1417
0
                let mem = self.read_var_u32()?;
1418
0
                visitor.visit_memory_discard(mem)
1419
            }
1420
1421
61
            0x13 => visitor.visit_i64_add128(),
1422
17
            0x14 => visitor.visit_i64_sub128(),
1423
2.19k
            0x15 => visitor.visit_i64_mul_wide_s(),
1424
5.05k
            0x16 => visitor.visit_i64_mul_wide_u(),
1425
1426
0
            _ => bail!(pos, "unknown 0xfc subopcode: 0x{code:x}"),
1427
        })
1428
478k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfc_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
1350
209k
    fn visit_0xfc_operator<T>(
1351
209k
        &mut self,
1352
209k
        pos: u64,
1353
209k
        visitor: &mut T,
1354
209k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1355
209k
    where
1356
209k
        T: VisitOperator<'a>,
1357
    {
1358
209k
        let code = self.read_var_u32()?;
1359
209k
        Ok(match code {
1360
5.28k
            0x00 => visitor.visit_i32_trunc_sat_f32_s(),
1361
2.42k
            0x01 => visitor.visit_i32_trunc_sat_f32_u(),
1362
4.67k
            0x02 => visitor.visit_i32_trunc_sat_f64_s(),
1363
3.10k
            0x03 => visitor.visit_i32_trunc_sat_f64_u(),
1364
3.93k
            0x04 => visitor.visit_i64_trunc_sat_f32_s(),
1365
3.74k
            0x05 => visitor.visit_i64_trunc_sat_f32_u(),
1366
5.70k
            0x06 => visitor.visit_i64_trunc_sat_f64_s(),
1367
3.59k
            0x07 => visitor.visit_i64_trunc_sat_f64_u(),
1368
1369
            0x08 => {
1370
1
                let segment = self.read_var_u32()?;
1371
1
                let mem = self.read_var_u32()?;
1372
1
                visitor.visit_memory_init(segment, mem)
1373
            }
1374
            0x09 => {
1375
100k
                let segment = self.read_var_u32()?;
1376
100k
                visitor.visit_data_drop(segment)
1377
            }
1378
            0x0a => {
1379
1
                let dst = self.read_var_u32()?;
1380
1
                let src = self.read_var_u32()?;
1381
1
                visitor.visit_memory_copy(dst, src)
1382
            }
1383
            0x0b => {
1384
4
                let mem = self.read_var_u32()?;
1385
4
                visitor.visit_memory_fill(mem)
1386
            }
1387
            0x0c => {
1388
9
                let segment = self.read_var_u32()?;
1389
9
                let table = self.read_var_u32()?;
1390
9
                visitor.visit_table_init(segment, table)
1391
            }
1392
            0x0d => {
1393
44.1k
                let segment = self.read_var_u32()?;
1394
44.1k
                visitor.visit_elem_drop(segment)
1395
            }
1396
            0x0e => {
1397
13
                let dst_table = self.read_var_u32()?;
1398
13
                let src_table = self.read_var_u32()?;
1399
13
                visitor.visit_table_copy(dst_table, src_table)
1400
            }
1401
1402
            0x0f => {
1403
710
                let table = self.read_var_u32()?;
1404
710
                visitor.visit_table_grow(table)
1405
            }
1406
            0x10 => {
1407
22.7k
                let table = self.read_var_u32()?;
1408
22.7k
                visitor.visit_table_size(table)
1409
            }
1410
1411
            0x11 => {
1412
11
                let table = self.read_var_u32()?;
1413
11
                visitor.visit_table_fill(table)
1414
            }
1415
1416
            0x12 => {
1417
0
                let mem = self.read_var_u32()?;
1418
0
                visitor.visit_memory_discard(mem)
1419
            }
1420
1421
30
            0x13 => visitor.visit_i64_add128(),
1422
16
            0x14 => visitor.visit_i64_sub128(),
1423
2.48k
            0x15 => visitor.visit_i64_mul_wide_s(),
1424
6.86k
            0x16 => visitor.visit_i64_mul_wide_u(),
1425
1426
0
            _ => bail!(pos, "unknown 0xfc subopcode: 0x{code:x}"),
1427
        })
1428
209k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfc_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfc_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
1429
1430
    #[cfg(feature = "simd")]
1431
1.26M
    pub(super) fn visit_0xfd_operator<T>(
1432
1.26M
        &mut self,
1433
1.26M
        pos: u64,
1434
1.26M
        visitor: &mut T,
1435
1.26M
    ) -> Result<<T as VisitOperator<'a>>::Output>
1436
1.26M
    where
1437
1.26M
        T: VisitSimdOperator<'a>,
1438
    {
1439
1.26M
        let code = self.read_var_u32()?;
1440
1.26M
        Ok(match code {
1441
3.28k
            0x00 => visitor.visit_v128_load(self.read_memarg(4)?),
1442
1.42k
            0x01 => visitor.visit_v128_load8x8_s(self.read_memarg(3)?),
1443
2.42k
            0x02 => visitor.visit_v128_load8x8_u(self.read_memarg(3)?),
1444
1.22k
            0x03 => visitor.visit_v128_load16x4_s(self.read_memarg(3)?),
1445
3.57k
            0x04 => visitor.visit_v128_load16x4_u(self.read_memarg(3)?),
1446
3.80k
            0x05 => visitor.visit_v128_load32x2_s(self.read_memarg(3)?),
1447
1.72k
            0x06 => visitor.visit_v128_load32x2_u(self.read_memarg(3)?),
1448
1.84k
            0x07 => visitor.visit_v128_load8_splat(self.read_memarg(0)?),
1449
2.06k
            0x08 => visitor.visit_v128_load16_splat(self.read_memarg(1)?),
1450
2.56k
            0x09 => visitor.visit_v128_load32_splat(self.read_memarg(2)?),
1451
2.92k
            0x0a => visitor.visit_v128_load64_splat(self.read_memarg(3)?),
1452
1453
269
            0x0b => visitor.visit_v128_store(self.read_memarg(4)?),
1454
399k
            0x0c => visitor.visit_v128_const(self.read_v128()?),
1455
            0x0d => {
1456
15
                let mut lanes: [u8; 16] = [0; 16];
1457
240
                for lane in &mut lanes {
1458
240
                    *lane = self.read_lane_index()?
1459
                }
1460
15
                visitor.visit_i8x16_shuffle(lanes)
1461
            }
1462
1463
44
            0x0e => visitor.visit_i8x16_swizzle(),
1464
8.73k
            0x0f => visitor.visit_i8x16_splat(),
1465
9.09k
            0x10 => visitor.visit_i16x8_splat(),
1466
7.21k
            0x11 => visitor.visit_i32x4_splat(),
1467
7.53k
            0x12 => visitor.visit_i64x2_splat(),
1468
1.35k
            0x13 => visitor.visit_f32x4_splat(),
1469
528
            0x14 => visitor.visit_f64x2_splat(),
1470
1471
5.14k
            0x15 => visitor.visit_i8x16_extract_lane_s(self.read_lane_index()?),
1472
5.42k
            0x16 => visitor.visit_i8x16_extract_lane_u(self.read_lane_index()?),
1473
372
            0x17 => visitor.visit_i8x16_replace_lane(self.read_lane_index()?),
1474
6.96k
            0x18 => visitor.visit_i16x8_extract_lane_s(self.read_lane_index()?),
1475
3.51k
            0x19 => visitor.visit_i16x8_extract_lane_u(self.read_lane_index()?),
1476
142
            0x1a => visitor.visit_i16x8_replace_lane(self.read_lane_index()?),
1477
5.19k
            0x1b => visitor.visit_i32x4_extract_lane(self.read_lane_index()?),
1478
1479
184
            0x1c => visitor.visit_i32x4_replace_lane(self.read_lane_index()?),
1480
5.47k
            0x1d => visitor.visit_i64x2_extract_lane(self.read_lane_index()?),
1481
836
            0x1e => visitor.visit_i64x2_replace_lane(self.read_lane_index()?),
1482
1.35k
            0x1f => visitor.visit_f32x4_extract_lane(self.read_lane_index()?),
1483
12
            0x20 => visitor.visit_f32x4_replace_lane(self.read_lane_index()?),
1484
1.24k
            0x21 => visitor.visit_f64x2_extract_lane(self.read_lane_index()?),
1485
124
            0x22 => visitor.visit_f64x2_replace_lane(self.read_lane_index()?),
1486
1487
56
            0x23 => visitor.visit_i8x16_eq(),
1488
66
            0x24 => visitor.visit_i8x16_ne(),
1489
48
            0x25 => visitor.visit_i8x16_lt_s(),
1490
21
            0x26 => visitor.visit_i8x16_lt_u(),
1491
34
            0x27 => visitor.visit_i8x16_gt_s(),
1492
31
            0x28 => visitor.visit_i8x16_gt_u(),
1493
86
            0x29 => visitor.visit_i8x16_le_s(),
1494
39
            0x2a => visitor.visit_i8x16_le_u(),
1495
146
            0x2b => visitor.visit_i8x16_ge_s(),
1496
610
            0x2c => visitor.visit_i8x16_ge_u(),
1497
90
            0x2d => visitor.visit_i16x8_eq(),
1498
188
            0x2e => visitor.visit_i16x8_ne(),
1499
102
            0x2f => visitor.visit_i16x8_lt_s(),
1500
20
            0x30 => visitor.visit_i16x8_lt_u(),
1501
28
            0x31 => visitor.visit_i16x8_gt_s(),
1502
34
            0x32 => visitor.visit_i16x8_gt_u(),
1503
22
            0x33 => visitor.visit_i16x8_le_s(),
1504
227
            0x34 => visitor.visit_i16x8_le_u(),
1505
29
            0x35 => visitor.visit_i16x8_ge_s(),
1506
16
            0x36 => visitor.visit_i16x8_ge_u(),
1507
93
            0x37 => visitor.visit_i32x4_eq(),
1508
151
            0x38 => visitor.visit_i32x4_ne(),
1509
63
            0x39 => visitor.visit_i32x4_lt_s(),
1510
27
            0x3a => visitor.visit_i32x4_lt_u(),
1511
13
            0x3b => visitor.visit_i32x4_gt_s(),
1512
84
            0x3c => visitor.visit_i32x4_gt_u(),
1513
661
            0x3d => visitor.visit_i32x4_le_s(),
1514
38
            0x3e => visitor.visit_i32x4_le_u(),
1515
83
            0x3f => visitor.visit_i32x4_ge_s(),
1516
20
            0x40 => visitor.visit_i32x4_ge_u(),
1517
17.7k
            0x41 => visitor.visit_f32x4_eq(),
1518
163
            0x42 => visitor.visit_f32x4_ne(),
1519
350
            0x43 => visitor.visit_f32x4_lt(),
1520
59
            0x44 => visitor.visit_f32x4_gt(),
1521
5
            0x45 => visitor.visit_f32x4_le(),
1522
8
            0x46 => visitor.visit_f32x4_ge(),
1523
12.5k
            0x47 => visitor.visit_f64x2_eq(),
1524
37
            0x48 => visitor.visit_f64x2_ne(),
1525
2
            0x49 => visitor.visit_f64x2_lt(),
1526
54
            0x4a => visitor.visit_f64x2_gt(),
1527
104
            0x4b => visitor.visit_f64x2_le(),
1528
0
            0x4c => visitor.visit_f64x2_ge(),
1529
7.87k
            0x4d => visitor.visit_v128_not(),
1530
81
            0x4e => visitor.visit_v128_and(),
1531
65
            0x4f => visitor.visit_v128_andnot(),
1532
45
            0x50 => visitor.visit_v128_or(),
1533
225k
            0x51 => visitor.visit_v128_xor(),
1534
30.2k
            0x52 => visitor.visit_v128_bitselect(),
1535
65
            0x53 => visitor.visit_v128_any_true(),
1536
1537
            0x54 => {
1538
157
                let memarg = self.read_memarg(0)?;
1539
157
                let lane = self.read_lane_index()?;
1540
157
                visitor.visit_v128_load8_lane(memarg, lane)
1541
            }
1542
            0x55 => {
1543
251
                let memarg = self.read_memarg(1)?;
1544
251
                let lane = self.read_lane_index()?;
1545
251
                visitor.visit_v128_load16_lane(memarg, lane)
1546
            }
1547
            0x56 => {
1548
249
                let memarg = self.read_memarg(2)?;
1549
249
                let lane = self.read_lane_index()?;
1550
249
                visitor.visit_v128_load32_lane(memarg, lane)
1551
            }
1552
            0x57 => {
1553
309
                let memarg = self.read_memarg(3)?;
1554
309
                let lane = self.read_lane_index()?;
1555
309
                visitor.visit_v128_load64_lane(memarg, lane)
1556
            }
1557
            0x58 => {
1558
200
                let memarg = self.read_memarg(0)?;
1559
200
                let lane = self.read_lane_index()?;
1560
200
                visitor.visit_v128_store8_lane(memarg, lane)
1561
            }
1562
            0x59 => {
1563
117
                let memarg = self.read_memarg(1)?;
1564
117
                let lane = self.read_lane_index()?;
1565
117
                visitor.visit_v128_store16_lane(memarg, lane)
1566
            }
1567
            0x5a => {
1568
48
                let memarg = self.read_memarg(2)?;
1569
48
                let lane = self.read_lane_index()?;
1570
48
                visitor.visit_v128_store32_lane(memarg, lane)
1571
            }
1572
            0x5b => {
1573
141
                let memarg = self.read_memarg(3)?;
1574
141
                let lane = self.read_lane_index()?;
1575
141
                visitor.visit_v128_store64_lane(memarg, lane)
1576
            }
1577
1578
5.84k
            0x5c => visitor.visit_v128_load32_zero(self.read_memarg(2)?),
1579
2.20k
            0x5d => visitor.visit_v128_load64_zero(self.read_memarg(3)?),
1580
4.49k
            0x5e => visitor.visit_f32x4_demote_f64x2_zero(),
1581
2.49k
            0x5f => visitor.visit_f64x2_promote_low_f32x4(),
1582
8.75k
            0x60 => visitor.visit_i8x16_abs(),
1583
11.8k
            0x61 => visitor.visit_i8x16_neg(),
1584
9.82k
            0x62 => visitor.visit_i8x16_popcnt(),
1585
6.67k
            0x63 => visitor.visit_i8x16_all_true(),
1586
3.61k
            0x64 => visitor.visit_i8x16_bitmask(),
1587
72
            0x65 => visitor.visit_i8x16_narrow_i16x8_s(),
1588
53
            0x66 => visitor.visit_i8x16_narrow_i16x8_u(),
1589
7.94k
            0x67 => visitor.visit_f32x4_ceil(),
1590
4.80k
            0x68 => visitor.visit_f32x4_floor(),
1591
1.91k
            0x69 => visitor.visit_f32x4_trunc(),
1592
1.28k
            0x6a => visitor.visit_f32x4_nearest(),
1593
473
            0x6b => visitor.visit_i8x16_shl(),
1594
1.42k
            0x6c => visitor.visit_i8x16_shr_s(),
1595
396
            0x6d => visitor.visit_i8x16_shr_u(),
1596
82
            0x6e => visitor.visit_i8x16_add(),
1597
105
            0x6f => visitor.visit_i8x16_add_sat_s(),
1598
215
            0x70 => visitor.visit_i8x16_add_sat_u(),
1599
132
            0x71 => visitor.visit_i8x16_sub(),
1600
97
            0x72 => visitor.visit_i8x16_sub_sat_s(),
1601
35
            0x73 => visitor.visit_i8x16_sub_sat_u(),
1602
1.12k
            0x74 => visitor.visit_f64x2_ceil(),
1603
5.38k
            0x75 => visitor.visit_f64x2_floor(),
1604
112
            0x76 => visitor.visit_i8x16_min_s(),
1605
11
            0x77 => visitor.visit_i8x16_min_u(),
1606
169
            0x78 => visitor.visit_i8x16_max_s(),
1607
163
            0x79 => visitor.visit_i8x16_max_u(),
1608
1.88k
            0x7a => visitor.visit_f64x2_trunc(),
1609
116
            0x7b => visitor.visit_i8x16_avgr_u(),
1610
5.75k
            0x7c => visitor.visit_i16x8_extadd_pairwise_i8x16_s(),
1611
8.35k
            0x7d => visitor.visit_i16x8_extadd_pairwise_i8x16_u(),
1612
6.60k
            0x7e => visitor.visit_i32x4_extadd_pairwise_i16x8_s(),
1613
9.41k
            0x7f => visitor.visit_i32x4_extadd_pairwise_i16x8_u(),
1614
4.81k
            0x80 => visitor.visit_i16x8_abs(),
1615
6.26k
            0x81 => visitor.visit_i16x8_neg(),
1616
68
            0x82 => visitor.visit_i16x8_q15mulr_sat_s(),
1617
3.85k
            0x83 => visitor.visit_i16x8_all_true(),
1618
3.80k
            0x84 => visitor.visit_i16x8_bitmask(),
1619
27
            0x85 => visitor.visit_i16x8_narrow_i32x4_s(),
1620
58
            0x86 => visitor.visit_i16x8_narrow_i32x4_u(),
1621
9.40k
            0x87 => visitor.visit_i16x8_extend_low_i8x16_s(),
1622
14.5k
            0x88 => visitor.visit_i16x8_extend_high_i8x16_s(),
1623
16.9k
            0x89 => visitor.visit_i16x8_extend_low_i8x16_u(),
1624
4.66k
            0x8a => visitor.visit_i16x8_extend_high_i8x16_u(),
1625
98
            0x8b => visitor.visit_i16x8_shl(),
1626
779
            0x8c => visitor.visit_i16x8_shr_s(),
1627
300
            0x8d => visitor.visit_i16x8_shr_u(),
1628
62
            0x8e => visitor.visit_i16x8_add(),
1629
34
            0x8f => visitor.visit_i16x8_add_sat_s(),
1630
15
            0x90 => visitor.visit_i16x8_add_sat_u(),
1631
84
            0x91 => visitor.visit_i16x8_sub(),
1632
9
            0x92 => visitor.visit_i16x8_sub_sat_s(),
1633
19
            0x93 => visitor.visit_i16x8_sub_sat_u(),
1634
1.14k
            0x94 => visitor.visit_f64x2_nearest(),
1635
107
            0x95 => visitor.visit_i16x8_mul(),
1636
55
            0x96 => visitor.visit_i16x8_min_s(),
1637
58
            0x97 => visitor.visit_i16x8_min_u(),
1638
138
            0x98 => visitor.visit_i16x8_max_s(),
1639
55
            0x99 => visitor.visit_i16x8_max_u(),
1640
49
            0x9b => visitor.visit_i16x8_avgr_u(),
1641
139
            0x9c => visitor.visit_i16x8_extmul_low_i8x16_s(),
1642
53
            0x9d => visitor.visit_i16x8_extmul_high_i8x16_s(),
1643
30
            0x9e => visitor.visit_i16x8_extmul_low_i8x16_u(),
1644
35
            0x9f => visitor.visit_i16x8_extmul_high_i8x16_u(),
1645
14.2k
            0xa0 => visitor.visit_i32x4_abs(),
1646
10.0k
            0xa1 => visitor.visit_i32x4_neg(),
1647
2.45k
            0xa3 => visitor.visit_i32x4_all_true(),
1648
1.86k
            0xa4 => visitor.visit_i32x4_bitmask(),
1649
5.46k
            0xa7 => visitor.visit_i32x4_extend_low_i16x8_s(),
1650
12.8k
            0xa8 => visitor.visit_i32x4_extend_high_i16x8_s(),
1651
8.34k
            0xa9 => visitor.visit_i32x4_extend_low_i16x8_u(),
1652
15.6k
            0xaa => visitor.visit_i32x4_extend_high_i16x8_u(),
1653
203
            0xab => visitor.visit_i32x4_shl(),
1654
233
            0xac => visitor.visit_i32x4_shr_s(),
1655
168
            0xad => visitor.visit_i32x4_shr_u(),
1656
108
            0xae => visitor.visit_i32x4_add(),
1657
102
            0xb1 => visitor.visit_i32x4_sub(),
1658
30
            0xb5 => visitor.visit_i32x4_mul(),
1659
94
            0xb6 => visitor.visit_i32x4_min_s(),
1660
45
            0xb7 => visitor.visit_i32x4_min_u(),
1661
44
            0xb8 => visitor.visit_i32x4_max_s(),
1662
67
            0xb9 => visitor.visit_i32x4_max_u(),
1663
59
            0xba => visitor.visit_i32x4_dot_i16x8_s(),
1664
83
            0xbc => visitor.visit_i32x4_extmul_low_i16x8_s(),
1665
174
            0xbd => visitor.visit_i32x4_extmul_high_i16x8_s(),
1666
102
            0xbe => visitor.visit_i32x4_extmul_low_i16x8_u(),
1667
64
            0xbf => visitor.visit_i32x4_extmul_high_i16x8_u(),
1668
11.8k
            0xc0 => visitor.visit_i64x2_abs(),
1669
15.9k
            0xc1 => visitor.visit_i64x2_neg(),
1670
7.21k
            0xc3 => visitor.visit_i64x2_all_true(),
1671
5.79k
            0xc4 => visitor.visit_i64x2_bitmask(),
1672
19.0k
            0xc7 => visitor.visit_i64x2_extend_low_i32x4_s(),
1673
13.6k
            0xc8 => visitor.visit_i64x2_extend_high_i32x4_s(),
1674
54.5k
            0xc9 => visitor.visit_i64x2_extend_low_i32x4_u(),
1675
47.0k
            0xca => visitor.visit_i64x2_extend_high_i32x4_u(),
1676
160
            0xcb => visitor.visit_i64x2_shl(),
1677
154
            0xcc => visitor.visit_i64x2_shr_s(),
1678
214
            0xcd => visitor.visit_i64x2_shr_u(),
1679
147
            0xce => visitor.visit_i64x2_add(),
1680
144
            0xd1 => visitor.visit_i64x2_sub(),
1681
79
            0xd5 => visitor.visit_i64x2_mul(),
1682
266
            0xd6 => visitor.visit_i64x2_eq(),
1683
63
            0xd7 => visitor.visit_i64x2_ne(),
1684
91
            0xd8 => visitor.visit_i64x2_lt_s(),
1685
32
            0xd9 => visitor.visit_i64x2_gt_s(),
1686
118
            0xda => visitor.visit_i64x2_le_s(),
1687
227
            0xdb => visitor.visit_i64x2_ge_s(),
1688
153
            0xdc => visitor.visit_i64x2_extmul_low_i32x4_s(),
1689
87
            0xdd => visitor.visit_i64x2_extmul_high_i32x4_s(),
1690
68
            0xde => visitor.visit_i64x2_extmul_low_i32x4_u(),
1691
73
            0xdf => visitor.visit_i64x2_extmul_high_i32x4_u(),
1692
3.08k
            0xe0 => visitor.visit_f32x4_abs(),
1693
1.33k
            0xe1 => visitor.visit_f32x4_neg(),
1694
1.80k
            0xe3 => visitor.visit_f32x4_sqrt(),
1695
32
            0xe4 => visitor.visit_f32x4_add(),
1696
0
            0xe5 => visitor.visit_f32x4_sub(),
1697
1
            0xe6 => visitor.visit_f32x4_mul(),
1698
46
            0xe7 => visitor.visit_f32x4_div(),
1699
24
            0xe8 => visitor.visit_f32x4_min(),
1700
12
            0xe9 => visitor.visit_f32x4_max(),
1701
334
            0xea => visitor.visit_f32x4_pmin(),
1702
36
            0xeb => visitor.visit_f32x4_pmax(),
1703
689
            0xec => visitor.visit_f64x2_abs(),
1704
1.09k
            0xed => visitor.visit_f64x2_neg(),
1705
2.24k
            0xef => visitor.visit_f64x2_sqrt(),
1706
5
            0xf0 => visitor.visit_f64x2_add(),
1707
0
            0xf1 => visitor.visit_f64x2_sub(),
1708
392
            0xf2 => visitor.visit_f64x2_mul(),
1709
15
            0xf3 => visitor.visit_f64x2_div(),
1710
24
            0xf4 => visitor.visit_f64x2_min(),
1711
392
            0xf5 => visitor.visit_f64x2_max(),
1712
12
            0xf6 => visitor.visit_f64x2_pmin(),
1713
36
            0xf7 => visitor.visit_f64x2_pmax(),
1714
619
            0xf8 => visitor.visit_i32x4_trunc_sat_f32x4_s(),
1715
4.86k
            0xf9 => visitor.visit_i32x4_trunc_sat_f32x4_u(),
1716
5.06k
            0xfa => visitor.visit_f32x4_convert_i32x4_s(),
1717
2.63k
            0xfb => visitor.visit_f32x4_convert_i32x4_u(),
1718
703
            0xfc => visitor.visit_i32x4_trunc_sat_f64x2_s_zero(),
1719
3.59k
            0xfd => visitor.visit_i32x4_trunc_sat_f64x2_u_zero(),
1720
1.13k
            0xfe => visitor.visit_f64x2_convert_low_i32x4_s(),
1721
2.41k
            0xff => visitor.visit_f64x2_convert_low_i32x4_u(),
1722
69
            0x100 => visitor.visit_i8x16_relaxed_swizzle(),
1723
818
            0x101 => visitor.visit_i32x4_relaxed_trunc_f32x4_s(),
1724
87
            0x102 => visitor.visit_i32x4_relaxed_trunc_f32x4_u(),
1725
95
            0x103 => visitor.visit_i32x4_relaxed_trunc_f64x2_s_zero(),
1726
1.84k
            0x104 => visitor.visit_i32x4_relaxed_trunc_f64x2_u_zero(),
1727
0
            0x105 => visitor.visit_f32x4_relaxed_madd(),
1728
0
            0x106 => visitor.visit_f32x4_relaxed_nmadd(),
1729
0
            0x107 => visitor.visit_f64x2_relaxed_madd(),
1730
0
            0x108 => visitor.visit_f64x2_relaxed_nmadd(),
1731
19
            0x109 => visitor.visit_i8x16_relaxed_laneselect(),
1732
0
            0x10a => visitor.visit_i16x8_relaxed_laneselect(),
1733
0
            0x10b => visitor.visit_i32x4_relaxed_laneselect(),
1734
4
            0x10c => visitor.visit_i64x2_relaxed_laneselect(),
1735
4
            0x10d => visitor.visit_f32x4_relaxed_min(),
1736
0
            0x10e => visitor.visit_f32x4_relaxed_max(),
1737
0
            0x10f => visitor.visit_f64x2_relaxed_min(),
1738
8
            0x110 => visitor.visit_f64x2_relaxed_max(),
1739
16
            0x111 => visitor.visit_i16x8_relaxed_q15mulr_s(),
1740
36
            0x112 => visitor.visit_i16x8_relaxed_dot_i8x16_i7x16_s(),
1741
1
            0x113 => visitor.visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(),
1742
1743
1
            _ => bail!(pos, "unknown 0xfd subopcode: 0x{code:x}"),
1744
        })
1745
1.26M
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfd_operator::<&mut dyn wasmparser::readers::core::operators::VisitSimdOperator<Output = core::result::Result<(), anyhow::Error>>>
Line
Count
Source
1431
340k
    pub(super) fn visit_0xfd_operator<T>(
1432
340k
        &mut self,
1433
340k
        pos: u64,
1434
340k
        visitor: &mut T,
1435
340k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1436
340k
    where
1437
340k
        T: VisitSimdOperator<'a>,
1438
    {
1439
340k
        let code = self.read_var_u32()?;
1440
340k
        Ok(match code {
1441
1.23k
            0x00 => visitor.visit_v128_load(self.read_memarg(4)?),
1442
295
            0x01 => visitor.visit_v128_load8x8_s(self.read_memarg(3)?),
1443
354
            0x02 => visitor.visit_v128_load8x8_u(self.read_memarg(3)?),
1444
182
            0x03 => visitor.visit_v128_load16x4_s(self.read_memarg(3)?),
1445
1.08k
            0x04 => visitor.visit_v128_load16x4_u(self.read_memarg(3)?),
1446
1.40k
            0x05 => visitor.visit_v128_load32x2_s(self.read_memarg(3)?),
1447
541
            0x06 => visitor.visit_v128_load32x2_u(self.read_memarg(3)?),
1448
340
            0x07 => visitor.visit_v128_load8_splat(self.read_memarg(0)?),
1449
436
            0x08 => visitor.visit_v128_load16_splat(self.read_memarg(1)?),
1450
520
            0x09 => visitor.visit_v128_load32_splat(self.read_memarg(2)?),
1451
805
            0x0a => visitor.visit_v128_load64_splat(self.read_memarg(3)?),
1452
1453
104
            0x0b => visitor.visit_v128_store(self.read_memarg(4)?),
1454
92.8k
            0x0c => visitor.visit_v128_const(self.read_v128()?),
1455
            0x0d => {
1456
7
                let mut lanes: [u8; 16] = [0; 16];
1457
112
                for lane in &mut lanes {
1458
112
                    *lane = self.read_lane_index()?
1459
                }
1460
7
                visitor.visit_i8x16_shuffle(lanes)
1461
            }
1462
1463
10
            0x0e => visitor.visit_i8x16_swizzle(),
1464
2.31k
            0x0f => visitor.visit_i8x16_splat(),
1465
2.98k
            0x10 => visitor.visit_i16x8_splat(),
1466
2.00k
            0x11 => visitor.visit_i32x4_splat(),
1467
1.89k
            0x12 => visitor.visit_i64x2_splat(),
1468
203
            0x13 => visitor.visit_f32x4_splat(),
1469
124
            0x14 => visitor.visit_f64x2_splat(),
1470
1471
1.43k
            0x15 => visitor.visit_i8x16_extract_lane_s(self.read_lane_index()?),
1472
1.14k
            0x16 => visitor.visit_i8x16_extract_lane_u(self.read_lane_index()?),
1473
114
            0x17 => visitor.visit_i8x16_replace_lane(self.read_lane_index()?),
1474
1.00k
            0x18 => visitor.visit_i16x8_extract_lane_s(self.read_lane_index()?),
1475
655
            0x19 => visitor.visit_i16x8_extract_lane_u(self.read_lane_index()?),
1476
40
            0x1a => visitor.visit_i16x8_replace_lane(self.read_lane_index()?),
1477
717
            0x1b => visitor.visit_i32x4_extract_lane(self.read_lane_index()?),
1478
1479
54
            0x1c => visitor.visit_i32x4_replace_lane(self.read_lane_index()?),
1480
1.71k
            0x1d => visitor.visit_i64x2_extract_lane(self.read_lane_index()?),
1481
78
            0x1e => visitor.visit_i64x2_replace_lane(self.read_lane_index()?),
1482
556
            0x1f => visitor.visit_f32x4_extract_lane(self.read_lane_index()?),
1483
6
            0x20 => visitor.visit_f32x4_replace_lane(self.read_lane_index()?),
1484
126
            0x21 => visitor.visit_f64x2_extract_lane(self.read_lane_index()?),
1485
24
            0x22 => visitor.visit_f64x2_replace_lane(self.read_lane_index()?),
1486
1487
13
            0x23 => visitor.visit_i8x16_eq(),
1488
25
            0x24 => visitor.visit_i8x16_ne(),
1489
12
            0x25 => visitor.visit_i8x16_lt_s(),
1490
6
            0x26 => visitor.visit_i8x16_lt_u(),
1491
6
            0x27 => visitor.visit_i8x16_gt_s(),
1492
4
            0x28 => visitor.visit_i8x16_gt_u(),
1493
20
            0x29 => visitor.visit_i8x16_le_s(),
1494
10
            0x2a => visitor.visit_i8x16_le_u(),
1495
60
            0x2b => visitor.visit_i8x16_ge_s(),
1496
10
            0x2c => visitor.visit_i8x16_ge_u(),
1497
8
            0x2d => visitor.visit_i16x8_eq(),
1498
10
            0x2e => visitor.visit_i16x8_ne(),
1499
28
            0x2f => visitor.visit_i16x8_lt_s(),
1500
2
            0x30 => visitor.visit_i16x8_lt_u(),
1501
8
            0x31 => visitor.visit_i16x8_gt_s(),
1502
12
            0x32 => visitor.visit_i16x8_gt_u(),
1503
6
            0x33 => visitor.visit_i16x8_le_s(),
1504
24
            0x34 => visitor.visit_i16x8_le_u(),
1505
7
            0x35 => visitor.visit_i16x8_ge_s(),
1506
4
            0x36 => visitor.visit_i16x8_ge_u(),
1507
20
            0x37 => visitor.visit_i32x4_eq(),
1508
32
            0x38 => visitor.visit_i32x4_ne(),
1509
30
            0x39 => visitor.visit_i32x4_lt_s(),
1510
6
            0x3a => visitor.visit_i32x4_lt_u(),
1511
6
            0x3b => visitor.visit_i32x4_gt_s(),
1512
32
            0x3c => visitor.visit_i32x4_gt_u(),
1513
14
            0x3d => visitor.visit_i32x4_le_s(),
1514
13
            0x3e => visitor.visit_i32x4_le_u(),
1515
18
            0x3f => visitor.visit_i32x4_ge_s(),
1516
4
            0x40 => visitor.visit_i32x4_ge_u(),
1517
7.38k
            0x41 => visitor.visit_f32x4_eq(),
1518
76
            0x42 => visitor.visit_f32x4_ne(),
1519
164
            0x43 => visitor.visit_f32x4_lt(),
1520
2
            0x44 => visitor.visit_f32x4_gt(),
1521
2
            0x45 => visitor.visit_f32x4_le(),
1522
2
            0x46 => visitor.visit_f32x4_ge(),
1523
5.00k
            0x47 => visitor.visit_f64x2_eq(),
1524
2
            0x48 => visitor.visit_f64x2_ne(),
1525
0
            0x49 => visitor.visit_f64x2_lt(),
1526
26
            0x4a => visitor.visit_f64x2_gt(),
1527
52
            0x4b => visitor.visit_f64x2_le(),
1528
0
            0x4c => visitor.visit_f64x2_ge(),
1529
2.30k
            0x4d => visitor.visit_v128_not(),
1530
7
            0x4e => visitor.visit_v128_and(),
1531
2
            0x4f => visitor.visit_v128_andnot(),
1532
20
            0x50 => visitor.visit_v128_or(),
1533
60.9k
            0x51 => visitor.visit_v128_xor(),
1534
12.3k
            0x52 => visitor.visit_v128_bitselect(),
1535
20
            0x53 => visitor.visit_v128_any_true(),
1536
1537
            0x54 => {
1538
24
                let memarg = self.read_memarg(0)?;
1539
24
                let lane = self.read_lane_index()?;
1540
24
                visitor.visit_v128_load8_lane(memarg, lane)
1541
            }
1542
            0x55 => {
1543
98
                let memarg = self.read_memarg(1)?;
1544
98
                let lane = self.read_lane_index()?;
1545
98
                visitor.visit_v128_load16_lane(memarg, lane)
1546
            }
1547
            0x56 => {
1548
42
                let memarg = self.read_memarg(2)?;
1549
42
                let lane = self.read_lane_index()?;
1550
42
                visitor.visit_v128_load32_lane(memarg, lane)
1551
            }
1552
            0x57 => {
1553
124
                let memarg = self.read_memarg(3)?;
1554
124
                let lane = self.read_lane_index()?;
1555
124
                visitor.visit_v128_load64_lane(memarg, lane)
1556
            }
1557
            0x58 => {
1558
60
                let memarg = self.read_memarg(0)?;
1559
60
                let lane = self.read_lane_index()?;
1560
60
                visitor.visit_v128_store8_lane(memarg, lane)
1561
            }
1562
            0x59 => {
1563
26
                let memarg = self.read_memarg(1)?;
1564
26
                let lane = self.read_lane_index()?;
1565
26
                visitor.visit_v128_store16_lane(memarg, lane)
1566
            }
1567
            0x5a => {
1568
10
                let memarg = self.read_memarg(2)?;
1569
10
                let lane = self.read_lane_index()?;
1570
10
                visitor.visit_v128_store32_lane(memarg, lane)
1571
            }
1572
            0x5b => {
1573
35
                let memarg = self.read_memarg(3)?;
1574
35
                let lane = self.read_lane_index()?;
1575
35
                visitor.visit_v128_store64_lane(memarg, lane)
1576
            }
1577
1578
979
            0x5c => visitor.visit_v128_load32_zero(self.read_memarg(2)?),
1579
579
            0x5d => visitor.visit_v128_load64_zero(self.read_memarg(3)?),
1580
782
            0x5e => visitor.visit_f32x4_demote_f64x2_zero(),
1581
589
            0x5f => visitor.visit_f64x2_promote_low_f32x4(),
1582
808
            0x60 => visitor.visit_i8x16_abs(),
1583
1.29k
            0x61 => visitor.visit_i8x16_neg(),
1584
2.31k
            0x62 => visitor.visit_i8x16_popcnt(),
1585
737
            0x63 => visitor.visit_i8x16_all_true(),
1586
754
            0x64 => visitor.visit_i8x16_bitmask(),
1587
18
            0x65 => visitor.visit_i8x16_narrow_i16x8_s(),
1588
10
            0x66 => visitor.visit_i8x16_narrow_i16x8_u(),
1589
3.29k
            0x67 => visitor.visit_f32x4_ceil(),
1590
2.15k
            0x68 => visitor.visit_f32x4_floor(),
1591
642
            0x69 => visitor.visit_f32x4_trunc(),
1592
538
            0x6a => visitor.visit_f32x4_nearest(),
1593
180
            0x6b => visitor.visit_i8x16_shl(),
1594
608
            0x6c => visitor.visit_i8x16_shr_s(),
1595
34
            0x6d => visitor.visit_i8x16_shr_u(),
1596
28
            0x6e => visitor.visit_i8x16_add(),
1597
12
            0x6f => visitor.visit_i8x16_add_sat_s(),
1598
14
            0x70 => visitor.visit_i8x16_add_sat_u(),
1599
12
            0x71 => visitor.visit_i8x16_sub(),
1600
32
            0x72 => visitor.visit_i8x16_sub_sat_s(),
1601
4
            0x73 => visitor.visit_i8x16_sub_sat_u(),
1602
512
            0x74 => visitor.visit_f64x2_ceil(),
1603
2.42k
            0x75 => visitor.visit_f64x2_floor(),
1604
34
            0x76 => visitor.visit_i8x16_min_s(),
1605
4
            0x77 => visitor.visit_i8x16_min_u(),
1606
46
            0x78 => visitor.visit_i8x16_max_s(),
1607
8
            0x79 => visitor.visit_i8x16_max_u(),
1608
628
            0x7a => visitor.visit_f64x2_trunc(),
1609
2
            0x7b => visitor.visit_i8x16_avgr_u(),
1610
960
            0x7c => visitor.visit_i16x8_extadd_pairwise_i8x16_s(),
1611
2.88k
            0x7d => visitor.visit_i16x8_extadd_pairwise_i8x16_u(),
1612
1.61k
            0x7e => visitor.visit_i32x4_extadd_pairwise_i16x8_s(),
1613
769
            0x7f => visitor.visit_i32x4_extadd_pairwise_i16x8_u(),
1614
1.12k
            0x80 => visitor.visit_i16x8_abs(),
1615
2.38k
            0x81 => visitor.visit_i16x8_neg(),
1616
16
            0x82 => visitor.visit_i16x8_q15mulr_sat_s(),
1617
1.23k
            0x83 => visitor.visit_i16x8_all_true(),
1618
878
            0x84 => visitor.visit_i16x8_bitmask(),
1619
10
            0x85 => visitor.visit_i16x8_narrow_i32x4_s(),
1620
4
            0x86 => visitor.visit_i16x8_narrow_i32x4_u(),
1621
1.67k
            0x87 => visitor.visit_i16x8_extend_low_i8x16_s(),
1622
1.61k
            0x88 => visitor.visit_i16x8_extend_high_i8x16_s(),
1623
2.26k
            0x89 => visitor.visit_i16x8_extend_low_i8x16_u(),
1624
960
            0x8a => visitor.visit_i16x8_extend_high_i8x16_u(),
1625
14
            0x8b => visitor.visit_i16x8_shl(),
1626
210
            0x8c => visitor.visit_i16x8_shr_s(),
1627
20
            0x8d => visitor.visit_i16x8_shr_u(),
1628
10
            0x8e => visitor.visit_i16x8_add(),
1629
14
            0x8f => visitor.visit_i16x8_add_sat_s(),
1630
0
            0x90 => visitor.visit_i16x8_add_sat_u(),
1631
40
            0x91 => visitor.visit_i16x8_sub(),
1632
2
            0x92 => visitor.visit_i16x8_sub_sat_s(),
1633
0
            0x93 => visitor.visit_i16x8_sub_sat_u(),
1634
355
            0x94 => visitor.visit_f64x2_nearest(),
1635
50
            0x95 => visitor.visit_i16x8_mul(),
1636
16
            0x96 => visitor.visit_i16x8_min_s(),
1637
20
            0x97 => visitor.visit_i16x8_min_u(),
1638
12
            0x98 => visitor.visit_i16x8_max_s(),
1639
12
            0x99 => visitor.visit_i16x8_max_u(),
1640
16
            0x9b => visitor.visit_i16x8_avgr_u(),
1641
18
            0x9c => visitor.visit_i16x8_extmul_low_i8x16_s(),
1642
8
            0x9d => visitor.visit_i16x8_extmul_high_i8x16_s(),
1643
10
            0x9e => visitor.visit_i16x8_extmul_low_i8x16_u(),
1644
8
            0x9f => visitor.visit_i16x8_extmul_high_i8x16_u(),
1645
4.81k
            0xa0 => visitor.visit_i32x4_abs(),
1646
1.67k
            0xa1 => visitor.visit_i32x4_neg(),
1647
736
            0xa3 => visitor.visit_i32x4_all_true(),
1648
403
            0xa4 => visitor.visit_i32x4_bitmask(),
1649
1.10k
            0xa7 => visitor.visit_i32x4_extend_low_i16x8_s(),
1650
4.92k
            0xa8 => visitor.visit_i32x4_extend_high_i16x8_s(),
1651
1.74k
            0xa9 => visitor.visit_i32x4_extend_low_i16x8_u(),
1652
3.69k
            0xaa => visitor.visit_i32x4_extend_high_i16x8_u(),
1653
36
            0xab => visitor.visit_i32x4_shl(),
1654
39
            0xac => visitor.visit_i32x4_shr_s(),
1655
12
            0xad => visitor.visit_i32x4_shr_u(),
1656
30
            0xae => visitor.visit_i32x4_add(),
1657
48
            0xb1 => visitor.visit_i32x4_sub(),
1658
10
            0xb5 => visitor.visit_i32x4_mul(),
1659
6
            0xb6 => visitor.visit_i32x4_min_s(),
1660
18
            0xb7 => visitor.visit_i32x4_min_u(),
1661
18
            0xb8 => visitor.visit_i32x4_max_s(),
1662
16
            0xb9 => visitor.visit_i32x4_max_u(),
1663
18
            0xba => visitor.visit_i32x4_dot_i16x8_s(),
1664
36
            0xbc => visitor.visit_i32x4_extmul_low_i16x8_s(),
1665
14
            0xbd => visitor.visit_i32x4_extmul_high_i16x8_s(),
1666
23
            0xbe => visitor.visit_i32x4_extmul_low_i16x8_u(),
1667
30
            0xbf => visitor.visit_i32x4_extmul_high_i16x8_u(),
1668
2.91k
            0xc0 => visitor.visit_i64x2_abs(),
1669
5.19k
            0xc1 => visitor.visit_i64x2_neg(),
1670
2.17k
            0xc3 => visitor.visit_i64x2_all_true(),
1671
1.49k
            0xc4 => visitor.visit_i64x2_bitmask(),
1672
1.97k
            0xc7 => visitor.visit_i64x2_extend_low_i32x4_s(),
1673
4.29k
            0xc8 => visitor.visit_i64x2_extend_high_i32x4_s(),
1674
25.4k
            0xc9 => visitor.visit_i64x2_extend_low_i32x4_u(),
1675
22.2k
            0xca => visitor.visit_i64x2_extend_high_i32x4_u(),
1676
44
            0xcb => visitor.visit_i64x2_shl(),
1677
40
            0xcc => visitor.visit_i64x2_shr_s(),
1678
88
            0xcd => visitor.visit_i64x2_shr_u(),
1679
8
            0xce => visitor.visit_i64x2_add(),
1680
8
            0xd1 => visitor.visit_i64x2_sub(),
1681
30
            0xd5 => visitor.visit_i64x2_mul(),
1682
114
            0xd6 => visitor.visit_i64x2_eq(),
1683
20
            0xd7 => visitor.visit_i64x2_ne(),
1684
22
            0xd8 => visitor.visit_i64x2_lt_s(),
1685
12
            0xd9 => visitor.visit_i64x2_gt_s(),
1686
2
            0xda => visitor.visit_i64x2_le_s(),
1687
16
            0xdb => visitor.visit_i64x2_ge_s(),
1688
72
            0xdc => visitor.visit_i64x2_extmul_low_i32x4_s(),
1689
8
            0xdd => visitor.visit_i64x2_extmul_high_i32x4_s(),
1690
34
            0xde => visitor.visit_i64x2_extmul_low_i32x4_u(),
1691
32
            0xdf => visitor.visit_i64x2_extmul_high_i32x4_u(),
1692
162
            0xe0 => visitor.visit_f32x4_abs(),
1693
291
            0xe1 => visitor.visit_f32x4_neg(),
1694
744
            0xe3 => visitor.visit_f32x4_sqrt(),
1695
16
            0xe4 => visitor.visit_f32x4_add(),
1696
0
            0xe5 => visitor.visit_f32x4_sub(),
1697
0
            0xe6 => visitor.visit_f32x4_mul(),
1698
12
            0xe7 => visitor.visit_f32x4_div(),
1699
1
            0xe8 => visitor.visit_f32x4_min(),
1700
4
            0xe9 => visitor.visit_f32x4_max(),
1701
166
            0xea => visitor.visit_f32x4_pmin(),
1702
18
            0xeb => visitor.visit_f32x4_pmax(),
1703
88
            0xec => visitor.visit_f64x2_abs(),
1704
354
            0xed => visitor.visit_f64x2_neg(),
1705
727
            0xef => visitor.visit_f64x2_sqrt(),
1706
0
            0xf0 => visitor.visit_f64x2_add(),
1707
0
            0xf1 => visitor.visit_f64x2_sub(),
1708
168
            0xf2 => visitor.visit_f64x2_mul(),
1709
2
            0xf3 => visitor.visit_f64x2_div(),
1710
12
            0xf4 => visitor.visit_f64x2_min(),
1711
196
            0xf5 => visitor.visit_f64x2_max(),
1712
6
            0xf6 => visitor.visit_f64x2_pmin(),
1713
18
            0xf7 => visitor.visit_f64x2_pmax(),
1714
148
            0xf8 => visitor.visit_i32x4_trunc_sat_f32x4_s(),
1715
716
            0xf9 => visitor.visit_i32x4_trunc_sat_f32x4_u(),
1716
277
            0xfa => visitor.visit_f32x4_convert_i32x4_s(),
1717
1.04k
            0xfb => visitor.visit_f32x4_convert_i32x4_u(),
1718
170
            0xfc => visitor.visit_i32x4_trunc_sat_f64x2_s_zero(),
1719
393
            0xfd => visitor.visit_i32x4_trunc_sat_f64x2_u_zero(),
1720
386
            0xfe => visitor.visit_f64x2_convert_low_i32x4_s(),
1721
914
            0xff => visitor.visit_f64x2_convert_low_i32x4_u(),
1722
34
            0x100 => visitor.visit_i8x16_relaxed_swizzle(),
1723
326
            0x101 => visitor.visit_i32x4_relaxed_trunc_f32x4_s(),
1724
30
            0x102 => visitor.visit_i32x4_relaxed_trunc_f32x4_u(),
1725
25
            0x103 => visitor.visit_i32x4_relaxed_trunc_f64x2_s_zero(),
1726
906
            0x104 => visitor.visit_i32x4_relaxed_trunc_f64x2_u_zero(),
1727
0
            0x105 => visitor.visit_f32x4_relaxed_madd(),
1728
0
            0x106 => visitor.visit_f32x4_relaxed_nmadd(),
1729
0
            0x107 => visitor.visit_f64x2_relaxed_madd(),
1730
0
            0x108 => visitor.visit_f64x2_relaxed_nmadd(),
1731
4
            0x109 => visitor.visit_i8x16_relaxed_laneselect(),
1732
0
            0x10a => visitor.visit_i16x8_relaxed_laneselect(),
1733
0
            0x10b => visitor.visit_i32x4_relaxed_laneselect(),
1734
2
            0x10c => visitor.visit_i64x2_relaxed_laneselect(),
1735
2
            0x10d => visitor.visit_f32x4_relaxed_min(),
1736
0
            0x10e => visitor.visit_f32x4_relaxed_max(),
1737
0
            0x10f => visitor.visit_f64x2_relaxed_min(),
1738
2
            0x110 => visitor.visit_f64x2_relaxed_max(),
1739
4
            0x111 => visitor.visit_i16x8_relaxed_q15mulr_s(),
1740
12
            0x112 => visitor.visit_i16x8_relaxed_dot_i8x16_i7x16_s(),
1741
0
            0x113 => visitor.visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(),
1742
1743
1
            _ => bail!(pos, "unknown 0xfd subopcode: 0x{code:x}"),
1744
        })
1745
340k
    }
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
1431
626k
    pub(super) fn visit_0xfd_operator<T>(
1432
626k
        &mut self,
1433
626k
        pos: u64,
1434
626k
        visitor: &mut T,
1435
626k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1436
626k
    where
1437
626k
        T: VisitSimdOperator<'a>,
1438
    {
1439
626k
        let code = self.read_var_u32()?;
1440
626k
        Ok(match code {
1441
1.25k
            0x00 => visitor.visit_v128_load(self.read_memarg(4)?),
1442
824
            0x01 => visitor.visit_v128_load8x8_s(self.read_memarg(3)?),
1443
1.74k
            0x02 => visitor.visit_v128_load8x8_u(self.read_memarg(3)?),
1444
793
            0x03 => visitor.visit_v128_load16x4_s(self.read_memarg(3)?),
1445
1.39k
            0x04 => visitor.visit_v128_load16x4_u(self.read_memarg(3)?),
1446
1.42k
            0x05 => visitor.visit_v128_load32x2_s(self.read_memarg(3)?),
1447
818
            0x06 => visitor.visit_v128_load32x2_u(self.read_memarg(3)?),
1448
1.22k
            0x07 => visitor.visit_v128_load8_splat(self.read_memarg(0)?),
1449
1.20k
            0x08 => visitor.visit_v128_load16_splat(self.read_memarg(1)?),
1450
1.45k
            0x09 => visitor.visit_v128_load32_splat(self.read_memarg(2)?),
1451
1.39k
            0x0a => visitor.visit_v128_load64_splat(self.read_memarg(3)?),
1452
1453
99
            0x0b => visitor.visit_v128_store(self.read_memarg(4)?),
1454
202k
            0x0c => visitor.visit_v128_const(self.read_v128()?),
1455
            0x0d => {
1456
4
                let mut lanes: [u8; 16] = [0; 16];
1457
64
                for lane in &mut lanes {
1458
64
                    *lane = self.read_lane_index()?
1459
                }
1460
4
                visitor.visit_i8x16_shuffle(lanes)
1461
            }
1462
1463
22
            0x0e => visitor.visit_i8x16_swizzle(),
1464
4.45k
            0x0f => visitor.visit_i8x16_splat(),
1465
4.04k
            0x10 => visitor.visit_i16x8_splat(),
1466
3.71k
            0x11 => visitor.visit_i32x4_splat(),
1467
4.24k
            0x12 => visitor.visit_i64x2_splat(),
1468
944
            0x13 => visitor.visit_f32x4_splat(),
1469
308
            0x14 => visitor.visit_f64x2_splat(),
1470
1471
2.25k
            0x15 => visitor.visit_i8x16_extract_lane_s(self.read_lane_index()?),
1472
3.34k
            0x16 => visitor.visit_i8x16_extract_lane_u(self.read_lane_index()?),
1473
150
            0x17 => visitor.visit_i8x16_replace_lane(self.read_lane_index()?),
1474
4.79k
            0x18 => visitor.visit_i16x8_extract_lane_s(self.read_lane_index()?),
1475
2.33k
            0x19 => visitor.visit_i16x8_extract_lane_u(self.read_lane_index()?),
1476
75
            0x1a => visitor.visit_i16x8_replace_lane(self.read_lane_index()?),
1477
3.43k
            0x1b => visitor.visit_i32x4_extract_lane(self.read_lane_index()?),
1478
1479
90
            0x1c => visitor.visit_i32x4_replace_lane(self.read_lane_index()?),
1480
2.57k
            0x1d => visitor.visit_i64x2_extract_lane(self.read_lane_index()?),
1481
668
            0x1e => visitor.visit_i64x2_replace_lane(self.read_lane_index()?),
1482
454
            0x1f => visitor.visit_f32x4_extract_lane(self.read_lane_index()?),
1483
3
            0x20 => visitor.visit_f32x4_replace_lane(self.read_lane_index()?),
1484
953
            0x21 => visitor.visit_f64x2_extract_lane(self.read_lane_index()?),
1485
82
            0x22 => visitor.visit_f64x2_replace_lane(self.read_lane_index()?),
1486
1487
30
            0x23 => visitor.visit_i8x16_eq(),
1488
25
            0x24 => visitor.visit_i8x16_ne(),
1489
23
            0x25 => visitor.visit_i8x16_lt_s(),
1490
10
            0x26 => visitor.visit_i8x16_lt_u(),
1491
19
            0x27 => visitor.visit_i8x16_gt_s(),
1492
25
            0x28 => visitor.visit_i8x16_gt_u(),
1493
48
            0x29 => visitor.visit_i8x16_le_s(),
1494
19
            0x2a => visitor.visit_i8x16_le_u(),
1495
52
            0x2b => visitor.visit_i8x16_ge_s(),
1496
595
            0x2c => visitor.visit_i8x16_ge_u(),
1497
40
            0x2d => visitor.visit_i16x8_eq(),
1498
168
            0x2e => visitor.visit_i16x8_ne(),
1499
55
            0x2f => visitor.visit_i16x8_lt_s(),
1500
12
            0x30 => visitor.visit_i16x8_lt_u(),
1501
15
            0x31 => visitor.visit_i16x8_gt_s(),
1502
14
            0x32 => visitor.visit_i16x8_gt_u(),
1503
7
            0x33 => visitor.visit_i16x8_le_s(),
1504
184
            0x34 => visitor.visit_i16x8_le_u(),
1505
19
            0x35 => visitor.visit_i16x8_ge_s(),
1506
7
            0x36 => visitor.visit_i16x8_ge_u(),
1507
57
            0x37 => visitor.visit_i32x4_eq(),
1508
95
            0x38 => visitor.visit_i32x4_ne(),
1509
16
            0x39 => visitor.visit_i32x4_lt_s(),
1510
16
            0x3a => visitor.visit_i32x4_lt_u(),
1511
4
            0x3b => visitor.visit_i32x4_gt_s(),
1512
27
            0x3c => visitor.visit_i32x4_gt_u(),
1513
630
            0x3d => visitor.visit_i32x4_le_s(),
1514
16
            0x3e => visitor.visit_i32x4_le_u(),
1515
36
            0x3f => visitor.visit_i32x4_ge_s(),
1516
10
            0x40 => visitor.visit_i32x4_ge_u(),
1517
6.16k
            0x41 => visitor.visit_f32x4_eq(),
1518
48
            0x42 => visitor.visit_f32x4_ne(),
1519
102
            0x43 => visitor.visit_f32x4_lt(),
1520
52
            0x44 => visitor.visit_f32x4_gt(),
1521
1
            0x45 => visitor.visit_f32x4_le(),
1522
3
            0x46 => visitor.visit_f32x4_ge(),
1523
4.56k
            0x47 => visitor.visit_f64x2_eq(),
1524
31
            0x48 => visitor.visit_f64x2_ne(),
1525
0
            0x49 => visitor.visit_f64x2_lt(),
1526
14
            0x4a => visitor.visit_f64x2_gt(),
1527
26
            0x4b => visitor.visit_f64x2_le(),
1528
0
            0x4c => visitor.visit_f64x2_ge(),
1529
3.49k
            0x4d => visitor.visit_v128_not(),
1530
65
            0x4e => visitor.visit_v128_and(),
1531
51
            0x4f => visitor.visit_v128_andnot(),
1532
11
            0x50 => visitor.visit_v128_or(),
1533
116k
            0x51 => visitor.visit_v128_xor(),
1534
10.7k
            0x52 => visitor.visit_v128_bitselect(),
1535
30
            0x53 => visitor.visit_v128_any_true(),
1536
1537
            0x54 => {
1538
102
                let memarg = self.read_memarg(0)?;
1539
102
                let lane = self.read_lane_index()?;
1540
102
                visitor.visit_v128_load8_lane(memarg, lane)
1541
            }
1542
            0x55 => {
1543
90
                let memarg = self.read_memarg(1)?;
1544
90
                let lane = self.read_lane_index()?;
1545
90
                visitor.visit_v128_load16_lane(memarg, lane)
1546
            }
1547
            0x56 => {
1548
141
                let memarg = self.read_memarg(2)?;
1549
141
                let lane = self.read_lane_index()?;
1550
141
                visitor.visit_v128_load32_lane(memarg, lane)
1551
            }
1552
            0x57 => {
1553
112
                let memarg = self.read_memarg(3)?;
1554
112
                let lane = self.read_lane_index()?;
1555
112
                visitor.visit_v128_load64_lane(memarg, lane)
1556
            }
1557
            0x58 => {
1558
105
                let memarg = self.read_memarg(0)?;
1559
105
                let lane = self.read_lane_index()?;
1560
105
                visitor.visit_v128_store8_lane(memarg, lane)
1561
            }
1562
            0x59 => {
1563
68
                let memarg = self.read_memarg(1)?;
1564
68
                let lane = self.read_lane_index()?;
1565
68
                visitor.visit_v128_store16_lane(memarg, lane)
1566
            }
1567
            0x5a => {
1568
19
                let memarg = self.read_memarg(2)?;
1569
19
                let lane = self.read_lane_index()?;
1570
19
                visitor.visit_v128_store32_lane(memarg, lane)
1571
            }
1572
            0x5b => {
1573
70
                let memarg = self.read_memarg(3)?;
1574
70
                let lane = self.read_lane_index()?;
1575
70
                visitor.visit_v128_store64_lane(memarg, lane)
1576
            }
1577
1578
4.18k
            0x5c => visitor.visit_v128_load32_zero(self.read_memarg(2)?),
1579
1.04k
            0x5d => visitor.visit_v128_load64_zero(self.read_memarg(3)?),
1580
2.13k
            0x5e => visitor.visit_f32x4_demote_f64x2_zero(),
1581
1.47k
            0x5f => visitor.visit_f64x2_promote_low_f32x4(),
1582
6.01k
            0x60 => visitor.visit_i8x16_abs(),
1583
9.20k
            0x61 => visitor.visit_i8x16_neg(),
1584
5.60k
            0x62 => visitor.visit_i8x16_popcnt(),
1585
5.05k
            0x63 => visitor.visit_i8x16_all_true(),
1586
2.09k
            0x64 => visitor.visit_i8x16_bitmask(),
1587
43
            0x65 => visitor.visit_i8x16_narrow_i16x8_s(),
1588
37
            0x66 => visitor.visit_i8x16_narrow_i16x8_u(),
1589
2.85k
            0x67 => visitor.visit_f32x4_ceil(),
1590
1.51k
            0x68 => visitor.visit_f32x4_floor(),
1591
717
            0x69 => visitor.visit_f32x4_trunc(),
1592
445
            0x6a => visitor.visit_f32x4_nearest(),
1593
170
            0x6b => visitor.visit_i8x16_shl(),
1594
424
            0x6c => visitor.visit_i8x16_shr_s(),
1595
271
            0x6d => visitor.visit_i8x16_shr_u(),
1596
33
            0x6e => visitor.visit_i8x16_add(),
1597
80
            0x6f => visitor.visit_i8x16_add_sat_s(),
1598
193
            0x70 => visitor.visit_i8x16_add_sat_u(),
1599
97
            0x71 => visitor.visit_i8x16_sub(),
1600
40
            0x72 => visitor.visit_i8x16_sub_sat_s(),
1601
27
            0x73 => visitor.visit_i8x16_sub_sat_u(),
1602
340
            0x74 => visitor.visit_f64x2_ceil(),
1603
1.57k
            0x75 => visitor.visit_f64x2_floor(),
1604
44
            0x76 => visitor.visit_i8x16_min_s(),
1605
3
            0x77 => visitor.visit_i8x16_min_u(),
1606
98
            0x78 => visitor.visit_i8x16_max_s(),
1607
148
            0x79 => visitor.visit_i8x16_max_u(),
1608
897
            0x7a => visitor.visit_f64x2_trunc(),
1609
107
            0x7b => visitor.visit_i8x16_avgr_u(),
1610
3.62k
            0x7c => visitor.visit_i16x8_extadd_pairwise_i8x16_s(),
1611
3.46k
            0x7d => visitor.visit_i16x8_extadd_pairwise_i8x16_u(),
1612
3.60k
            0x7e => visitor.visit_i32x4_extadd_pairwise_i16x8_s(),
1613
6.98k
            0x7f => visitor.visit_i32x4_extadd_pairwise_i16x8_u(),
1614
2.59k
            0x80 => visitor.visit_i16x8_abs(),
1615
2.28k
            0x81 => visitor.visit_i16x8_neg(),
1616
34
            0x82 => visitor.visit_i16x8_q15mulr_sat_s(),
1617
1.77k
            0x83 => visitor.visit_i16x8_all_true(),
1618
2.12k
            0x84 => visitor.visit_i16x8_bitmask(),
1619
9
            0x85 => visitor.visit_i16x8_narrow_i32x4_s(),
1620
41
            0x86 => visitor.visit_i16x8_narrow_i32x4_u(),
1621
6.10k
            0x87 => visitor.visit_i16x8_extend_low_i8x16_s(),
1622
6.60k
            0x88 => visitor.visit_i16x8_extend_high_i8x16_s(),
1623
10.6k
            0x89 => visitor.visit_i16x8_extend_low_i8x16_u(),
1624
2.54k
            0x8a => visitor.visit_i16x8_extend_high_i8x16_u(),
1625
66
            0x8b => visitor.visit_i16x8_shl(),
1626
325
            0x8c => visitor.visit_i16x8_shr_s(),
1627
236
            0x8d => visitor.visit_i16x8_shr_u(),
1628
40
            0x8e => visitor.visit_i16x8_add(),
1629
10
            0x8f => visitor.visit_i16x8_add_sat_s(),
1630
11
            0x90 => visitor.visit_i16x8_add_sat_u(),
1631
21
            0x91 => visitor.visit_i16x8_sub(),
1632
5
            0x92 => visitor.visit_i16x8_sub_sat_s(),
1633
17
            0x93 => visitor.visit_i16x8_sub_sat_u(),
1634
533
            0x94 => visitor.visit_f64x2_nearest(),
1635
29
            0x95 => visitor.visit_i16x8_mul(),
1636
30
            0x96 => visitor.visit_i16x8_min_s(),
1637
19
            0x97 => visitor.visit_i16x8_min_u(),
1638
117
            0x98 => visitor.visit_i16x8_max_s(),
1639
32
            0x99 => visitor.visit_i16x8_max_u(),
1640
23
            0x9b => visitor.visit_i16x8_avgr_u(),
1641
103
            0x9c => visitor.visit_i16x8_extmul_low_i8x16_s(),
1642
26
            0x9d => visitor.visit_i16x8_extmul_high_i8x16_s(),
1643
8
            0x9e => visitor.visit_i16x8_extmul_low_i8x16_u(),
1644
21
            0x9f => visitor.visit_i16x8_extmul_high_i8x16_u(),
1645
5.84k
            0xa0 => visitor.visit_i32x4_abs(),
1646
6.74k
            0xa1 => visitor.visit_i32x4_neg(),
1647
1.17k
            0xa3 => visitor.visit_i32x4_all_true(),
1648
1.06k
            0xa4 => visitor.visit_i32x4_bitmask(),
1649
2.92k
            0xa7 => visitor.visit_i32x4_extend_low_i16x8_s(),
1650
5.15k
            0xa8 => visitor.visit_i32x4_extend_high_i16x8_s(),
1651
5.03k
            0xa9 => visitor.visit_i32x4_extend_low_i16x8_u(),
1652
8.79k
            0xaa => visitor.visit_i32x4_extend_high_i16x8_u(),
1653
105
            0xab => visitor.visit_i32x4_shl(),
1654
156
            0xac => visitor.visit_i32x4_shr_s(),
1655
91
            0xad => visitor.visit_i32x4_shr_u(),
1656
54
            0xae => visitor.visit_i32x4_add(),
1657
28
            0xb1 => visitor.visit_i32x4_sub(),
1658
5
            0xb5 => visitor.visit_i32x4_mul(),
1659
16
            0xb6 => visitor.visit_i32x4_min_s(),
1660
16
            0xb7 => visitor.visit_i32x4_min_u(),
1661
10
            0xb8 => visitor.visit_i32x4_max_s(),
1662
39
            0xb9 => visitor.visit_i32x4_max_u(),
1663
24
            0xba => visitor.visit_i32x4_dot_i16x8_s(),
1664
27
            0xbc => visitor.visit_i32x4_extmul_low_i16x8_s(),
1665
128
            0xbd => visitor.visit_i32x4_extmul_high_i16x8_s(),
1666
53
            0xbe => visitor.visit_i32x4_extmul_low_i16x8_u(),
1667
17
            0xbf => visitor.visit_i32x4_extmul_high_i16x8_u(),
1668
5.12k
            0xc0 => visitor.visit_i64x2_abs(),
1669
6.28k
            0xc1 => visitor.visit_i64x2_neg(),
1670
3.33k
            0xc3 => visitor.visit_i64x2_all_true(),
1671
3.01k
            0xc4 => visitor.visit_i64x2_bitmask(),
1672
14.2k
            0xc7 => visitor.visit_i64x2_extend_low_i32x4_s(),
1673
6.56k
            0xc8 => visitor.visit_i64x2_extend_high_i32x4_s(),
1674
15.6k
            0xc9 => visitor.visit_i64x2_extend_low_i32x4_u(),
1675
13.3k
            0xca => visitor.visit_i64x2_extend_high_i32x4_u(),
1676
83
            0xcb => visitor.visit_i64x2_shl(),
1677
59
            0xcc => visitor.visit_i64x2_shr_s(),
1678
71
            0xcd => visitor.visit_i64x2_shr_u(),
1679
76
            0xce => visitor.visit_i64x2_add(),
1680
130
            0xd1 => visitor.visit_i64x2_sub(),
1681
29
            0xd5 => visitor.visit_i64x2_mul(),
1682
88
            0xd6 => visitor.visit_i64x2_eq(),
1683
25
            0xd7 => visitor.visit_i64x2_ne(),
1684
49
            0xd8 => visitor.visit_i64x2_lt_s(),
1685
12
            0xd9 => visitor.visit_i64x2_gt_s(),
1686
111
            0xda => visitor.visit_i64x2_le_s(),
1687
197
            0xdb => visitor.visit_i64x2_ge_s(),
1688
39
            0xdc => visitor.visit_i64x2_extmul_low_i32x4_s(),
1689
20
            0xdd => visitor.visit_i64x2_extmul_high_i32x4_s(),
1690
17
            0xde => visitor.visit_i64x2_extmul_low_i32x4_u(),
1691
20
            0xdf => visitor.visit_i64x2_extmul_high_i32x4_u(),
1692
1.37k
            0xe0 => visitor.visit_f32x4_abs(),
1693
821
            0xe1 => visitor.visit_f32x4_neg(),
1694
628
            0xe3 => visitor.visit_f32x4_sqrt(),
1695
8
            0xe4 => visitor.visit_f32x4_add(),
1696
0
            0xe5 => visitor.visit_f32x4_sub(),
1697
1
            0xe6 => visitor.visit_f32x4_mul(),
1698
26
            0xe7 => visitor.visit_f32x4_div(),
1699
21
            0xe8 => visitor.visit_f32x4_min(),
1700
6
            0xe9 => visitor.visit_f32x4_max(),
1701
84
            0xea => visitor.visit_f32x4_pmin(),
1702
9
            0xeb => visitor.visit_f32x4_pmax(),
1703
489
            0xec => visitor.visit_f64x2_abs(),
1704
486
            0xed => visitor.visit_f64x2_neg(),
1705
1.02k
            0xef => visitor.visit_f64x2_sqrt(),
1706
2
            0xf0 => visitor.visit_f64x2_add(),
1707
0
            0xf1 => visitor.visit_f64x2_sub(),
1708
134
            0xf2 => visitor.visit_f64x2_mul(),
1709
11
            0xf3 => visitor.visit_f64x2_div(),
1710
6
            0xf4 => visitor.visit_f64x2_min(),
1711
98
            0xf5 => visitor.visit_f64x2_max(),
1712
3
            0xf6 => visitor.visit_f64x2_pmin(),
1713
9
            0xf7 => visitor.visit_f64x2_pmax(),
1714
335
            0xf8 => visitor.visit_i32x4_trunc_sat_f32x4_s(),
1715
3.22k
            0xf9 => visitor.visit_i32x4_trunc_sat_f32x4_u(),
1716
4.56k
            0xfa => visitor.visit_f32x4_convert_i32x4_s(),
1717
963
            0xfb => visitor.visit_f32x4_convert_i32x4_u(),
1718
394
            0xfc => visitor.visit_i32x4_trunc_sat_f64x2_s_zero(),
1719
2.72k
            0xfd => visitor.visit_i32x4_trunc_sat_f64x2_u_zero(),
1720
497
            0xfe => visitor.visit_f64x2_convert_low_i32x4_s(),
1721
987
            0xff => visitor.visit_f64x2_convert_low_i32x4_u(),
1722
17
            0x100 => visitor.visit_i8x16_relaxed_swizzle(),
1723
311
            0x101 => visitor.visit_i32x4_relaxed_trunc_f32x4_s(),
1724
37
            0x102 => visitor.visit_i32x4_relaxed_trunc_f32x4_u(),
1725
42
            0x103 => visitor.visit_i32x4_relaxed_trunc_f64x2_s_zero(),
1726
473
            0x104 => visitor.visit_i32x4_relaxed_trunc_f64x2_u_zero(),
1727
0
            0x105 => visitor.visit_f32x4_relaxed_madd(),
1728
0
            0x106 => visitor.visit_f32x4_relaxed_nmadd(),
1729
0
            0x107 => visitor.visit_f64x2_relaxed_madd(),
1730
0
            0x108 => visitor.visit_f64x2_relaxed_nmadd(),
1731
12
            0x109 => visitor.visit_i8x16_relaxed_laneselect(),
1732
0
            0x10a => visitor.visit_i16x8_relaxed_laneselect(),
1733
0
            0x10b => visitor.visit_i32x4_relaxed_laneselect(),
1734
1
            0x10c => visitor.visit_i64x2_relaxed_laneselect(),
1735
1
            0x10d => visitor.visit_f32x4_relaxed_min(),
1736
0
            0x10e => visitor.visit_f32x4_relaxed_max(),
1737
0
            0x10f => visitor.visit_f64x2_relaxed_min(),
1738
3
            0x110 => visitor.visit_f64x2_relaxed_max(),
1739
3
            0x111 => visitor.visit_i16x8_relaxed_q15mulr_s(),
1740
17
            0x112 => visitor.visit_i16x8_relaxed_dot_i8x16_i7x16_s(),
1741
0
            0x113 => visitor.visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(),
1742
1743
0
            _ => bail!(pos, "unknown 0xfd subopcode: 0x{code:x}"),
1744
        })
1745
626k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfd_operator::<&mut dyn wasmparser::readers::core::operators::VisitSimdOperator<Output = wasmparser::readers::core::operators::Operator>>
Line
Count
Source
1431
279k
    pub(super) fn visit_0xfd_operator<T>(
1432
279k
        &mut self,
1433
279k
        pos: u64,
1434
279k
        visitor: &mut T,
1435
279k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1436
279k
    where
1437
279k
        T: VisitSimdOperator<'a>,
1438
    {
1439
279k
        let code = self.read_var_u32()?;
1440
279k
        Ok(match code {
1441
799
            0x00 => visitor.visit_v128_load(self.read_memarg(4)?),
1442
302
            0x01 => visitor.visit_v128_load8x8_s(self.read_memarg(3)?),
1443
323
            0x02 => visitor.visit_v128_load8x8_u(self.read_memarg(3)?),
1444
250
            0x03 => visitor.visit_v128_load16x4_s(self.read_memarg(3)?),
1445
1.08k
            0x04 => visitor.visit_v128_load16x4_u(self.read_memarg(3)?),
1446
978
            0x05 => visitor.visit_v128_load32x2_s(self.read_memarg(3)?),
1447
364
            0x06 => visitor.visit_v128_load32x2_u(self.read_memarg(3)?),
1448
283
            0x07 => visitor.visit_v128_load8_splat(self.read_memarg(0)?),
1449
431
            0x08 => visitor.visit_v128_load16_splat(self.read_memarg(1)?),
1450
588
            0x09 => visitor.visit_v128_load32_splat(self.read_memarg(2)?),
1451
727
            0x0a => visitor.visit_v128_load64_splat(self.read_memarg(3)?),
1452
1453
66
            0x0b => visitor.visit_v128_store(self.read_memarg(4)?),
1454
86.7k
            0x0c => visitor.visit_v128_const(self.read_v128()?),
1455
            0x0d => {
1456
4
                let mut lanes: [u8; 16] = [0; 16];
1457
64
                for lane in &mut lanes {
1458
64
                    *lane = self.read_lane_index()?
1459
                }
1460
4
                visitor.visit_i8x16_shuffle(lanes)
1461
            }
1462
1463
12
            0x0e => visitor.visit_i8x16_swizzle(),
1464
1.96k
            0x0f => visitor.visit_i8x16_splat(),
1465
2.05k
            0x10 => visitor.visit_i16x8_splat(),
1466
1.50k
            0x11 => visitor.visit_i32x4_splat(),
1467
1.39k
            0x12 => visitor.visit_i64x2_splat(),
1468
204
            0x13 => visitor.visit_f32x4_splat(),
1469
96
            0x14 => visitor.visit_f64x2_splat(),
1470
1471
1.45k
            0x15 => visitor.visit_i8x16_extract_lane_s(self.read_lane_index()?),
1472
934
            0x16 => visitor.visit_i8x16_extract_lane_u(self.read_lane_index()?),
1473
108
            0x17 => visitor.visit_i8x16_replace_lane(self.read_lane_index()?),
1474
1.16k
            0x18 => visitor.visit_i16x8_extract_lane_s(self.read_lane_index()?),
1475
529
            0x19 => visitor.visit_i16x8_extract_lane_u(self.read_lane_index()?),
1476
27
            0x1a => visitor.visit_i16x8_replace_lane(self.read_lane_index()?),
1477
1.05k
            0x1b => visitor.visit_i32x4_extract_lane(self.read_lane_index()?),
1478
1479
40
            0x1c => visitor.visit_i32x4_replace_lane(self.read_lane_index()?),
1480
1.18k
            0x1d => visitor.visit_i64x2_extract_lane(self.read_lane_index()?),
1481
90
            0x1e => visitor.visit_i64x2_replace_lane(self.read_lane_index()?),
1482
343
            0x1f => visitor.visit_f32x4_extract_lane(self.read_lane_index()?),
1483
3
            0x20 => visitor.visit_f32x4_replace_lane(self.read_lane_index()?),
1484
164
            0x21 => visitor.visit_f64x2_extract_lane(self.read_lane_index()?),
1485
18
            0x22 => visitor.visit_f64x2_replace_lane(self.read_lane_index()?),
1486
1487
13
            0x23 => visitor.visit_i8x16_eq(),
1488
16
            0x24 => visitor.visit_i8x16_ne(),
1489
13
            0x25 => visitor.visit_i8x16_lt_s(),
1490
5
            0x26 => visitor.visit_i8x16_lt_u(),
1491
9
            0x27 => visitor.visit_i8x16_gt_s(),
1492
2
            0x28 => visitor.visit_i8x16_gt_u(),
1493
18
            0x29 => visitor.visit_i8x16_le_s(),
1494
10
            0x2a => visitor.visit_i8x16_le_u(),
1495
34
            0x2b => visitor.visit_i8x16_ge_s(),
1496
5
            0x2c => visitor.visit_i8x16_ge_u(),
1497
42
            0x2d => visitor.visit_i16x8_eq(),
1498
10
            0x2e => visitor.visit_i16x8_ne(),
1499
19
            0x2f => visitor.visit_i16x8_lt_s(),
1500
6
            0x30 => visitor.visit_i16x8_lt_u(),
1501
5
            0x31 => visitor.visit_i16x8_gt_s(),
1502
8
            0x32 => visitor.visit_i16x8_gt_u(),
1503
9
            0x33 => visitor.visit_i16x8_le_s(),
1504
19
            0x34 => visitor.visit_i16x8_le_u(),
1505
3
            0x35 => visitor.visit_i16x8_ge_s(),
1506
5
            0x36 => visitor.visit_i16x8_ge_u(),
1507
16
            0x37 => visitor.visit_i32x4_eq(),
1508
24
            0x38 => visitor.visit_i32x4_ne(),
1509
17
            0x39 => visitor.visit_i32x4_lt_s(),
1510
5
            0x3a => visitor.visit_i32x4_lt_u(),
1511
3
            0x3b => visitor.visit_i32x4_gt_s(),
1512
25
            0x3c => visitor.visit_i32x4_gt_u(),
1513
17
            0x3d => visitor.visit_i32x4_le_s(),
1514
9
            0x3e => visitor.visit_i32x4_le_u(),
1515
29
            0x3f => visitor.visit_i32x4_ge_s(),
1516
6
            0x40 => visitor.visit_i32x4_ge_u(),
1517
4.21k
            0x41 => visitor.visit_f32x4_eq(),
1518
39
            0x42 => visitor.visit_f32x4_ne(),
1519
84
            0x43 => visitor.visit_f32x4_lt(),
1520
5
            0x44 => visitor.visit_f32x4_gt(),
1521
2
            0x45 => visitor.visit_f32x4_le(),
1522
3
            0x46 => visitor.visit_f32x4_ge(),
1523
2.95k
            0x47 => visitor.visit_f64x2_eq(),
1524
4
            0x48 => visitor.visit_f64x2_ne(),
1525
2
            0x49 => visitor.visit_f64x2_lt(),
1526
14
            0x4a => visitor.visit_f64x2_gt(),
1527
26
            0x4b => visitor.visit_f64x2_le(),
1528
0
            0x4c => visitor.visit_f64x2_ge(),
1529
2.06k
            0x4d => visitor.visit_v128_not(),
1530
9
            0x4e => visitor.visit_v128_and(),
1531
12
            0x4f => visitor.visit_v128_andnot(),
1532
14
            0x50 => visitor.visit_v128_or(),
1533
48.0k
            0x51 => visitor.visit_v128_xor(),
1534
7.17k
            0x52 => visitor.visit_v128_bitselect(),
1535
15
            0x53 => visitor.visit_v128_any_true(),
1536
1537
            0x54 => {
1538
31
                let memarg = self.read_memarg(0)?;
1539
31
                let lane = self.read_lane_index()?;
1540
31
                visitor.visit_v128_load8_lane(memarg, lane)
1541
            }
1542
            0x55 => {
1543
63
                let memarg = self.read_memarg(1)?;
1544
63
                let lane = self.read_lane_index()?;
1545
63
                visitor.visit_v128_load16_lane(memarg, lane)
1546
            }
1547
            0x56 => {
1548
66
                let memarg = self.read_memarg(2)?;
1549
66
                let lane = self.read_lane_index()?;
1550
66
                visitor.visit_v128_load32_lane(memarg, lane)
1551
            }
1552
            0x57 => {
1553
73
                let memarg = self.read_memarg(3)?;
1554
73
                let lane = self.read_lane_index()?;
1555
73
                visitor.visit_v128_load64_lane(memarg, lane)
1556
            }
1557
            0x58 => {
1558
35
                let memarg = self.read_memarg(0)?;
1559
35
                let lane = self.read_lane_index()?;
1560
35
                visitor.visit_v128_store8_lane(memarg, lane)
1561
            }
1562
            0x59 => {
1563
23
                let memarg = self.read_memarg(1)?;
1564
23
                let lane = self.read_lane_index()?;
1565
23
                visitor.visit_v128_store16_lane(memarg, lane)
1566
            }
1567
            0x5a => {
1568
19
                let memarg = self.read_memarg(2)?;
1569
19
                let lane = self.read_lane_index()?;
1570
19
                visitor.visit_v128_store32_lane(memarg, lane)
1571
            }
1572
            0x5b => {
1573
36
                let memarg = self.read_memarg(3)?;
1574
36
                let lane = self.read_lane_index()?;
1575
36
                visitor.visit_v128_store64_lane(memarg, lane)
1576
            }
1577
1578
675
            0x5c => visitor.visit_v128_load32_zero(self.read_memarg(2)?),
1579
580
            0x5d => visitor.visit_v128_load64_zero(self.read_memarg(3)?),
1580
1.57k
            0x5e => visitor.visit_f32x4_demote_f64x2_zero(),
1581
427
            0x5f => visitor.visit_f64x2_promote_low_f32x4(),
1582
1.92k
            0x60 => visitor.visit_i8x16_abs(),
1583
1.32k
            0x61 => visitor.visit_i8x16_neg(),
1584
1.91k
            0x62 => visitor.visit_i8x16_popcnt(),
1585
881
            0x63 => visitor.visit_i8x16_all_true(),
1586
763
            0x64 => visitor.visit_i8x16_bitmask(),
1587
11
            0x65 => visitor.visit_i8x16_narrow_i16x8_s(),
1588
6
            0x66 => visitor.visit_i8x16_narrow_i16x8_u(),
1589
1.79k
            0x67 => visitor.visit_f32x4_ceil(),
1590
1.14k
            0x68 => visitor.visit_f32x4_floor(),
1591
556
            0x69 => visitor.visit_f32x4_trunc(),
1592
298
            0x6a => visitor.visit_f32x4_nearest(),
1593
123
            0x6b => visitor.visit_i8x16_shl(),
1594
393
            0x6c => visitor.visit_i8x16_shr_s(),
1595
91
            0x6d => visitor.visit_i8x16_shr_u(),
1596
21
            0x6e => visitor.visit_i8x16_add(),
1597
13
            0x6f => visitor.visit_i8x16_add_sat_s(),
1598
8
            0x70 => visitor.visit_i8x16_add_sat_u(),
1599
23
            0x71 => visitor.visit_i8x16_sub(),
1600
25
            0x72 => visitor.visit_i8x16_sub_sat_s(),
1601
4
            0x73 => visitor.visit_i8x16_sub_sat_u(),
1602
275
            0x74 => visitor.visit_f64x2_ceil(),
1603
1.38k
            0x75 => visitor.visit_f64x2_floor(),
1604
34
            0x76 => visitor.visit_i8x16_min_s(),
1605
4
            0x77 => visitor.visit_i8x16_min_u(),
1606
25
            0x78 => visitor.visit_i8x16_max_s(),
1607
7
            0x79 => visitor.visit_i8x16_max_u(),
1608
357
            0x7a => visitor.visit_f64x2_trunc(),
1609
7
            0x7b => visitor.visit_i8x16_avgr_u(),
1610
1.16k
            0x7c => visitor.visit_i16x8_extadd_pairwise_i8x16_s(),
1611
2.00k
            0x7d => visitor.visit_i16x8_extadd_pairwise_i8x16_u(),
1612
1.38k
            0x7e => visitor.visit_i32x4_extadd_pairwise_i16x8_s(),
1613
1.66k
            0x7f => visitor.visit_i32x4_extadd_pairwise_i16x8_u(),
1614
1.09k
            0x80 => visitor.visit_i16x8_abs(),
1615
1.59k
            0x81 => visitor.visit_i16x8_neg(),
1616
18
            0x82 => visitor.visit_i16x8_q15mulr_sat_s(),
1617
839
            0x83 => visitor.visit_i16x8_all_true(),
1618
805
            0x84 => visitor.visit_i16x8_bitmask(),
1619
8
            0x85 => visitor.visit_i16x8_narrow_i32x4_s(),
1620
13
            0x86 => visitor.visit_i16x8_narrow_i32x4_u(),
1621
1.62k
            0x87 => visitor.visit_i16x8_extend_low_i8x16_s(),
1622
6.27k
            0x88 => visitor.visit_i16x8_extend_high_i8x16_s(),
1623
4.00k
            0x89 => visitor.visit_i16x8_extend_low_i8x16_u(),
1624
1.15k
            0x8a => visitor.visit_i16x8_extend_high_i8x16_u(),
1625
18
            0x8b => visitor.visit_i16x8_shl(),
1626
244
            0x8c => visitor.visit_i16x8_shr_s(),
1627
44
            0x8d => visitor.visit_i16x8_shr_u(),
1628
12
            0x8e => visitor.visit_i16x8_add(),
1629
10
            0x8f => visitor.visit_i16x8_add_sat_s(),
1630
4
            0x90 => visitor.visit_i16x8_add_sat_u(),
1631
23
            0x91 => visitor.visit_i16x8_sub(),
1632
2
            0x92 => visitor.visit_i16x8_sub_sat_s(),
1633
2
            0x93 => visitor.visit_i16x8_sub_sat_u(),
1634
258
            0x94 => visitor.visit_f64x2_nearest(),
1635
28
            0x95 => visitor.visit_i16x8_mul(),
1636
9
            0x96 => visitor.visit_i16x8_min_s(),
1637
19
            0x97 => visitor.visit_i16x8_min_u(),
1638
9
            0x98 => visitor.visit_i16x8_max_s(),
1639
11
            0x99 => visitor.visit_i16x8_max_u(),
1640
10
            0x9b => visitor.visit_i16x8_avgr_u(),
1641
18
            0x9c => visitor.visit_i16x8_extmul_low_i8x16_s(),
1642
19
            0x9d => visitor.visit_i16x8_extmul_high_i8x16_s(),
1643
12
            0x9e => visitor.visit_i16x8_extmul_low_i8x16_u(),
1644
6
            0x9f => visitor.visit_i16x8_extmul_high_i8x16_u(),
1645
3.54k
            0xa0 => visitor.visit_i32x4_abs(),
1646
1.66k
            0xa1 => visitor.visit_i32x4_neg(),
1647
547
            0xa3 => visitor.visit_i32x4_all_true(),
1648
394
            0xa4 => visitor.visit_i32x4_bitmask(),
1649
1.43k
            0xa7 => visitor.visit_i32x4_extend_low_i16x8_s(),
1650
2.79k
            0xa8 => visitor.visit_i32x4_extend_high_i16x8_s(),
1651
1.57k
            0xa9 => visitor.visit_i32x4_extend_low_i16x8_u(),
1652
3.18k
            0xaa => visitor.visit_i32x4_extend_high_i16x8_u(),
1653
62
            0xab => visitor.visit_i32x4_shl(),
1654
38
            0xac => visitor.visit_i32x4_shr_s(),
1655
65
            0xad => visitor.visit_i32x4_shr_u(),
1656
24
            0xae => visitor.visit_i32x4_add(),
1657
26
            0xb1 => visitor.visit_i32x4_sub(),
1658
15
            0xb5 => visitor.visit_i32x4_mul(),
1659
72
            0xb6 => visitor.visit_i32x4_min_s(),
1660
11
            0xb7 => visitor.visit_i32x4_min_u(),
1661
16
            0xb8 => visitor.visit_i32x4_max_s(),
1662
12
            0xb9 => visitor.visit_i32x4_max_u(),
1663
17
            0xba => visitor.visit_i32x4_dot_i16x8_s(),
1664
20
            0xbc => visitor.visit_i32x4_extmul_low_i16x8_s(),
1665
32
            0xbd => visitor.visit_i32x4_extmul_high_i16x8_s(),
1666
26
            0xbe => visitor.visit_i32x4_extmul_low_i16x8_u(),
1667
17
            0xbf => visitor.visit_i32x4_extmul_high_i16x8_u(),
1668
3.78k
            0xc0 => visitor.visit_i64x2_abs(),
1669
4.42k
            0xc1 => visitor.visit_i64x2_neg(),
1670
1.70k
            0xc3 => visitor.visit_i64x2_all_true(),
1671
1.28k
            0xc4 => visitor.visit_i64x2_bitmask(),
1672
2.88k
            0xc7 => visitor.visit_i64x2_extend_low_i32x4_s(),
1673
2.79k
            0xc8 => visitor.visit_i64x2_extend_high_i32x4_s(),
1674
13.4k
            0xc9 => visitor.visit_i64x2_extend_low_i32x4_u(),
1675
11.4k
            0xca => visitor.visit_i64x2_extend_high_i32x4_u(),
1676
33
            0xcb => visitor.visit_i64x2_shl(),
1677
55
            0xcc => visitor.visit_i64x2_shr_s(),
1678
55
            0xcd => visitor.visit_i64x2_shr_u(),
1679
63
            0xce => visitor.visit_i64x2_add(),
1680
6
            0xd1 => visitor.visit_i64x2_sub(),
1681
20
            0xd5 => visitor.visit_i64x2_mul(),
1682
64
            0xd6 => visitor.visit_i64x2_eq(),
1683
18
            0xd7 => visitor.visit_i64x2_ne(),
1684
20
            0xd8 => visitor.visit_i64x2_lt_s(),
1685
8
            0xd9 => visitor.visit_i64x2_gt_s(),
1686
5
            0xda => visitor.visit_i64x2_le_s(),
1687
14
            0xdb => visitor.visit_i64x2_ge_s(),
1688
42
            0xdc => visitor.visit_i64x2_extmul_low_i32x4_s(),
1689
59
            0xdd => visitor.visit_i64x2_extmul_high_i32x4_s(),
1690
17
            0xde => visitor.visit_i64x2_extmul_low_i32x4_u(),
1691
21
            0xdf => visitor.visit_i64x2_extmul_high_i32x4_u(),
1692
1.55k
            0xe0 => visitor.visit_f32x4_abs(),
1693
220
            0xe1 => visitor.visit_f32x4_neg(),
1694
432
            0xe3 => visitor.visit_f32x4_sqrt(),
1695
8
            0xe4 => visitor.visit_f32x4_add(),
1696
0
            0xe5 => visitor.visit_f32x4_sub(),
1697
0
            0xe6 => visitor.visit_f32x4_mul(),
1698
8
            0xe7 => visitor.visit_f32x4_div(),
1699
2
            0xe8 => visitor.visit_f32x4_min(),
1700
2
            0xe9 => visitor.visit_f32x4_max(),
1701
84
            0xea => visitor.visit_f32x4_pmin(),
1702
9
            0xeb => visitor.visit_f32x4_pmax(),
1703
112
            0xec => visitor.visit_f64x2_abs(),
1704
252
            0xed => visitor.visit_f64x2_neg(),
1705
495
            0xef => visitor.visit_f64x2_sqrt(),
1706
3
            0xf0 => visitor.visit_f64x2_add(),
1707
0
            0xf1 => visitor.visit_f64x2_sub(),
1708
90
            0xf2 => visitor.visit_f64x2_mul(),
1709
2
            0xf3 => visitor.visit_f64x2_div(),
1710
6
            0xf4 => visitor.visit_f64x2_min(),
1711
98
            0xf5 => visitor.visit_f64x2_max(),
1712
3
            0xf6 => visitor.visit_f64x2_pmin(),
1713
9
            0xf7 => visitor.visit_f64x2_pmax(),
1714
136
            0xf8 => visitor.visit_i32x4_trunc_sat_f32x4_s(),
1715
919
            0xf9 => visitor.visit_i32x4_trunc_sat_f32x4_u(),
1716
218
            0xfa => visitor.visit_f32x4_convert_i32x4_s(),
1717
627
            0xfb => visitor.visit_f32x4_convert_i32x4_u(),
1718
139
            0xfc => visitor.visit_i32x4_trunc_sat_f64x2_s_zero(),
1719
480
            0xfd => visitor.visit_i32x4_trunc_sat_f64x2_u_zero(),
1720
251
            0xfe => visitor.visit_f64x2_convert_low_i32x4_s(),
1721
510
            0xff => visitor.visit_f64x2_convert_low_i32x4_u(),
1722
18
            0x100 => visitor.visit_i8x16_relaxed_swizzle(),
1723
181
            0x101 => visitor.visit_i32x4_relaxed_trunc_f32x4_s(),
1724
20
            0x102 => visitor.visit_i32x4_relaxed_trunc_f32x4_u(),
1725
28
            0x103 => visitor.visit_i32x4_relaxed_trunc_f64x2_s_zero(),
1726
466
            0x104 => visitor.visit_i32x4_relaxed_trunc_f64x2_u_zero(),
1727
0
            0x105 => visitor.visit_f32x4_relaxed_madd(),
1728
0
            0x106 => visitor.visit_f32x4_relaxed_nmadd(),
1729
0
            0x107 => visitor.visit_f64x2_relaxed_madd(),
1730
0
            0x108 => visitor.visit_f64x2_relaxed_nmadd(),
1731
3
            0x109 => visitor.visit_i8x16_relaxed_laneselect(),
1732
0
            0x10a => visitor.visit_i16x8_relaxed_laneselect(),
1733
0
            0x10b => visitor.visit_i32x4_relaxed_laneselect(),
1734
1
            0x10c => visitor.visit_i64x2_relaxed_laneselect(),
1735
1
            0x10d => visitor.visit_f32x4_relaxed_min(),
1736
0
            0x10e => visitor.visit_f32x4_relaxed_max(),
1737
0
            0x10f => visitor.visit_f64x2_relaxed_min(),
1738
3
            0x110 => visitor.visit_f64x2_relaxed_max(),
1739
9
            0x111 => visitor.visit_i16x8_relaxed_q15mulr_s(),
1740
7
            0x112 => visitor.visit_i16x8_relaxed_dot_i8x16_i7x16_s(),
1741
1
            0x113 => visitor.visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(),
1742
1743
0
            _ => bail!(pos, "unknown 0xfd subopcode: 0x{code:x}"),
1744
        })
1745
279k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfd_operator::<&mut dyn wasmparser::readers::core::operators::VisitSimdOperator<Output = bool>>
Line
Count
Source
1431
17.9k
    pub(super) fn visit_0xfd_operator<T>(
1432
17.9k
        &mut self,
1433
17.9k
        pos: u64,
1434
17.9k
        visitor: &mut T,
1435
17.9k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1436
17.9k
    where
1437
17.9k
        T: VisitSimdOperator<'a>,
1438
    {
1439
17.9k
        let code = self.read_var_u32()?;
1440
17.9k
        Ok(match code {
1441
0
            0x00 => visitor.visit_v128_load(self.read_memarg(4)?),
1442
0
            0x01 => visitor.visit_v128_load8x8_s(self.read_memarg(3)?),
1443
0
            0x02 => visitor.visit_v128_load8x8_u(self.read_memarg(3)?),
1444
0
            0x03 => visitor.visit_v128_load16x4_s(self.read_memarg(3)?),
1445
0
            0x04 => visitor.visit_v128_load16x4_u(self.read_memarg(3)?),
1446
0
            0x05 => visitor.visit_v128_load32x2_s(self.read_memarg(3)?),
1447
0
            0x06 => visitor.visit_v128_load32x2_u(self.read_memarg(3)?),
1448
0
            0x07 => visitor.visit_v128_load8_splat(self.read_memarg(0)?),
1449
0
            0x08 => visitor.visit_v128_load16_splat(self.read_memarg(1)?),
1450
0
            0x09 => visitor.visit_v128_load32_splat(self.read_memarg(2)?),
1451
0
            0x0a => visitor.visit_v128_load64_splat(self.read_memarg(3)?),
1452
1453
0
            0x0b => visitor.visit_v128_store(self.read_memarg(4)?),
1454
17.9k
            0x0c => visitor.visit_v128_const(self.read_v128()?),
1455
            0x0d => {
1456
0
                let mut lanes: [u8; 16] = [0; 16];
1457
0
                for lane in &mut lanes {
1458
0
                    *lane = self.read_lane_index()?
1459
                }
1460
0
                visitor.visit_i8x16_shuffle(lanes)
1461
            }
1462
1463
0
            0x0e => visitor.visit_i8x16_swizzle(),
1464
0
            0x0f => visitor.visit_i8x16_splat(),
1465
0
            0x10 => visitor.visit_i16x8_splat(),
1466
0
            0x11 => visitor.visit_i32x4_splat(),
1467
0
            0x12 => visitor.visit_i64x2_splat(),
1468
0
            0x13 => visitor.visit_f32x4_splat(),
1469
0
            0x14 => visitor.visit_f64x2_splat(),
1470
1471
0
            0x15 => visitor.visit_i8x16_extract_lane_s(self.read_lane_index()?),
1472
0
            0x16 => visitor.visit_i8x16_extract_lane_u(self.read_lane_index()?),
1473
0
            0x17 => visitor.visit_i8x16_replace_lane(self.read_lane_index()?),
1474
0
            0x18 => visitor.visit_i16x8_extract_lane_s(self.read_lane_index()?),
1475
0
            0x19 => visitor.visit_i16x8_extract_lane_u(self.read_lane_index()?),
1476
0
            0x1a => visitor.visit_i16x8_replace_lane(self.read_lane_index()?),
1477
0
            0x1b => visitor.visit_i32x4_extract_lane(self.read_lane_index()?),
1478
1479
0
            0x1c => visitor.visit_i32x4_replace_lane(self.read_lane_index()?),
1480
0
            0x1d => visitor.visit_i64x2_extract_lane(self.read_lane_index()?),
1481
0
            0x1e => visitor.visit_i64x2_replace_lane(self.read_lane_index()?),
1482
0
            0x1f => visitor.visit_f32x4_extract_lane(self.read_lane_index()?),
1483
0
            0x20 => visitor.visit_f32x4_replace_lane(self.read_lane_index()?),
1484
0
            0x21 => visitor.visit_f64x2_extract_lane(self.read_lane_index()?),
1485
0
            0x22 => visitor.visit_f64x2_replace_lane(self.read_lane_index()?),
1486
1487
0
            0x23 => visitor.visit_i8x16_eq(),
1488
0
            0x24 => visitor.visit_i8x16_ne(),
1489
0
            0x25 => visitor.visit_i8x16_lt_s(),
1490
0
            0x26 => visitor.visit_i8x16_lt_u(),
1491
0
            0x27 => visitor.visit_i8x16_gt_s(),
1492
0
            0x28 => visitor.visit_i8x16_gt_u(),
1493
0
            0x29 => visitor.visit_i8x16_le_s(),
1494
0
            0x2a => visitor.visit_i8x16_le_u(),
1495
0
            0x2b => visitor.visit_i8x16_ge_s(),
1496
0
            0x2c => visitor.visit_i8x16_ge_u(),
1497
0
            0x2d => visitor.visit_i16x8_eq(),
1498
0
            0x2e => visitor.visit_i16x8_ne(),
1499
0
            0x2f => visitor.visit_i16x8_lt_s(),
1500
0
            0x30 => visitor.visit_i16x8_lt_u(),
1501
0
            0x31 => visitor.visit_i16x8_gt_s(),
1502
0
            0x32 => visitor.visit_i16x8_gt_u(),
1503
0
            0x33 => visitor.visit_i16x8_le_s(),
1504
0
            0x34 => visitor.visit_i16x8_le_u(),
1505
0
            0x35 => visitor.visit_i16x8_ge_s(),
1506
0
            0x36 => visitor.visit_i16x8_ge_u(),
1507
0
            0x37 => visitor.visit_i32x4_eq(),
1508
0
            0x38 => visitor.visit_i32x4_ne(),
1509
0
            0x39 => visitor.visit_i32x4_lt_s(),
1510
0
            0x3a => visitor.visit_i32x4_lt_u(),
1511
0
            0x3b => visitor.visit_i32x4_gt_s(),
1512
0
            0x3c => visitor.visit_i32x4_gt_u(),
1513
0
            0x3d => visitor.visit_i32x4_le_s(),
1514
0
            0x3e => visitor.visit_i32x4_le_u(),
1515
0
            0x3f => visitor.visit_i32x4_ge_s(),
1516
0
            0x40 => visitor.visit_i32x4_ge_u(),
1517
0
            0x41 => visitor.visit_f32x4_eq(),
1518
0
            0x42 => visitor.visit_f32x4_ne(),
1519
0
            0x43 => visitor.visit_f32x4_lt(),
1520
0
            0x44 => visitor.visit_f32x4_gt(),
1521
0
            0x45 => visitor.visit_f32x4_le(),
1522
0
            0x46 => visitor.visit_f32x4_ge(),
1523
0
            0x47 => visitor.visit_f64x2_eq(),
1524
0
            0x48 => visitor.visit_f64x2_ne(),
1525
0
            0x49 => visitor.visit_f64x2_lt(),
1526
0
            0x4a => visitor.visit_f64x2_gt(),
1527
0
            0x4b => visitor.visit_f64x2_le(),
1528
0
            0x4c => visitor.visit_f64x2_ge(),
1529
0
            0x4d => visitor.visit_v128_not(),
1530
0
            0x4e => visitor.visit_v128_and(),
1531
0
            0x4f => visitor.visit_v128_andnot(),
1532
0
            0x50 => visitor.visit_v128_or(),
1533
0
            0x51 => visitor.visit_v128_xor(),
1534
0
            0x52 => visitor.visit_v128_bitselect(),
1535
0
            0x53 => visitor.visit_v128_any_true(),
1536
1537
            0x54 => {
1538
0
                let memarg = self.read_memarg(0)?;
1539
0
                let lane = self.read_lane_index()?;
1540
0
                visitor.visit_v128_load8_lane(memarg, lane)
1541
            }
1542
            0x55 => {
1543
0
                let memarg = self.read_memarg(1)?;
1544
0
                let lane = self.read_lane_index()?;
1545
0
                visitor.visit_v128_load16_lane(memarg, lane)
1546
            }
1547
            0x56 => {
1548
0
                let memarg = self.read_memarg(2)?;
1549
0
                let lane = self.read_lane_index()?;
1550
0
                visitor.visit_v128_load32_lane(memarg, lane)
1551
            }
1552
            0x57 => {
1553
0
                let memarg = self.read_memarg(3)?;
1554
0
                let lane = self.read_lane_index()?;
1555
0
                visitor.visit_v128_load64_lane(memarg, lane)
1556
            }
1557
            0x58 => {
1558
0
                let memarg = self.read_memarg(0)?;
1559
0
                let lane = self.read_lane_index()?;
1560
0
                visitor.visit_v128_store8_lane(memarg, lane)
1561
            }
1562
            0x59 => {
1563
0
                let memarg = self.read_memarg(1)?;
1564
0
                let lane = self.read_lane_index()?;
1565
0
                visitor.visit_v128_store16_lane(memarg, lane)
1566
            }
1567
            0x5a => {
1568
0
                let memarg = self.read_memarg(2)?;
1569
0
                let lane = self.read_lane_index()?;
1570
0
                visitor.visit_v128_store32_lane(memarg, lane)
1571
            }
1572
            0x5b => {
1573
0
                let memarg = self.read_memarg(3)?;
1574
0
                let lane = self.read_lane_index()?;
1575
0
                visitor.visit_v128_store64_lane(memarg, lane)
1576
            }
1577
1578
0
            0x5c => visitor.visit_v128_load32_zero(self.read_memarg(2)?),
1579
0
            0x5d => visitor.visit_v128_load64_zero(self.read_memarg(3)?),
1580
0
            0x5e => visitor.visit_f32x4_demote_f64x2_zero(),
1581
0
            0x5f => visitor.visit_f64x2_promote_low_f32x4(),
1582
0
            0x60 => visitor.visit_i8x16_abs(),
1583
0
            0x61 => visitor.visit_i8x16_neg(),
1584
0
            0x62 => visitor.visit_i8x16_popcnt(),
1585
0
            0x63 => visitor.visit_i8x16_all_true(),
1586
0
            0x64 => visitor.visit_i8x16_bitmask(),
1587
0
            0x65 => visitor.visit_i8x16_narrow_i16x8_s(),
1588
0
            0x66 => visitor.visit_i8x16_narrow_i16x8_u(),
1589
0
            0x67 => visitor.visit_f32x4_ceil(),
1590
0
            0x68 => visitor.visit_f32x4_floor(),
1591
0
            0x69 => visitor.visit_f32x4_trunc(),
1592
0
            0x6a => visitor.visit_f32x4_nearest(),
1593
0
            0x6b => visitor.visit_i8x16_shl(),
1594
0
            0x6c => visitor.visit_i8x16_shr_s(),
1595
0
            0x6d => visitor.visit_i8x16_shr_u(),
1596
0
            0x6e => visitor.visit_i8x16_add(),
1597
0
            0x6f => visitor.visit_i8x16_add_sat_s(),
1598
0
            0x70 => visitor.visit_i8x16_add_sat_u(),
1599
0
            0x71 => visitor.visit_i8x16_sub(),
1600
0
            0x72 => visitor.visit_i8x16_sub_sat_s(),
1601
0
            0x73 => visitor.visit_i8x16_sub_sat_u(),
1602
0
            0x74 => visitor.visit_f64x2_ceil(),
1603
0
            0x75 => visitor.visit_f64x2_floor(),
1604
0
            0x76 => visitor.visit_i8x16_min_s(),
1605
0
            0x77 => visitor.visit_i8x16_min_u(),
1606
0
            0x78 => visitor.visit_i8x16_max_s(),
1607
0
            0x79 => visitor.visit_i8x16_max_u(),
1608
0
            0x7a => visitor.visit_f64x2_trunc(),
1609
0
            0x7b => visitor.visit_i8x16_avgr_u(),
1610
0
            0x7c => visitor.visit_i16x8_extadd_pairwise_i8x16_s(),
1611
0
            0x7d => visitor.visit_i16x8_extadd_pairwise_i8x16_u(),
1612
0
            0x7e => visitor.visit_i32x4_extadd_pairwise_i16x8_s(),
1613
0
            0x7f => visitor.visit_i32x4_extadd_pairwise_i16x8_u(),
1614
0
            0x80 => visitor.visit_i16x8_abs(),
1615
0
            0x81 => visitor.visit_i16x8_neg(),
1616
0
            0x82 => visitor.visit_i16x8_q15mulr_sat_s(),
1617
0
            0x83 => visitor.visit_i16x8_all_true(),
1618
0
            0x84 => visitor.visit_i16x8_bitmask(),
1619
0
            0x85 => visitor.visit_i16x8_narrow_i32x4_s(),
1620
0
            0x86 => visitor.visit_i16x8_narrow_i32x4_u(),
1621
0
            0x87 => visitor.visit_i16x8_extend_low_i8x16_s(),
1622
0
            0x88 => visitor.visit_i16x8_extend_high_i8x16_s(),
1623
0
            0x89 => visitor.visit_i16x8_extend_low_i8x16_u(),
1624
0
            0x8a => visitor.visit_i16x8_extend_high_i8x16_u(),
1625
0
            0x8b => visitor.visit_i16x8_shl(),
1626
0
            0x8c => visitor.visit_i16x8_shr_s(),
1627
0
            0x8d => visitor.visit_i16x8_shr_u(),
1628
0
            0x8e => visitor.visit_i16x8_add(),
1629
0
            0x8f => visitor.visit_i16x8_add_sat_s(),
1630
0
            0x90 => visitor.visit_i16x8_add_sat_u(),
1631
0
            0x91 => visitor.visit_i16x8_sub(),
1632
0
            0x92 => visitor.visit_i16x8_sub_sat_s(),
1633
0
            0x93 => visitor.visit_i16x8_sub_sat_u(),
1634
0
            0x94 => visitor.visit_f64x2_nearest(),
1635
0
            0x95 => visitor.visit_i16x8_mul(),
1636
0
            0x96 => visitor.visit_i16x8_min_s(),
1637
0
            0x97 => visitor.visit_i16x8_min_u(),
1638
0
            0x98 => visitor.visit_i16x8_max_s(),
1639
0
            0x99 => visitor.visit_i16x8_max_u(),
1640
0
            0x9b => visitor.visit_i16x8_avgr_u(),
1641
0
            0x9c => visitor.visit_i16x8_extmul_low_i8x16_s(),
1642
0
            0x9d => visitor.visit_i16x8_extmul_high_i8x16_s(),
1643
0
            0x9e => visitor.visit_i16x8_extmul_low_i8x16_u(),
1644
0
            0x9f => visitor.visit_i16x8_extmul_high_i8x16_u(),
1645
0
            0xa0 => visitor.visit_i32x4_abs(),
1646
0
            0xa1 => visitor.visit_i32x4_neg(),
1647
0
            0xa3 => visitor.visit_i32x4_all_true(),
1648
0
            0xa4 => visitor.visit_i32x4_bitmask(),
1649
0
            0xa7 => visitor.visit_i32x4_extend_low_i16x8_s(),
1650
0
            0xa8 => visitor.visit_i32x4_extend_high_i16x8_s(),
1651
0
            0xa9 => visitor.visit_i32x4_extend_low_i16x8_u(),
1652
0
            0xaa => visitor.visit_i32x4_extend_high_i16x8_u(),
1653
0
            0xab => visitor.visit_i32x4_shl(),
1654
0
            0xac => visitor.visit_i32x4_shr_s(),
1655
0
            0xad => visitor.visit_i32x4_shr_u(),
1656
0
            0xae => visitor.visit_i32x4_add(),
1657
0
            0xb1 => visitor.visit_i32x4_sub(),
1658
0
            0xb5 => visitor.visit_i32x4_mul(),
1659
0
            0xb6 => visitor.visit_i32x4_min_s(),
1660
0
            0xb7 => visitor.visit_i32x4_min_u(),
1661
0
            0xb8 => visitor.visit_i32x4_max_s(),
1662
0
            0xb9 => visitor.visit_i32x4_max_u(),
1663
0
            0xba => visitor.visit_i32x4_dot_i16x8_s(),
1664
0
            0xbc => visitor.visit_i32x4_extmul_low_i16x8_s(),
1665
0
            0xbd => visitor.visit_i32x4_extmul_high_i16x8_s(),
1666
0
            0xbe => visitor.visit_i32x4_extmul_low_i16x8_u(),
1667
0
            0xbf => visitor.visit_i32x4_extmul_high_i16x8_u(),
1668
0
            0xc0 => visitor.visit_i64x2_abs(),
1669
0
            0xc1 => visitor.visit_i64x2_neg(),
1670
0
            0xc3 => visitor.visit_i64x2_all_true(),
1671
0
            0xc4 => visitor.visit_i64x2_bitmask(),
1672
0
            0xc7 => visitor.visit_i64x2_extend_low_i32x4_s(),
1673
0
            0xc8 => visitor.visit_i64x2_extend_high_i32x4_s(),
1674
0
            0xc9 => visitor.visit_i64x2_extend_low_i32x4_u(),
1675
0
            0xca => visitor.visit_i64x2_extend_high_i32x4_u(),
1676
0
            0xcb => visitor.visit_i64x2_shl(),
1677
0
            0xcc => visitor.visit_i64x2_shr_s(),
1678
0
            0xcd => visitor.visit_i64x2_shr_u(),
1679
0
            0xce => visitor.visit_i64x2_add(),
1680
0
            0xd1 => visitor.visit_i64x2_sub(),
1681
0
            0xd5 => visitor.visit_i64x2_mul(),
1682
0
            0xd6 => visitor.visit_i64x2_eq(),
1683
0
            0xd7 => visitor.visit_i64x2_ne(),
1684
0
            0xd8 => visitor.visit_i64x2_lt_s(),
1685
0
            0xd9 => visitor.visit_i64x2_gt_s(),
1686
0
            0xda => visitor.visit_i64x2_le_s(),
1687
0
            0xdb => visitor.visit_i64x2_ge_s(),
1688
0
            0xdc => visitor.visit_i64x2_extmul_low_i32x4_s(),
1689
0
            0xdd => visitor.visit_i64x2_extmul_high_i32x4_s(),
1690
0
            0xde => visitor.visit_i64x2_extmul_low_i32x4_u(),
1691
0
            0xdf => visitor.visit_i64x2_extmul_high_i32x4_u(),
1692
0
            0xe0 => visitor.visit_f32x4_abs(),
1693
0
            0xe1 => visitor.visit_f32x4_neg(),
1694
0
            0xe3 => visitor.visit_f32x4_sqrt(),
1695
0
            0xe4 => visitor.visit_f32x4_add(),
1696
0
            0xe5 => visitor.visit_f32x4_sub(),
1697
0
            0xe6 => visitor.visit_f32x4_mul(),
1698
0
            0xe7 => visitor.visit_f32x4_div(),
1699
0
            0xe8 => visitor.visit_f32x4_min(),
1700
0
            0xe9 => visitor.visit_f32x4_max(),
1701
0
            0xea => visitor.visit_f32x4_pmin(),
1702
0
            0xeb => visitor.visit_f32x4_pmax(),
1703
0
            0xec => visitor.visit_f64x2_abs(),
1704
0
            0xed => visitor.visit_f64x2_neg(),
1705
0
            0xef => visitor.visit_f64x2_sqrt(),
1706
0
            0xf0 => visitor.visit_f64x2_add(),
1707
0
            0xf1 => visitor.visit_f64x2_sub(),
1708
0
            0xf2 => visitor.visit_f64x2_mul(),
1709
0
            0xf3 => visitor.visit_f64x2_div(),
1710
0
            0xf4 => visitor.visit_f64x2_min(),
1711
0
            0xf5 => visitor.visit_f64x2_max(),
1712
0
            0xf6 => visitor.visit_f64x2_pmin(),
1713
0
            0xf7 => visitor.visit_f64x2_pmax(),
1714
0
            0xf8 => visitor.visit_i32x4_trunc_sat_f32x4_s(),
1715
0
            0xf9 => visitor.visit_i32x4_trunc_sat_f32x4_u(),
1716
0
            0xfa => visitor.visit_f32x4_convert_i32x4_s(),
1717
0
            0xfb => visitor.visit_f32x4_convert_i32x4_u(),
1718
0
            0xfc => visitor.visit_i32x4_trunc_sat_f64x2_s_zero(),
1719
0
            0xfd => visitor.visit_i32x4_trunc_sat_f64x2_u_zero(),
1720
0
            0xfe => visitor.visit_f64x2_convert_low_i32x4_s(),
1721
0
            0xff => visitor.visit_f64x2_convert_low_i32x4_u(),
1722
0
            0x100 => visitor.visit_i8x16_relaxed_swizzle(),
1723
0
            0x101 => visitor.visit_i32x4_relaxed_trunc_f32x4_s(),
1724
0
            0x102 => visitor.visit_i32x4_relaxed_trunc_f32x4_u(),
1725
0
            0x103 => visitor.visit_i32x4_relaxed_trunc_f64x2_s_zero(),
1726
0
            0x104 => visitor.visit_i32x4_relaxed_trunc_f64x2_u_zero(),
1727
0
            0x105 => visitor.visit_f32x4_relaxed_madd(),
1728
0
            0x106 => visitor.visit_f32x4_relaxed_nmadd(),
1729
0
            0x107 => visitor.visit_f64x2_relaxed_madd(),
1730
0
            0x108 => visitor.visit_f64x2_relaxed_nmadd(),
1731
0
            0x109 => visitor.visit_i8x16_relaxed_laneselect(),
1732
0
            0x10a => visitor.visit_i16x8_relaxed_laneselect(),
1733
0
            0x10b => visitor.visit_i32x4_relaxed_laneselect(),
1734
0
            0x10c => visitor.visit_i64x2_relaxed_laneselect(),
1735
0
            0x10d => visitor.visit_f32x4_relaxed_min(),
1736
0
            0x10e => visitor.visit_f32x4_relaxed_max(),
1737
0
            0x10f => visitor.visit_f64x2_relaxed_min(),
1738
0
            0x110 => visitor.visit_f64x2_relaxed_max(),
1739
0
            0x111 => visitor.visit_i16x8_relaxed_q15mulr_s(),
1740
0
            0x112 => visitor.visit_i16x8_relaxed_dot_i8x16_i7x16_s(),
1741
0
            0x113 => visitor.visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(),
1742
1743
0
            _ => bail!(pos, "unknown 0xfd subopcode: 0x{code:x}"),
1744
        })
1745
17.9k
    }
1746
1747
512k
    fn visit_0xfe_operator<T>(
1748
512k
        &mut self,
1749
512k
        pos: u64,
1750
512k
        visitor: &mut T,
1751
512k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1752
512k
    where
1753
512k
        T: VisitOperator<'a>,
1754
    {
1755
512k
        let code = self.read_var_u32()?;
1756
512k
        Ok(match code {
1757
434
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1758
28
            0x01 => visitor.visit_memory_atomic_wait32(self.read_memarg(2)?),
1759
40
            0x02 => visitor.visit_memory_atomic_wait64(self.read_memarg(3)?),
1760
            0x03 => {
1761
433k
                if self.read_u8()? != 0 {
1762
0
                    bail!(pos, "nonzero byte after `atomic.fence`");
1763
433k
                }
1764
433k
                visitor.visit_atomic_fence()
1765
            }
1766
10.2k
            0x10 => visitor.visit_i32_atomic_load(self.read_memarg(2)?),
1767
6.45k
            0x11 => visitor.visit_i64_atomic_load(self.read_memarg(3)?),
1768
6.24k
            0x12 => visitor.visit_i32_atomic_load8_u(self.read_memarg(0)?),
1769
4.14k
            0x13 => visitor.visit_i32_atomic_load16_u(self.read_memarg(1)?),
1770
6.42k
            0x14 => visitor.visit_i64_atomic_load8_u(self.read_memarg(0)?),
1771
6.31k
            0x15 => visitor.visit_i64_atomic_load16_u(self.read_memarg(1)?),
1772
4.82k
            0x16 => visitor.visit_i64_atomic_load32_u(self.read_memarg(2)?),
1773
392
            0x17 => visitor.visit_i32_atomic_store(self.read_memarg(2)?),
1774
499
            0x18 => visitor.visit_i64_atomic_store(self.read_memarg(3)?),
1775
464
            0x19 => visitor.visit_i32_atomic_store8(self.read_memarg(0)?),
1776
896
            0x1a => visitor.visit_i32_atomic_store16(self.read_memarg(1)?),
1777
201
            0x1b => visitor.visit_i64_atomic_store8(self.read_memarg(0)?),
1778
774
            0x1c => visitor.visit_i64_atomic_store16(self.read_memarg(1)?),
1779
570
            0x1d => visitor.visit_i64_atomic_store32(self.read_memarg(2)?),
1780
390
            0x1e => visitor.visit_i32_atomic_rmw_add(self.read_memarg(2)?),
1781
441
            0x1f => visitor.visit_i64_atomic_rmw_add(self.read_memarg(3)?),
1782
285
            0x20 => visitor.visit_i32_atomic_rmw8_add_u(self.read_memarg(0)?),
1783
297
            0x21 => visitor.visit_i32_atomic_rmw16_add_u(self.read_memarg(1)?),
1784
1.33k
            0x22 => visitor.visit_i64_atomic_rmw8_add_u(self.read_memarg(0)?),
1785
235
            0x23 => visitor.visit_i64_atomic_rmw16_add_u(self.read_memarg(1)?),
1786
727
            0x24 => visitor.visit_i64_atomic_rmw32_add_u(self.read_memarg(2)?),
1787
567
            0x25 => visitor.visit_i32_atomic_rmw_sub(self.read_memarg(2)?),
1788
585
            0x26 => visitor.visit_i64_atomic_rmw_sub(self.read_memarg(3)?),
1789
649
            0x27 => visitor.visit_i32_atomic_rmw8_sub_u(self.read_memarg(0)?),
1790
610
            0x28 => visitor.visit_i32_atomic_rmw16_sub_u(self.read_memarg(1)?),
1791
626
            0x29 => visitor.visit_i64_atomic_rmw8_sub_u(self.read_memarg(0)?),
1792
917
            0x2a => visitor.visit_i64_atomic_rmw16_sub_u(self.read_memarg(1)?),
1793
859
            0x2b => visitor.visit_i64_atomic_rmw32_sub_u(self.read_memarg(2)?),
1794
506
            0x2c => visitor.visit_i32_atomic_rmw_and(self.read_memarg(2)?),
1795
852
            0x2d => visitor.visit_i64_atomic_rmw_and(self.read_memarg(3)?),
1796
261
            0x2e => visitor.visit_i32_atomic_rmw8_and_u(self.read_memarg(0)?),
1797
585
            0x2f => visitor.visit_i32_atomic_rmw16_and_u(self.read_memarg(1)?),
1798
1.73k
            0x30 => visitor.visit_i64_atomic_rmw8_and_u(self.read_memarg(0)?),
1799
355
            0x31 => visitor.visit_i64_atomic_rmw16_and_u(self.read_memarg(1)?),
1800
558
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1801
402
            0x33 => visitor.visit_i32_atomic_rmw_or(self.read_memarg(2)?),
1802
565
            0x34 => visitor.visit_i64_atomic_rmw_or(self.read_memarg(3)?),
1803
575
            0x35 => visitor.visit_i32_atomic_rmw8_or_u(self.read_memarg(0)?),
1804
343
            0x36 => visitor.visit_i32_atomic_rmw16_or_u(self.read_memarg(1)?),
1805
901
            0x37 => visitor.visit_i64_atomic_rmw8_or_u(self.read_memarg(0)?),
1806
563
            0x38 => visitor.visit_i64_atomic_rmw16_or_u(self.read_memarg(1)?),
1807
801
            0x39 => visitor.visit_i64_atomic_rmw32_or_u(self.read_memarg(2)?),
1808
845
            0x3a => visitor.visit_i32_atomic_rmw_xor(self.read_memarg(2)?),
1809
558
            0x3b => visitor.visit_i64_atomic_rmw_xor(self.read_memarg(3)?),
1810
1.11k
            0x3c => visitor.visit_i32_atomic_rmw8_xor_u(self.read_memarg(0)?),
1811
425
            0x3d => visitor.visit_i32_atomic_rmw16_xor_u(self.read_memarg(1)?),
1812
482
            0x3e => visitor.visit_i64_atomic_rmw8_xor_u(self.read_memarg(0)?),
1813
323
            0x3f => visitor.visit_i64_atomic_rmw16_xor_u(self.read_memarg(1)?),
1814
2.79k
            0x40 => visitor.visit_i64_atomic_rmw32_xor_u(self.read_memarg(2)?),
1815
201
            0x41 => visitor.visit_i32_atomic_rmw_xchg(self.read_memarg(2)?),
1816
792
            0x42 => visitor.visit_i64_atomic_rmw_xchg(self.read_memarg(3)?),
1817
1.03k
            0x43 => visitor.visit_i32_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1818
609
            0x44 => visitor.visit_i32_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1819
757
            0x45 => visitor.visit_i64_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1820
1.17k
            0x46 => visitor.visit_i64_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1821
460
            0x47 => visitor.visit_i64_atomic_rmw32_xchg_u(self.read_memarg(2)?),
1822
22
            0x48 => visitor.visit_i32_atomic_rmw_cmpxchg(self.read_memarg(2)?),
1823
61
            0x49 => visitor.visit_i64_atomic_rmw_cmpxchg(self.read_memarg(3)?),
1824
84
            0x4a => visitor.visit_i32_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1825
54
            0x4b => visitor.visit_i32_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1826
58
            0x4c => visitor.visit_i64_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1827
35
            0x4d => visitor.visit_i64_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1828
77
            0x4e => visitor.visit_i64_atomic_rmw32_cmpxchg_u(self.read_memarg(2)?),
1829
1830
            // Decode shared-everything-threads proposal.
1831
0
            0x4f => visitor.visit_global_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1832
0
            0x50 => visitor.visit_global_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1833
            0x51 => {
1834
0
                visitor.visit_global_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?)
1835
            }
1836
            0x52 => {
1837
0
                visitor.visit_global_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?)
1838
            }
1839
            0x53 => {
1840
0
                visitor.visit_global_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?)
1841
            }
1842
0
            0x54 => visitor.visit_global_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1843
            0x55 => {
1844
0
                visitor.visit_global_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?)
1845
            }
1846
            0x56 => {
1847
0
                visitor.visit_global_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1848
            }
1849
            0x57 => {
1850
0
                visitor.visit_global_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1851
            }
1852
0
            0x58 => visitor.visit_table_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1853
0
            0x59 => visitor.visit_table_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1854
            0x5a => {
1855
0
                visitor.visit_table_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1856
            }
1857
            0x5b => {
1858
0
                visitor.visit_table_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1859
            }
1860
0
            0x5c => visitor.visit_struct_atomic_get(
1861
0
                self.read_ordering()?,
1862
0
                self.read_var_u32()?,
1863
0
                self.read_var_u32()?,
1864
            ),
1865
0
            0x5d => visitor.visit_struct_atomic_get_s(
1866
0
                self.read_ordering()?,
1867
0
                self.read_var_u32()?,
1868
0
                self.read_var_u32()?,
1869
            ),
1870
0
            0x5e => visitor.visit_struct_atomic_get_u(
1871
0
                self.read_ordering()?,
1872
0
                self.read_var_u32()?,
1873
0
                self.read_var_u32()?,
1874
            ),
1875
0
            0x5f => visitor.visit_struct_atomic_set(
1876
0
                self.read_ordering()?,
1877
0
                self.read_var_u32()?,
1878
0
                self.read_var_u32()?,
1879
            ),
1880
0
            0x60 => visitor.visit_struct_atomic_rmw_add(
1881
0
                self.read_ordering()?,
1882
0
                self.read_var_u32()?,
1883
0
                self.read_var_u32()?,
1884
            ),
1885
0
            0x61 => visitor.visit_struct_atomic_rmw_sub(
1886
0
                self.read_ordering()?,
1887
0
                self.read_var_u32()?,
1888
0
                self.read_var_u32()?,
1889
            ),
1890
0
            0x62 => visitor.visit_struct_atomic_rmw_and(
1891
0
                self.read_ordering()?,
1892
0
                self.read_var_u32()?,
1893
0
                self.read_var_u32()?,
1894
            ),
1895
0
            0x63 => visitor.visit_struct_atomic_rmw_or(
1896
0
                self.read_ordering()?,
1897
0
                self.read_var_u32()?,
1898
0
                self.read_var_u32()?,
1899
            ),
1900
0
            0x64 => visitor.visit_struct_atomic_rmw_xor(
1901
0
                self.read_ordering()?,
1902
0
                self.read_var_u32()?,
1903
0
                self.read_var_u32()?,
1904
            ),
1905
0
            0x65 => visitor.visit_struct_atomic_rmw_xchg(
1906
0
                self.read_ordering()?,
1907
0
                self.read_var_u32()?,
1908
0
                self.read_var_u32()?,
1909
            ),
1910
0
            0x66 => visitor.visit_struct_atomic_rmw_cmpxchg(
1911
0
                self.read_ordering()?,
1912
0
                self.read_var_u32()?,
1913
0
                self.read_var_u32()?,
1914
            ),
1915
0
            0x67 => visitor.visit_array_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1916
0
            0x68 => visitor.visit_array_atomic_get_s(self.read_ordering()?, self.read_var_u32()?),
1917
0
            0x69 => visitor.visit_array_atomic_get_u(self.read_ordering()?, self.read_var_u32()?),
1918
0
            0x6a => visitor.visit_array_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1919
0
            0x6b => visitor.visit_array_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?),
1920
0
            0x6c => visitor.visit_array_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?),
1921
0
            0x6d => visitor.visit_array_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?),
1922
0
            0x6e => visitor.visit_array_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1923
0
            0x6f => visitor.visit_array_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?),
1924
            0x70 => {
1925
0
                visitor.visit_array_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1926
            }
1927
            0x71 => {
1928
0
                visitor.visit_array_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1929
            }
1930
33
            0x72 => visitor.visit_ref_i31_shared(),
1931
1932
2
            _ => bail!(pos, "unknown 0xfe subopcode: 0x{code:x}"),
1933
        })
1934
512k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfe_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmprinter::operator::PrintOperator>>
Line
Count
Source
1747
207k
    fn visit_0xfe_operator<T>(
1748
207k
        &mut self,
1749
207k
        pos: u64,
1750
207k
        visitor: &mut T,
1751
207k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1752
207k
    where
1753
207k
        T: VisitOperator<'a>,
1754
    {
1755
207k
        let code = self.read_var_u32()?;
1756
207k
        Ok(match code {
1757
159
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1758
14
            0x01 => visitor.visit_memory_atomic_wait32(self.read_memarg(2)?),
1759
20
            0x02 => visitor.visit_memory_atomic_wait64(self.read_memarg(3)?),
1760
            0x03 => {
1761
181k
                if self.read_u8()? != 0 {
1762
0
                    bail!(pos, "nonzero byte after `atomic.fence`");
1763
181k
                }
1764
181k
                visitor.visit_atomic_fence()
1765
            }
1766
3.55k
            0x10 => visitor.visit_i32_atomic_load(self.read_memarg(2)?),
1767
1.91k
            0x11 => visitor.visit_i64_atomic_load(self.read_memarg(3)?),
1768
1.71k
            0x12 => visitor.visit_i32_atomic_load8_u(self.read_memarg(0)?),
1769
1.29k
            0x13 => visitor.visit_i32_atomic_load16_u(self.read_memarg(1)?),
1770
1.52k
            0x14 => visitor.visit_i64_atomic_load8_u(self.read_memarg(0)?),
1771
2.68k
            0x15 => visitor.visit_i64_atomic_load16_u(self.read_memarg(1)?),
1772
1.82k
            0x16 => visitor.visit_i64_atomic_load32_u(self.read_memarg(2)?),
1773
134
            0x17 => visitor.visit_i32_atomic_store(self.read_memarg(2)?),
1774
119
            0x18 => visitor.visit_i64_atomic_store(self.read_memarg(3)?),
1775
156
            0x19 => visitor.visit_i32_atomic_store8(self.read_memarg(0)?),
1776
190
            0x1a => visitor.visit_i32_atomic_store16(self.read_memarg(1)?),
1777
70
            0x1b => visitor.visit_i64_atomic_store8(self.read_memarg(0)?),
1778
194
            0x1c => visitor.visit_i64_atomic_store16(self.read_memarg(1)?),
1779
126
            0x1d => visitor.visit_i64_atomic_store32(self.read_memarg(2)?),
1780
86
            0x1e => visitor.visit_i32_atomic_rmw_add(self.read_memarg(2)?),
1781
188
            0x1f => visitor.visit_i64_atomic_rmw_add(self.read_memarg(3)?),
1782
102
            0x20 => visitor.visit_i32_atomic_rmw8_add_u(self.read_memarg(0)?),
1783
102
            0x21 => visitor.visit_i32_atomic_rmw16_add_u(self.read_memarg(1)?),
1784
615
            0x22 => visitor.visit_i64_atomic_rmw8_add_u(self.read_memarg(0)?),
1785
72
            0x23 => visitor.visit_i64_atomic_rmw16_add_u(self.read_memarg(1)?),
1786
262
            0x24 => visitor.visit_i64_atomic_rmw32_add_u(self.read_memarg(2)?),
1787
240
            0x25 => visitor.visit_i32_atomic_rmw_sub(self.read_memarg(2)?),
1788
194
            0x26 => visitor.visit_i64_atomic_rmw_sub(self.read_memarg(3)?),
1789
264
            0x27 => visitor.visit_i32_atomic_rmw8_sub_u(self.read_memarg(0)?),
1790
280
            0x28 => visitor.visit_i32_atomic_rmw16_sub_u(self.read_memarg(1)?),
1791
254
            0x29 => visitor.visit_i64_atomic_rmw8_sub_u(self.read_memarg(0)?),
1792
296
            0x2a => visitor.visit_i64_atomic_rmw16_sub_u(self.read_memarg(1)?),
1793
254
            0x2b => visitor.visit_i64_atomic_rmw32_sub_u(self.read_memarg(2)?),
1794
131
            0x2c => visitor.visit_i32_atomic_rmw_and(self.read_memarg(2)?),
1795
248
            0x2d => visitor.visit_i64_atomic_rmw_and(self.read_memarg(3)?),
1796
102
            0x2e => visitor.visit_i32_atomic_rmw8_and_u(self.read_memarg(0)?),
1797
270
            0x2f => visitor.visit_i32_atomic_rmw16_and_u(self.read_memarg(1)?),
1798
126
            0x30 => visitor.visit_i64_atomic_rmw8_and_u(self.read_memarg(0)?),
1799
86
            0x31 => visitor.visit_i64_atomic_rmw16_and_u(self.read_memarg(1)?),
1800
226
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1801
176
            0x33 => visitor.visit_i32_atomic_rmw_or(self.read_memarg(2)?),
1802
228
            0x34 => visitor.visit_i64_atomic_rmw_or(self.read_memarg(3)?),
1803
192
            0x35 => visitor.visit_i32_atomic_rmw8_or_u(self.read_memarg(0)?),
1804
99
            0x36 => visitor.visit_i32_atomic_rmw16_or_u(self.read_memarg(1)?),
1805
418
            0x37 => visitor.visit_i64_atomic_rmw8_or_u(self.read_memarg(0)?),
1806
212
            0x38 => visitor.visit_i64_atomic_rmw16_or_u(self.read_memarg(1)?),
1807
356
            0x39 => visitor.visit_i64_atomic_rmw32_or_u(self.read_memarg(2)?),
1808
350
            0x3a => visitor.visit_i32_atomic_rmw_xor(self.read_memarg(2)?),
1809
181
            0x3b => visitor.visit_i64_atomic_rmw_xor(self.read_memarg(3)?),
1810
528
            0x3c => visitor.visit_i32_atomic_rmw8_xor_u(self.read_memarg(0)?),
1811
204
            0x3d => visitor.visit_i32_atomic_rmw16_xor_u(self.read_memarg(1)?),
1812
192
            0x3e => visitor.visit_i64_atomic_rmw8_xor_u(self.read_memarg(0)?),
1813
88
            0x3f => visitor.visit_i64_atomic_rmw16_xor_u(self.read_memarg(1)?),
1814
100
            0x40 => visitor.visit_i64_atomic_rmw32_xor_u(self.read_memarg(2)?),
1815
82
            0x41 => visitor.visit_i32_atomic_rmw_xchg(self.read_memarg(2)?),
1816
342
            0x42 => visitor.visit_i64_atomic_rmw_xchg(self.read_memarg(3)?),
1817
314
            0x43 => visitor.visit_i32_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1818
182
            0x44 => visitor.visit_i32_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1819
286
            0x45 => visitor.visit_i64_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1820
84
            0x46 => visitor.visit_i64_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1821
160
            0x47 => visitor.visit_i64_atomic_rmw32_xchg_u(self.read_memarg(2)?),
1822
6
            0x48 => visitor.visit_i32_atomic_rmw_cmpxchg(self.read_memarg(2)?),
1823
26
            0x49 => visitor.visit_i64_atomic_rmw_cmpxchg(self.read_memarg(3)?),
1824
36
            0x4a => visitor.visit_i32_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1825
27
            0x4b => visitor.visit_i32_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1826
16
            0x4c => visitor.visit_i64_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1827
2
            0x4d => visitor.visit_i64_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1828
38
            0x4e => visitor.visit_i64_atomic_rmw32_cmpxchg_u(self.read_memarg(2)?),
1829
1830
            // Decode shared-everything-threads proposal.
1831
0
            0x4f => visitor.visit_global_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1832
0
            0x50 => visitor.visit_global_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1833
            0x51 => {
1834
0
                visitor.visit_global_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?)
1835
            }
1836
            0x52 => {
1837
0
                visitor.visit_global_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?)
1838
            }
1839
            0x53 => {
1840
0
                visitor.visit_global_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?)
1841
            }
1842
0
            0x54 => visitor.visit_global_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1843
            0x55 => {
1844
0
                visitor.visit_global_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?)
1845
            }
1846
            0x56 => {
1847
0
                visitor.visit_global_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1848
            }
1849
            0x57 => {
1850
0
                visitor.visit_global_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1851
            }
1852
0
            0x58 => visitor.visit_table_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1853
0
            0x59 => visitor.visit_table_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1854
            0x5a => {
1855
0
                visitor.visit_table_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1856
            }
1857
            0x5b => {
1858
0
                visitor.visit_table_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1859
            }
1860
0
            0x5c => visitor.visit_struct_atomic_get(
1861
0
                self.read_ordering()?,
1862
0
                self.read_var_u32()?,
1863
0
                self.read_var_u32()?,
1864
            ),
1865
0
            0x5d => visitor.visit_struct_atomic_get_s(
1866
0
                self.read_ordering()?,
1867
0
                self.read_var_u32()?,
1868
0
                self.read_var_u32()?,
1869
            ),
1870
0
            0x5e => visitor.visit_struct_atomic_get_u(
1871
0
                self.read_ordering()?,
1872
0
                self.read_var_u32()?,
1873
0
                self.read_var_u32()?,
1874
            ),
1875
0
            0x5f => visitor.visit_struct_atomic_set(
1876
0
                self.read_ordering()?,
1877
0
                self.read_var_u32()?,
1878
0
                self.read_var_u32()?,
1879
            ),
1880
0
            0x60 => visitor.visit_struct_atomic_rmw_add(
1881
0
                self.read_ordering()?,
1882
0
                self.read_var_u32()?,
1883
0
                self.read_var_u32()?,
1884
            ),
1885
0
            0x61 => visitor.visit_struct_atomic_rmw_sub(
1886
0
                self.read_ordering()?,
1887
0
                self.read_var_u32()?,
1888
0
                self.read_var_u32()?,
1889
            ),
1890
0
            0x62 => visitor.visit_struct_atomic_rmw_and(
1891
0
                self.read_ordering()?,
1892
0
                self.read_var_u32()?,
1893
0
                self.read_var_u32()?,
1894
            ),
1895
0
            0x63 => visitor.visit_struct_atomic_rmw_or(
1896
0
                self.read_ordering()?,
1897
0
                self.read_var_u32()?,
1898
0
                self.read_var_u32()?,
1899
            ),
1900
0
            0x64 => visitor.visit_struct_atomic_rmw_xor(
1901
0
                self.read_ordering()?,
1902
0
                self.read_var_u32()?,
1903
0
                self.read_var_u32()?,
1904
            ),
1905
0
            0x65 => visitor.visit_struct_atomic_rmw_xchg(
1906
0
                self.read_ordering()?,
1907
0
                self.read_var_u32()?,
1908
0
                self.read_var_u32()?,
1909
            ),
1910
0
            0x66 => visitor.visit_struct_atomic_rmw_cmpxchg(
1911
0
                self.read_ordering()?,
1912
0
                self.read_var_u32()?,
1913
0
                self.read_var_u32()?,
1914
            ),
1915
0
            0x67 => visitor.visit_array_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1916
0
            0x68 => visitor.visit_array_atomic_get_s(self.read_ordering()?, self.read_var_u32()?),
1917
0
            0x69 => visitor.visit_array_atomic_get_u(self.read_ordering()?, self.read_var_u32()?),
1918
0
            0x6a => visitor.visit_array_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1919
0
            0x6b => visitor.visit_array_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?),
1920
0
            0x6c => visitor.visit_array_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?),
1921
0
            0x6d => visitor.visit_array_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?),
1922
0
            0x6e => visitor.visit_array_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1923
0
            0x6f => visitor.visit_array_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?),
1924
            0x70 => {
1925
0
                visitor.visit_array_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1926
            }
1927
            0x71 => {
1928
0
                visitor.visit_array_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1929
            }
1930
9
            0x72 => visitor.visit_ref_i31_shared(),
1931
1932
1
            _ => bail!(pos, "unknown 0xfe subopcode: 0x{code:x}"),
1933
        })
1934
207k
    }
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
1747
169k
    fn visit_0xfe_operator<T>(
1748
169k
        &mut self,
1749
169k
        pos: u64,
1750
169k
        visitor: &mut T,
1751
169k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1752
169k
    where
1753
169k
        T: VisitOperator<'a>,
1754
    {
1755
169k
        let code = self.read_var_u32()?;
1756
169k
        Ok(match code {
1757
152
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1758
7
            0x01 => visitor.visit_memory_atomic_wait32(self.read_memarg(2)?),
1759
10
            0x02 => visitor.visit_memory_atomic_wait64(self.read_memarg(3)?),
1760
            0x03 => {
1761
136k
                if self.read_u8()? != 0 {
1762
0
                    bail!(pos, "nonzero byte after `atomic.fence`");
1763
136k
                }
1764
136k
                visitor.visit_atomic_fence()
1765
            }
1766
4.10k
            0x10 => visitor.visit_i32_atomic_load(self.read_memarg(2)?),
1767
3.04k
            0x11 => visitor.visit_i64_atomic_load(self.read_memarg(3)?),
1768
2.92k
            0x12 => visitor.visit_i32_atomic_load8_u(self.read_memarg(0)?),
1769
1.80k
            0x13 => visitor.visit_i32_atomic_load16_u(self.read_memarg(1)?),
1770
2.93k
            0x14 => visitor.visit_i64_atomic_load8_u(self.read_memarg(0)?),
1771
2.05k
            0x15 => visitor.visit_i64_atomic_load16_u(self.read_memarg(1)?),
1772
1.72k
            0x16 => visitor.visit_i64_atomic_load32_u(self.read_memarg(2)?),
1773
152
            0x17 => visitor.visit_i32_atomic_store(self.read_memarg(2)?),
1774
162
            0x18 => visitor.visit_i64_atomic_store(self.read_memarg(3)?),
1775
150
            0x19 => visitor.visit_i32_atomic_store8(self.read_memarg(0)?),
1776
548
            0x1a => visitor.visit_i32_atomic_store16(self.read_memarg(1)?),
1777
75
            0x1b => visitor.visit_i64_atomic_store8(self.read_memarg(0)?),
1778
424
            0x1c => visitor.visit_i64_atomic_store16(self.read_memarg(1)?),
1779
305
            0x1d => visitor.visit_i64_atomic_store32(self.read_memarg(2)?),
1780
106
            0x1e => visitor.visit_i32_atomic_rmw_add(self.read_memarg(2)?),
1781
131
            0x1f => visitor.visit_i64_atomic_rmw_add(self.read_memarg(3)?),
1782
115
            0x20 => visitor.visit_i32_atomic_rmw8_add_u(self.read_memarg(0)?),
1783
126
            0x21 => visitor.visit_i32_atomic_rmw16_add_u(self.read_memarg(1)?),
1784
381
            0x22 => visitor.visit_i64_atomic_rmw8_add_u(self.read_memarg(0)?),
1785
91
            0x23 => visitor.visit_i64_atomic_rmw16_add_u(self.read_memarg(1)?),
1786
310
            0x24 => visitor.visit_i64_atomic_rmw32_add_u(self.read_memarg(2)?),
1787
191
            0x25 => visitor.visit_i32_atomic_rmw_sub(self.read_memarg(2)?),
1788
159
            0x26 => visitor.visit_i64_atomic_rmw_sub(self.read_memarg(3)?),
1789
204
            0x27 => visitor.visit_i32_atomic_rmw8_sub_u(self.read_memarg(0)?),
1790
163
            0x28 => visitor.visit_i32_atomic_rmw16_sub_u(self.read_memarg(1)?),
1791
220
            0x29 => visitor.visit_i64_atomic_rmw8_sub_u(self.read_memarg(0)?),
1792
318
            0x2a => visitor.visit_i64_atomic_rmw16_sub_u(self.read_memarg(1)?),
1793
307
            0x2b => visitor.visit_i64_atomic_rmw32_sub_u(self.read_memarg(2)?),
1794
249
            0x2c => visitor.visit_i32_atomic_rmw_and(self.read_memarg(2)?),
1795
443
            0x2d => visitor.visit_i64_atomic_rmw_and(self.read_memarg(3)?),
1796
64
            0x2e => visitor.visit_i32_atomic_rmw8_and_u(self.read_memarg(0)?),
1797
152
            0x2f => visitor.visit_i32_atomic_rmw16_and_u(self.read_memarg(1)?),
1798
642
            0x30 => visitor.visit_i64_atomic_rmw8_and_u(self.read_memarg(0)?),
1799
176
            0x31 => visitor.visit_i64_atomic_rmw16_and_u(self.read_memarg(1)?),
1800
205
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1801
125
            0x33 => visitor.visit_i32_atomic_rmw_or(self.read_memarg(2)?),
1802
204
            0x34 => visitor.visit_i64_atomic_rmw_or(self.read_memarg(3)?),
1803
253
            0x35 => visitor.visit_i32_atomic_rmw8_or_u(self.read_memarg(0)?),
1804
147
            0x36 => visitor.visit_i32_atomic_rmw16_or_u(self.read_memarg(1)?),
1805
245
            0x37 => visitor.visit_i64_atomic_rmw8_or_u(self.read_memarg(0)?),
1806
196
            0x38 => visitor.visit_i64_atomic_rmw16_or_u(self.read_memarg(1)?),
1807
251
            0x39 => visitor.visit_i64_atomic_rmw32_or_u(self.read_memarg(2)?),
1808
289
            0x3a => visitor.visit_i32_atomic_rmw_xor(self.read_memarg(2)?),
1809
218
            0x3b => visitor.visit_i64_atomic_rmw_xor(self.read_memarg(3)?),
1810
315
            0x3c => visitor.visit_i32_atomic_rmw8_xor_u(self.read_memarg(0)?),
1811
108
            0x3d => visitor.visit_i32_atomic_rmw16_xor_u(self.read_memarg(1)?),
1812
149
            0x3e => visitor.visit_i64_atomic_rmw8_xor_u(self.read_memarg(0)?),
1813
147
            0x3f => visitor.visit_i64_atomic_rmw16_xor_u(self.read_memarg(1)?),
1814
2.59k
            0x40 => visitor.visit_i64_atomic_rmw32_xor_u(self.read_memarg(2)?),
1815
70
            0x41 => visitor.visit_i32_atomic_rmw_xchg(self.read_memarg(2)?),
1816
233
            0x42 => visitor.visit_i64_atomic_rmw_xchg(self.read_memarg(3)?),
1817
368
            0x43 => visitor.visit_i32_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1818
185
            0x44 => visitor.visit_i32_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1819
277
            0x45 => visitor.visit_i64_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1820
973
            0x46 => visitor.visit_i64_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1821
167
            0x47 => visitor.visit_i64_atomic_rmw32_xchg_u(self.read_memarg(2)?),
1822
13
            0x48 => visitor.visit_i32_atomic_rmw_cmpxchg(self.read_memarg(2)?),
1823
14
            0x49 => visitor.visit_i64_atomic_rmw_cmpxchg(self.read_memarg(3)?),
1824
22
            0x4a => visitor.visit_i32_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1825
13
            0x4b => visitor.visit_i32_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1826
17
            0x4c => visitor.visit_i64_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1827
31
            0x4d => visitor.visit_i64_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1828
19
            0x4e => visitor.visit_i64_atomic_rmw32_cmpxchg_u(self.read_memarg(2)?),
1829
1830
            // Decode shared-everything-threads proposal.
1831
0
            0x4f => visitor.visit_global_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1832
0
            0x50 => visitor.visit_global_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1833
            0x51 => {
1834
0
                visitor.visit_global_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?)
1835
            }
1836
            0x52 => {
1837
0
                visitor.visit_global_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?)
1838
            }
1839
            0x53 => {
1840
0
                visitor.visit_global_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?)
1841
            }
1842
0
            0x54 => visitor.visit_global_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1843
            0x55 => {
1844
0
                visitor.visit_global_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?)
1845
            }
1846
            0x56 => {
1847
0
                visitor.visit_global_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1848
            }
1849
            0x57 => {
1850
0
                visitor.visit_global_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1851
            }
1852
0
            0x58 => visitor.visit_table_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1853
0
            0x59 => visitor.visit_table_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1854
            0x5a => {
1855
0
                visitor.visit_table_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1856
            }
1857
            0x5b => {
1858
0
                visitor.visit_table_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1859
            }
1860
0
            0x5c => visitor.visit_struct_atomic_get(
1861
0
                self.read_ordering()?,
1862
0
                self.read_var_u32()?,
1863
0
                self.read_var_u32()?,
1864
            ),
1865
0
            0x5d => visitor.visit_struct_atomic_get_s(
1866
0
                self.read_ordering()?,
1867
0
                self.read_var_u32()?,
1868
0
                self.read_var_u32()?,
1869
            ),
1870
0
            0x5e => visitor.visit_struct_atomic_get_u(
1871
0
                self.read_ordering()?,
1872
0
                self.read_var_u32()?,
1873
0
                self.read_var_u32()?,
1874
            ),
1875
0
            0x5f => visitor.visit_struct_atomic_set(
1876
0
                self.read_ordering()?,
1877
0
                self.read_var_u32()?,
1878
0
                self.read_var_u32()?,
1879
            ),
1880
0
            0x60 => visitor.visit_struct_atomic_rmw_add(
1881
0
                self.read_ordering()?,
1882
0
                self.read_var_u32()?,
1883
0
                self.read_var_u32()?,
1884
            ),
1885
0
            0x61 => visitor.visit_struct_atomic_rmw_sub(
1886
0
                self.read_ordering()?,
1887
0
                self.read_var_u32()?,
1888
0
                self.read_var_u32()?,
1889
            ),
1890
0
            0x62 => visitor.visit_struct_atomic_rmw_and(
1891
0
                self.read_ordering()?,
1892
0
                self.read_var_u32()?,
1893
0
                self.read_var_u32()?,
1894
            ),
1895
0
            0x63 => visitor.visit_struct_atomic_rmw_or(
1896
0
                self.read_ordering()?,
1897
0
                self.read_var_u32()?,
1898
0
                self.read_var_u32()?,
1899
            ),
1900
0
            0x64 => visitor.visit_struct_atomic_rmw_xor(
1901
0
                self.read_ordering()?,
1902
0
                self.read_var_u32()?,
1903
0
                self.read_var_u32()?,
1904
            ),
1905
0
            0x65 => visitor.visit_struct_atomic_rmw_xchg(
1906
0
                self.read_ordering()?,
1907
0
                self.read_var_u32()?,
1908
0
                self.read_var_u32()?,
1909
            ),
1910
0
            0x66 => visitor.visit_struct_atomic_rmw_cmpxchg(
1911
0
                self.read_ordering()?,
1912
0
                self.read_var_u32()?,
1913
0
                self.read_var_u32()?,
1914
            ),
1915
0
            0x67 => visitor.visit_array_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1916
0
            0x68 => visitor.visit_array_atomic_get_s(self.read_ordering()?, self.read_var_u32()?),
1917
0
            0x69 => visitor.visit_array_atomic_get_u(self.read_ordering()?, self.read_var_u32()?),
1918
0
            0x6a => visitor.visit_array_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1919
0
            0x6b => visitor.visit_array_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?),
1920
0
            0x6c => visitor.visit_array_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?),
1921
0
            0x6d => visitor.visit_array_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?),
1922
0
            0x6e => visitor.visit_array_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1923
0
            0x6f => visitor.visit_array_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?),
1924
            0x70 => {
1925
0
                visitor.visit_array_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1926
            }
1927
            0x71 => {
1928
0
                visitor.visit_array_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1929
            }
1930
0
            0x72 => visitor.visit_ref_i31_shared(),
1931
1932
0
            _ => bail!(pos, "unknown 0xfe subopcode: 0x{code:x}"),
1933
        })
1934
169k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfe_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
1747
136k
    fn visit_0xfe_operator<T>(
1748
136k
        &mut self,
1749
136k
        pos: u64,
1750
136k
        visitor: &mut T,
1751
136k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1752
136k
    where
1753
136k
        T: VisitOperator<'a>,
1754
    {
1755
136k
        let code = self.read_var_u32()?;
1756
136k
        Ok(match code {
1757
123
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1758
7
            0x01 => visitor.visit_memory_atomic_wait32(self.read_memarg(2)?),
1759
10
            0x02 => visitor.visit_memory_atomic_wait64(self.read_memarg(3)?),
1760
            0x03 => {
1761
115k
                if self.read_u8()? != 0 {
1762
0
                    bail!(pos, "nonzero byte after `atomic.fence`");
1763
115k
                }
1764
115k
                visitor.visit_atomic_fence()
1765
            }
1766
2.54k
            0x10 => visitor.visit_i32_atomic_load(self.read_memarg(2)?),
1767
1.50k
            0x11 => visitor.visit_i64_atomic_load(self.read_memarg(3)?),
1768
1.60k
            0x12 => visitor.visit_i32_atomic_load8_u(self.read_memarg(0)?),
1769
1.04k
            0x13 => visitor.visit_i32_atomic_load16_u(self.read_memarg(1)?),
1770
1.96k
            0x14 => visitor.visit_i64_atomic_load8_u(self.read_memarg(0)?),
1771
1.58k
            0x15 => visitor.visit_i64_atomic_load16_u(self.read_memarg(1)?),
1772
1.28k
            0x16 => visitor.visit_i64_atomic_load32_u(self.read_memarg(2)?),
1773
106
            0x17 => visitor.visit_i32_atomic_store(self.read_memarg(2)?),
1774
218
            0x18 => visitor.visit_i64_atomic_store(self.read_memarg(3)?),
1775
158
            0x19 => visitor.visit_i32_atomic_store8(self.read_memarg(0)?),
1776
158
            0x1a => visitor.visit_i32_atomic_store16(self.read_memarg(1)?),
1777
56
            0x1b => visitor.visit_i64_atomic_store8(self.read_memarg(0)?),
1778
156
            0x1c => visitor.visit_i64_atomic_store16(self.read_memarg(1)?),
1779
139
            0x1d => visitor.visit_i64_atomic_store32(self.read_memarg(2)?),
1780
198
            0x1e => visitor.visit_i32_atomic_rmw_add(self.read_memarg(2)?),
1781
122
            0x1f => visitor.visit_i64_atomic_rmw_add(self.read_memarg(3)?),
1782
68
            0x20 => visitor.visit_i32_atomic_rmw8_add_u(self.read_memarg(0)?),
1783
69
            0x21 => visitor.visit_i32_atomic_rmw16_add_u(self.read_memarg(1)?),
1784
342
            0x22 => visitor.visit_i64_atomic_rmw8_add_u(self.read_memarg(0)?),
1785
72
            0x23 => visitor.visit_i64_atomic_rmw16_add_u(self.read_memarg(1)?),
1786
155
            0x24 => visitor.visit_i64_atomic_rmw32_add_u(self.read_memarg(2)?),
1787
136
            0x25 => visitor.visit_i32_atomic_rmw_sub(self.read_memarg(2)?),
1788
232
            0x26 => visitor.visit_i64_atomic_rmw_sub(self.read_memarg(3)?),
1789
181
            0x27 => visitor.visit_i32_atomic_rmw8_sub_u(self.read_memarg(0)?),
1790
167
            0x28 => visitor.visit_i32_atomic_rmw16_sub_u(self.read_memarg(1)?),
1791
152
            0x29 => visitor.visit_i64_atomic_rmw8_sub_u(self.read_memarg(0)?),
1792
303
            0x2a => visitor.visit_i64_atomic_rmw16_sub_u(self.read_memarg(1)?),
1793
298
            0x2b => visitor.visit_i64_atomic_rmw32_sub_u(self.read_memarg(2)?),
1794
126
            0x2c => visitor.visit_i32_atomic_rmw_and(self.read_memarg(2)?),
1795
161
            0x2d => visitor.visit_i64_atomic_rmw_and(self.read_memarg(3)?),
1796
95
            0x2e => visitor.visit_i32_atomic_rmw8_and_u(self.read_memarg(0)?),
1797
163
            0x2f => visitor.visit_i32_atomic_rmw16_and_u(self.read_memarg(1)?),
1798
964
            0x30 => visitor.visit_i64_atomic_rmw8_and_u(self.read_memarg(0)?),
1799
93
            0x31 => visitor.visit_i64_atomic_rmw16_and_u(self.read_memarg(1)?),
1800
127
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1801
101
            0x33 => visitor.visit_i32_atomic_rmw_or(self.read_memarg(2)?),
1802
133
            0x34 => visitor.visit_i64_atomic_rmw_or(self.read_memarg(3)?),
1803
130
            0x35 => visitor.visit_i32_atomic_rmw8_or_u(self.read_memarg(0)?),
1804
97
            0x36 => visitor.visit_i32_atomic_rmw16_or_u(self.read_memarg(1)?),
1805
238
            0x37 => visitor.visit_i64_atomic_rmw8_or_u(self.read_memarg(0)?),
1806
155
            0x38 => visitor.visit_i64_atomic_rmw16_or_u(self.read_memarg(1)?),
1807
194
            0x39 => visitor.visit_i64_atomic_rmw32_or_u(self.read_memarg(2)?),
1808
206
            0x3a => visitor.visit_i32_atomic_rmw_xor(self.read_memarg(2)?),
1809
159
            0x3b => visitor.visit_i64_atomic_rmw_xor(self.read_memarg(3)?),
1810
276
            0x3c => visitor.visit_i32_atomic_rmw8_xor_u(self.read_memarg(0)?),
1811
113
            0x3d => visitor.visit_i32_atomic_rmw16_xor_u(self.read_memarg(1)?),
1812
141
            0x3e => visitor.visit_i64_atomic_rmw8_xor_u(self.read_memarg(0)?),
1813
88
            0x3f => visitor.visit_i64_atomic_rmw16_xor_u(self.read_memarg(1)?),
1814
103
            0x40 => visitor.visit_i64_atomic_rmw32_xor_u(self.read_memarg(2)?),
1815
49
            0x41 => visitor.visit_i32_atomic_rmw_xchg(self.read_memarg(2)?),
1816
217
            0x42 => visitor.visit_i64_atomic_rmw_xchg(self.read_memarg(3)?),
1817
353
            0x43 => visitor.visit_i32_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1818
242
            0x44 => visitor.visit_i32_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1819
194
            0x45 => visitor.visit_i64_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1820
115
            0x46 => visitor.visit_i64_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1821
133
            0x47 => visitor.visit_i64_atomic_rmw32_xchg_u(self.read_memarg(2)?),
1822
3
            0x48 => visitor.visit_i32_atomic_rmw_cmpxchg(self.read_memarg(2)?),
1823
21
            0x49 => visitor.visit_i64_atomic_rmw_cmpxchg(self.read_memarg(3)?),
1824
26
            0x4a => visitor.visit_i32_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1825
14
            0x4b => visitor.visit_i32_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1826
25
            0x4c => visitor.visit_i64_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1827
2
            0x4d => visitor.visit_i64_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1828
20
            0x4e => visitor.visit_i64_atomic_rmw32_cmpxchg_u(self.read_memarg(2)?),
1829
1830
            // Decode shared-everything-threads proposal.
1831
0
            0x4f => visitor.visit_global_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1832
0
            0x50 => visitor.visit_global_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1833
            0x51 => {
1834
0
                visitor.visit_global_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?)
1835
            }
1836
            0x52 => {
1837
0
                visitor.visit_global_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?)
1838
            }
1839
            0x53 => {
1840
0
                visitor.visit_global_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?)
1841
            }
1842
0
            0x54 => visitor.visit_global_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1843
            0x55 => {
1844
0
                visitor.visit_global_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?)
1845
            }
1846
            0x56 => {
1847
0
                visitor.visit_global_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1848
            }
1849
            0x57 => {
1850
0
                visitor.visit_global_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1851
            }
1852
0
            0x58 => visitor.visit_table_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1853
0
            0x59 => visitor.visit_table_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1854
            0x5a => {
1855
0
                visitor.visit_table_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1856
            }
1857
            0x5b => {
1858
0
                visitor.visit_table_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1859
            }
1860
0
            0x5c => visitor.visit_struct_atomic_get(
1861
0
                self.read_ordering()?,
1862
0
                self.read_var_u32()?,
1863
0
                self.read_var_u32()?,
1864
            ),
1865
0
            0x5d => visitor.visit_struct_atomic_get_s(
1866
0
                self.read_ordering()?,
1867
0
                self.read_var_u32()?,
1868
0
                self.read_var_u32()?,
1869
            ),
1870
0
            0x5e => visitor.visit_struct_atomic_get_u(
1871
0
                self.read_ordering()?,
1872
0
                self.read_var_u32()?,
1873
0
                self.read_var_u32()?,
1874
            ),
1875
0
            0x5f => visitor.visit_struct_atomic_set(
1876
0
                self.read_ordering()?,
1877
0
                self.read_var_u32()?,
1878
0
                self.read_var_u32()?,
1879
            ),
1880
0
            0x60 => visitor.visit_struct_atomic_rmw_add(
1881
0
                self.read_ordering()?,
1882
0
                self.read_var_u32()?,
1883
0
                self.read_var_u32()?,
1884
            ),
1885
0
            0x61 => visitor.visit_struct_atomic_rmw_sub(
1886
0
                self.read_ordering()?,
1887
0
                self.read_var_u32()?,
1888
0
                self.read_var_u32()?,
1889
            ),
1890
0
            0x62 => visitor.visit_struct_atomic_rmw_and(
1891
0
                self.read_ordering()?,
1892
0
                self.read_var_u32()?,
1893
0
                self.read_var_u32()?,
1894
            ),
1895
0
            0x63 => visitor.visit_struct_atomic_rmw_or(
1896
0
                self.read_ordering()?,
1897
0
                self.read_var_u32()?,
1898
0
                self.read_var_u32()?,
1899
            ),
1900
0
            0x64 => visitor.visit_struct_atomic_rmw_xor(
1901
0
                self.read_ordering()?,
1902
0
                self.read_var_u32()?,
1903
0
                self.read_var_u32()?,
1904
            ),
1905
0
            0x65 => visitor.visit_struct_atomic_rmw_xchg(
1906
0
                self.read_ordering()?,
1907
0
                self.read_var_u32()?,
1908
0
                self.read_var_u32()?,
1909
            ),
1910
0
            0x66 => visitor.visit_struct_atomic_rmw_cmpxchg(
1911
0
                self.read_ordering()?,
1912
0
                self.read_var_u32()?,
1913
0
                self.read_var_u32()?,
1914
            ),
1915
0
            0x67 => visitor.visit_array_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1916
0
            0x68 => visitor.visit_array_atomic_get_s(self.read_ordering()?, self.read_var_u32()?),
1917
0
            0x69 => visitor.visit_array_atomic_get_u(self.read_ordering()?, self.read_var_u32()?),
1918
0
            0x6a => visitor.visit_array_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1919
0
            0x6b => visitor.visit_array_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?),
1920
0
            0x6c => visitor.visit_array_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?),
1921
0
            0x6d => visitor.visit_array_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?),
1922
0
            0x6e => visitor.visit_array_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1923
0
            0x6f => visitor.visit_array_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?),
1924
            0x70 => {
1925
0
                visitor.visit_array_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1926
            }
1927
            0x71 => {
1928
0
                visitor.visit_array_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1929
            }
1930
5
            0x72 => visitor.visit_ref_i31_shared(),
1931
1932
1
            _ => bail!(pos, "unknown 0xfe subopcode: 0x{code:x}"),
1933
        })
1934
136k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfe_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>
Line
Count
Source
1747
14
    fn visit_0xfe_operator<T>(
1748
14
        &mut self,
1749
14
        pos: u64,
1750
14
        visitor: &mut T,
1751
14
    ) -> Result<<T as VisitOperator<'a>>::Output>
1752
14
    where
1753
14
        T: VisitOperator<'a>,
1754
    {
1755
14
        let code = self.read_var_u32()?;
1756
14
        Ok(match code {
1757
0
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1758
0
            0x01 => visitor.visit_memory_atomic_wait32(self.read_memarg(2)?),
1759
0
            0x02 => visitor.visit_memory_atomic_wait64(self.read_memarg(3)?),
1760
            0x03 => {
1761
0
                if self.read_u8()? != 0 {
1762
0
                    bail!(pos, "nonzero byte after `atomic.fence`");
1763
0
                }
1764
0
                visitor.visit_atomic_fence()
1765
            }
1766
0
            0x10 => visitor.visit_i32_atomic_load(self.read_memarg(2)?),
1767
0
            0x11 => visitor.visit_i64_atomic_load(self.read_memarg(3)?),
1768
0
            0x12 => visitor.visit_i32_atomic_load8_u(self.read_memarg(0)?),
1769
0
            0x13 => visitor.visit_i32_atomic_load16_u(self.read_memarg(1)?),
1770
0
            0x14 => visitor.visit_i64_atomic_load8_u(self.read_memarg(0)?),
1771
0
            0x15 => visitor.visit_i64_atomic_load16_u(self.read_memarg(1)?),
1772
0
            0x16 => visitor.visit_i64_atomic_load32_u(self.read_memarg(2)?),
1773
0
            0x17 => visitor.visit_i32_atomic_store(self.read_memarg(2)?),
1774
0
            0x18 => visitor.visit_i64_atomic_store(self.read_memarg(3)?),
1775
0
            0x19 => visitor.visit_i32_atomic_store8(self.read_memarg(0)?),
1776
0
            0x1a => visitor.visit_i32_atomic_store16(self.read_memarg(1)?),
1777
0
            0x1b => visitor.visit_i64_atomic_store8(self.read_memarg(0)?),
1778
0
            0x1c => visitor.visit_i64_atomic_store16(self.read_memarg(1)?),
1779
0
            0x1d => visitor.visit_i64_atomic_store32(self.read_memarg(2)?),
1780
0
            0x1e => visitor.visit_i32_atomic_rmw_add(self.read_memarg(2)?),
1781
0
            0x1f => visitor.visit_i64_atomic_rmw_add(self.read_memarg(3)?),
1782
0
            0x20 => visitor.visit_i32_atomic_rmw8_add_u(self.read_memarg(0)?),
1783
0
            0x21 => visitor.visit_i32_atomic_rmw16_add_u(self.read_memarg(1)?),
1784
0
            0x22 => visitor.visit_i64_atomic_rmw8_add_u(self.read_memarg(0)?),
1785
0
            0x23 => visitor.visit_i64_atomic_rmw16_add_u(self.read_memarg(1)?),
1786
0
            0x24 => visitor.visit_i64_atomic_rmw32_add_u(self.read_memarg(2)?),
1787
0
            0x25 => visitor.visit_i32_atomic_rmw_sub(self.read_memarg(2)?),
1788
0
            0x26 => visitor.visit_i64_atomic_rmw_sub(self.read_memarg(3)?),
1789
0
            0x27 => visitor.visit_i32_atomic_rmw8_sub_u(self.read_memarg(0)?),
1790
0
            0x28 => visitor.visit_i32_atomic_rmw16_sub_u(self.read_memarg(1)?),
1791
0
            0x29 => visitor.visit_i64_atomic_rmw8_sub_u(self.read_memarg(0)?),
1792
0
            0x2a => visitor.visit_i64_atomic_rmw16_sub_u(self.read_memarg(1)?),
1793
0
            0x2b => visitor.visit_i64_atomic_rmw32_sub_u(self.read_memarg(2)?),
1794
0
            0x2c => visitor.visit_i32_atomic_rmw_and(self.read_memarg(2)?),
1795
0
            0x2d => visitor.visit_i64_atomic_rmw_and(self.read_memarg(3)?),
1796
0
            0x2e => visitor.visit_i32_atomic_rmw8_and_u(self.read_memarg(0)?),
1797
0
            0x2f => visitor.visit_i32_atomic_rmw16_and_u(self.read_memarg(1)?),
1798
0
            0x30 => visitor.visit_i64_atomic_rmw8_and_u(self.read_memarg(0)?),
1799
0
            0x31 => visitor.visit_i64_atomic_rmw16_and_u(self.read_memarg(1)?),
1800
0
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1801
0
            0x33 => visitor.visit_i32_atomic_rmw_or(self.read_memarg(2)?),
1802
0
            0x34 => visitor.visit_i64_atomic_rmw_or(self.read_memarg(3)?),
1803
0
            0x35 => visitor.visit_i32_atomic_rmw8_or_u(self.read_memarg(0)?),
1804
0
            0x36 => visitor.visit_i32_atomic_rmw16_or_u(self.read_memarg(1)?),
1805
0
            0x37 => visitor.visit_i64_atomic_rmw8_or_u(self.read_memarg(0)?),
1806
0
            0x38 => visitor.visit_i64_atomic_rmw16_or_u(self.read_memarg(1)?),
1807
0
            0x39 => visitor.visit_i64_atomic_rmw32_or_u(self.read_memarg(2)?),
1808
0
            0x3a => visitor.visit_i32_atomic_rmw_xor(self.read_memarg(2)?),
1809
0
            0x3b => visitor.visit_i64_atomic_rmw_xor(self.read_memarg(3)?),
1810
0
            0x3c => visitor.visit_i32_atomic_rmw8_xor_u(self.read_memarg(0)?),
1811
0
            0x3d => visitor.visit_i32_atomic_rmw16_xor_u(self.read_memarg(1)?),
1812
0
            0x3e => visitor.visit_i64_atomic_rmw8_xor_u(self.read_memarg(0)?),
1813
0
            0x3f => visitor.visit_i64_atomic_rmw16_xor_u(self.read_memarg(1)?),
1814
0
            0x40 => visitor.visit_i64_atomic_rmw32_xor_u(self.read_memarg(2)?),
1815
0
            0x41 => visitor.visit_i32_atomic_rmw_xchg(self.read_memarg(2)?),
1816
0
            0x42 => visitor.visit_i64_atomic_rmw_xchg(self.read_memarg(3)?),
1817
0
            0x43 => visitor.visit_i32_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1818
0
            0x44 => visitor.visit_i32_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1819
0
            0x45 => visitor.visit_i64_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1820
0
            0x46 => visitor.visit_i64_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1821
0
            0x47 => visitor.visit_i64_atomic_rmw32_xchg_u(self.read_memarg(2)?),
1822
0
            0x48 => visitor.visit_i32_atomic_rmw_cmpxchg(self.read_memarg(2)?),
1823
0
            0x49 => visitor.visit_i64_atomic_rmw_cmpxchg(self.read_memarg(3)?),
1824
0
            0x4a => visitor.visit_i32_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1825
0
            0x4b => visitor.visit_i32_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1826
0
            0x4c => visitor.visit_i64_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1827
0
            0x4d => visitor.visit_i64_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1828
0
            0x4e => visitor.visit_i64_atomic_rmw32_cmpxchg_u(self.read_memarg(2)?),
1829
1830
            // Decode shared-everything-threads proposal.
1831
0
            0x4f => visitor.visit_global_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1832
0
            0x50 => visitor.visit_global_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1833
            0x51 => {
1834
0
                visitor.visit_global_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?)
1835
            }
1836
            0x52 => {
1837
0
                visitor.visit_global_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?)
1838
            }
1839
            0x53 => {
1840
0
                visitor.visit_global_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?)
1841
            }
1842
0
            0x54 => visitor.visit_global_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1843
            0x55 => {
1844
0
                visitor.visit_global_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?)
1845
            }
1846
            0x56 => {
1847
0
                visitor.visit_global_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1848
            }
1849
            0x57 => {
1850
0
                visitor.visit_global_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1851
            }
1852
0
            0x58 => visitor.visit_table_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1853
0
            0x59 => visitor.visit_table_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1854
            0x5a => {
1855
0
                visitor.visit_table_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1856
            }
1857
            0x5b => {
1858
0
                visitor.visit_table_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1859
            }
1860
0
            0x5c => visitor.visit_struct_atomic_get(
1861
0
                self.read_ordering()?,
1862
0
                self.read_var_u32()?,
1863
0
                self.read_var_u32()?,
1864
            ),
1865
0
            0x5d => visitor.visit_struct_atomic_get_s(
1866
0
                self.read_ordering()?,
1867
0
                self.read_var_u32()?,
1868
0
                self.read_var_u32()?,
1869
            ),
1870
0
            0x5e => visitor.visit_struct_atomic_get_u(
1871
0
                self.read_ordering()?,
1872
0
                self.read_var_u32()?,
1873
0
                self.read_var_u32()?,
1874
            ),
1875
0
            0x5f => visitor.visit_struct_atomic_set(
1876
0
                self.read_ordering()?,
1877
0
                self.read_var_u32()?,
1878
0
                self.read_var_u32()?,
1879
            ),
1880
0
            0x60 => visitor.visit_struct_atomic_rmw_add(
1881
0
                self.read_ordering()?,
1882
0
                self.read_var_u32()?,
1883
0
                self.read_var_u32()?,
1884
            ),
1885
0
            0x61 => visitor.visit_struct_atomic_rmw_sub(
1886
0
                self.read_ordering()?,
1887
0
                self.read_var_u32()?,
1888
0
                self.read_var_u32()?,
1889
            ),
1890
0
            0x62 => visitor.visit_struct_atomic_rmw_and(
1891
0
                self.read_ordering()?,
1892
0
                self.read_var_u32()?,
1893
0
                self.read_var_u32()?,
1894
            ),
1895
0
            0x63 => visitor.visit_struct_atomic_rmw_or(
1896
0
                self.read_ordering()?,
1897
0
                self.read_var_u32()?,
1898
0
                self.read_var_u32()?,
1899
            ),
1900
0
            0x64 => visitor.visit_struct_atomic_rmw_xor(
1901
0
                self.read_ordering()?,
1902
0
                self.read_var_u32()?,
1903
0
                self.read_var_u32()?,
1904
            ),
1905
0
            0x65 => visitor.visit_struct_atomic_rmw_xchg(
1906
0
                self.read_ordering()?,
1907
0
                self.read_var_u32()?,
1908
0
                self.read_var_u32()?,
1909
            ),
1910
0
            0x66 => visitor.visit_struct_atomic_rmw_cmpxchg(
1911
0
                self.read_ordering()?,
1912
0
                self.read_var_u32()?,
1913
0
                self.read_var_u32()?,
1914
            ),
1915
0
            0x67 => visitor.visit_array_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1916
0
            0x68 => visitor.visit_array_atomic_get_s(self.read_ordering()?, self.read_var_u32()?),
1917
0
            0x69 => visitor.visit_array_atomic_get_u(self.read_ordering()?, self.read_var_u32()?),
1918
0
            0x6a => visitor.visit_array_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1919
0
            0x6b => visitor.visit_array_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?),
1920
0
            0x6c => visitor.visit_array_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?),
1921
0
            0x6d => visitor.visit_array_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?),
1922
0
            0x6e => visitor.visit_array_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1923
0
            0x6f => visitor.visit_array_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?),
1924
            0x70 => {
1925
0
                visitor.visit_array_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1926
            }
1927
            0x71 => {
1928
0
                visitor.visit_array_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1929
            }
1930
14
            0x72 => visitor.visit_ref_i31_shared(),
1931
1932
0
            _ => bail!(pos, "unknown 0xfe subopcode: 0x{code:x}"),
1933
        })
1934
14
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfe_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
Line
Count
Source
1747
5
    fn visit_0xfe_operator<T>(
1748
5
        &mut self,
1749
5
        pos: u64,
1750
5
        visitor: &mut T,
1751
5
    ) -> Result<<T as VisitOperator<'a>>::Output>
1752
5
    where
1753
5
        T: VisitOperator<'a>,
1754
    {
1755
5
        let code = self.read_var_u32()?;
1756
5
        Ok(match code {
1757
0
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1758
0
            0x01 => visitor.visit_memory_atomic_wait32(self.read_memarg(2)?),
1759
0
            0x02 => visitor.visit_memory_atomic_wait64(self.read_memarg(3)?),
1760
            0x03 => {
1761
0
                if self.read_u8()? != 0 {
1762
0
                    bail!(pos, "nonzero byte after `atomic.fence`");
1763
0
                }
1764
0
                visitor.visit_atomic_fence()
1765
            }
1766
0
            0x10 => visitor.visit_i32_atomic_load(self.read_memarg(2)?),
1767
0
            0x11 => visitor.visit_i64_atomic_load(self.read_memarg(3)?),
1768
0
            0x12 => visitor.visit_i32_atomic_load8_u(self.read_memarg(0)?),
1769
0
            0x13 => visitor.visit_i32_atomic_load16_u(self.read_memarg(1)?),
1770
0
            0x14 => visitor.visit_i64_atomic_load8_u(self.read_memarg(0)?),
1771
0
            0x15 => visitor.visit_i64_atomic_load16_u(self.read_memarg(1)?),
1772
0
            0x16 => visitor.visit_i64_atomic_load32_u(self.read_memarg(2)?),
1773
0
            0x17 => visitor.visit_i32_atomic_store(self.read_memarg(2)?),
1774
0
            0x18 => visitor.visit_i64_atomic_store(self.read_memarg(3)?),
1775
0
            0x19 => visitor.visit_i32_atomic_store8(self.read_memarg(0)?),
1776
0
            0x1a => visitor.visit_i32_atomic_store16(self.read_memarg(1)?),
1777
0
            0x1b => visitor.visit_i64_atomic_store8(self.read_memarg(0)?),
1778
0
            0x1c => visitor.visit_i64_atomic_store16(self.read_memarg(1)?),
1779
0
            0x1d => visitor.visit_i64_atomic_store32(self.read_memarg(2)?),
1780
0
            0x1e => visitor.visit_i32_atomic_rmw_add(self.read_memarg(2)?),
1781
0
            0x1f => visitor.visit_i64_atomic_rmw_add(self.read_memarg(3)?),
1782
0
            0x20 => visitor.visit_i32_atomic_rmw8_add_u(self.read_memarg(0)?),
1783
0
            0x21 => visitor.visit_i32_atomic_rmw16_add_u(self.read_memarg(1)?),
1784
0
            0x22 => visitor.visit_i64_atomic_rmw8_add_u(self.read_memarg(0)?),
1785
0
            0x23 => visitor.visit_i64_atomic_rmw16_add_u(self.read_memarg(1)?),
1786
0
            0x24 => visitor.visit_i64_atomic_rmw32_add_u(self.read_memarg(2)?),
1787
0
            0x25 => visitor.visit_i32_atomic_rmw_sub(self.read_memarg(2)?),
1788
0
            0x26 => visitor.visit_i64_atomic_rmw_sub(self.read_memarg(3)?),
1789
0
            0x27 => visitor.visit_i32_atomic_rmw8_sub_u(self.read_memarg(0)?),
1790
0
            0x28 => visitor.visit_i32_atomic_rmw16_sub_u(self.read_memarg(1)?),
1791
0
            0x29 => visitor.visit_i64_atomic_rmw8_sub_u(self.read_memarg(0)?),
1792
0
            0x2a => visitor.visit_i64_atomic_rmw16_sub_u(self.read_memarg(1)?),
1793
0
            0x2b => visitor.visit_i64_atomic_rmw32_sub_u(self.read_memarg(2)?),
1794
0
            0x2c => visitor.visit_i32_atomic_rmw_and(self.read_memarg(2)?),
1795
0
            0x2d => visitor.visit_i64_atomic_rmw_and(self.read_memarg(3)?),
1796
0
            0x2e => visitor.visit_i32_atomic_rmw8_and_u(self.read_memarg(0)?),
1797
0
            0x2f => visitor.visit_i32_atomic_rmw16_and_u(self.read_memarg(1)?),
1798
0
            0x30 => visitor.visit_i64_atomic_rmw8_and_u(self.read_memarg(0)?),
1799
0
            0x31 => visitor.visit_i64_atomic_rmw16_and_u(self.read_memarg(1)?),
1800
0
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1801
0
            0x33 => visitor.visit_i32_atomic_rmw_or(self.read_memarg(2)?),
1802
0
            0x34 => visitor.visit_i64_atomic_rmw_or(self.read_memarg(3)?),
1803
0
            0x35 => visitor.visit_i32_atomic_rmw8_or_u(self.read_memarg(0)?),
1804
0
            0x36 => visitor.visit_i32_atomic_rmw16_or_u(self.read_memarg(1)?),
1805
0
            0x37 => visitor.visit_i64_atomic_rmw8_or_u(self.read_memarg(0)?),
1806
0
            0x38 => visitor.visit_i64_atomic_rmw16_or_u(self.read_memarg(1)?),
1807
0
            0x39 => visitor.visit_i64_atomic_rmw32_or_u(self.read_memarg(2)?),
1808
0
            0x3a => visitor.visit_i32_atomic_rmw_xor(self.read_memarg(2)?),
1809
0
            0x3b => visitor.visit_i64_atomic_rmw_xor(self.read_memarg(3)?),
1810
0
            0x3c => visitor.visit_i32_atomic_rmw8_xor_u(self.read_memarg(0)?),
1811
0
            0x3d => visitor.visit_i32_atomic_rmw16_xor_u(self.read_memarg(1)?),
1812
0
            0x3e => visitor.visit_i64_atomic_rmw8_xor_u(self.read_memarg(0)?),
1813
0
            0x3f => visitor.visit_i64_atomic_rmw16_xor_u(self.read_memarg(1)?),
1814
0
            0x40 => visitor.visit_i64_atomic_rmw32_xor_u(self.read_memarg(2)?),
1815
0
            0x41 => visitor.visit_i32_atomic_rmw_xchg(self.read_memarg(2)?),
1816
0
            0x42 => visitor.visit_i64_atomic_rmw_xchg(self.read_memarg(3)?),
1817
0
            0x43 => visitor.visit_i32_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1818
0
            0x44 => visitor.visit_i32_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1819
0
            0x45 => visitor.visit_i64_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1820
0
            0x46 => visitor.visit_i64_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1821
0
            0x47 => visitor.visit_i64_atomic_rmw32_xchg_u(self.read_memarg(2)?),
1822
0
            0x48 => visitor.visit_i32_atomic_rmw_cmpxchg(self.read_memarg(2)?),
1823
0
            0x49 => visitor.visit_i64_atomic_rmw_cmpxchg(self.read_memarg(3)?),
1824
0
            0x4a => visitor.visit_i32_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1825
0
            0x4b => visitor.visit_i32_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1826
0
            0x4c => visitor.visit_i64_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1827
0
            0x4d => visitor.visit_i64_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1828
0
            0x4e => visitor.visit_i64_atomic_rmw32_cmpxchg_u(self.read_memarg(2)?),
1829
1830
            // Decode shared-everything-threads proposal.
1831
0
            0x4f => visitor.visit_global_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1832
0
            0x50 => visitor.visit_global_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1833
            0x51 => {
1834
0
                visitor.visit_global_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?)
1835
            }
1836
            0x52 => {
1837
0
                visitor.visit_global_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?)
1838
            }
1839
            0x53 => {
1840
0
                visitor.visit_global_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?)
1841
            }
1842
0
            0x54 => visitor.visit_global_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1843
            0x55 => {
1844
0
                visitor.visit_global_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?)
1845
            }
1846
            0x56 => {
1847
0
                visitor.visit_global_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1848
            }
1849
            0x57 => {
1850
0
                visitor.visit_global_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1851
            }
1852
0
            0x58 => visitor.visit_table_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1853
0
            0x59 => visitor.visit_table_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1854
            0x5a => {
1855
0
                visitor.visit_table_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1856
            }
1857
            0x5b => {
1858
0
                visitor.visit_table_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1859
            }
1860
0
            0x5c => visitor.visit_struct_atomic_get(
1861
0
                self.read_ordering()?,
1862
0
                self.read_var_u32()?,
1863
0
                self.read_var_u32()?,
1864
            ),
1865
0
            0x5d => visitor.visit_struct_atomic_get_s(
1866
0
                self.read_ordering()?,
1867
0
                self.read_var_u32()?,
1868
0
                self.read_var_u32()?,
1869
            ),
1870
0
            0x5e => visitor.visit_struct_atomic_get_u(
1871
0
                self.read_ordering()?,
1872
0
                self.read_var_u32()?,
1873
0
                self.read_var_u32()?,
1874
            ),
1875
0
            0x5f => visitor.visit_struct_atomic_set(
1876
0
                self.read_ordering()?,
1877
0
                self.read_var_u32()?,
1878
0
                self.read_var_u32()?,
1879
            ),
1880
0
            0x60 => visitor.visit_struct_atomic_rmw_add(
1881
0
                self.read_ordering()?,
1882
0
                self.read_var_u32()?,
1883
0
                self.read_var_u32()?,
1884
            ),
1885
0
            0x61 => visitor.visit_struct_atomic_rmw_sub(
1886
0
                self.read_ordering()?,
1887
0
                self.read_var_u32()?,
1888
0
                self.read_var_u32()?,
1889
            ),
1890
0
            0x62 => visitor.visit_struct_atomic_rmw_and(
1891
0
                self.read_ordering()?,
1892
0
                self.read_var_u32()?,
1893
0
                self.read_var_u32()?,
1894
            ),
1895
0
            0x63 => visitor.visit_struct_atomic_rmw_or(
1896
0
                self.read_ordering()?,
1897
0
                self.read_var_u32()?,
1898
0
                self.read_var_u32()?,
1899
            ),
1900
0
            0x64 => visitor.visit_struct_atomic_rmw_xor(
1901
0
                self.read_ordering()?,
1902
0
                self.read_var_u32()?,
1903
0
                self.read_var_u32()?,
1904
            ),
1905
0
            0x65 => visitor.visit_struct_atomic_rmw_xchg(
1906
0
                self.read_ordering()?,
1907
0
                self.read_var_u32()?,
1908
0
                self.read_var_u32()?,
1909
            ),
1910
0
            0x66 => visitor.visit_struct_atomic_rmw_cmpxchg(
1911
0
                self.read_ordering()?,
1912
0
                self.read_var_u32()?,
1913
0
                self.read_var_u32()?,
1914
            ),
1915
0
            0x67 => visitor.visit_array_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1916
0
            0x68 => visitor.visit_array_atomic_get_s(self.read_ordering()?, self.read_var_u32()?),
1917
0
            0x69 => visitor.visit_array_atomic_get_u(self.read_ordering()?, self.read_var_u32()?),
1918
0
            0x6a => visitor.visit_array_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1919
0
            0x6b => visitor.visit_array_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?),
1920
0
            0x6c => visitor.visit_array_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?),
1921
0
            0x6d => visitor.visit_array_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?),
1922
0
            0x6e => visitor.visit_array_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1923
0
            0x6f => visitor.visit_array_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?),
1924
            0x70 => {
1925
0
                visitor.visit_array_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1926
            }
1927
            0x71 => {
1928
0
                visitor.visit_array_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1929
            }
1930
5
            0x72 => visitor.visit_ref_i31_shared(),
1931
1932
0
            _ => bail!(pos, "unknown 0xfe subopcode: 0x{code:x}"),
1933
        })
1934
5
    }
1935
1936
729k
    fn read_memarg(&mut self, max_align: u8) -> Result<MemArg> {
1937
729k
        let flags_pos = self.original_position();
1938
729k
        let mut flags = self.read_var_u32()?;
1939
1940
729k
        let memory = if self.multi_memory() && flags & (1 << 6) != 0 {
1941
559k
            flags ^= 1 << 6;
1942
559k
            self.read_var_u32()?
1943
        } else {
1944
170k
            0
1945
        };
1946
729k
        let max_flag_bits = if self.multi_memory() { 6 } else { 5 };
1947
729k
        if flags >= (1 << max_flag_bits) {
1948
9
            return Err(Error::new(
1949
9
                "malformed memop alignment: alignment too large",
1950
9
                flags_pos,
1951
9
            ));
1952
729k
        }
1953
729k
        let align = flags as u8;
1954
729k
        let offset = if self.memory64() {
1955
720k
            self.read_var_u64()?
1956
        } else {
1957
8.97k
            u64::from(self.read_var_u32()?)
1958
        };
1959
729k
        Ok(MemArg {
1960
729k
            align,
1961
729k
            max_align,
1962
729k
            offset,
1963
729k
            memory,
1964
729k
        })
1965
729k
    }
1966
1967
0
    fn read_ordering(&mut self) -> Result<Ordering> {
1968
0
        let byte = self.read_var_u32()?;
1969
0
        match byte {
1970
0
            0 => Ok(Ordering::SeqCst),
1971
0
            1 => Ok(Ordering::AcqRel),
1972
0
            x => Err(Error::new(
1973
0
                format!("invalid atomic consistency ordering {x}"),
1974
0
                self.original_position() - 1,
1975
0
            )),
1976
        }
1977
0
    }
1978
1979
14.9k
    fn read_br_table(&mut self) -> Result<BrTable<'a>> {
1980
14.9k
        let cnt = self.read_size(MAX_WASM_BR_TABLE_SIZE, "br_table")?;
1981
14.9k
        let reader = self.skip(|reader| {
1982
14.9k
            for _ in 0..cnt {
1983
64.5k
                reader.read_var_u32()?;
1984
            }
1985
14.9k
            Ok(())
1986
14.9k
        })?;
1987
14.9k
        let default = self.read_var_u32()?;
1988
14.9k
        Ok(BrTable {
1989
14.9k
            reader,
1990
14.9k
            cnt: cnt as u32,
1991
14.9k
            default,
1992
14.9k
        })
1993
14.9k
    }
1994
1995
    #[cfg(feature = "simd")]
1996
37.6k
    fn read_lane_index(&mut self) -> Result<u8> {
1997
37.6k
        self.read_u8()
1998
37.6k
    }
1999
2000
    #[cfg(feature = "simd")]
2001
399k
    fn read_v128(&mut self) -> Result<V128> {
2002
399k
        let mut bytes = [0; 16];
2003
399k
        bytes.clone_from_slice(self.read_bytes(16)?);
2004
399k
        Ok(V128(bytes))
2005
399k
    }
2006
2007
662k
    fn read_memory_index_or_zero_if_not_multi_memory(&mut self) -> Result<u32> {
2008
662k
        if self.multi_memory() {
2009
660k
            self.read_var_u32()
2010
        } else {
2011
            // Before bulk memory this byte was required to be a single zero
2012
            // byte, not a LEB-encoded zero, so require a precise zero byte.
2013
1.13k
            match self.read_u8()? {
2014
1.13k
                0 => Ok(0),
2015
0
                _ => bail!(self.original_position() - 1, "zero byte expected"),
2016
            }
2017
        }
2018
662k
    }
2019
2020
2.93k
    fn read_call_indirect_table_immediate(&mut self) -> Result<u32> {
2021
        // If the `call_indirect_overlong` feature is enabled, then read this
2022
        // immediate as a LEB. This feature is enabled as part of the
2023
        // `reference_types` feature or the `lime1` feature.
2024
2.93k
        if self.call_indirect_overlong() {
2025
2.66k
            return self.read_var_u32();
2026
270
        }
2027
2028
        // Before reference types this byte was required to be a single zero
2029
        // byte, not a LEB-encoded zero, so require a precise zero byte.
2030
270
        match self.read_u8()? {
2031
270
            0 => Ok(0),
2032
0
            _ => bail!(self.original_position() - 1, "zero byte expected"),
2033
        }
2034
2.93k
    }
2035
}
2036
2037
#[cfg(test)]
2038
mod tests {
2039
    use super::*;
2040
2041
    macro_rules! assert_matches {
2042
        ($a:expr, $b:pat $(,)?) => {
2043
            match $a {
2044
                $b => {}
2045
                a => panic!("`{:?}` doesn't match `{}`", a, stringify!($b)),
2046
            }
2047
        };
2048
    }
2049
2050
    #[test]
2051
    #[should_panic = "too large"]
2052
    fn panic_on_large_offsets() {
2053
        assert!(
2054
            BinaryReader::max_data_len(u64::MAX) == 0,
2055
            "must not accept data at offset 0x{:x}",
2056
            u64::MAX
2057
        );
2058
        let _rdr = BinaryReader::new(&[10], u64::MAX);
2059
    }
2060
2061
    #[test]
2062
    fn can_parse_on_large_offset() {
2063
        let large_offset = u64::from(u32::MAX) + 1;
2064
        assert!(BinaryReader::max_data_len(large_offset) > 1);
2065
        let mut rdr = BinaryReader::new(&[10], large_offset);
2066
        assert_matches!(rdr.read_u8(), Ok(10));
2067
    }
2068
2069
    #[test]
2070
    fn read_var_s33() {
2071
        let s33 = |bytes: &[u8]| {
2072
            let mut rdr = BinaryReader::new(bytes, 0);
2073
            let ret = rdr.read_var_s33().unwrap();
2074
            assert!(rdr.eof());
2075
            ret
2076
        };
2077
        assert_eq!(s33(&[0x00]), 0);
2078
        assert_eq!(s33(&[0x7f]), -1);
2079
        assert_eq!(s33(&[0xc0, 0xff, 0xff, 0x7f]), -64);
2080
        assert_eq!(s33(&[0xff, 0xff, 0xff, 0xff, 0x7f]), -1);
2081
        assert_eq!(s33(&[0xff, 0xff, 0xff, 0xff, 0x0f]), (1 << 32) - 1);
2082
        assert_eq!(s33(&[0x80, 0x80, 0x80, 0x80, 0x70]), -(1 << 32));
2083
        assert_eq!(s33(&[0x80, 0x80, 0x80, 0x80, 0x00]), 0);
2084
    }
2085
}