Coverage Report

Created: 2026-11-11 06:34

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/wasmparser-0.262.0/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
25.3k
    pub fn new(data: &[u8], original_offset: u64) -> BinaryReader<'_> {
65
25.3k
        let max_len = Self::max_data_len(original_offset);
66
25.3k
        if max_len < data.len() {
67
0
            panic_too_many_bytes(original_offset, data.len(), max_len);
68
25.3k
        }
69
25.3k
        BinaryReader {
70
25.3k
            buffer: data,
71
25.3k
            position: 0,
72
25.3k
            original_offset,
73
25.3k
            #[cfg(feature = "features")]
74
25.3k
            features: WasmFeatures::all(),
75
25.3k
        }
76
25.3k
    }
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
29
    pub fn new_features(
116
29
        data: &[u8],
117
29
        original_offset: u64,
118
29
        features: WasmFeatures,
119
29
    ) -> BinaryReader<'_> {
120
29
        let max_len = max_data_len(original_offset, u64::MAX);
121
29
        if max_len < data.len() {
122
0
            panic_too_many_bytes(original_offset, data.len(), max_len);
123
29
        }
124
29
        BinaryReader {
125
29
            buffer: data,
126
29
            position: 0,
127
29
            original_offset,
128
29
            features,
129
29
        }
130
29
    }
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
25.3k
    pub fn max_data_len(original_offset: u64) -> usize {
135
25.3k
        max_data_len(original_offset, u64::MAX)
136
25.3k
    }
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
14
    pub(crate) fn shrink(&self) -> BinaryReader<'a> {
149
14
        let buffer = &self.buffer[self.position..];
150
14
        let original_offset = self.original_position();
151
14
        BinaryReader {
152
14
            buffer,
153
14
            position: 0,
154
14
            original_offset,
155
14
            #[cfg(feature = "features")]
156
14
            features: self.features,
157
14
        }
158
14
    }
159
160
    /// Gets the original position of the binary reader.
161
    #[inline]
162
532k
    pub fn original_position(&self) -> u64 {
163
532k
        self.original_offset + self.position as u64
164
532k
    }
<wasmparser::binary_reader::BinaryReader>::original_position
Line
Count
Source
162
6.98k
    pub fn original_position(&self) -> u64 {
163
6.98k
        self.original_offset + self.position as u64
164
6.98k
    }
<wasmparser::binary_reader::BinaryReader>::original_position
Line
Count
Source
162
525k
    pub fn original_position(&self) -> u64 {
163
525k
        self.original_offset + self.position as u64
164
525k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::original_position
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
48
    pub fn features(&self) -> WasmFeatures {
172
48
        self.features
173
48
    }
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
25.3k
    pub fn set_features(&mut self, features: WasmFeatures) {
180
25.3k
        self.features = features;
181
25.3k
    }
182
183
    /// Returns a range from the starting offset to the end of the buffer.
184
30.9k
    pub fn range(&self) -> Range<u64> {
185
30.9k
        self.original_offset..(self.original_offset + self.max_position() as u64)
186
30.9k
    }
187
188
280
    pub(crate) fn remaining_buffer(&self) -> &'a [u8] {
189
280
        &self.buffer[self.position..]
190
280
    }
191
192
    /// Returns a range from the current position to the end of the buffer.
193
8
    pub fn remaining_range(&self) -> Range<u64> {
194
8
        self.original_position()..(self.original_offset + self.max_position() as u64)
195
8
    }
196
197
261k
    fn max_position(&self) -> usize {
198
        // constructor enforces:
199
        // self.buffer.len() <= max_memory_offset(u64::MAX - self.original_offset, self.buffer.len())
200
261k
        self.buffer.len()
201
261k
    }
202
203
79.6k
    fn ensure_has_byte(&self) -> Result<()> {
204
79.6k
        if self.position < self.max_position() {
205
79.6k
            Ok(())
206
        } else {
207
52
            Err(self.eof_err(1))
208
        }
209
79.6k
    }
210
211
    /// Returns the offset past `len` bytes on success
212
66.0k
    pub(crate) fn ensure_has_bytes(&self, len: usize) -> Result<usize> {
213
66.0k
        let remaining = self.bytes_remaining();
214
66.0k
        match len <= remaining {
215
65.8k
            true => Ok(self.position + len),
216
278
            false => Err(self.eof_err(len - remaining)),
217
        }
218
66.0k
    }
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
213k
    pub fn read<T>(&mut self) -> Result<T>
224
213k
    where
225
213k
        T: FromReader<'a>,
226
    {
227
213k
        T::from_reader(self)
228
213k
    }
<wasmparser::binary_reader::BinaryReader>::read::<core::option::Option<wasmparser::readers::component::types::ComponentValType>>
Line
Count
Source
223
67
    pub fn read<T>(&mut self) -> Result<T>
224
67
    where
225
67
        T: FromReader<'a>,
226
    {
227
67
        T::from_reader(self)
228
67
    }
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
455
    pub fn read<T>(&mut self) -> Result<T>
224
455
    where
225
455
        T: FromReader<'a>,
226
    {
227
455
        T::from_reader(self)
228
455
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::init::ConstExpr>
Line
Count
Source
223
4.96k
    pub fn read<T>(&mut self) -> Result<T>
224
4.96k
    where
225
4.96k
        T: FromReader<'a>,
226
    {
227
4.96k
        T::from_reader(self)
228
4.96k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::names::IndirectNaming>
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::names::Naming>
Line
Count
Source
223
178
    pub fn read<T>(&mut self) -> Result<T>
224
178
    where
225
178
        T: FromReader<'a>,
226
    {
227
178
        T::from_reader(self)
228
178
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::GlobalType>
Line
Count
Source
223
3.13k
    pub fn read<T>(&mut self) -> Result<T>
224
3.13k
    where
225
3.13k
        T: FromReader<'a>,
226
    {
227
3.13k
        T::from_reader(self)
228
3.13k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::MemoryType>
Line
Count
Source
223
1.78k
    pub fn read<T>(&mut self) -> Result<T>
224
1.78k
    where
225
1.78k
        T: FromReader<'a>,
226
    {
227
1.78k
        T::from_reader(self)
228
1.78k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::StructType>
Line
Count
Source
223
24
    pub fn read<T>(&mut self) -> Result<T>
224
24
    where
225
24
        T: FromReader<'a>,
226
    {
227
24
        T::from_reader(self)
228
24
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::StorageType>
Line
Count
Source
223
29
    pub fn read<T>(&mut self) -> Result<T>
224
29
    where
225
29
        T: FromReader<'a>,
226
    {
227
29
        T::from_reader(self)
228
29
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::AbstractHeapType>
Line
Count
Source
223
3.86k
    pub fn read<T>(&mut self) -> Result<T>
224
3.86k
    where
225
3.86k
        T: FromReader<'a>,
226
    {
227
3.86k
        T::from_reader(self)
228
3.86k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::RefType>
Line
Count
Source
223
3.87k
    pub fn read<T>(&mut self) -> Result<T>
224
3.87k
    where
225
3.87k
        T: FromReader<'a>,
226
    {
227
3.87k
        T::from_reader(self)
228
3.87k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::SubType>
Line
Count
Source
223
19.1k
    pub fn read<T>(&mut self) -> Result<T>
224
19.1k
    where
225
19.1k
        T: FromReader<'a>,
226
    {
227
19.1k
        T::from_reader(self)
228
19.1k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::TagType>
Line
Count
Source
223
31
    pub fn read<T>(&mut self) -> Result<T>
224
31
    where
225
31
        T: FromReader<'a>,
226
    {
227
31
        T::from_reader(self)
228
31
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::ValType>
Line
Count
Source
223
45.6k
    pub fn read<T>(&mut self) -> Result<T>
224
45.6k
    where
225
45.6k
        T: FromReader<'a>,
226
    {
227
45.6k
        T::from_reader(self)
228
45.6k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::ContType>
Line
Count
Source
223
12
    pub fn read<T>(&mut self) -> Result<T>
224
12
    where
225
12
        T: FromReader<'a>,
226
    {
227
12
        T::from_reader(self)
228
12
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::FuncType>
Line
Count
Source
223
19.0k
    pub fn read<T>(&mut self) -> Result<T>
224
19.0k
    where
225
19.0k
        T: FromReader<'a>,
226
    {
227
19.0k
        T::from_reader(self)
228
19.0k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::HeapType>
Line
Count
Source
223
169
    pub fn read<T>(&mut self) -> Result<T>
224
169
    where
225
169
        T: FromReader<'a>,
226
    {
227
169
        T::from_reader(self)
228
169
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::RecGroup>
Line
Count
Source
223
19.1k
    pub fn read<T>(&mut self) -> Result<T>
224
19.1k
    where
225
19.1k
        T: FromReader<'a>,
226
    {
227
19.1k
        T::from_reader(self)
228
19.1k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::ArrayType>
Line
Count
Source
223
6
    pub fn read<T>(&mut self) -> Result<T>
224
6
    where
225
6
        T: FromReader<'a>,
226
    {
227
6
        T::from_reader(self)
228
6
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::FieldType>
Line
Count
Source
223
23
    pub fn read<T>(&mut self) -> Result<T>
224
23
    where
225
23
        T: FromReader<'a>,
226
    {
227
23
        T::from_reader(self)
228
23
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::types::TableType>
Line
Count
Source
223
1.62k
    pub fn read<T>(&mut self) -> Result<T>
224
1.62k
    where
225
1.62k
        T: FromReader<'a>,
226
    {
227
1.62k
        T::from_reader(self)
228
1.62k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::tables::Table>
Line
Count
Source
223
1.62k
    pub fn read<T>(&mut self) -> Result<T>
224
1.62k
    where
225
1.62k
        T: FromReader<'a>,
226
    {
227
1.62k
        T::from_reader(self)
228
1.62k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::exports::ExternalKind>
Line
Count
Source
223
12.5k
    pub fn read<T>(&mut self) -> Result<T>
224
12.5k
    where
225
12.5k
        T: FromReader<'a>,
226
    {
227
12.5k
        T::from_reader(self)
228
12.5k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::exports::Export>
Line
Count
Source
223
9.02k
    pub fn read<T>(&mut self) -> Result<T>
224
9.02k
    where
225
9.02k
        T: FromReader<'a>,
226
    {
227
9.02k
        T::from_reader(self)
228
9.02k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::globals::Global>
Line
Count
Source
223
3.12k
    pub fn read<T>(&mut self) -> Result<T>
224
3.12k
    where
225
3.12k
        T: FromReader<'a>,
226
    {
227
3.12k
        T::from_reader(self)
228
3.12k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::imports::ImportItemCompact>
Line
Count
Source
223
8
    pub fn read<T>(&mut self) -> Result<T>
224
8
    where
225
8
        T: FromReader<'a>,
226
    {
227
8
        T::from_reader(self)
228
8
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::imports::Import>
Line
Count
Source
223
13
    pub fn read<T>(&mut self) -> Result<T>
224
13
    where
225
13
        T: FromReader<'a>,
226
    {
227
13
        T::from_reader(self)
228
13
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::imports::Imports>
Line
Count
Source
223
3.53k
    pub fn read<T>(&mut self) -> Result<T>
224
3.53k
    where
225
3.53k
        T: FromReader<'a>,
226
    {
227
3.53k
        T::from_reader(self)
228
3.53k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::imports::TypeRef>
Line
Count
Source
223
3.52k
    pub fn read<T>(&mut self) -> Result<T>
224
3.52k
    where
225
3.52k
        T: FromReader<'a>,
226
    {
227
3.52k
        T::from_reader(self)
228
3.52k
    }
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
1.48k
    pub fn read<T>(&mut self) -> Result<T>
224
1.48k
    where
225
1.48k
        T: FromReader<'a>,
226
    {
227
1.48k
        T::from_reader(self)
228
1.48k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::operators::ResumeTable>
Line
Count
Source
223
100
    pub fn read<T>(&mut self) -> Result<T>
224
100
    where
225
100
        T: FromReader<'a>,
226
    {
227
100
        T::from_reader(self)
228
100
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::operators::Catch>
Line
Count
Source
223
548
    pub fn read<T>(&mut self) -> Result<T>
224
548
    where
225
548
        T: FromReader<'a>,
226
    {
227
548
        T::from_reader(self)
228
548
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::operators::Handle>
Line
Count
Source
223
282
    pub fn read<T>(&mut self) -> Result<T>
224
282
    where
225
282
        T: FromReader<'a>,
226
    {
227
282
        T::from_reader(self)
228
282
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::core::operators::TryTable>
Line
Count
Source
223
163
    pub fn read<T>(&mut self) -> Result<T>
224
163
    where
225
163
        T: FromReader<'a>,
226
    {
227
163
        T::from_reader(self)
228
163
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::canonicals::CanonicalOption>
Line
Count
Source
223
84
    pub fn read<T>(&mut self) -> Result<T>
224
84
    where
225
84
        T: FromReader<'a>,
226
    {
227
84
        T::from_reader(self)
228
84
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::canonicals::CanonicalFunction>
Line
Count
Source
223
1.20k
    pub fn read<T>(&mut self) -> Result<T>
224
1.20k
    where
225
1.20k
        T: FromReader<'a>,
226
    {
227
1.20k
        T::from_reader(self)
228
1.20k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::start::ComponentStartFunction>
Line
Count
Source
223
16
    pub fn read<T>(&mut self) -> Result<T>
224
16
    where
225
16
        T: FromReader<'a>,
226
    {
227
16
        T::from_reader(self)
228
16
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::VariantCase>
Line
Count
Source
223
54
    pub fn read<T>(&mut self) -> Result<T>
224
54
    where
225
54
        T: FromReader<'a>,
226
    {
227
54
        T::from_reader(self)
228
54
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::ComponentType>
Line
Count
Source
223
1.71k
    pub fn read<T>(&mut self) -> Result<T>
224
1.71k
    where
225
1.71k
        T: FromReader<'a>,
226
    {
227
1.71k
        T::from_reader(self)
228
1.71k
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::ComponentValType>
Line
Count
Source
223
548
    pub fn read<T>(&mut self) -> Result<T>
224
548
    where
225
548
        T: FromReader<'a>,
226
    {
227
548
        T::from_reader(self)
228
548
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::ModuleTypeDeclaration>
Line
Count
Source
223
16
    pub fn read<T>(&mut self) -> Result<T>
224
16
    where
225
16
        T: FromReader<'a>,
226
    {
227
16
        T::from_reader(self)
228
16
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::types::CoreType>
Line
Count
Source
223
20
    pub fn read<T>(&mut self) -> Result<T>
224
20
    where
225
20
        T: FromReader<'a>,
226
    {
227
20
        T::from_reader(self)
228
20
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::aliases::ComponentAlias>
Line
Count
Source
223
17
    pub fn read<T>(&mut self) -> Result<T>
224
17
    where
225
17
        T: FromReader<'a>,
226
    {
227
17
        T::from_reader(self)
228
17
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::exports::ComponentExport>
Line
Count
Source
223
22
    pub fn read<T>(&mut self) -> Result<T>
224
22
    where
225
22
        T: FromReader<'a>,
226
    {
227
22
        T::from_reader(self)
228
22
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::exports::ComponentExternalKind>
Line
Count
Source
223
42
    pub fn read<T>(&mut self) -> Result<T>
224
42
    where
225
42
        T: FromReader<'a>,
226
    {
227
42
        T::from_reader(self)
228
42
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::TypeBounds>
Line
Count
Source
223
3
    pub fn read<T>(&mut self) -> Result<T>
224
3
    where
225
3
        T: FromReader<'a>,
226
    {
227
3
        T::from_reader(self)
228
3
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::ComponentImport>
Line
Count
Source
223
10
    pub fn read<T>(&mut self) -> Result<T>
224
10
    where
225
10
        T: FromReader<'a>,
226
    {
227
10
        T::from_reader(self)
228
10
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::ComponentNameOpt>
Line
Count
Source
223
4
    pub fn read<T>(&mut self) -> Result<T>
224
4
    where
225
4
        T: FromReader<'a>,
226
    {
227
4
        T::from_reader(self)
228
4
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::ComponentTypeRef>
Line
Count
Source
223
16
    pub fn read<T>(&mut self) -> Result<T>
224
16
    where
225
16
        T: FromReader<'a>,
226
    {
227
16
        T::from_reader(self)
228
16
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::imports::ComponentExternName>
Line
Count
Source
223
42
    pub fn read<T>(&mut self) -> Result<T>
224
42
    where
225
42
        T: FromReader<'a>,
226
    {
227
42
        T::from_reader(self)
228
42
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::InstantiationArg>
Line
Count
Source
223
5
    pub fn read<T>(&mut self) -> Result<T>
224
5
    where
225
5
        T: FromReader<'a>,
226
    {
227
5
        T::from_reader(self)
228
5
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::ComponentInstance>
Line
Count
Source
223
39
    pub fn read<T>(&mut self) -> Result<T>
224
39
    where
225
39
        T: FromReader<'a>,
226
    {
227
39
        T::from_reader(self)
228
39
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::InstantiationArgKind>
Line
Count
Source
223
3
    pub fn read<T>(&mut self) -> Result<T>
224
3
    where
225
3
        T: FromReader<'a>,
226
    {
227
3
        T::from_reader(self)
228
3
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::ComponentInstantiationArg>
Line
Count
Source
223
14
    pub fn read<T>(&mut self) -> Result<T>
224
14
    where
225
14
        T: FromReader<'a>,
226
    {
227
14
        T::from_reader(self)
228
14
    }
<wasmparser::binary_reader::BinaryReader>::read::<wasmparser::readers::component::instances::Instance>
Line
Count
Source
223
22
    pub fn read<T>(&mut self) -> Result<T>
224
22
    where
225
22
        T: FromReader<'a>,
226
    {
227
22
        T::from_reader(self)
228
22
    }
<wasmparser::binary_reader::BinaryReader>::read::<&str>
Line
Count
Source
223
318
    pub fn read<T>(&mut self) -> Result<T>
224
318
    where
225
318
        T: FromReader<'a>,
226
    {
227
318
        T::from_reader(self)
228
318
    }
<wasmparser::binary_reader::BinaryReader>::read::<(&str, wasmparser::readers::component::types::ComponentValType)>
Line
Count
Source
223
77
    pub fn read<T>(&mut self) -> Result<T>
224
77
    where
225
77
        T: FromReader<'a>,
226
    {
227
77
        T::from_reader(self)
228
77
    }
<wasmparser::binary_reader::BinaryReader>::read::<bool>
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::<u32>
Line
Count
Source
223
49.4k
    pub fn read<T>(&mut self) -> Result<T>
224
49.4k
    where
225
49.4k
        T: FromReader<'a>,
226
    {
227
49.4k
        T::from_reader(self)
228
49.4k
    }
229
230
64
    pub(crate) fn read_u7(&mut self) -> Result<u8> {
231
64
        let b = self.read_u8()?;
232
64
        if (b & 0x80) != 0 {
233
0
            return Err(Error::new("invalid u7", self.original_position() - 1));
234
64
        }
235
64
        Ok(b)
236
64
    }
237
238
12.5k
    pub(crate) fn external_kind_from_byte(byte: u8, offset: u64) -> Result<ExternalKind> {
239
12.5k
        match byte {
240
11.0k
            0x00 => Ok(ExternalKind::Func),
241
662
            0x01 => Ok(ExternalKind::Table),
242
743
            0x02 => Ok(ExternalKind::Memory),
243
43
            0x03 => Ok(ExternalKind::Global),
244
16
            0x04 => Ok(ExternalKind::Tag),
245
22
            0x20 => Ok(ExternalKind::FuncExact),
246
43
            x => Err(Self::invalid_leading_byte_error(x, "external kind", offset)),
247
        }
248
12.5k
    }
249
250
    /// Reads a variable-length 32-bit size from the byte stream while checking
251
    /// against a limit.
252
38.7k
    pub fn read_size(&mut self, limit: usize, desc: &str) -> Result<usize> {
253
38.7k
        let pos = self.original_position();
254
38.7k
        let size = self.read_var_u32()? as usize;
255
38.7k
        if size > limit {
256
28
            bail!(pos, "{desc} size is out of bounds");
257
38.7k
        }
258
38.7k
        Ok(size)
259
38.7k
    }
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
38.4k
    pub fn read_iter<'me, T>(
269
38.4k
        &'me mut self,
270
38.4k
        limit: usize,
271
38.4k
        desc: &str,
272
38.4k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
38.4k
    where
274
38.4k
        T: FromReader<'a>,
275
    {
276
38.4k
        let size = self.read_size(limit, desc)?;
277
38.4k
        Ok(BinaryReaderIter {
278
38.4k
            remaining: size,
279
38.4k
            reader: self,
280
38.4k
            _marker: marker::PhantomData,
281
38.4k
        })
282
38.4k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::types::SubType>
Line
Count
Source
268
17
    pub fn read_iter<'me, T>(
269
17
        &'me mut self,
270
17
        limit: usize,
271
17
        desc: &str,
272
17
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
17
    where
274
17
        T: FromReader<'a>,
275
    {
276
17
        let size = self.read_size(limit, desc)?;
277
17
        Ok(BinaryReaderIter {
278
17
            remaining: size,
279
17
            reader: self,
280
17
            _marker: marker::PhantomData,
281
17
        })
282
17
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::types::ValType>
Line
Count
Source
268
37.9k
    pub fn read_iter<'me, T>(
269
37.9k
        &'me mut self,
270
37.9k
        limit: usize,
271
37.9k
        desc: &str,
272
37.9k
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
37.9k
    where
274
37.9k
        T: FromReader<'a>,
275
    {
276
37.9k
        let size = self.read_size(limit, desc)?;
277
37.9k
        Ok(BinaryReaderIter {
278
37.9k
            remaining: size,
279
37.9k
            reader: self,
280
37.9k
            _marker: marker::PhantomData,
281
37.9k
        })
282
37.9k
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::types::FieldType>
Line
Count
Source
268
24
    pub fn read_iter<'me, T>(
269
24
        &'me mut self,
270
24
        limit: usize,
271
24
        desc: &str,
272
24
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
24
    where
274
24
        T: FromReader<'a>,
275
    {
276
24
        let size = self.read_size(limit, desc)?;
277
22
        Ok(BinaryReaderIter {
278
22
            remaining: size,
279
22
            reader: self,
280
22
            _marker: marker::PhantomData,
281
22
        })
282
24
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::exports::Export>
Line
Count
Source
268
12
    pub fn read_iter<'me, T>(
269
12
        &'me mut self,
270
12
        limit: usize,
271
12
        desc: &str,
272
12
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
12
    where
274
12
        T: FromReader<'a>,
275
    {
276
12
        let size = self.read_size(limit, desc)?;
277
12
        Ok(BinaryReaderIter {
278
12
            remaining: size,
279
12
            reader: self,
280
12
            _marker: marker::PhantomData,
281
12
        })
282
12
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::operators::Catch>
Line
Count
Source
268
156
    pub fn read_iter<'me, T>(
269
156
        &'me mut self,
270
156
        limit: usize,
271
156
        desc: &str,
272
156
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
156
    where
274
156
        T: FromReader<'a>,
275
    {
276
156
        let size = self.read_size(limit, desc)?;
277
155
        Ok(BinaryReaderIter {
278
155
            remaining: size,
279
155
            reader: self,
280
155
            _marker: marker::PhantomData,
281
155
        })
282
156
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::core::operators::Handle>
Line
Count
Source
268
100
    pub fn read_iter<'me, T>(
269
100
        &'me mut self,
270
100
        limit: usize,
271
100
        desc: &str,
272
100
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
100
    where
274
100
        T: FromReader<'a>,
275
    {
276
100
        let size = self.read_size(limit, desc)?;
277
95
        Ok(BinaryReaderIter {
278
95
            remaining: size,
279
95
            reader: self,
280
95
            _marker: marker::PhantomData,
281
95
        })
282
100
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::canonicals::CanonicalOption>
Line
Count
Source
268
41
    pub fn read_iter<'me, T>(
269
41
        &'me mut self,
270
41
        limit: usize,
271
41
        desc: &str,
272
41
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
41
    where
274
41
        T: FromReader<'a>,
275
    {
276
41
        let size = self.read_size(limit, desc)?;
277
33
        Ok(BinaryReaderIter {
278
33
            remaining: size,
279
33
            reader: self,
280
33
            _marker: marker::PhantomData,
281
33
        })
282
41
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::types::VariantCase>
Line
Count
Source
268
12
    pub fn read_iter<'me, T>(
269
12
        &'me mut self,
270
12
        limit: usize,
271
12
        desc: &str,
272
12
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
12
    where
274
12
        T: FromReader<'a>,
275
    {
276
12
        let size = self.read_size(limit, desc)?;
277
11
        Ok(BinaryReaderIter {
278
11
            remaining: size,
279
11
            reader: self,
280
11
            _marker: marker::PhantomData,
281
11
        })
282
12
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::types::ComponentValType>
Line
Count
Source
268
28
    pub fn read_iter<'me, T>(
269
28
        &'me mut self,
270
28
        limit: usize,
271
28
        desc: &str,
272
28
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
28
    where
274
28
        T: FromReader<'a>,
275
    {
276
28
        let size = self.read_size(limit, desc)?;
277
27
        Ok(BinaryReaderIter {
278
27
            remaining: size,
279
27
            reader: self,
280
27
            _marker: marker::PhantomData,
281
27
        })
282
28
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::types::ModuleTypeDeclaration>
Line
Count
Source
268
8
    pub fn read_iter<'me, T>(
269
8
        &'me mut self,
270
8
        limit: usize,
271
8
        desc: &str,
272
8
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
8
    where
274
8
        T: FromReader<'a>,
275
    {
276
8
        let size = self.read_size(limit, desc)?;
277
7
        Ok(BinaryReaderIter {
278
7
            remaining: size,
279
7
            reader: self,
280
7
            _marker: marker::PhantomData,
281
7
        })
282
8
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::instances::InstantiationArg>
Line
Count
Source
268
6
    pub fn read_iter<'me, T>(
269
6
        &'me mut self,
270
6
        limit: usize,
271
6
        desc: &str,
272
6
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
6
    where
274
6
        T: FromReader<'a>,
275
    {
276
6
        let size = self.read_size(limit, desc)?;
277
5
        Ok(BinaryReaderIter {
278
5
            remaining: size,
279
5
            reader: self,
280
5
            _marker: marker::PhantomData,
281
5
        })
282
6
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<wasmparser::readers::component::instances::ComponentInstantiationArg>
Line
Count
Source
268
11
    pub fn read_iter<'me, T>(
269
11
        &'me mut self,
270
11
        limit: usize,
271
11
        desc: &str,
272
11
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
11
    where
274
11
        T: FromReader<'a>,
275
    {
276
11
        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
11
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<&str>
Line
Count
Source
268
17
    pub fn read_iter<'me, T>(
269
17
        &'me mut self,
270
17
        limit: usize,
271
17
        desc: &str,
272
17
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
17
    where
274
17
        T: FromReader<'a>,
275
    {
276
17
        let size = self.read_size(limit, desc)?;
277
15
        Ok(BinaryReaderIter {
278
15
            remaining: size,
279
15
            reader: self,
280
15
            _marker: marker::PhantomData,
281
15
        })
282
17
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<(&str, wasmparser::readers::component::types::ComponentValType)>
Line
Count
Source
268
15
    pub fn read_iter<'me, T>(
269
15
        &'me mut self,
270
15
        limit: usize,
271
15
        desc: &str,
272
15
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
15
    where
274
15
        T: FromReader<'a>,
275
    {
276
15
        let size = self.read_size(limit, desc)?;
277
15
        Ok(BinaryReaderIter {
278
15
            remaining: size,
279
15
            reader: self,
280
15
            _marker: marker::PhantomData,
281
15
        })
282
15
    }
<wasmparser::binary_reader::BinaryReader>::read_iter::<u32>
Line
Count
Source
268
41
    pub fn read_iter<'me, T>(
269
41
        &'me mut self,
270
41
        limit: usize,
271
41
        desc: &str,
272
41
    ) -> Result<BinaryReaderIter<'a, 'me, T>>
273
41
    where
274
41
        T: FromReader<'a>,
275
    {
276
41
        let size = self.read_size(limit, desc)?;
277
35
        Ok(BinaryReaderIter {
278
35
            remaining: size,
279
35
            reader: self,
280
35
            _marker: marker::PhantomData,
281
35
        })
282
41
    }
283
284
    /// Returns whether the `BinaryReader` has reached the end of the file.
285
    #[inline]
286
70.2k
    pub fn eof(&self) -> bool {
287
70.2k
        self.position >= self.max_position()
288
70.2k
    }
289
290
    /// Returns the `BinaryReader`'s current position.
291
    #[inline]
292
24.9k
    pub fn current_position(&self) -> usize {
293
24.9k
        self.position
294
24.9k
    }
295
296
    /// Returns the number of bytes remaining in the `BinaryReader`.
297
    #[inline]
298
80.6k
    pub fn bytes_remaining(&self) -> usize {
299
80.6k
        self.max_position() - self.position
300
80.6k
    }
<wasmparser::binary_reader::BinaryReader>::bytes_remaining
Line
Count
Source
298
14
    pub fn bytes_remaining(&self) -> usize {
299
14
        self.max_position() - self.position
300
14
    }
<wasmparser::binary_reader::BinaryReader>::bytes_remaining
Line
Count
Source
298
80.6k
    pub fn bytes_remaining(&self) -> usize {
299
80.6k
        self.max_position() - self.position
300
80.6k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::bytes_remaining
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
47.8k
    pub fn read_bytes(&mut self, size: usize) -> Result<&'a [u8]> {
308
47.8k
        let start = self.position;
309
47.8k
        let end = self.ensure_has_bytes(size)?;
310
47.5k
        self.position = end;
311
47.5k
        Ok(&self.buffer[start..end])
312
47.8k
    }
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
6.04k
    pub fn read_reader(&mut self) -> Result<BinaryReader<'a>> {
317
6.04k
        let size = self.read_var_u32()? as usize;
318
6.03k
        self.skip(|reader| {
319
6.03k
            reader.read_bytes(size)?;
320
6.03k
            Ok(())
321
6.03k
        })
322
6.04k
    }
323
324
    /// Advances the `BinaryReader` four bytes and returns a `u32`.
325
    /// # Errors
326
    /// If `BinaryReader` has less than four bytes remaining.
327
5.31k
    pub fn read_u32(&mut self) -> Result<u32> {
328
5.31k
        let chunk = self.read_bytes(4)?;
329
5.30k
        let word = u32::from_le_bytes(chunk.try_into().unwrap());
330
5.30k
        Ok(word)
331
5.31k
    }
332
333
    /// Advances the `BinaryReader` eight bytes and returns a `u64`.
334
    /// # Errors
335
    /// If `BinaryReader` has less than eight bytes remaining.
336
650
    pub fn read_u64(&mut self) -> Result<u64> {
337
650
        let chunk = self.read_bytes(8)?;
338
626
        let word = u64::from_le_bytes(chunk.try_into().unwrap());
339
626
        Ok(word)
340
650
    }
341
342
    /// Advances the `BinaryReader` a single byte.
343
    ///
344
    /// # Errors
345
    ///
346
    /// If `BinaryReader` has no bytes remaining.
347
    #[inline]
348
633k
    pub fn read_u8(&mut self) -> Result<u8> {
349
633k
        let b = match self.buffer.get(self.position) {
350
632k
            Some(b) => *b,
351
1.59k
            None => return Err(self.eof_err(1)),
352
        };
353
632k
        self.position += 1;
354
632k
        Ok(b)
355
633k
    }
<wasmparser::binary_reader::BinaryReader>::read_u8
Line
Count
Source
348
5.92k
    pub fn read_u8(&mut self) -> Result<u8> {
349
5.92k
        let b = match self.buffer.get(self.position) {
350
5.92k
            Some(b) => *b,
351
2
            None => return Err(self.eof_err(1)),
352
        };
353
5.92k
        self.position += 1;
354
5.92k
        Ok(b)
355
5.92k
    }
<wasmparser::binary_reader::BinaryReader>::read_u8
Line
Count
Source
348
627k
    pub fn read_u8(&mut self) -> Result<u8> {
349
627k
        let b = match self.buffer.get(self.position) {
350
626k
            Some(b) => *b,
351
1.58k
            None => return Err(self.eof_err(1)),
352
        };
353
626k
        self.position += 1;
354
626k
        Ok(b)
355
627k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read_u8
356
357
    #[cold]
358
1.92k
    fn eof_err(&self, hint: usize) -> Error {
359
1.92k
        Error::eof(self.original_position(), hint)
360
1.92k
    }
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
224k
    pub fn read_var_u32(&mut self) -> Result<u32> {
371
        // Optimization for single byte i32.
372
224k
        let byte = self.read_u8()?;
373
223k
        if (byte & 0x80) == 0 {
374
211k
            Ok(u32::from(byte))
375
        } else {
376
12.0k
            self.read_var_u32_big(byte)
377
        }
378
224k
    }
<wasmparser::binary_reader::BinaryReader>::read_var_u32
Line
Count
Source
370
5.92k
    pub fn read_var_u32(&mut self) -> Result<u32> {
371
        // Optimization for single byte i32.
372
5.92k
        let byte = self.read_u8()?;
373
5.92k
        if (byte & 0x80) == 0 {
374
5.91k
            Ok(u32::from(byte))
375
        } else {
376
8
            self.read_var_u32_big(byte)
377
        }
378
5.92k
    }
<wasmparser::binary_reader::BinaryReader>::read_var_u32
Line
Count
Source
370
218k
    pub fn read_var_u32(&mut self) -> Result<u32> {
371
        // Optimization for single byte i32.
372
218k
        let byte = self.read_u8()?;
373
217k
        if (byte & 0x80) == 0 {
374
205k
            Ok(u32::from(byte))
375
        } else {
376
12.0k
            self.read_var_u32_big(byte)
377
        }
378
218k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::read_var_u32
379
380
12.0k
    fn read_var_u32_big(&mut self, byte: u8) -> Result<u32> {
381
12.0k
        let mut result = (byte & 0x7F) as u32;
382
12.0k
        let mut shift = 7;
383
        loop {
384
32.2k
            let byte = self.read_u8()?;
385
32.1k
            result |= ((byte & 0x7F) as u32) << shift;
386
32.1k
            if shift >= 25 && (byte >> (32 - shift)) != 0 {
387
334
                let msg = if byte & 0x80 != 0 {
388
283
                    "invalid var_u32: integer representation too long"
389
                } else {
390
51
                    "invalid var_u32: integer too large"
391
                };
392
                // The continuation bit or unused bits are set.
393
334
                return Err(Error::new(msg, self.original_position() - 1));
394
31.8k
            }
395
31.8k
            shift += 7;
396
31.8k
            if (byte & 0x80) == 0 {
397
11.5k
                break;
398
20.2k
            }
399
        }
400
11.5k
        Ok(result)
401
12.0k
    }
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
20.5k
    pub fn read_var_u64(&mut self) -> Result<u64> {
412
        // Optimization for single byte u64.
413
20.5k
        let byte = u64::from(self.read_u8()?);
414
20.4k
        if (byte & 0x80) == 0 {
415
16.9k
            Ok(byte)
416
        } else {
417
3.57k
            self.read_var_u64_big(byte)
418
        }
419
20.5k
    }
420
421
3.57k
    fn read_var_u64_big(&mut self, byte: u64) -> Result<u64> {
422
3.57k
        let mut result = byte & 0x7F;
423
3.57k
        let mut shift = 7;
424
        loop {
425
6.55k
            let byte = u64::from(self.read_u8()?);
426
6.53k
            result |= (byte & 0x7F) << shift;
427
6.53k
            if shift >= 57 && (byte >> (64 - shift)) != 0 {
428
21
                let msg = if byte & 0x80 != 0 {
429
21
                    "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
21
                return Err(Error::new(msg, self.original_position() - 1));
435
6.51k
            }
436
6.51k
            shift += 7;
437
6.51k
            if (byte & 0x80) == 0 {
438
3.53k
                break;
439
2.97k
            }
440
        }
441
3.53k
        Ok(result)
442
3.57k
    }
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
25.1k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
25.1k
        let start_offset = self.original_position();
448
25.1k
        let start = self.position;
449
25.1k
        f(self)?;
450
22.5k
        let mut ret = self.clone();
451
22.5k
        ret.buffer = &self.buffer[start..self.position];
452
22.5k
        ret.original_offset = start_offset;
453
22.5k
        ret.position = 0;
454
22.5k
        Ok(ret)
455
25.1k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::single_item<wasmparser::readers::component::start::ComponentStartFunction>::{closure#0}>
Line
Count
Source
446
25
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
25
        let start_offset = self.original_position();
448
25
        let start = self.position;
449
25
        f(self)?;
450
16
        let mut ret = self.clone();
451
16
        ret.buffer = &self.buffer[start..self.position];
452
16
        ret.original_offset = start_offset;
453
16
        ret.position = 0;
454
16
        Ok(ret)
455
25
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::single_item<u32>::{closure#0}>
Line
Count
Source
446
46
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
46
        let start_offset = self.original_position();
448
46
        let start = self.position;
449
46
        f(self)?;
450
29
        let mut ret = self.clone();
451
29
        ret.buffer = &self.buffer[start..self.position];
452
29
        ret.original_offset = start_offset;
453
29
        ret.position = 0;
454
29
        Ok(ret)
455
46
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::data::Data>>::{closure#0}>
Line
Count
Source
446
428
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
428
        let start_offset = self.original_position();
448
428
        let start = self.position;
449
428
        f(self)?;
450
424
        let mut ret = self.clone();
451
424
        ret.buffer = &self.buffer[start..self.position];
452
424
        ret.original_offset = start_offset;
453
424
        ret.position = 0;
454
424
        Ok(ret)
455
428
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::types::MemoryType>>::{closure#0}>
Line
Count
Source
446
1.55k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
1.55k
        let start_offset = self.original_position();
448
1.55k
        let start = self.position;
449
1.55k
        f(self)?;
450
1.54k
        let mut ret = self.clone();
451
1.54k
        ret.buffer = &self.buffer[start..self.position];
452
1.54k
        ret.original_offset = start_offset;
453
1.54k
        ret.position = 0;
454
1.54k
        Ok(ret)
455
1.55k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::types::TagType>>::{closure#0}>
Line
Count
Source
446
27
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
27
        let start_offset = self.original_position();
448
27
        let start = self.position;
449
27
        f(self)?;
450
27
        let mut ret = self.clone();
451
27
        ret.buffer = &self.buffer[start..self.position];
452
27
        ret.original_offset = start_offset;
453
27
        ret.position = 0;
454
27
        Ok(ret)
455
27
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::types::RecGroup>>::{closure#0}>
Line
Count
Source
446
2.01k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
2.01k
        let start_offset = self.original_position();
448
2.01k
        let start = self.position;
449
2.01k
        f(self)?;
450
2.00k
        let mut ret = self.clone();
451
2.00k
        ret.buffer = &self.buffer[start..self.position];
452
2.00k
        ret.original_offset = start_offset;
453
2.00k
        ret.position = 0;
454
2.00k
        Ok(ret)
455
2.01k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::tables::Table>>::{closure#0}>
Line
Count
Source
446
1.60k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
1.60k
        let start_offset = self.original_position();
448
1.60k
        let start = self.position;
449
1.60k
        f(self)?;
450
1.59k
        let mut ret = self.clone();
451
1.59k
        ret.buffer = &self.buffer[start..self.position];
452
1.59k
        ret.original_offset = start_offset;
453
1.59k
        ret.position = 0;
454
1.59k
        Ok(ret)
455
1.60k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::exports::Export>>::{closure#0}>
Line
Count
Source
446
719
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
719
        let start_offset = self.original_position();
448
719
        let start = self.position;
449
719
        f(self)?;
450
714
        let mut ret = self.clone();
451
714
        ret.buffer = &self.buffer[start..self.position];
452
714
        ret.original_offset = start_offset;
453
714
        ret.position = 0;
454
714
        Ok(ret)
455
719
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::globals::Global>>::{closure#0}>
Line
Count
Source
446
1.62k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
1.62k
        let start_offset = self.original_position();
448
1.62k
        let start = self.position;
449
1.62k
        f(self)?;
450
1.61k
        let mut ret = self.clone();
451
1.61k
        ret.buffer = &self.buffer[start..self.position];
452
1.61k
        ret.original_offset = start_offset;
453
1.61k
        ret.position = 0;
454
1.61k
        Ok(ret)
455
1.62k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::imports::Imports>>::{closure#0}>
Line
Count
Source
446
1.77k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
1.77k
        let start_offset = self.original_position();
448
1.77k
        let start = self.position;
449
1.77k
        f(self)?;
450
1.76k
        let mut ret = self.clone();
451
1.76k
        ret.buffer = &self.buffer[start..self.position];
452
1.76k
        ret.original_offset = start_offset;
453
1.76k
        ret.position = 0;
454
1.76k
        Ok(ret)
455
1.77k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::core::elements::Element>>::{closure#0}>
Line
Count
Source
446
1.47k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
1.47k
        let start_offset = self.original_position();
448
1.47k
        let start = self.position;
449
1.47k
        f(self)?;
450
1.47k
        let mut ret = self.clone();
451
1.47k
        ret.buffer = &self.buffer[start..self.position];
452
1.47k
        ret.original_offset = start_offset;
453
1.47k
        ret.position = 0;
454
1.47k
        Ok(ret)
455
1.47k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::canonicals::CanonicalFunction>>::{closure#0}>
Line
Count
Source
446
138
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
138
        let start_offset = self.original_position();
448
138
        let start = self.position;
449
138
        f(self)?;
450
136
        let mut ret = self.clone();
451
136
        ret.buffer = &self.buffer[start..self.position];
452
136
        ret.original_offset = start_offset;
453
136
        ret.position = 0;
454
136
        Ok(ret)
455
138
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::types::ComponentType>>::{closure#0}>
Line
Count
Source
446
154
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
154
        let start_offset = self.original_position();
448
154
        let start = self.position;
449
154
        f(self)?;
450
153
        let mut ret = self.clone();
451
153
        ret.buffer = &self.buffer[start..self.position];
452
153
        ret.original_offset = start_offset;
453
153
        ret.position = 0;
454
153
        Ok(ret)
455
154
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::types::CoreType>>::{closure#0}>
Line
Count
Source
446
31
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
31
        let start_offset = self.original_position();
448
31
        let start = self.position;
449
31
        f(self)?;
450
29
        let mut ret = self.clone();
451
29
        ret.buffer = &self.buffer[start..self.position];
452
29
        ret.original_offset = start_offset;
453
29
        ret.position = 0;
454
29
        Ok(ret)
455
31
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::aliases::ComponentAlias>>::{closure#0}>
Line
Count
Source
446
33
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
33
        let start_offset = self.original_position();
448
33
        let start = self.position;
449
33
        f(self)?;
450
32
        let mut ret = self.clone();
451
32
        ret.buffer = &self.buffer[start..self.position];
452
32
        ret.original_offset = start_offset;
453
32
        ret.position = 0;
454
32
        Ok(ret)
455
33
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::exports::ComponentExport>>::{closure#0}>
Line
Count
Source
446
47
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
47
        let start_offset = self.original_position();
448
47
        let start = self.position;
449
47
        f(self)?;
450
44
        let mut ret = self.clone();
451
44
        ret.buffer = &self.buffer[start..self.position];
452
44
        ret.original_offset = start_offset;
453
44
        ret.position = 0;
454
44
        Ok(ret)
455
47
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::imports::ComponentImport>>::{closure#0}>
Line
Count
Source
446
20
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
20
        let start_offset = self.original_position();
448
20
        let start = self.position;
449
20
        f(self)?;
450
20
        let mut ret = self.clone();
451
20
        ret.buffer = &self.buffer[start..self.position];
452
20
        ret.original_offset = start_offset;
453
20
        ret.position = 0;
454
20
        Ok(ret)
455
20
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::instances::ComponentInstance>>::{closure#0}>
Line
Count
Source
446
32
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
32
        let start_offset = self.original_position();
448
32
        let start = self.position;
449
32
        f(self)?;
450
32
        let mut ret = self.clone();
451
32
        ret.buffer = &self.buffer[start..self.position];
452
32
        ret.original_offset = start_offset;
453
32
        ret.position = 0;
454
32
        Ok(ret)
455
32
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<wasmparser::readers::component::instances::Instance>>::{closure#0}>
Line
Count
Source
446
19
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
19
        let start_offset = self.original_position();
448
19
        let start = self.position;
449
19
        f(self)?;
450
19
        let mut ret = self.clone();
451
19
        ret.buffer = &self.buffer[start..self.position];
452
19
        ret.original_offset = start_offset;
453
19
        ret.position = 0;
454
19
        Ok(ret)
455
19
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::SectionLimited<u32>>::{closure#0}>
Line
Count
Source
446
1.57k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
1.57k
        let start_offset = self.original_position();
448
1.57k
        let start = self.position;
449
1.57k
        f(self)?;
450
1.56k
        let mut ret = self.clone();
451
1.56k
        ret.buffer = &self.buffer[start..self.position];
452
1.56k
        ret.original_offset = start_offset;
453
1.56k
        ret.position = 0;
454
1.56k
        Ok(ret)
455
1.57k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<wasmparser::parser::section<wasmparser::readers::core::custom::CustomSectionReader>::{closure#0}>
Line
Count
Source
446
484
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
484
        let start_offset = self.original_position();
448
484
        let start = self.position;
449
484
        f(self)?;
450
463
        let mut ret = self.clone();
451
463
        ret.buffer = &self.buffer[start..self.position];
452
463
        ret.original_offset = start_offset;
453
463
        ret.position = 0;
454
463
        Ok(ret)
455
484
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::binary_reader::BinaryReader>::read_reader::{closure#0}>
Line
Count
Source
446
6.03k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
6.03k
        let start_offset = self.original_position();
448
6.03k
        let start = self.position;
449
6.03k
        f(self)?;
450
6.03k
        let mut ret = self.clone();
451
6.03k
        ret.buffer = &self.buffer[start..self.position];
452
6.03k
        ret.original_offset = start_offset;
453
6.03k
        ret.position = 0;
454
6.03k
        Ok(ret)
455
6.03k
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::binary_reader::BinaryReader>::read_br_table::{closure#0}>
Line
Count
Source
446
182
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
182
        let start_offset = self.original_position();
448
182
        let start = self.position;
449
182
        f(self)?;
450
149
        let mut ret = self.clone();
451
149
        ret.buffer = &self.buffer[start..self.position];
452
149
        ret.original_offset = start_offset;
453
149
        ret.position = 0;
454
149
        Ok(ret)
455
182
    }
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
23
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
23
        let start_offset = self.original_position();
448
23
        let start = self.position;
449
23
        f(self)?;
450
11
        let mut ret = self.clone();
451
11
        ret.buffer = &self.buffer[start..self.position];
452
11
        ret.original_offset = start_offset;
453
11
        ret.position = 0;
454
11
        Ok(ret)
455
23
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::imports::Imports as wasmparser::readers::FromReader>::from_reader::{closure#1}>
Line
Count
Source
446
24
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
24
        let start_offset = self.original_position();
448
24
        let start = self.position;
449
24
        f(self)?;
450
15
        let mut ret = self.clone();
451
15
        ret.buffer = &self.buffer[start..self.position];
452
15
        ret.original_offset = start_offset;
453
15
        ret.position = 0;
454
15
        Ok(ret)
455
24
    }
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::elements::Element as wasmparser::readers::FromReader>::from_reader::{closure#0}>
Line
Count
Source
446
79
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
79
        let start_offset = self.original_position();
448
79
        let start = self.position;
449
79
        f(self)?;
450
62
        let mut ret = self.clone();
451
62
        ret.buffer = &self.buffer[start..self.position];
452
62
        ret.original_offset = start_offset;
453
62
        ret.position = 0;
454
62
        Ok(ret)
455
79
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::producers::ProducersField as wasmparser::readers::FromReader>::from_reader::{closure#0}>
<wasmparser::binary_reader::BinaryReader>::skip::<<wasmparser::readers::core::init::ConstExpr as wasmparser::readers::FromReader>::from_reader::{closure#0}>
Line
Count
Source
446
4.96k
    pub fn skip(&mut self, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<Self> {
447
4.96k
        let start_offset = self.original_position();
448
4.96k
        let start = self.position;
449
4.96k
        f(self)?;
450
2.56k
        let mut ret = self.clone();
451
2.56k
        ret.buffer = &self.buffer[start..self.position];
452
2.56k
        ret.original_offset = start_offset;
453
2.56k
        ret.position = 0;
454
2.56k
        Ok(ret)
455
4.96k
    }
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
231
    pub fn skip_string(&mut self) -> Result<()> {
464
231
        let len = self.read_var_u32()? as usize;
465
228
        if len > MAX_WASM_STRING_SIZE {
466
2
            return Err(Error::new(
467
2
                "string size out of bounds",
468
2
                self.original_position() - 1,
469
2
            ));
470
226
        }
471
226
        self.ensure_has_bytes(len)?;
472
219
        self.position += len;
473
219
        Ok(())
474
231
    }
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
10.7k
    pub fn read_var_i32(&mut self) -> Result<i32> {
483
        // Optimization for single byte i32.
484
10.7k
        let byte = self.read_u8()?;
485
10.7k
        if (byte & 0x80) == 0 {
486
7.04k
            Ok(((byte as i32) << 25) >> 25)
487
        } else {
488
3.70k
            self.read_var_i32_big(byte)
489
        }
490
10.7k
    }
491
492
3.70k
    fn read_var_i32_big(&mut self, byte: u8) -> Result<i32> {
493
3.70k
        let mut result = (byte & 0x7F) as i32;
494
3.70k
        let mut shift = 7;
495
        loop {
496
9.92k
            let byte = self.read_u8()?;
497
9.90k
            result |= ((byte & 0x7F) as i32) << shift;
498
9.90k
            if shift >= 25 {
499
1.16k
                let continuation_bit = (byte & 0x80) != 0;
500
1.16k
                let sign_and_unused_bit = (byte << 1) as i8 >> (32 - shift);
501
1.16k
                if continuation_bit || (sign_and_unused_bit != 0 && sign_and_unused_bit != -1) {
502
11
                    let msg = if continuation_bit {
503
10
                        "invalid var_i32: integer representation too long"
504
                    } else {
505
1
                        "invalid var_i32: integer too large"
506
                    };
507
11
                    return Err(Error::new(msg, self.original_position() - 1));
508
1.15k
                }
509
1.15k
                return Ok(result);
510
8.74k
            }
511
8.74k
            shift += 7;
512
8.74k
            if (byte & 0x80) == 0 {
513
2.53k
                break;
514
6.21k
            }
515
        }
516
2.53k
        let ashift = 32 - shift;
517
2.53k
        Ok((result << ashift) >> ashift)
518
3.70k
    }
519
520
    /// Advances the `BinaryReader` up to four bytes to parse a variable
521
    /// length integer as a signed 33 bit integer, returned as a `i64`.
522
    /// # Errors
523
    /// If `BinaryReader` has less than one or up to five bytes remaining, or
524
    /// the integer is larger than 33 bits.
525
3.56k
    pub fn read_var_s33(&mut self) -> Result<i64> {
526
        // Optimization for single byte.
527
3.56k
        let byte = self.read_u8()?;
528
3.54k
        if (byte & 0x80) == 0 {
529
3.03k
            return Ok(((byte as i8) << 1) as i64 >> 1);
530
515
        }
531
532
515
        let mut result = (byte & 0x7F) as i64;
533
515
        let mut shift = 7;
534
        loop {
535
884
            let byte = self.read_u8()?;
536
876
            result |= ((byte & 0x7F) as i64) << shift;
537
876
            if shift >= 25 {
538
62
                let continuation_bit = (byte & 0x80) != 0;
539
62
                let sign_and_unused_bit = (byte << 1) as i8 >> (33 - shift);
540
62
                if continuation_bit || (sign_and_unused_bit != 0 && sign_and_unused_bit != -1) {
541
19
                    return Err(Error::new(
542
19
                        "invalid var_s33: integer representation too long",
543
19
                        self.original_position() - 1,
544
19
                    ));
545
43
                }
546
814
            }
547
857
            shift += 7;
548
857
            if (byte & 0x80) == 0 {
549
488
                break;
550
369
            }
551
        }
552
488
        let ashift = 64 - shift;
553
488
        Ok((result << ashift) >> ashift)
554
3.56k
    }
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
960
    pub fn read_var_i64(&mut self) -> Result<i64> {
562
960
        let mut result: i64 = 0;
563
960
        let mut shift = 0;
564
        loop {
565
1.76k
            let byte = self.read_u8()?;
566
1.76k
            result |= i64::from(byte & 0x7F) << shift;
567
1.76k
            if shift >= 57 {
568
24
                let continuation_bit = (byte & 0x80) != 0;
569
24
                let sign_and_unused_bit = ((byte << 1) as i8) >> (64 - shift);
570
24
                if continuation_bit || (sign_and_unused_bit != 0 && sign_and_unused_bit != -1) {
571
15
                    let msg = if continuation_bit {
572
10
                        "invalid var_i64: integer representation too long"
573
                    } else {
574
5
                        "invalid var_i64: integer too large"
575
                    };
576
15
                    return Err(Error::new(msg, self.original_position() - 1));
577
9
                }
578
9
                return Ok(result);
579
1.73k
            }
580
1.73k
            shift += 7;
581
1.73k
            if (byte & 0x80) == 0 {
582
930
                break;
583
808
            }
584
        }
585
930
        let ashift = 64 - shift;
586
930
        Ok((result << ashift) >> ashift)
587
960
    }
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
465
    pub fn read_f32(&mut self) -> Result<Ieee32> {
594
465
        let value = self.read_u32()?;
595
453
        Ok(Ieee32(value))
596
465
    }
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
650
    pub fn read_f64(&mut self) -> Result<Ieee64> {
603
650
        let value = self.read_u64()?;
604
626
        Ok(Ieee64(value))
605
650
    }
606
607
    /// (internal) Reads a fixed-size WebAssembly string from the module.
608
16.9k
    fn internal_read_string(&mut self, len: usize) -> Result<&'a str> {
609
16.9k
        let bytes = self.read_bytes(len)?;
610
16.9k
        str::from_utf8(bytes)
611
16.9k
            .map_err(|_| Error::new("malformed UTF-8 encoding", self.original_position() - 1))
612
16.9k
    }
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
16.8k
    pub fn read_string(&mut self) -> Result<&'a str> {
622
16.8k
        let len = self.read_var_u32()? as usize;
623
16.8k
        if len > MAX_WASM_STRING_SIZE {
624
12
            return Err(Error::new(
625
12
                "string size out of bounds",
626
12
                self.original_position() - 1,
627
12
            ));
628
16.8k
        }
629
16.8k
        return self.internal_read_string(len);
630
16.8k
    }
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
178
    pub fn read_unlimited_string(&mut self) -> Result<&'a str> {
638
178
        let len = self.read_var_u32()? as usize;
639
178
        return self.internal_read_string(len);
640
178
    }
641
642
    #[cold]
643
235
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
235
        Err(Self::invalid_leading_byte_error(
645
235
            byte,
646
235
            desc,
647
235
            self.original_position() - 1,
648
235
        ))
649
235
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<core::option::Option<wasmparser::readers::component::types::ComponentValType>>
Line
Count
Source
643
4
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
4
        Err(Self::invalid_leading_byte_error(
645
4
            byte,
646
4
            desc,
647
4
            self.original_position() - 1,
648
4
        ))
649
4
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::core::types::CompositeType>
Line
Count
Source
643
64
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
64
        Err(Self::invalid_leading_byte_error(
645
64
            byte,
646
64
            desc,
647
64
            self.original_position() - 1,
648
64
        ))
649
64
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::core::operators::Catch>
Line
Count
Source
643
43
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
43
        Err(Self::invalid_leading_byte_error(
645
43
            byte,
646
43
            desc,
647
43
            self.original_position() - 1,
648
43
        ))
649
43
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::core::operators::Handle>
Line
Count
Source
643
20
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
20
        Err(Self::invalid_leading_byte_error(
645
20
            byte,
646
20
            desc,
647
20
            self.original_position() - 1,
648
20
        ))
649
20
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::canonicals::CanonicalOption>
Line
Count
Source
643
4
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
4
        Err(Self::invalid_leading_byte_error(
645
4
            byte,
646
4
            desc,
647
4
            self.original_position() - 1,
648
4
        ))
649
4
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::canonicals::CanonicalFunction>
Line
Count
Source
643
29
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
29
        Err(Self::invalid_leading_byte_error(
645
29
            byte,
646
29
            desc,
647
29
            self.original_position() - 1,
648
29
        ))
649
29
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::types::VariantCase>
Line
Count
Source
643
1
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
1
        Err(Self::invalid_leading_byte_error(
645
1
            byte,
646
1
            desc,
647
1
            self.original_position() - 1,
648
1
        ))
649
1
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::types::ComponentType>
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::types::ComponentDefinedType>
Line
Count
Source
643
41
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
41
        Err(Self::invalid_leading_byte_error(
645
41
            byte,
646
41
            desc,
647
41
            self.original_position() - 1,
648
41
        ))
649
41
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::types::ModuleTypeDeclaration>
Line
Count
Source
643
1
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
1
        Err(Self::invalid_leading_byte_error(
645
1
            byte,
646
1
            desc,
647
1
            self.original_position() - 1,
648
1
        ))
649
1
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::types::InstanceTypeDeclaration>
Line
Count
Source
643
5
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
5
        Err(Self::invalid_leading_byte_error(
645
5
            byte,
646
5
            desc,
647
5
            self.original_position() - 1,
648
5
        ))
649
5
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::types::CoreType>
Line
Count
Source
643
1
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
1
        Err(Self::invalid_leading_byte_error(
645
1
            byte,
646
1
            desc,
647
1
            self.original_position() - 1,
648
1
        ))
649
1
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::aliases::ComponentAlias>
Line
Count
Source
643
6
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
6
        Err(Self::invalid_leading_byte_error(
645
6
            byte,
646
6
            desc,
647
6
            self.original_position() - 1,
648
6
        ))
649
6
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::imports::TypeBounds>
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::imports::ComponentNameOpt>
Line
Count
Source
643
1
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
1
        Err(Self::invalid_leading_byte_error(
645
1
            byte,
646
1
            desc,
647
1
            self.original_position() - 1,
648
1
        ))
649
1
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::imports::ComponentExternName>
Line
Count
Source
643
4
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
4
        Err(Self::invalid_leading_byte_error(
645
4
            byte,
646
4
            desc,
647
4
            self.original_position() - 1,
648
4
        ))
649
4
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::instances::ComponentInstance>
Line
Count
Source
643
2
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
2
        Err(Self::invalid_leading_byte_error(
645
2
            byte,
646
2
            desc,
647
2
            self.original_position() - 1,
648
2
        ))
649
2
    }
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::instances::InstantiationArgKind>
Line
Count
Source
643
1
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
1
        Err(Self::invalid_leading_byte_error(
645
1
            byte,
646
1
            desc,
647
1
            self.original_position() - 1,
648
1
        ))
649
1
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<wasmparser::readers::component::instances::Instance>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<bool>
<wasmparser::binary_reader::BinaryReader>::invalid_leading_byte::<()>
Line
Count
Source
643
8
    pub(crate) fn invalid_leading_byte<T>(&self, byte: u8, desc: &str) -> Result<T> {
644
8
        Err(Self::invalid_leading_byte_error(
645
8
            byte,
646
8
            desc,
647
8
            self.original_position() - 1,
648
8
        ))
649
8
    }
650
651
296
    pub(crate) fn invalid_leading_byte_error(byte: u8, desc: &str, offset: u64) -> Error {
652
296
        format_err!(offset, "invalid leading byte (0x{byte:x}) for {desc}")
653
296
    }
654
655
79.6k
    pub(crate) fn peek(&self) -> Result<u8> {
656
79.6k
        self.ensure_has_byte()?;
657
79.6k
        Ok(self.buffer[self.position])
658
79.6k
    }
659
660
18.0k
    pub(crate) fn peek_bytes(&self, len: usize) -> Result<&[u8]> {
661
18.0k
        let start = self.position;
662
18.0k
        let end = self.ensure_has_bytes(len)?;
663
18.0k
        Ok(&self.buffer[start..end])
664
18.0k
    }
665
666
4.87k
    pub(crate) fn read_block_type(&mut self) -> Result<BlockType> {
667
4.87k
        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
4.84k
        if b & 0x80 == 0 && b & 0x40 != 0 {
686
1.78k
            if b == 0x40 {
687
1.00k
                self.position += 1;
688
1.00k
                return Ok(BlockType::Empty);
689
779
            }
690
779
            return Ok(BlockType::Type(self.read()?));
691
3.05k
        }
692
693
        // Not empty or a singular type, so read the function type index
694
3.05k
        let idx = self.read_var_s33()?;
695
3.04k
        match u32::try_from(idx) {
696
3.03k
            Ok(idx) => Ok(BlockType::FuncType(idx)),
697
            Err(_) => {
698
8
                return Err(Error::new(
699
8
                    "invalid function type",
700
8
                    self.original_position(),
701
8
                ));
702
            }
703
        }
704
4.87k
    }
705
706
    /// Returns whether there is an `end` opcode followed by eof remaining in
707
    /// this reader.
708
0
    pub fn is_end_then_eof(&self) -> bool {
709
0
        self.remaining_buffer() == &[0x0b]
710
0
    }
711
712
4.85k
    pub(crate) fn read_header_version(&mut self) -> Result<u32> {
713
4.85k
        let magic_number = self.read_bytes(4)?;
714
4.85k
        if magic_number != WASM_MAGIC_NUMBER {
715
10
            return Err(Error::new(
716
10
                format!(
717
10
                    "magic header not detected: bad magic number - expected={WASM_MAGIC_NUMBER:#x?} actual={magic_number:#x?}"
718
10
                ),
719
10
                self.original_position() - 4,
720
10
            ));
721
4.84k
        }
722
4.84k
        self.read_u32()
723
4.85k
    }
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
51.5k
            pub(crate) fn $feature(&self) -> bool {
734
                #[cfg(feature = "features")]
735
                {
736
51.5k
                    self.features.$feature()
737
                }
738
                #[cfg(not(feature = "features"))]
739
                {
740
                    true
741
                }
742
51.5k
            }
<wasmparser::binary_reader::BinaryReader>::call_indirect_overlong
Line
Count
Source
733
663
            pub(crate) fn $feature(&self) -> bool {
734
                #[cfg(feature = "features")]
735
                {
736
663
                    self.features.$feature()
737
                }
738
                #[cfg(not(feature = "features"))]
739
                {
740
                    true
741
                }
742
663
            }
<wasmparser::binary_reader::BinaryReader>::cm_implements
Line
Count
Source
733
5
            pub(crate) fn $feature(&self) -> bool {
734
                #[cfg(feature = "features")]
735
                {
736
5
                    self.features.$feature()
737
                }
738
                #[cfg(not(feature = "features"))]
739
                {
740
                    true
741
                }
742
5
            }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::cm_canon_names
<wasmparser::binary_reader::BinaryReader>::multi_memory
Line
Count
Source
733
30.2k
            pub(crate) fn $feature(&self) -> bool {
734
                #[cfg(feature = "features")]
735
                {
736
30.2k
                    self.features.$feature()
737
                }
738
                #[cfg(not(feature = "features"))]
739
                {
740
                    true
741
                }
742
30.2k
            }
<wasmparser::binary_reader::BinaryReader>::memory64
Line
Count
Source
733
20.5k
            pub(crate) fn $feature(&self) -> bool {
734
                #[cfg(feature = "features")]
735
                {
736
20.5k
                    self.features.$feature()
737
                }
738
                #[cfg(not(feature = "features"))]
739
                {
740
                    true
741
                }
742
20.5k
            }
<wasmparser::binary_reader::BinaryReader>::gc
Line
Count
Source
733
26
            pub(crate) fn $feature(&self) -> bool {
734
                #[cfg(feature = "features")]
735
                {
736
26
                    self.features.$feature()
737
                }
738
                #[cfg(not(feature = "features"))]
739
                {
740
                    true
741
                }
742
26
            }
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
118k
    fn next(&mut self) -> Option<Result<T>> {
763
118k
        if self.remaining == 0 {
764
76.5k
            None
765
        } else {
766
41.6k
            let ret = self.reader.read::<T>();
767
41.6k
            if ret.is_err() {
768
284
                self.remaining = 0;
769
41.3k
            } else {
770
41.3k
                self.remaining -= 1;
771
41.3k
            }
772
41.6k
            Some(ret)
773
        }
774
118k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::SubType> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
35
    fn next(&mut self) -> Option<Result<T>> {
763
35
        if self.remaining == 0 {
764
20
            None
765
        } else {
766
15
            let ret = self.reader.read::<T>();
767
15
            if ret.is_err() {
768
14
                self.remaining = 0;
769
14
            } else {
770
1
                self.remaining -= 1;
771
1
            }
772
15
            Some(ret)
773
        }
774
35
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::ValType> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
115k
    fn next(&mut self) -> Option<Result<T>> {
763
115k
        if self.remaining == 0 {
764
75.8k
            None
765
        } else {
766
39.6k
            let ret = self.reader.read::<T>();
767
39.6k
            if ret.is_err() {
768
95
                self.remaining = 0;
769
39.5k
            } else {
770
39.5k
                self.remaining -= 1;
771
39.5k
            }
772
39.6k
            Some(ret)
773
        }
774
115k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::FieldType> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
56
    fn next(&mut self) -> Option<Result<T>> {
763
56
        if self.remaining == 0 {
764
33
            None
765
        } else {
766
23
            let ret = self.reader.read::<T>();
767
23
            if ret.is_err() {
768
11
                self.remaining = 0;
769
12
            } else {
770
12
                self.remaining -= 1;
771
12
            }
772
23
            Some(ret)
773
        }
774
56
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::exports::Export> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
52
    fn next(&mut self) -> Option<Result<T>> {
763
52
        if self.remaining == 0 {
764
20
            None
765
        } else {
766
32
            let ret = self.reader.read::<T>();
767
32
            if ret.is_err() {
768
4
                self.remaining = 0;
769
28
            } else {
770
28
                self.remaining -= 1;
771
28
            }
772
32
            Some(ret)
773
        }
774
52
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Catch> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
799
    fn next(&mut self) -> Option<Result<T>> {
763
799
        if self.remaining == 0 {
764
251
            None
765
        } else {
766
548
            let ret = self.reader.read::<T>();
767
548
            if ret.is_err() {
768
59
                self.remaining = 0;
769
489
            } else {
770
489
                self.remaining -= 1;
771
489
            }
772
548
            Some(ret)
773
        }
774
799
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Handle> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
433
    fn next(&mut self) -> Option<Result<T>> {
763
433
        if self.remaining == 0 {
764
151
            None
765
        } else {
766
282
            let ret = self.reader.read::<T>();
767
282
            if ret.is_err() {
768
39
                self.remaining = 0;
769
243
            } else {
770
243
                self.remaining -= 1;
771
243
            }
772
282
            Some(ret)
773
        }
774
433
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::canonicals::CanonicalOption> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
138
    fn next(&mut self) -> Option<Result<T>> {
763
138
        if self.remaining == 0 {
764
54
            None
765
        } else {
766
84
            let ret = self.reader.read::<T>();
767
84
            if ret.is_err() {
768
12
                self.remaining = 0;
769
72
            } else {
770
72
                self.remaining -= 1;
771
72
            }
772
84
            Some(ret)
773
        }
774
138
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::VariantCase> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
68
    fn next(&mut self) -> Option<Result<T>> {
763
68
        if self.remaining == 0 {
764
14
            None
765
        } else {
766
54
            let ret = self.reader.read::<T>();
767
54
            if ret.is_err() {
768
8
                self.remaining = 0;
769
46
            } else {
770
46
                self.remaining -= 1;
771
46
            }
772
54
            Some(ret)
773
        }
774
68
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ComponentValType> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
390
    fn next(&mut self) -> Option<Result<T>> {
763
390
        if self.remaining == 0 {
764
47
            None
765
        } else {
766
343
            let ret = self.reader.read::<T>();
767
343
            if ret.is_err() {
768
7
                self.remaining = 0;
769
336
            } else {
770
336
                self.remaining -= 1;
771
336
            }
772
343
            Some(ret)
773
        }
774
390
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ModuleTypeDeclaration> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
25
    fn next(&mut self) -> Option<Result<T>> {
763
25
        if self.remaining == 0 {
764
9
            None
765
        } else {
766
16
            let ret = self.reader.read::<T>();
767
16
            if ret.is_err() {
768
5
                self.remaining = 0;
769
11
            } else {
770
11
                self.remaining -= 1;
771
11
            }
772
16
            Some(ret)
773
        }
774
25
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::InstantiationArg> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
11
    fn next(&mut self) -> Option<Result<T>> {
763
11
        if self.remaining == 0 {
764
6
            None
765
        } else {
766
5
            let ret = self.reader.read::<T>();
767
5
            if ret.is_err() {
768
4
                self.remaining = 0;
769
4
            } else {
770
1
                self.remaining -= 1;
771
1
            }
772
5
            Some(ret)
773
        }
774
11
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::ComponentInstantiationArg> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
26
    fn next(&mut self) -> Option<Result<T>> {
763
26
        if self.remaining == 0 {
764
12
            None
765
        } else {
766
14
            let ret = self.reader.read::<T>();
767
14
            if ret.is_err() {
768
4
                self.remaining = 0;
769
10
            } else {
770
10
                self.remaining -= 1;
771
10
            }
772
14
            Some(ret)
773
        }
774
26
    }
<wasmparser::binary_reader::BinaryReaderIter<&str> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
56
    fn next(&mut self) -> Option<Result<T>> {
763
56
        if self.remaining == 0 {
764
28
            None
765
        } else {
766
28
            let ret = self.reader.read::<T>();
767
28
            if ret.is_err() {
768
2
                self.remaining = 0;
769
26
            } else {
770
26
                self.remaining -= 1;
771
26
            }
772
28
            Some(ret)
773
        }
774
56
    }
<wasmparser::binary_reader::BinaryReaderIter<(&str, wasmparser::readers::component::types::ComponentValType)> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
99
    fn next(&mut self) -> Option<Result<T>> {
763
99
        if self.remaining == 0 {
764
22
            None
765
        } else {
766
77
            let ret = self.reader.read::<T>();
767
77
            if ret.is_err() {
768
8
                self.remaining = 0;
769
69
            } else {
770
69
                self.remaining -= 1;
771
69
            }
772
77
            Some(ret)
773
        }
774
99
    }
<wasmparser::binary_reader::BinaryReaderIter<u32> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
762
490
    fn next(&mut self) -> Option<Result<T>> {
763
490
        if self.remaining == 0 {
764
58
            None
765
        } else {
766
432
            let ret = self.reader.read::<T>();
767
432
            if ret.is_err() {
768
12
                self.remaining = 0;
769
420
            } else {
770
420
                self.remaining -= 1;
771
420
            }
772
432
            Some(ret)
773
        }
774
490
    }
775
776
32.3k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
32.3k
        (self.remaining, Some(self.remaining))
778
32.3k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::SubType> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
17
    fn size_hint(&self) -> (usize, Option<usize>) {
777
17
        (self.remaining, Some(self.remaining))
778
17
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::ValType> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
31.8k
    fn size_hint(&self) -> (usize, Option<usize>) {
777
31.8k
        (self.remaining, Some(self.remaining))
778
31.8k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::FieldType> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
12
    fn size_hint(&self) -> (usize, Option<usize>) {
777
12
        (self.remaining, Some(self.remaining))
778
12
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::exports::Export> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
8
    fn size_hint(&self) -> (usize, Option<usize>) {
777
8
        (self.remaining, Some(self.remaining))
778
8
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Catch> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
146
    fn size_hint(&self) -> (usize, Option<usize>) {
777
146
        (self.remaining, Some(self.remaining))
778
146
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Handle> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
64
    fn size_hint(&self) -> (usize, Option<usize>) {
777
64
        (self.remaining, Some(self.remaining))
778
64
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::canonicals::CanonicalOption> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
29
    fn size_hint(&self) -> (usize, Option<usize>) {
777
29
        (self.remaining, Some(self.remaining))
778
29
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::VariantCase> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
11
    fn size_hint(&self) -> (usize, Option<usize>) {
777
11
        (self.remaining, Some(self.remaining))
778
11
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ComponentValType> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
76
    fn size_hint(&self) -> (usize, Option<usize>) {
777
76
        (self.remaining, Some(self.remaining))
778
76
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ModuleTypeDeclaration> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
5
    fn size_hint(&self) -> (usize, Option<usize>) {
777
5
        (self.remaining, Some(self.remaining))
778
5
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::InstantiationArg> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
1
    fn size_hint(&self) -> (usize, Option<usize>) {
777
1
        (self.remaining, Some(self.remaining))
778
1
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::ComponentInstantiationArg> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
6
    fn size_hint(&self) -> (usize, Option<usize>) {
777
6
        (self.remaining, Some(self.remaining))
778
6
    }
<wasmparser::binary_reader::BinaryReaderIter<&str> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
16
    fn size_hint(&self) -> (usize, Option<usize>) {
777
16
        (self.remaining, Some(self.remaining))
778
16
    }
<wasmparser::binary_reader::BinaryReaderIter<(&str, wasmparser::readers::component::types::ComponentValType)> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
14
    fn size_hint(&self) -> (usize, Option<usize>) {
777
14
        (self.remaining, Some(self.remaining))
778
14
    }
<wasmparser::binary_reader::BinaryReaderIter<u32> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
776
57
    fn size_hint(&self) -> (usize, Option<usize>) {
777
57
        (self.remaining, Some(self.remaining))
778
57
    }
779
}
780
781
impl<'a, T> Drop for BinaryReaderIter<'a, '_, T>
782
where
783
    T: FromReader<'a>,
784
{
785
38.4k
    fn drop(&mut self) {
786
38.4k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
38.4k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::SubType> as core::ops::drop::Drop>::drop
Line
Count
Source
785
17
    fn drop(&mut self) {
786
17
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
17
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::ValType> as core::ops::drop::Drop>::drop
Line
Count
Source
785
37.9k
    fn drop(&mut self) {
786
37.9k
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
37.9k
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::types::FieldType> as core::ops::drop::Drop>::drop
Line
Count
Source
785
22
    fn drop(&mut self) {
786
22
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
22
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::exports::Export> as core::ops::drop::Drop>::drop
Line
Count
Source
785
12
    fn drop(&mut self) {
786
12
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
12
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Catch> as core::ops::drop::Drop>::drop
Line
Count
Source
785
155
    fn drop(&mut self) {
786
155
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
155
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::core::operators::Handle> as core::ops::drop::Drop>::drop
Line
Count
Source
785
95
    fn drop(&mut self) {
786
95
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
95
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::canonicals::CanonicalOption> as core::ops::drop::Drop>::drop
Line
Count
Source
785
33
    fn drop(&mut self) {
786
33
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
33
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::VariantCase> as core::ops::drop::Drop>::drop
Line
Count
Source
785
11
    fn drop(&mut self) {
786
11
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
11
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ComponentValType> as core::ops::drop::Drop>::drop
Line
Count
Source
785
27
    fn drop(&mut self) {
786
27
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
27
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::types::ModuleTypeDeclaration> as core::ops::drop::Drop>::drop
Line
Count
Source
785
7
    fn drop(&mut self) {
786
7
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
7
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::InstantiationArg> as core::ops::drop::Drop>::drop
Line
Count
Source
785
5
    fn drop(&mut self) {
786
5
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
5
    }
<wasmparser::binary_reader::BinaryReaderIter<wasmparser::readers::component::instances::ComponentInstantiationArg> 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<&str> as core::ops::drop::Drop>::drop
Line
Count
Source
785
15
    fn drop(&mut self) {
786
15
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
15
    }
<wasmparser::binary_reader::BinaryReaderIter<(&str, wasmparser::readers::component::types::ComponentValType)> as core::ops::drop::Drop>::drop
Line
Count
Source
785
15
    fn drop(&mut self) {
786
15
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
15
    }
<wasmparser::binary_reader::BinaryReaderIter<u32> as core::ops::drop::Drop>::drop
Line
Count
Source
785
35
    fn drop(&mut self) {
786
35
        while self.next().is_some() {
787
0
            // ...
788
0
        }
789
35
    }
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
5.44k
    pub fn finish_expression(&self, stack: &impl FrameStack) -> Result<()> {
796
5.44k
        if stack.current_frame().is_some() {
797
36
            bail!(
798
36
                self.original_position(),
799
36
                "control frames remain at end of function body or expression"
800
            );
801
5.41k
        }
802
5.41k
        if !self.eof() {
803
0
            bail!(
804
0
                self.original_position(),
805
0
                "unexpected data at the end of operators"
806
            );
807
5.41k
        }
808
5.41k
        Ok(())
809
5.44k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::finish_expression::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>
<wasmparser::binary_reader::BinaryReader>::finish_expression::<wasmparser::readers::core::operators::OperatorsReader>
Line
Count
Source
795
5.44k
    pub fn finish_expression(&self, stack: &impl FrameStack) -> Result<()> {
796
5.44k
        if stack.current_frame().is_some() {
797
36
            bail!(
798
36
                self.original_position(),
799
36
                "control frames remain at end of function body or expression"
800
            );
801
5.41k
        }
802
5.41k
        if !self.eof() {
803
0
            bail!(
804
0
                self.original_position(),
805
0
                "unexpected data at the end of operators"
806
            );
807
5.41k
        }
808
5.41k
        Ok(())
809
5.44k
    }
810
811
    #[inline]
812
530
    fn expect_frame(&mut self, stack: &impl FrameStack, k: FrameKind, found: &str) -> Result<()> {
813
530
        if stack.current_frame() == Some(k) {
814
309
            return Ok(());
815
221
        }
816
221
        bail!(
817
221
            self.original_position(),
818
221
            "`{}` found outside `{:?}` block",
819
            found,
820
            k
821
        );
822
530
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::expect_frame::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>
<wasmparser::binary_reader::BinaryReader>::expect_frame::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
812
20
    fn expect_frame(&mut self, stack: &impl FrameStack, k: FrameKind, found: &str) -> Result<()> {
813
20
        if stack.current_frame() == Some(k) {
814
8
            return Ok(());
815
12
        }
816
12
        bail!(
817
12
            self.original_position(),
818
12
            "`{}` found outside `{:?}` block",
819
            found,
820
            k
821
        );
822
20
    }
<wasmparser::binary_reader::BinaryReader>::expect_frame::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>
Line
Count
Source
812
510
    fn expect_frame(&mut self, stack: &impl FrameStack, k: FrameKind, found: &str) -> Result<()> {
813
510
        if stack.current_frame() == Some(k) {
814
301
            return Ok(());
815
209
        }
816
209
        bail!(
817
209
            self.original_position(),
818
209
            "`{}` found outside `{:?}` block",
819
            found,
820
            k
821
        );
822
510
    }
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
217k
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
830
217k
    where
831
217k
        T: VisitOperator<'a> + FrameStack,
832
    {
833
217k
        if visitor.current_frame().is_none() {
834
6
            bail!(
835
6
                self.original_position(),
836
6
                "operators remaining after end of function body or expression"
837
            );
838
217k
        }
839
217k
        let pos = self.original_position();
840
217k
        let code = self.read_u8()?;
841
216k
        Ok(match code {
842
48.8k
            0x00 => visitor.visit_unreachable(),
843
3.90k
            0x01 => visitor.visit_nop(),
844
1.92k
            0x02 => visitor.visit_block(self.read_block_type()?),
845
1.01k
            0x03 => visitor.visit_loop(self.read_block_type()?),
846
624
            0x04 => visitor.visit_if(self.read_block_type()?),
847
            0x05 => {
848
55
                self.expect_frame(visitor, FrameKind::If, "else")?;
849
23
                visitor.visit_else()
850
            }
851
            0x06 => {
852
                #[cfg(feature = "features")]
853
1.14k
                require_feature::legacy_exceptions(
854
1.14k
                    self.features,
855
                    "legacy_exceptions feature required for try instruction",
856
1.14k
                    pos,
857
0
                )?;
858
1.14k
                visitor.visit_try(self.read_block_type()?)
859
            }
860
            0x07 => {
861
                #[cfg(feature = "features")]
862
211
                require_feature::legacy_exceptions(
863
211
                    self.features,
864
                    "legacy_exceptions feature required for catch instruction",
865
211
                    pos,
866
0
                )?;
867
211
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
868
84
                    Ok(()) => (),
869
127
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
870
                }
871
194
                visitor.visit_catch(self.read_var_u32()?)
872
            }
873
1.15k
            0x08 => visitor.visit_throw(self.read_var_u32()?),
874
1.82k
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
875
1.05k
            0x0a => visitor.visit_throw_ref(),
876
11.0k
            0x0b => visitor.visit_end(),
877
2.12k
            0x0c => visitor.visit_br(self.read_var_u32()?),
878
1.66k
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
879
187
            0x0e => visitor.visit_br_table(self.read_br_table()?),
880
2.50k
            0x0f => visitor.visit_return(),
881
3.89k
            0x10 => visitor.visit_call(self.read_var_u32()?),
882
            0x11 => {
883
666
                let index = self.read_var_u32()?;
884
663
                let table = self.read_call_indirect_table_immediate()?;
885
654
                visitor.visit_call_indirect(index, table)
886
            }
887
444
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
888
298
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
889
301
            0x14 => visitor.visit_call_ref(self.read()?),
890
437
            0x15 => visitor.visit_return_call_ref(self.read()?),
891
            0x18 => {
892
102
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
893
85
                visitor.visit_delegate(self.read_var_u32()?)
894
            }
895
            0x19 => {
896
                #[cfg(feature = "features")]
897
19
                require_feature::legacy_exceptions(
898
19
                    self.features,
899
                    "legacy_exceptions feature required for catch_all instruction",
900
19
                    pos,
901
0
                )?;
902
19
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch_all") {
903
3
                    Ok(()) => (),
904
16
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch_all")?,
905
                }
906
7
                visitor.visit_catch_all()
907
            }
908
748
            0x1a => visitor.visit_drop(),
909
483
            0x1b => visitor.visit_select(),
910
            0x1c => {
911
49
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
912
45
                if result_count == 1 {
913
14
                    visitor.visit_typed_select(self.read()?)
914
                } else {
915
31
                    let mut results = Vec::new();
916
31
                    results.reserve_exact(result_count);
917
31
                    for _ in 0..result_count {
918
6
                        results.push(self.read()?);
919
                    }
920
26
                    visitor.visit_typed_select_multi(results)
921
                }
922
            }
923
163
            0x1f => visitor.visit_try_table(self.read()?),
924
925
7.09k
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
926
1.27k
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
927
1.01k
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
928
2.34k
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
929
1.32k
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
930
423
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
931
299
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
932
933
2.83k
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
934
245
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
935
225
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
936
330
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
937
528
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
938
415
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
939
1.25k
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
940
449
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
941
1.56k
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
942
689
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
943
404
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
944
372
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
945
382
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
946
357
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
947
1.15k
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
948
388
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
949
408
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
950
237
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
951
404
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
952
306
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
953
196
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
954
311
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
955
129
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
956
            0x3f => {
957
502
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
958
497
                visitor.visit_memory_size(mem)
959
            }
960
            0x40 => {
961
695
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
962
683
                visitor.visit_memory_grow(mem)
963
            }
964
965
10.7k
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
966
960
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
967
465
            0x43 => visitor.visit_f32_const(self.read_f32()?),
968
650
            0x44 => visitor.visit_f64_const(self.read_f64()?),
969
970
1.20k
            0x45 => visitor.visit_i32_eqz(),
971
689
            0x46 => visitor.visit_i32_eq(),
972
219
            0x47 => visitor.visit_i32_ne(),
973
507
            0x48 => visitor.visit_i32_lt_s(),
974
977
            0x49 => visitor.visit_i32_lt_u(),
975
847
            0x4a => visitor.visit_i32_gt_s(),
976
341
            0x4b => visitor.visit_i32_gt_u(),
977
1.67k
            0x4c => visitor.visit_i32_le_s(),
978
1.10k
            0x4d => visitor.visit_i32_le_u(),
979
643
            0x4e => visitor.visit_i32_ge_s(),
980
999
            0x4f => visitor.visit_i32_ge_u(),
981
632
            0x50 => visitor.visit_i64_eqz(),
982
353
            0x51 => visitor.visit_i64_eq(),
983
268
            0x52 => visitor.visit_i64_ne(),
984
832
            0x53 => visitor.visit_i64_lt_s(),
985
440
            0x54 => visitor.visit_i64_lt_u(),
986
3.58k
            0x55 => visitor.visit_i64_gt_s(),
987
260
            0x56 => visitor.visit_i64_gt_u(),
988
435
            0x57 => visitor.visit_i64_le_s(),
989
365
            0x58 => visitor.visit_i64_le_u(),
990
897
            0x59 => visitor.visit_i64_ge_s(),
991
553
            0x5a => visitor.visit_i64_ge_u(),
992
1.27k
            0x5b => visitor.visit_f32_eq(),
993
504
            0x5c => visitor.visit_f32_ne(),
994
1.36k
            0x5d => visitor.visit_f32_lt(),
995
381
            0x5e => visitor.visit_f32_gt(),
996
841
            0x5f => visitor.visit_f32_le(),
997
612
            0x60 => visitor.visit_f32_ge(),
998
1.73k
            0x61 => visitor.visit_f64_eq(),
999
230
            0x62 => visitor.visit_f64_ne(),
1000
975
            0x63 => visitor.visit_f64_lt(),
1001
710
            0x64 => visitor.visit_f64_gt(),
1002
932
            0x65 => visitor.visit_f64_le(),
1003
684
            0x66 => visitor.visit_f64_ge(),
1004
1.05k
            0x67 => visitor.visit_i32_clz(),
1005
409
            0x68 => visitor.visit_i32_ctz(),
1006
691
            0x69 => visitor.visit_i32_popcnt(),
1007
1.24k
            0x6a => visitor.visit_i32_add(),
1008
1.48k
            0x6b => visitor.visit_i32_sub(),
1009
408
            0x6c => visitor.visit_i32_mul(),
1010
1.75k
            0x6d => visitor.visit_i32_div_s(),
1011
950
            0x6e => visitor.visit_i32_div_u(),
1012
774
            0x6f => visitor.visit_i32_rem_s(),
1013
1.35k
            0x70 => visitor.visit_i32_rem_u(),
1014
1.06k
            0x71 => visitor.visit_i32_and(),
1015
912
            0x72 => visitor.visit_i32_or(),
1016
2.02k
            0x73 => visitor.visit_i32_xor(),
1017
996
            0x74 => visitor.visit_i32_shl(),
1018
710
            0x75 => visitor.visit_i32_shr_s(),
1019
734
            0x76 => visitor.visit_i32_shr_u(),
1020
573
            0x77 => visitor.visit_i32_rotl(),
1021
503
            0x78 => visitor.visit_i32_rotr(),
1022
427
            0x79 => visitor.visit_i64_clz(),
1023
2.44k
            0x7a => visitor.visit_i64_ctz(),
1024
174
            0x7b => visitor.visit_i64_popcnt(),
1025
480
            0x7c => visitor.visit_i64_add(),
1026
464
            0x7d => visitor.visit_i64_sub(),
1027
666
            0x7e => visitor.visit_i64_mul(),
1028
661
            0x7f => visitor.visit_i64_div_s(),
1029
1.03k
            0x80 => visitor.visit_i64_div_u(),
1030
313
            0x81 => visitor.visit_i64_rem_s(),
1031
406
            0x82 => visitor.visit_i64_rem_u(),
1032
928
            0x83 => visitor.visit_i64_and(),
1033
344
            0x84 => visitor.visit_i64_or(),
1034
497
            0x85 => visitor.visit_i64_xor(),
1035
541
            0x86 => visitor.visit_i64_shl(),
1036
159
            0x87 => visitor.visit_i64_shr_s(),
1037
201
            0x88 => visitor.visit_i64_shr_u(),
1038
501
            0x89 => visitor.visit_i64_rotl(),
1039
451
            0x8a => visitor.visit_i64_rotr(),
1040
1.43k
            0x8b => visitor.visit_f32_abs(),
1041
335
            0x8c => visitor.visit_f32_neg(),
1042
299
            0x8d => visitor.visit_f32_ceil(),
1043
67
            0x8e => visitor.visit_f32_floor(),
1044
361
            0x8f => visitor.visit_f32_trunc(),
1045
269
            0x90 => visitor.visit_f32_nearest(),
1046
282
            0x91 => visitor.visit_f32_sqrt(),
1047
412
            0x92 => visitor.visit_f32_add(),
1048
520
            0x93 => visitor.visit_f32_sub(),
1049
333
            0x94 => visitor.visit_f32_mul(),
1050
528
            0x95 => visitor.visit_f32_div(),
1051
650
            0x96 => visitor.visit_f32_min(),
1052
378
            0x97 => visitor.visit_f32_max(),
1053
388
            0x98 => visitor.visit_f32_copysign(),
1054
314
            0x99 => visitor.visit_f64_abs(),
1055
535
            0x9a => visitor.visit_f64_neg(),
1056
843
            0x9b => visitor.visit_f64_ceil(),
1057
270
            0x9c => visitor.visit_f64_floor(),
1058
408
            0x9d => visitor.visit_f64_trunc(),
1059
78
            0x9e => visitor.visit_f64_nearest(),
1060
351
            0x9f => visitor.visit_f64_sqrt(),
1061
70
            0xa0 => visitor.visit_f64_add(),
1062
285
            0xa1 => visitor.visit_f64_sub(),
1063
316
            0xa2 => visitor.visit_f64_mul(),
1064
235
            0xa3 => visitor.visit_f64_div(),
1065
525
            0xa4 => visitor.visit_f64_min(),
1066
320
            0xa5 => visitor.visit_f64_max(),
1067
444
            0xa6 => visitor.visit_f64_copysign(),
1068
1.08k
            0xa7 => visitor.visit_i32_wrap_i64(),
1069
786
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1070
1.11k
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1071
118
            0xaa => visitor.visit_i32_trunc_f64_s(),
1072
340
            0xab => visitor.visit_i32_trunc_f64_u(),
1073
475
            0xac => visitor.visit_i64_extend_i32_s(),
1074
243
            0xad => visitor.visit_i64_extend_i32_u(),
1075
341
            0xae => visitor.visit_i64_trunc_f32_s(),
1076
268
            0xaf => visitor.visit_i64_trunc_f32_u(),
1077
388
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1078
1.26k
            0xb1 => visitor.visit_i64_trunc_f64_u(),
1079
360
            0xb2 => visitor.visit_f32_convert_i32_s(),
1080
158
            0xb3 => visitor.visit_f32_convert_i32_u(),
1081
428
            0xb4 => visitor.visit_f32_convert_i64_s(),
1082
191
            0xb5 => visitor.visit_f32_convert_i64_u(),
1083
206
            0xb6 => visitor.visit_f32_demote_f64(),
1084
695
            0xb7 => visitor.visit_f64_convert_i32_s(),
1085
316
            0xb8 => visitor.visit_f64_convert_i32_u(),
1086
493
            0xb9 => visitor.visit_f64_convert_i64_s(),
1087
475
            0xba => visitor.visit_f64_convert_i64_u(),
1088
404
            0xbb => visitor.visit_f64_promote_f32(),
1089
208
            0xbc => visitor.visit_i32_reinterpret_f32(),
1090
274
            0xbd => visitor.visit_i64_reinterpret_f64(),
1091
387
            0xbe => visitor.visit_f32_reinterpret_i32(),
1092
167
            0xbf => visitor.visit_f64_reinterpret_i64(),
1093
1094
1.56k
            0xc0 => visitor.visit_i32_extend8_s(),
1095
363
            0xc1 => visitor.visit_i32_extend16_s(),
1096
310
            0xc2 => visitor.visit_i64_extend8_s(),
1097
228
            0xc3 => visitor.visit_i64_extend16_s(),
1098
798
            0xc4 => visitor.visit_i64_extend32_s(),
1099
1100
43
            0xd0 => visitor.visit_ref_null(self.read()?),
1101
413
            0xd1 => visitor.visit_ref_is_null(),
1102
74
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1103
407
            0xd3 => visitor.visit_ref_eq(),
1104
239
            0xd4 => visitor.visit_ref_as_non_null(),
1105
57
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1106
63
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1107
1108
95
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1109
86
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1110
47
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1111
27
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1112
            0xe4 => {
1113
42
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1114
            }
1115
49
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1116
65
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1117
1118
406
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1119
589
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1120
            0xfd => {
1121
                #[cfg(feature = "simd")]
1122
2.09k
                if let Some(mut visitor) = visitor.simd_visitor() {
1123
2.09k
                    return self.visit_0xfd_operator(pos, &mut visitor);
1124
0
                }
1125
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1126
            }
1127
1.11k
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1128
1129
420
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1130
        })
1131
217k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>
<wasmparser::binary_reader::BinaryReader>::visit_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
829
37.6k
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
830
37.6k
    where
831
37.6k
        T: VisitOperator<'a> + FrameStack,
832
    {
833
37.6k
        if visitor.current_frame().is_none() {
834
6
            bail!(
835
6
                self.original_position(),
836
6
                "operators remaining after end of function body or expression"
837
            );
838
37.6k
        }
839
37.6k
        let pos = self.original_position();
840
37.6k
        let code = self.read_u8()?;
841
37.6k
        Ok(match code {
842
1.68k
            0x00 => visitor.visit_unreachable(),
843
40
            0x01 => visitor.visit_nop(),
844
896
            0x02 => visitor.visit_block(self.read_block_type()?),
845
142
            0x03 => visitor.visit_loop(self.read_block_type()?),
846
18
            0x04 => visitor.visit_if(self.read_block_type()?),
847
            0x05 => {
848
8
                self.expect_frame(visitor, FrameKind::If, "else")?;
849
2
                visitor.visit_else()
850
            }
851
            0x06 => {
852
                #[cfg(feature = "features")]
853
16
                require_feature::legacy_exceptions(
854
16
                    self.features,
855
                    "legacy_exceptions feature required for try instruction",
856
16
                    pos,
857
0
                )?;
858
16
                visitor.visit_try(self.read_block_type()?)
859
            }
860
            0x07 => {
861
                #[cfg(feature = "features")]
862
2
                require_feature::legacy_exceptions(
863
2
                    self.features,
864
                    "legacy_exceptions feature required for catch instruction",
865
2
                    pos,
866
0
                )?;
867
2
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
868
0
                    Ok(()) => (),
869
2
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
870
                }
871
0
                visitor.visit_catch(self.read_var_u32()?)
872
            }
873
4
            0x08 => visitor.visit_throw(self.read_var_u32()?),
874
2
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
875
10
            0x0a => visitor.visit_throw_ref(),
876
6.22k
            0x0b => visitor.visit_end(),
877
8
            0x0c => visitor.visit_br(self.read_var_u32()?),
878
1.02k
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
879
8
            0x0e => visitor.visit_br_table(self.read_br_table()?),
880
2.02k
            0x0f => visitor.visit_return(),
881
3.19k
            0x10 => visitor.visit_call(self.read_var_u32()?),
882
            0x11 => {
883
172
                let index = self.read_var_u32()?;
884
172
                let table = self.read_call_indirect_table_immediate()?;
885
168
                visitor.visit_call_indirect(index, table)
886
            }
887
40
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
888
8
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
889
6
            0x14 => visitor.visit_call_ref(self.read()?),
890
2
            0x15 => visitor.visit_return_call_ref(self.read()?),
891
            0x18 => {
892
8
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
893
6
                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
356
            0x1a => visitor.visit_drop(),
909
8
            0x1b => visitor.visit_select(),
910
            0x1c => {
911
10
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
912
10
                if result_count == 1 {
913
4
                    visitor.visit_typed_select(self.read()?)
914
                } else {
915
6
                    let mut results = Vec::new();
916
6
                    results.reserve_exact(result_count);
917
6
                    for _ in 0..result_count {
918
2
                        results.push(self.read()?);
919
                    }
920
4
                    visitor.visit_typed_select_multi(results)
921
                }
922
            }
923
10
            0x1f => visitor.visit_try_table(self.read()?),
924
925
5.35k
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
926
1.00k
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
927
610
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
928
1.99k
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
929
1.02k
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
930
4
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
931
4
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
932
933
2.43k
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
934
2
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
935
10
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
936
6
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
937
0
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
938
4
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
939
2
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
940
4
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
941
2
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
942
2
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
943
4
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
944
4
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
945
20
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
946
76
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
947
824
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
948
154
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
949
2
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
950
2
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
951
4
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
952
2
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
953
6
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
954
4
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
955
2
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
956
            0x3f => {
957
4
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
958
2
                visitor.visit_memory_size(mem)
959
            }
960
            0x40 => {
961
8
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
962
4
                visitor.visit_memory_grow(mem)
963
            }
964
965
4.05k
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
966
150
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
967
16
            0x43 => visitor.visit_f32_const(self.read_f32()?),
968
4
            0x44 => visitor.visit_f64_const(self.read_f64()?),
969
970
406
            0x45 => visitor.visit_i32_eqz(),
971
272
            0x46 => visitor.visit_i32_eq(),
972
0
            0x47 => visitor.visit_i32_ne(),
973
2
            0x48 => visitor.visit_i32_lt_s(),
974
8
            0x49 => visitor.visit_i32_lt_u(),
975
4
            0x4a => visitor.visit_i32_gt_s(),
976
0
            0x4b => visitor.visit_i32_gt_u(),
977
4
            0x4c => visitor.visit_i32_le_s(),
978
6
            0x4d => visitor.visit_i32_le_u(),
979
2
            0x4e => visitor.visit_i32_ge_s(),
980
4
            0x4f => visitor.visit_i32_ge_u(),
981
0
            0x50 => visitor.visit_i64_eqz(),
982
0
            0x51 => visitor.visit_i64_eq(),
983
2
            0x52 => visitor.visit_i64_ne(),
984
6
            0x53 => visitor.visit_i64_lt_s(),
985
8
            0x54 => visitor.visit_i64_lt_u(),
986
6
            0x55 => visitor.visit_i64_gt_s(),
987
2
            0x56 => visitor.visit_i64_gt_u(),
988
0
            0x57 => visitor.visit_i64_le_s(),
989
4
            0x58 => visitor.visit_i64_le_u(),
990
2
            0x59 => visitor.visit_i64_ge_s(),
991
0
            0x5a => visitor.visit_i64_ge_u(),
992
0
            0x5b => visitor.visit_f32_eq(),
993
4
            0x5c => visitor.visit_f32_ne(),
994
2
            0x5d => visitor.visit_f32_lt(),
995
0
            0x5e => visitor.visit_f32_gt(),
996
6
            0x5f => visitor.visit_f32_le(),
997
2
            0x60 => visitor.visit_f32_ge(),
998
4
            0x61 => visitor.visit_f64_eq(),
999
0
            0x62 => visitor.visit_f64_ne(),
1000
6
            0x63 => visitor.visit_f64_lt(),
1001
2
            0x64 => visitor.visit_f64_gt(),
1002
2
            0x65 => visitor.visit_f64_le(),
1003
2
            0x66 => visitor.visit_f64_ge(),
1004
2
            0x67 => visitor.visit_i32_clz(),
1005
0
            0x68 => visitor.visit_i32_ctz(),
1006
14
            0x69 => visitor.visit_i32_popcnt(),
1007
674
            0x6a => visitor.visit_i32_add(),
1008
1.06k
            0x6b => visitor.visit_i32_sub(),
1009
0
            0x6c => visitor.visit_i32_mul(),
1010
4
            0x6d => visitor.visit_i32_div_s(),
1011
2
            0x6e => visitor.visit_i32_div_u(),
1012
6
            0x6f => visitor.visit_i32_rem_s(),
1013
4
            0x70 => visitor.visit_i32_rem_u(),
1014
500
            0x71 => visitor.visit_i32_and(),
1015
222
            0x72 => visitor.visit_i32_or(),
1016
4
            0x73 => visitor.visit_i32_xor(),
1017
0
            0x74 => visitor.visit_i32_shl(),
1018
0
            0x75 => visitor.visit_i32_shr_s(),
1019
162
            0x76 => visitor.visit_i32_shr_u(),
1020
0
            0x77 => visitor.visit_i32_rotl(),
1021
2
            0x78 => visitor.visit_i32_rotr(),
1022
4
            0x79 => visitor.visit_i64_clz(),
1023
2
            0x7a => visitor.visit_i64_ctz(),
1024
0
            0x7b => visitor.visit_i64_popcnt(),
1025
30
            0x7c => visitor.visit_i64_add(),
1026
0
            0x7d => visitor.visit_i64_sub(),
1027
2
            0x7e => visitor.visit_i64_mul(),
1028
4
            0x7f => visitor.visit_i64_div_s(),
1029
102
            0x80 => visitor.visit_i64_div_u(),
1030
0
            0x81 => visitor.visit_i64_rem_s(),
1031
2
            0x82 => visitor.visit_i64_rem_u(),
1032
2
            0x83 => visitor.visit_i64_and(),
1033
38
            0x84 => visitor.visit_i64_or(),
1034
4
            0x85 => visitor.visit_i64_xor(),
1035
16
            0x86 => visitor.visit_i64_shl(),
1036
0
            0x87 => visitor.visit_i64_shr_s(),
1037
0
            0x88 => visitor.visit_i64_shr_u(),
1038
2
            0x89 => visitor.visit_i64_rotl(),
1039
0
            0x8a => visitor.visit_i64_rotr(),
1040
2
            0x8b => visitor.visit_f32_abs(),
1041
2
            0x8c => visitor.visit_f32_neg(),
1042
0
            0x8d => visitor.visit_f32_ceil(),
1043
0
            0x8e => visitor.visit_f32_floor(),
1044
2
            0x8f => visitor.visit_f32_trunc(),
1045
32
            0x90 => visitor.visit_f32_nearest(),
1046
2
            0x91 => visitor.visit_f32_sqrt(),
1047
0
            0x92 => visitor.visit_f32_add(),
1048
2
            0x93 => visitor.visit_f32_sub(),
1049
0
            0x94 => visitor.visit_f32_mul(),
1050
2
            0x95 => visitor.visit_f32_div(),
1051
4
            0x96 => visitor.visit_f32_min(),
1052
2
            0x97 => visitor.visit_f32_max(),
1053
4
            0x98 => visitor.visit_f32_copysign(),
1054
18
            0x99 => visitor.visit_f64_abs(),
1055
2
            0x9a => visitor.visit_f64_neg(),
1056
16
            0x9b => visitor.visit_f64_ceil(),
1057
2
            0x9c => visitor.visit_f64_floor(),
1058
2
            0x9d => visitor.visit_f64_trunc(),
1059
0
            0x9e => visitor.visit_f64_nearest(),
1060
2
            0x9f => visitor.visit_f64_sqrt(),
1061
2
            0xa0 => visitor.visit_f64_add(),
1062
2
            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
2
            0xa6 => visitor.visit_f64_copysign(),
1068
0
            0xa7 => visitor.visit_i32_wrap_i64(),
1069
4
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1070
0
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1071
4
            0xaa => visitor.visit_i32_trunc_f64_s(),
1072
0
            0xab => visitor.visit_i32_trunc_f64_u(),
1073
78
            0xac => visitor.visit_i64_extend_i32_s(),
1074
10
            0xad => visitor.visit_i64_extend_i32_u(),
1075
8
            0xae => visitor.visit_i64_trunc_f32_s(),
1076
2
            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
4
            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
2
            0xb5 => visitor.visit_f32_convert_i64_u(),
1083
2
            0xb6 => visitor.visit_f32_demote_f64(),
1084
4
            0xb7 => visitor.visit_f64_convert_i32_s(),
1085
6
            0xb8 => visitor.visit_f64_convert_i32_u(),
1086
2
            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
8
            0xbe => visitor.visit_f32_reinterpret_i32(),
1092
0
            0xbf => visitor.visit_f64_reinterpret_i64(),
1093
1094
6
            0xc0 => visitor.visit_i32_extend8_s(),
1095
16
            0xc1 => visitor.visit_i32_extend16_s(),
1096
2
            0xc2 => visitor.visit_i64_extend8_s(),
1097
0
            0xc3 => visitor.visit_i64_extend16_s(),
1098
0
            0xc4 => visitor.visit_i64_extend32_s(),
1099
1100
4
            0xd0 => visitor.visit_ref_null(self.read()?),
1101
4
            0xd1 => visitor.visit_ref_is_null(),
1102
0
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1103
0
            0xd3 => visitor.visit_ref_eq(),
1104
6
            0xd4 => visitor.visit_ref_as_non_null(),
1105
0
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1106
4
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1107
1108
6
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1109
2
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1110
0
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1111
2
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1112
            0xe4 => {
1113
4
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1114
            }
1115
2
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1116
4
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1117
1118
6
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1119
4
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1120
            0xfd => {
1121
                #[cfg(feature = "simd")]
1122
10
                if let Some(mut visitor) = visitor.simd_visitor() {
1123
10
                    return self.visit_0xfd_operator(pos, &mut visitor);
1124
0
                }
1125
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1126
            }
1127
0
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1128
1129
8
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1130
        })
1131
37.6k
    }
<wasmparser::binary_reader::BinaryReader>::visit_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>
Line
Count
Source
829
174k
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
830
174k
    where
831
174k
        T: VisitOperator<'a> + FrameStack,
832
    {
833
174k
        if visitor.current_frame().is_none() {
834
0
            bail!(
835
0
                self.original_position(),
836
0
                "operators remaining after end of function body or expression"
837
            );
838
174k
        }
839
174k
        let pos = self.original_position();
840
174k
        let code = self.read_u8()?;
841
173k
        Ok(match code {
842
47.1k
            0x00 => visitor.visit_unreachable(),
843
3.86k
            0x01 => visitor.visit_nop(),
844
1.02k
            0x02 => visitor.visit_block(self.read_block_type()?),
845
872
            0x03 => visitor.visit_loop(self.read_block_type()?),
846
606
            0x04 => visitor.visit_if(self.read_block_type()?),
847
            0x05 => {
848
47
                self.expect_frame(visitor, FrameKind::If, "else")?;
849
21
                visitor.visit_else()
850
            }
851
            0x06 => {
852
                #[cfg(feature = "features")]
853
1.13k
                require_feature::legacy_exceptions(
854
1.13k
                    self.features,
855
                    "legacy_exceptions feature required for try instruction",
856
1.13k
                    pos,
857
0
                )?;
858
1.13k
                visitor.visit_try(self.read_block_type()?)
859
            }
860
            0x07 => {
861
                #[cfg(feature = "features")]
862
209
                require_feature::legacy_exceptions(
863
209
                    self.features,
864
                    "legacy_exceptions feature required for catch instruction",
865
209
                    pos,
866
0
                )?;
867
209
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch") {
868
84
                    Ok(()) => (),
869
125
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch")?,
870
                }
871
194
                visitor.visit_catch(self.read_var_u32()?)
872
            }
873
1.15k
            0x08 => visitor.visit_throw(self.read_var_u32()?),
874
1.82k
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
875
1.04k
            0x0a => visitor.visit_throw_ref(),
876
2.61k
            0x0b => visitor.visit_end(),
877
2.11k
            0x0c => visitor.visit_br(self.read_var_u32()?),
878
635
            0x0d => visitor.visit_br_if(self.read_var_u32()?),
879
179
            0x0e => visitor.visit_br_table(self.read_br_table()?),
880
476
            0x0f => visitor.visit_return(),
881
703
            0x10 => visitor.visit_call(self.read_var_u32()?),
882
            0x11 => {
883
494
                let index = self.read_var_u32()?;
884
491
                let table = self.read_call_indirect_table_immediate()?;
885
486
                visitor.visit_call_indirect(index, table)
886
            }
887
404
            0x12 => visitor.visit_return_call(self.read_var_u32()?),
888
290
            0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
889
295
            0x14 => visitor.visit_call_ref(self.read()?),
890
434
            0x15 => visitor.visit_return_call_ref(self.read()?),
891
            0x18 => {
892
94
                self.expect_frame(visitor, FrameKind::LegacyTry, "delegate")?;
893
79
                visitor.visit_delegate(self.read_var_u32()?)
894
            }
895
            0x19 => {
896
                #[cfg(feature = "features")]
897
19
                require_feature::legacy_exceptions(
898
19
                    self.features,
899
                    "legacy_exceptions feature required for catch_all instruction",
900
19
                    pos,
901
0
                )?;
902
19
                match self.expect_frame(visitor, FrameKind::LegacyCatch, "catch_all") {
903
3
                    Ok(()) => (),
904
16
                    Err(_) => self.expect_frame(visitor, FrameKind::LegacyTry, "catch_all")?,
905
                }
906
7
                visitor.visit_catch_all()
907
            }
908
390
            0x1a => visitor.visit_drop(),
909
473
            0x1b => visitor.visit_select(),
910
            0x1c => {
911
39
                let result_count = self.read_size(MAX_WASM_SELECT_RESULT_SIZE, "select types")?;
912
35
                if result_count == 1 {
913
10
                    visitor.visit_typed_select(self.read()?)
914
                } else {
915
25
                    let mut results = Vec::new();
916
25
                    results.reserve_exact(result_count);
917
25
                    for _ in 0..result_count {
918
4
                        results.push(self.read()?);
919
                    }
920
22
                    visitor.visit_typed_select_multi(results)
921
                }
922
            }
923
153
            0x1f => visitor.visit_try_table(self.read()?),
924
925
1.73k
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
926
268
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
927
407
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
928
341
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
929
297
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
930
416
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
931
293
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
932
933
398
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
934
240
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
935
211
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
936
321
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
937
526
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
938
411
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
939
1.25k
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
940
443
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
941
1.55k
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
942
686
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
943
398
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
944
367
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
945
359
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
946
279
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
947
332
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
948
233
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
949
406
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
950
233
            0x39 => visitor.visit_f64_store(self.read_memarg(3)?),
951
400
            0x3a => visitor.visit_i32_store8(self.read_memarg(0)?),
952
304
            0x3b => visitor.visit_i32_store16(self.read_memarg(1)?),
953
190
            0x3c => visitor.visit_i64_store8(self.read_memarg(0)?),
954
306
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
955
125
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
956
            0x3f => {
957
496
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
958
493
                visitor.visit_memory_size(mem)
959
            }
960
            0x40 => {
961
686
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
962
678
                visitor.visit_memory_grow(mem)
963
            }
964
965
4.27k
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
966
795
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
967
409
            0x43 => visitor.visit_f32_const(self.read_f32()?),
968
628
            0x44 => visitor.visit_f64_const(self.read_f64()?),
969
970
791
            0x45 => visitor.visit_i32_eqz(),
971
414
            0x46 => visitor.visit_i32_eq(),
972
218
            0x47 => visitor.visit_i32_ne(),
973
503
            0x48 => visitor.visit_i32_lt_s(),
974
969
            0x49 => visitor.visit_i32_lt_u(),
975
842
            0x4a => visitor.visit_i32_gt_s(),
976
339
            0x4b => visitor.visit_i32_gt_u(),
977
1.67k
            0x4c => visitor.visit_i32_le_s(),
978
1.09k
            0x4d => visitor.visit_i32_le_u(),
979
641
            0x4e => visitor.visit_i32_ge_s(),
980
995
            0x4f => visitor.visit_i32_ge_u(),
981
629
            0x50 => visitor.visit_i64_eqz(),
982
353
            0x51 => visitor.visit_i64_eq(),
983
266
            0x52 => visitor.visit_i64_ne(),
984
820
            0x53 => visitor.visit_i64_lt_s(),
985
432
            0x54 => visitor.visit_i64_lt_u(),
986
3.57k
            0x55 => visitor.visit_i64_gt_s(),
987
257
            0x56 => visitor.visit_i64_gt_u(),
988
432
            0x57 => visitor.visit_i64_le_s(),
989
361
            0x58 => visitor.visit_i64_le_u(),
990
895
            0x59 => visitor.visit_i64_ge_s(),
991
553
            0x5a => visitor.visit_i64_ge_u(),
992
1.27k
            0x5b => visitor.visit_f32_eq(),
993
499
            0x5c => visitor.visit_f32_ne(),
994
1.35k
            0x5d => visitor.visit_f32_lt(),
995
379
            0x5e => visitor.visit_f32_gt(),
996
835
            0x5f => visitor.visit_f32_le(),
997
607
            0x60 => visitor.visit_f32_ge(),
998
1.73k
            0x61 => visitor.visit_f64_eq(),
999
230
            0x62 => visitor.visit_f64_ne(),
1000
968
            0x63 => visitor.visit_f64_lt(),
1001
708
            0x64 => visitor.visit_f64_gt(),
1002
928
            0x65 => visitor.visit_f64_le(),
1003
680
            0x66 => visitor.visit_f64_ge(),
1004
1.04k
            0x67 => visitor.visit_i32_clz(),
1005
409
            0x68 => visitor.visit_i32_ctz(),
1006
675
            0x69 => visitor.visit_i32_popcnt(),
1007
573
            0x6a => visitor.visit_i32_add(),
1008
420
            0x6b => visitor.visit_i32_sub(),
1009
401
            0x6c => visitor.visit_i32_mul(),
1010
1.74k
            0x6d => visitor.visit_i32_div_s(),
1011
945
            0x6e => visitor.visit_i32_div_u(),
1012
766
            0x6f => visitor.visit_i32_rem_s(),
1013
1.34k
            0x70 => visitor.visit_i32_rem_u(),
1014
565
            0x71 => visitor.visit_i32_and(),
1015
687
            0x72 => visitor.visit_i32_or(),
1016
2.02k
            0x73 => visitor.visit_i32_xor(),
1017
996
            0x74 => visitor.visit_i32_shl(),
1018
710
            0x75 => visitor.visit_i32_shr_s(),
1019
570
            0x76 => visitor.visit_i32_shr_u(),
1020
572
            0x77 => visitor.visit_i32_rotl(),
1021
501
            0x78 => visitor.visit_i32_rotr(),
1022
423
            0x79 => visitor.visit_i64_clz(),
1023
2.44k
            0x7a => visitor.visit_i64_ctz(),
1024
174
            0x7b => visitor.visit_i64_popcnt(),
1025
449
            0x7c => visitor.visit_i64_add(),
1026
463
            0x7d => visitor.visit_i64_sub(),
1027
664
            0x7e => visitor.visit_i64_mul(),
1028
655
            0x7f => visitor.visit_i64_div_s(),
1029
927
            0x80 => visitor.visit_i64_div_u(),
1030
312
            0x81 => visitor.visit_i64_rem_s(),
1031
402
            0x82 => visitor.visit_i64_rem_u(),
1032
924
            0x83 => visitor.visit_i64_and(),
1033
306
            0x84 => visitor.visit_i64_or(),
1034
493
            0x85 => visitor.visit_i64_xor(),
1035
523
            0x86 => visitor.visit_i64_shl(),
1036
156
            0x87 => visitor.visit_i64_shr_s(),
1037
198
            0x88 => visitor.visit_i64_shr_u(),
1038
498
            0x89 => visitor.visit_i64_rotl(),
1039
450
            0x8a => visitor.visit_i64_rotr(),
1040
1.42k
            0x8b => visitor.visit_f32_abs(),
1041
333
            0x8c => visitor.visit_f32_neg(),
1042
297
            0x8d => visitor.visit_f32_ceil(),
1043
65
            0x8e => visitor.visit_f32_floor(),
1044
359
            0x8f => visitor.visit_f32_trunc(),
1045
237
            0x90 => visitor.visit_f32_nearest(),
1046
280
            0x91 => visitor.visit_f32_sqrt(),
1047
412
            0x92 => visitor.visit_f32_add(),
1048
517
            0x93 => visitor.visit_f32_sub(),
1049
333
            0x94 => visitor.visit_f32_mul(),
1050
526
            0x95 => visitor.visit_f32_div(),
1051
646
            0x96 => visitor.visit_f32_min(),
1052
376
            0x97 => visitor.visit_f32_max(),
1053
384
            0x98 => visitor.visit_f32_copysign(),
1054
295
            0x99 => visitor.visit_f64_abs(),
1055
531
            0x9a => visitor.visit_f64_neg(),
1056
827
            0x9b => visitor.visit_f64_ceil(),
1057
268
            0x9c => visitor.visit_f64_floor(),
1058
406
            0x9d => visitor.visit_f64_trunc(),
1059
78
            0x9e => visitor.visit_f64_nearest(),
1060
344
            0x9f => visitor.visit_f64_sqrt(),
1061
68
            0xa0 => visitor.visit_f64_add(),
1062
283
            0xa1 => visitor.visit_f64_sub(),
1063
315
            0xa2 => visitor.visit_f64_mul(),
1064
233
            0xa3 => visitor.visit_f64_div(),
1065
523
            0xa4 => visitor.visit_f64_min(),
1066
318
            0xa5 => visitor.visit_f64_max(),
1067
442
            0xa6 => visitor.visit_f64_copysign(),
1068
1.08k
            0xa7 => visitor.visit_i32_wrap_i64(),
1069
778
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1070
1.11k
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1071
114
            0xaa => visitor.visit_i32_trunc_f64_s(),
1072
338
            0xab => visitor.visit_i32_trunc_f64_u(),
1073
397
            0xac => visitor.visit_i64_extend_i32_s(),
1074
231
            0xad => visitor.visit_i64_extend_i32_u(),
1075
333
            0xae => visitor.visit_i64_trunc_f32_s(),
1076
265
            0xaf => visitor.visit_i64_trunc_f32_u(),
1077
382
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1078
1.26k
            0xb1 => visitor.visit_i64_trunc_f64_u(),
1079
356
            0xb2 => visitor.visit_f32_convert_i32_s(),
1080
158
            0xb3 => visitor.visit_f32_convert_i32_u(),
1081
428
            0xb4 => visitor.visit_f32_convert_i64_s(),
1082
187
            0xb5 => visitor.visit_f32_convert_i64_u(),
1083
204
            0xb6 => visitor.visit_f32_demote_f64(),
1084
691
            0xb7 => visitor.visit_f64_convert_i32_s(),
1085
308
            0xb8 => visitor.visit_f64_convert_i32_u(),
1086
489
            0xb9 => visitor.visit_f64_convert_i64_s(),
1087
475
            0xba => visitor.visit_f64_convert_i64_u(),
1088
404
            0xbb => visitor.visit_f64_promote_f32(),
1089
207
            0xbc => visitor.visit_i32_reinterpret_f32(),
1090
274
            0xbd => visitor.visit_i64_reinterpret_f64(),
1091
379
            0xbe => visitor.visit_f32_reinterpret_i32(),
1092
165
            0xbf => visitor.visit_f64_reinterpret_i64(),
1093
1094
1.55k
            0xc0 => visitor.visit_i32_extend8_s(),
1095
345
            0xc1 => visitor.visit_i32_extend16_s(),
1096
307
            0xc2 => visitor.visit_i64_extend8_s(),
1097
227
            0xc3 => visitor.visit_i64_extend16_s(),
1098
798
            0xc4 => visitor.visit_i64_extend32_s(),
1099
1100
39
            0xd0 => visitor.visit_ref_null(self.read()?),
1101
409
            0xd1 => visitor.visit_ref_is_null(),
1102
74
            0xd2 => visitor.visit_ref_func(self.read_var_u32()?),
1103
407
            0xd3 => visitor.visit_ref_eq(),
1104
233
            0xd4 => visitor.visit_ref_as_non_null(),
1105
57
            0xd5 => visitor.visit_br_on_null(self.read_var_u32()?),
1106
59
            0xd6 => visitor.visit_br_on_non_null(self.read_var_u32()?),
1107
1108
87
            0xe0 => visitor.visit_cont_new(self.read_var_u32()?),
1109
83
            0xe1 => visitor.visit_cont_bind(self.read_var_u32()?, self.read_var_u32()?),
1110
47
            0xe2 => visitor.visit_suspend(self.read_var_u32()?),
1111
25
            0xe3 => visitor.visit_resume(self.read_var_u32()?, self.read()?),
1112
            0xe4 => {
1113
38
                visitor.visit_resume_throw(self.read_var_u32()?, self.read_var_u32()?, self.read()?)
1114
            }
1115
47
            0xe5 => visitor.visit_resume_throw_ref(self.read_var_u32()?, self.read()?),
1116
61
            0xe6 => visitor.visit_switch(self.read_var_u32()?, self.read_var_u32()?),
1117
1118
394
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1119
582
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1120
            0xfd => {
1121
                #[cfg(feature = "simd")]
1122
2.03k
                if let Some(mut visitor) = visitor.simd_visitor() {
1123
2.03k
                    return self.visit_0xfd_operator(pos, &mut visitor);
1124
0
                }
1125
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1126
            }
1127
1.10k
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1128
1129
412
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1130
        })
1131
174k
    }
<wasmparser::binary_reader::BinaryReader>::visit_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
Line
Count
Source
829
5.03k
    pub fn visit_operator<T>(&mut self, visitor: &mut T) -> Result<<T as VisitOperator<'a>>::Output>
830
5.03k
    where
831
5.03k
        T: VisitOperator<'a> + FrameStack,
832
    {
833
5.03k
        if visitor.current_frame().is_none() {
834
0
            bail!(
835
0
                self.original_position(),
836
0
                "operators remaining after end of function body or expression"
837
            );
838
5.03k
        }
839
5.03k
        let pos = self.original_position();
840
5.03k
        let code = self.read_u8()?;
841
5.03k
        Ok(match code {
842
6
            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
1
            0x09 => visitor.visit_rethrow(self.read_var_u32()?),
875
3
            0x0a => visitor.visit_throw_ref(),
876
2.23k
            0x0b => visitor.visit_end(),
877
2
            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
3
            0x0f => visitor.visit_return(),
881
3
            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
1
            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
2
            0x1a => visitor.visit_drop(),
909
2
            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
1
            0x20 => visitor.visit_local_get(self.read_var_u32()?),
926
2
            0x21 => visitor.visit_local_set(self.read_var_u32()?),
927
0
            0x22 => visitor.visit_local_tee(self.read_var_u32()?),
928
2
            0x23 => visitor.visit_global_get(self.read_var_u32()?),
929
0
            0x24 => visitor.visit_global_set(self.read_var_u32()?),
930
3
            0x25 => visitor.visit_table_get(self.read_var_u32()?),
931
2
            0x26 => visitor.visit_table_set(self.read_var_u32()?),
932
933
0
            0x28 => visitor.visit_i32_load(self.read_memarg(2)?),
934
3
            0x29 => visitor.visit_i64_load(self.read_memarg(3)?),
935
4
            0x2a => visitor.visit_f32_load(self.read_memarg(2)?),
936
3
            0x2b => visitor.visit_f64_load(self.read_memarg(3)?),
937
2
            0x2c => visitor.visit_i32_load8_s(self.read_memarg(0)?),
938
0
            0x2d => visitor.visit_i32_load8_u(self.read_memarg(0)?),
939
2
            0x2e => visitor.visit_i32_load16_s(self.read_memarg(1)?),
940
2
            0x2f => visitor.visit_i32_load16_u(self.read_memarg(1)?),
941
1
            0x30 => visitor.visit_i64_load8_s(self.read_memarg(0)?),
942
1
            0x31 => visitor.visit_i64_load8_u(self.read_memarg(0)?),
943
2
            0x32 => visitor.visit_i64_load16_s(self.read_memarg(1)?),
944
1
            0x33 => visitor.visit_i64_load16_u(self.read_memarg(1)?),
945
3
            0x34 => visitor.visit_i64_load32_s(self.read_memarg(2)?),
946
2
            0x35 => visitor.visit_i64_load32_u(self.read_memarg(2)?),
947
2
            0x36 => visitor.visit_i32_store(self.read_memarg(2)?),
948
1
            0x37 => visitor.visit_i64_store(self.read_memarg(3)?),
949
0
            0x38 => visitor.visit_f32_store(self.read_memarg(2)?),
950
2
            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
1
            0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
955
2
            0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
956
            0x3f => {
957
2
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
958
2
                visitor.visit_memory_size(mem)
959
            }
960
            0x40 => {
961
1
                let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
962
1
                visitor.visit_memory_grow(mem)
963
            }
964
965
2.42k
            0x41 => visitor.visit_i32_const(self.read_var_i32()?),
966
15
            0x42 => visitor.visit_i64_const(self.read_var_i64()?),
967
40
            0x43 => visitor.visit_f32_const(self.read_f32()?),
968
18
            0x44 => visitor.visit_f64_const(self.read_f64()?),
969
970
3
            0x45 => visitor.visit_i32_eqz(),
971
3
            0x46 => visitor.visit_i32_eq(),
972
1
            0x47 => visitor.visit_i32_ne(),
973
2
            0x48 => visitor.visit_i32_lt_s(),
974
0
            0x49 => visitor.visit_i32_lt_u(),
975
1
            0x4a => visitor.visit_i32_gt_s(),
976
2
            0x4b => visitor.visit_i32_gt_u(),
977
0
            0x4c => visitor.visit_i32_le_s(),
978
2
            0x4d => visitor.visit_i32_le_u(),
979
0
            0x4e => visitor.visit_i32_ge_s(),
980
0
            0x4f => visitor.visit_i32_ge_u(),
981
3
            0x50 => visitor.visit_i64_eqz(),
982
0
            0x51 => visitor.visit_i64_eq(),
983
0
            0x52 => visitor.visit_i64_ne(),
984
6
            0x53 => visitor.visit_i64_lt_s(),
985
0
            0x54 => visitor.visit_i64_lt_u(),
986
1
            0x55 => visitor.visit_i64_gt_s(),
987
1
            0x56 => visitor.visit_i64_gt_u(),
988
3
            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
4
            0x5b => visitor.visit_f32_eq(),
993
1
            0x5c => visitor.visit_f32_ne(),
994
2
            0x5d => visitor.visit_f32_lt(),
995
2
            0x5e => visitor.visit_f32_gt(),
996
0
            0x5f => visitor.visit_f32_le(),
997
3
            0x60 => visitor.visit_f32_ge(),
998
3
            0x61 => visitor.visit_f64_eq(),
999
0
            0x62 => visitor.visit_f64_ne(),
1000
1
            0x63 => visitor.visit_f64_lt(),
1001
0
            0x64 => visitor.visit_f64_gt(),
1002
2
            0x65 => visitor.visit_f64_le(),
1003
2
            0x66 => visitor.visit_f64_ge(),
1004
2
            0x67 => visitor.visit_i32_clz(),
1005
0
            0x68 => visitor.visit_i32_ctz(),
1006
2
            0x69 => visitor.visit_i32_popcnt(),
1007
0
            0x6a => visitor.visit_i32_add(),
1008
1
            0x6b => visitor.visit_i32_sub(),
1009
7
            0x6c => visitor.visit_i32_mul(),
1010
0
            0x6d => visitor.visit_i32_div_s(),
1011
3
            0x6e => visitor.visit_i32_div_u(),
1012
2
            0x6f => visitor.visit_i32_rem_s(),
1013
0
            0x70 => visitor.visit_i32_rem_u(),
1014
0
            0x71 => visitor.visit_i32_and(),
1015
3
            0x72 => visitor.visit_i32_or(),
1016
4
            0x73 => visitor.visit_i32_xor(),
1017
0
            0x74 => visitor.visit_i32_shl(),
1018
0
            0x75 => visitor.visit_i32_shr_s(),
1019
2
            0x76 => visitor.visit_i32_shr_u(),
1020
1
            0x77 => visitor.visit_i32_rotl(),
1021
0
            0x78 => visitor.visit_i32_rotr(),
1022
0
            0x79 => visitor.visit_i64_clz(),
1023
1
            0x7a => visitor.visit_i64_ctz(),
1024
0
            0x7b => visitor.visit_i64_popcnt(),
1025
1
            0x7c => visitor.visit_i64_add(),
1026
1
            0x7d => visitor.visit_i64_sub(),
1027
0
            0x7e => visitor.visit_i64_mul(),
1028
2
            0x7f => visitor.visit_i64_div_s(),
1029
4
            0x80 => visitor.visit_i64_div_u(),
1030
1
            0x81 => visitor.visit_i64_rem_s(),
1031
2
            0x82 => visitor.visit_i64_rem_u(),
1032
2
            0x83 => visitor.visit_i64_and(),
1033
0
            0x84 => visitor.visit_i64_or(),
1034
0
            0x85 => visitor.visit_i64_xor(),
1035
2
            0x86 => visitor.visit_i64_shl(),
1036
3
            0x87 => visitor.visit_i64_shr_s(),
1037
3
            0x88 => visitor.visit_i64_shr_u(),
1038
1
            0x89 => visitor.visit_i64_rotl(),
1039
1
            0x8a => visitor.visit_i64_rotr(),
1040
3
            0x8b => visitor.visit_f32_abs(),
1041
0
            0x8c => visitor.visit_f32_neg(),
1042
2
            0x8d => visitor.visit_f32_ceil(),
1043
2
            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
1
            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
1
            0x99 => visitor.visit_f64_abs(),
1055
2
            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
5
            0x9f => visitor.visit_f64_sqrt(),
1061
0
            0xa0 => visitor.visit_f64_add(),
1062
0
            0xa1 => visitor.visit_f64_sub(),
1063
1
            0xa2 => visitor.visit_f64_mul(),
1064
2
            0xa3 => visitor.visit_f64_div(),
1065
2
            0xa4 => visitor.visit_f64_min(),
1066
2
            0xa5 => visitor.visit_f64_max(),
1067
0
            0xa6 => visitor.visit_f64_copysign(),
1068
0
            0xa7 => visitor.visit_i32_wrap_i64(),
1069
4
            0xa8 => visitor.visit_i32_trunc_f32_s(),
1070
2
            0xa9 => visitor.visit_i32_trunc_f32_u(),
1071
0
            0xaa => visitor.visit_i32_trunc_f64_s(),
1072
2
            0xab => visitor.visit_i32_trunc_f64_u(),
1073
0
            0xac => visitor.visit_i64_extend_i32_s(),
1074
2
            0xad => visitor.visit_i64_extend_i32_u(),
1075
0
            0xae => visitor.visit_i64_trunc_f32_s(),
1076
1
            0xaf => visitor.visit_i64_trunc_f32_u(),
1077
6
            0xb0 => visitor.visit_i64_trunc_f64_s(),
1078
3
            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
2
            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
2
            0xb8 => visitor.visit_f64_convert_i32_u(),
1086
2
            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
1
            0xbc => visitor.visit_i32_reinterpret_f32(),
1090
0
            0xbd => visitor.visit_i64_reinterpret_f64(),
1091
0
            0xbe => visitor.visit_f32_reinterpret_i32(),
1092
2
            0xbf => visitor.visit_f64_reinterpret_i64(),
1093
1094
2
            0xc0 => visitor.visit_i32_extend8_s(),
1095
2
            0xc1 => visitor.visit_i32_extend16_s(),
1096
1
            0xc2 => visitor.visit_i64_extend8_s(),
1097
1
            0xc3 => visitor.visit_i64_extend16_s(),
1098
0
            0xc4 => visitor.visit_i64_extend32_s(),
1099
1100
0
            0xd0 => visitor.visit_ref_null(self.read()?),
1101
0
            0xd1 => visitor.visit_ref_is_null(),
1102
0
            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
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
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
6
            0xfb => self.visit_0xfb_operator(pos, visitor)?,
1119
3
            0xfc => self.visit_0xfc_operator(pos, visitor)?,
1120
            0xfd => {
1121
                #[cfg(feature = "simd")]
1122
51
                if let Some(mut visitor) = visitor.simd_visitor() {
1123
51
                    return self.visit_0xfd_operator(pos, &mut visitor);
1124
0
                }
1125
0
                bail!(pos, "unexpected SIMD opcode: 0x{code:x}")
1126
            }
1127
12
            0xfe => self.visit_0xfe_operator(pos, visitor)?,
1128
1129
0
            _ => bail!(pos, "illegal opcode: 0x{code:x}"),
1130
        })
1131
5.03k
    }
1132
1133
406
    fn visit_0xfb_operator<T>(
1134
406
        &mut self,
1135
406
        pos: u64,
1136
406
        visitor: &mut T,
1137
406
    ) -> Result<<T as VisitOperator<'a>>::Output>
1138
406
    where
1139
406
        T: VisitOperator<'a>,
1140
    {
1141
406
        let code = self.read_var_u32()?;
1142
397
        Ok(match code {
1143
            0x0 => {
1144
65
                let type_index = self.read_var_u32()?;
1145
63
                visitor.visit_struct_new(type_index)
1146
            }
1147
            0x01 => {
1148
22
                let type_index = self.read_var_u32()?;
1149
19
                visitor.visit_struct_new_default(type_index)
1150
            }
1151
            0x02 => {
1152
15
                let type_index = self.read_var_u32()?;
1153
14
                let field_index = self.read_var_u32()?;
1154
11
                visitor.visit_struct_get(type_index, field_index)
1155
            }
1156
            0x03 => {
1157
9
                let type_index = self.read_var_u32()?;
1158
9
                let field_index = self.read_var_u32()?;
1159
7
                visitor.visit_struct_get_s(type_index, field_index)
1160
            }
1161
            0x04 => {
1162
38
                let type_index = self.read_var_u32()?;
1163
35
                let field_index = self.read_var_u32()?;
1164
32
                visitor.visit_struct_get_u(type_index, field_index)
1165
            }
1166
            0x05 => {
1167
3
                let type_index = self.read_var_u32()?;
1168
3
                let field_index = self.read_var_u32()?;
1169
3
                visitor.visit_struct_set(type_index, field_index)
1170
            }
1171
            0x06 => {
1172
13
                let type_index = self.read_var_u32()?;
1173
11
                visitor.visit_array_new(type_index)
1174
            }
1175
            0x07 => {
1176
3
                let type_index = self.read_var_u32()?;
1177
3
                visitor.visit_array_new_default(type_index)
1178
            }
1179
            0x08 => {
1180
10
                let type_index = self.read_var_u32()?;
1181
10
                let n = self.read_var_u32()?;
1182
10
                visitor.visit_array_new_fixed(type_index, n)
1183
            }
1184
            0x09 => {
1185
3
                let type_index = self.read_var_u32()?;
1186
3
                let data_index = self.read_var_u32()?;
1187
3
                visitor.visit_array_new_data(type_index, data_index)
1188
            }
1189
            0x0a => {
1190
12
                let type_index = self.read_var_u32()?;
1191
10
                let elem_index = self.read_var_u32()?;
1192
7
                visitor.visit_array_new_elem(type_index, elem_index)
1193
            }
1194
            0x0b => {
1195
9
                let type_index = self.read_var_u32()?;
1196
9
                visitor.visit_array_get(type_index)
1197
            }
1198
            0x0c => {
1199
12
                let type_index = self.read_var_u32()?;
1200
12
                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
10
                let type_index = self.read_var_u32()?;
1208
10
                visitor.visit_array_set(type_index)
1209
            }
1210
2
            0x0f => visitor.visit_array_len(),
1211
            0x10 => {
1212
5
                let type_index = self.read_var_u32()?;
1213
5
                visitor.visit_array_fill(type_index)
1214
            }
1215
            0x11 => {
1216
11
                let type_index_dst = self.read_var_u32()?;
1217
10
                let type_index_src = self.read_var_u32()?;
1218
9
                visitor.visit_array_copy(type_index_dst, type_index_src)
1219
            }
1220
            0x12 => {
1221
1
                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
5
                let type_index = self.read_var_u32()?;
1227
5
                let elem_index = self.read_var_u32()?;
1228
5
                visitor.visit_array_init_elem(type_index, elem_index)
1229
            }
1230
5
            0x14 => visitor.visit_ref_test_non_null(self.read()?),
1231
5
            0x15 => visitor.visit_ref_test_nullable(self.read()?),
1232
18
            0x16 => visitor.visit_ref_cast_non_null(self.read()?),
1233
7
            0x17 => visitor.visit_ref_cast_nullable(self.read()?),
1234
            0x18 => {
1235
8
                let pos = self.original_position();
1236
8
                let cast_flags = self.read_u8()?;
1237
8
                let relative_depth = self.read_var_u32()?;
1238
8
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1239
7
                    0b00 => (false, false),
1240
0
                    0b01 => (true, false),
1241
0
                    0b10 => (false, true),
1242
0
                    0b11 => (true, true),
1243
1
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1244
                };
1245
7
                let from_heap_type = self.read()?;
1246
6
                let from_ref_type =
1247
6
                    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::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
6
                let to_heap_type = self.read()?;
1251
6
                let to_ref_type =
1252
6
                    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::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
6
                visitor.visit_br_on_cast(relative_depth, from_ref_type, to_ref_type)
1256
            }
1257
            0x19 => {
1258
10
                let pos = self.original_position();
1259
10
                let cast_flags = self.read_u8()?;
1260
7
                let relative_depth = self.read_var_u32()?;
1261
5
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1262
5
                    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
5
                let from_heap_type = self.read()?;
1269
5
                let from_ref_type =
1270
5
                    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::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
5
                let to_heap_type = self.read()?;
1274
4
                let to_ref_type =
1275
5
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1276
1
                        format_err!(pos, "implementation error: type index too large")
1277
1
                    })?;
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}
<wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>::{closure#3}
Line
Count
Source
1275
1
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1276
1
                        format_err!(pos, "implementation error: type index too large")
1277
1
                    })?;
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#3}
1278
4
                visitor.visit_br_on_cast_fail(relative_depth, from_ref_type, to_ref_type)
1279
            }
1280
1281
6
            0x1a => visitor.visit_any_convert_extern(),
1282
8
            0x1b => visitor.visit_extern_convert_any(),
1283
1284
14
            0x1c => visitor.visit_ref_i31(),
1285
4
            0x1d => visitor.visit_i31_get_s(),
1286
1
            0x1e => visitor.visit_i31_get_u(),
1287
1288
            0x20 => {
1289
4
                let type_index = self.read_var_u32()?;
1290
4
                visitor.visit_struct_new_desc(type_index)
1291
            }
1292
            0x21 => {
1293
5
                let type_index = self.read_var_u32()?;
1294
5
                visitor.visit_struct_new_default_desc(type_index)
1295
            }
1296
8
            0x22 => visitor.visit_ref_get_desc(self.read()?),
1297
0
            0x23 => visitor.visit_ref_cast_desc_eq_non_null(self.read()?),
1298
9
            0x24 => visitor.visit_ref_cast_desc_eq_nullable(self.read()?),
1299
            0x25 => {
1300
4
                let pos = self.original_position();
1301
4
                let cast_flags = self.read_u8()?;
1302
4
                let relative_depth = self.read_var_u32()?;
1303
3
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1304
3
                    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
3
                let from_heap_type = self.read()?;
1311
3
                let from_ref_type =
1312
3
                    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::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
3
                let to_heap_type = self.read()?;
1316
3
                let to_ref_type =
1317
3
                    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::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
3
                visitor.visit_br_on_cast_desc_eq(relative_depth, from_ref_type, to_ref_type)
1321
            }
1322
            0x26 => {
1323
15
                let pos = self.original_position();
1324
15
                let cast_flags = self.read_u8()?;
1325
14
                let relative_depth = self.read_var_u32()?;
1326
12
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1327
7
                    0 => (false, false),
1328
0
                    1 => (true, false),
1329
0
                    2 => (false, true),
1330
0
                    3 => (true, true),
1331
5
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1332
                };
1333
7
                let from_heap_type = self.read()?;
1334
4
                let from_ref_type =
1335
5
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1336
1
                        format_err!(pos, "implementation error: type index too large")
1337
1
                    })?;
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}
<wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>::{closure#6}
Line
Count
Source
1335
1
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1336
1
                        format_err!(pos, "implementation error: type index too large")
1337
1
                    })?;
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>::{closure#6}
1338
4
                let to_heap_type = self.read()?;
1339
3
                let to_ref_type =
1340
3
                    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::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
3
                visitor.visit_br_on_cast_desc_eq_fail(relative_depth, from_ref_type, to_ref_type)
1344
            }
1345
1346
10
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1347
        })
1348
406
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>
<wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
1133
6
    fn visit_0xfb_operator<T>(
1134
6
        &mut self,
1135
6
        pos: u64,
1136
6
        visitor: &mut T,
1137
6
    ) -> Result<<T as VisitOperator<'a>>::Output>
1138
6
    where
1139
6
        T: VisitOperator<'a>,
1140
    {
1141
6
        let code = self.read_var_u32()?;
1142
6
        Ok(match code {
1143
            0x0 => {
1144
0
                let type_index = self.read_var_u32()?;
1145
0
                visitor.visit_struct_new(type_index)
1146
            }
1147
            0x01 => {
1148
0
                let type_index = self.read_var_u32()?;
1149
0
                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
0
                let type_index = self.read_var_u32()?;
1173
0
                visitor.visit_array_new(type_index)
1174
            }
1175
            0x07 => {
1176
0
                let type_index = self.read_var_u32()?;
1177
0
                visitor.visit_array_new_default(type_index)
1178
            }
1179
            0x08 => {
1180
0
                let type_index = self.read_var_u32()?;
1181
0
                let n = self.read_var_u32()?;
1182
0
                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
0
            0x1a => visitor.visit_any_convert_extern(),
1282
0
            0x1b => visitor.visit_extern_convert_any(),
1283
1284
0
            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
4
                let type_index = self.read_var_u32()?;
1290
4
                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
2
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1347
        })
1348
6
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>
Line
Count
Source
1133
394
    fn visit_0xfb_operator<T>(
1134
394
        &mut self,
1135
394
        pos: u64,
1136
394
        visitor: &mut T,
1137
394
    ) -> Result<<T as VisitOperator<'a>>::Output>
1138
394
    where
1139
394
        T: VisitOperator<'a>,
1140
    {
1141
394
        let code = self.read_var_u32()?;
1142
385
        Ok(match code {
1143
            0x0 => {
1144
63
                let type_index = self.read_var_u32()?;
1145
61
                visitor.visit_struct_new(type_index)
1146
            }
1147
            0x01 => {
1148
22
                let type_index = self.read_var_u32()?;
1149
19
                visitor.visit_struct_new_default(type_index)
1150
            }
1151
            0x02 => {
1152
15
                let type_index = self.read_var_u32()?;
1153
14
                let field_index = self.read_var_u32()?;
1154
11
                visitor.visit_struct_get(type_index, field_index)
1155
            }
1156
            0x03 => {
1157
9
                let type_index = self.read_var_u32()?;
1158
9
                let field_index = self.read_var_u32()?;
1159
7
                visitor.visit_struct_get_s(type_index, field_index)
1160
            }
1161
            0x04 => {
1162
38
                let type_index = self.read_var_u32()?;
1163
35
                let field_index = self.read_var_u32()?;
1164
32
                visitor.visit_struct_get_u(type_index, field_index)
1165
            }
1166
            0x05 => {
1167
3
                let type_index = self.read_var_u32()?;
1168
3
                let field_index = self.read_var_u32()?;
1169
3
                visitor.visit_struct_set(type_index, field_index)
1170
            }
1171
            0x06 => {
1172
13
                let type_index = self.read_var_u32()?;
1173
11
                visitor.visit_array_new(type_index)
1174
            }
1175
            0x07 => {
1176
3
                let type_index = self.read_var_u32()?;
1177
3
                visitor.visit_array_new_default(type_index)
1178
            }
1179
            0x08 => {
1180
10
                let type_index = self.read_var_u32()?;
1181
10
                let n = self.read_var_u32()?;
1182
10
                visitor.visit_array_new_fixed(type_index, n)
1183
            }
1184
            0x09 => {
1185
3
                let type_index = self.read_var_u32()?;
1186
3
                let data_index = self.read_var_u32()?;
1187
3
                visitor.visit_array_new_data(type_index, data_index)
1188
            }
1189
            0x0a => {
1190
12
                let type_index = self.read_var_u32()?;
1191
10
                let elem_index = self.read_var_u32()?;
1192
7
                visitor.visit_array_new_elem(type_index, elem_index)
1193
            }
1194
            0x0b => {
1195
7
                let type_index = self.read_var_u32()?;
1196
7
                visitor.visit_array_get(type_index)
1197
            }
1198
            0x0c => {
1199
12
                let type_index = self.read_var_u32()?;
1200
12
                visitor.visit_array_get_s(type_index)
1201
            }
1202
            0x0d => {
1203
7
                let type_index = self.read_var_u32()?;
1204
7
                visitor.visit_array_get_u(type_index)
1205
            }
1206
            0x0e => {
1207
10
                let type_index = self.read_var_u32()?;
1208
10
                visitor.visit_array_set(type_index)
1209
            }
1210
2
            0x0f => visitor.visit_array_len(),
1211
            0x10 => {
1212
5
                let type_index = self.read_var_u32()?;
1213
5
                visitor.visit_array_fill(type_index)
1214
            }
1215
            0x11 => {
1216
11
                let type_index_dst = self.read_var_u32()?;
1217
10
                let type_index_src = self.read_var_u32()?;
1218
9
                visitor.visit_array_copy(type_index_dst, type_index_src)
1219
            }
1220
            0x12 => {
1221
1
                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
5
                let type_index = self.read_var_u32()?;
1227
5
                let elem_index = self.read_var_u32()?;
1228
5
                visitor.visit_array_init_elem(type_index, elem_index)
1229
            }
1230
5
            0x14 => visitor.visit_ref_test_non_null(self.read()?),
1231
5
            0x15 => visitor.visit_ref_test_nullable(self.read()?),
1232
18
            0x16 => visitor.visit_ref_cast_non_null(self.read()?),
1233
7
            0x17 => visitor.visit_ref_cast_nullable(self.read()?),
1234
            0x18 => {
1235
8
                let pos = self.original_position();
1236
8
                let cast_flags = self.read_u8()?;
1237
8
                let relative_depth = self.read_var_u32()?;
1238
8
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1239
7
                    0b00 => (false, false),
1240
0
                    0b01 => (true, false),
1241
0
                    0b10 => (false, true),
1242
0
                    0b11 => (true, true),
1243
1
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1244
                };
1245
7
                let from_heap_type = self.read()?;
1246
6
                let from_ref_type =
1247
6
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1248
                        format_err!(pos, "implementation error: type index too large")
1249
0
                    })?;
1250
6
                let to_heap_type = self.read()?;
1251
6
                let to_ref_type =
1252
6
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1253
                        format_err!(pos, "implementation error: type index too large")
1254
0
                    })?;
1255
6
                visitor.visit_br_on_cast(relative_depth, from_ref_type, to_ref_type)
1256
            }
1257
            0x19 => {
1258
10
                let pos = self.original_position();
1259
10
                let cast_flags = self.read_u8()?;
1260
7
                let relative_depth = self.read_var_u32()?;
1261
5
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1262
5
                    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
5
                let from_heap_type = self.read()?;
1269
5
                let from_ref_type =
1270
5
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1271
                        format_err!(pos, "implementation error: type index too large")
1272
0
                    })?;
1273
5
                let to_heap_type = self.read()?;
1274
4
                let to_ref_type =
1275
5
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1276
                        format_err!(pos, "implementation error: type index too large")
1277
1
                    })?;
1278
4
                visitor.visit_br_on_cast_fail(relative_depth, from_ref_type, to_ref_type)
1279
            }
1280
1281
5
            0x1a => visitor.visit_any_convert_extern(),
1282
8
            0x1b => visitor.visit_extern_convert_any(),
1283
1284
14
            0x1c => visitor.visit_ref_i31(),
1285
4
            0x1d => visitor.visit_i31_get_s(),
1286
1
            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
5
                let type_index = self.read_var_u32()?;
1294
5
                visitor.visit_struct_new_default_desc(type_index)
1295
            }
1296
8
            0x22 => visitor.visit_ref_get_desc(self.read()?),
1297
0
            0x23 => visitor.visit_ref_cast_desc_eq_non_null(self.read()?),
1298
9
            0x24 => visitor.visit_ref_cast_desc_eq_nullable(self.read()?),
1299
            0x25 => {
1300
4
                let pos = self.original_position();
1301
4
                let cast_flags = self.read_u8()?;
1302
4
                let relative_depth = self.read_var_u32()?;
1303
3
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1304
3
                    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
3
                let from_heap_type = self.read()?;
1311
3
                let from_ref_type =
1312
3
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1313
                        format_err!(pos, "implementation error: type index too large")
1314
0
                    })?;
1315
3
                let to_heap_type = self.read()?;
1316
3
                let to_ref_type =
1317
3
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1318
                        format_err!(pos, "implementation error: type index too large")
1319
0
                    })?;
1320
3
                visitor.visit_br_on_cast_desc_eq(relative_depth, from_ref_type, to_ref_type)
1321
            }
1322
            0x26 => {
1323
15
                let pos = self.original_position();
1324
15
                let cast_flags = self.read_u8()?;
1325
14
                let relative_depth = self.read_var_u32()?;
1326
12
                let (from_type_nullable, to_type_nullable) = match cast_flags {
1327
7
                    0 => (false, false),
1328
0
                    1 => (true, false),
1329
0
                    2 => (false, true),
1330
0
                    3 => (true, true),
1331
5
                    _ => bail!(pos, "invalid cast flags: {cast_flags:08b}"),
1332
                };
1333
7
                let from_heap_type = self.read()?;
1334
4
                let from_ref_type =
1335
5
                    RefType::new(from_type_nullable, from_heap_type).ok_or_else(|| {
1336
                        format_err!(pos, "implementation error: type index too large")
1337
1
                    })?;
1338
4
                let to_heap_type = self.read()?;
1339
3
                let to_ref_type =
1340
3
                    RefType::new(to_type_nullable, to_heap_type).ok_or_else(|| {
1341
                        format_err!(pos, "implementation error: type index too large")
1342
0
                    })?;
1343
3
                visitor.visit_br_on_cast_desc_eq_fail(relative_depth, from_ref_type, to_ref_type)
1344
            }
1345
1346
8
            _ => bail!(pos, "unknown 0xfb subopcode: 0x{code:x}"),
1347
        })
1348
394
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfb_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
Line
Count
Source
1133
6
    fn visit_0xfb_operator<T>(
1134
6
        &mut self,
1135
6
        pos: u64,
1136
6
        visitor: &mut T,
1137
6
    ) -> Result<<T as VisitOperator<'a>>::Output>
1138
6
    where
1139
6
        T: VisitOperator<'a>,
1140
    {
1141
6
        let code = self.read_var_u32()?;
1142
6
        Ok(match code {
1143
            0x0 => {
1144
2
                let type_index = self.read_var_u32()?;
1145
2
                visitor.visit_struct_new(type_index)
1146
            }
1147
            0x01 => {
1148
0
                let type_index = self.read_var_u32()?;
1149
0
                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
0
                let type_index = self.read_var_u32()?;
1173
0
                visitor.visit_array_new(type_index)
1174
            }
1175
            0x07 => {
1176
0
                let type_index = self.read_var_u32()?;
1177
0
                visitor.visit_array_new_default(type_index)
1178
            }
1179
            0x08 => {
1180
0
                let type_index = self.read_var_u32()?;
1181
0
                let n = self.read_var_u32()?;
1182
0
                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
2
                let type_index = self.read_var_u32()?;
1196
2
                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
1
                let type_index = self.read_var_u32()?;
1204
1
                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
1
            0x1a => visitor.visit_any_convert_extern(),
1282
0
            0x1b => visitor.visit_extern_convert_any(),
1283
1284
0
            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
6
    }
1349
1350
589
    fn visit_0xfc_operator<T>(
1351
589
        &mut self,
1352
589
        pos: u64,
1353
589
        visitor: &mut T,
1354
589
    ) -> Result<<T as VisitOperator<'a>>::Output>
1355
589
    where
1356
589
        T: VisitOperator<'a>,
1357
    {
1358
589
        let code = self.read_var_u32()?;
1359
579
        Ok(match code {
1360
39
            0x00 => visitor.visit_i32_trunc_sat_f32_s(),
1361
11
            0x01 => visitor.visit_i32_trunc_sat_f32_u(),
1362
15
            0x02 => visitor.visit_i32_trunc_sat_f64_s(),
1363
5
            0x03 => visitor.visit_i32_trunc_sat_f64_u(),
1364
4
            0x04 => visitor.visit_i64_trunc_sat_f32_s(),
1365
2
            0x05 => visitor.visit_i64_trunc_sat_f32_u(),
1366
16
            0x06 => visitor.visit_i64_trunc_sat_f64_s(),
1367
3
            0x07 => visitor.visit_i64_trunc_sat_f64_u(),
1368
1369
            0x08 => {
1370
20
                let segment = self.read_var_u32()?;
1371
20
                let mem = self.read_var_u32()?;
1372
19
                visitor.visit_memory_init(segment, mem)
1373
            }
1374
            0x09 => {
1375
295
                let segment = self.read_var_u32()?;
1376
293
                visitor.visit_data_drop(segment)
1377
            }
1378
            0x0a => {
1379
10
                let dst = self.read_var_u32()?;
1380
10
                let src = self.read_var_u32()?;
1381
10
                visitor.visit_memory_copy(dst, src)
1382
            }
1383
            0x0b => {
1384
9
                let mem = self.read_var_u32()?;
1385
4
                visitor.visit_memory_fill(mem)
1386
            }
1387
            0x0c => {
1388
1
                let segment = self.read_var_u32()?;
1389
1
                let table = self.read_var_u32()?;
1390
1
                visitor.visit_table_init(segment, table)
1391
            }
1392
            0x0d => {
1393
7
                let segment = self.read_var_u32()?;
1394
6
                visitor.visit_elem_drop(segment)
1395
            }
1396
            0x0e => {
1397
28
                let dst_table = self.read_var_u32()?;
1398
26
                let src_table = self.read_var_u32()?;
1399
26
                visitor.visit_table_copy(dst_table, src_table)
1400
            }
1401
1402
            0x0f => {
1403
6
                let table = self.read_var_u32()?;
1404
6
                visitor.visit_table_grow(table)
1405
            }
1406
            0x10 => {
1407
8
                let table = self.read_var_u32()?;
1408
7
                visitor.visit_table_size(table)
1409
            }
1410
1411
            0x11 => {
1412
13
                let table = self.read_var_u32()?;
1413
12
                visitor.visit_table_fill(table)
1414
            }
1415
1416
            0x12 => {
1417
75
                let mem = self.read_var_u32()?;
1418
75
                visitor.visit_memory_discard(mem)
1419
            }
1420
1421
2
            0x13 => visitor.visit_i64_add128(),
1422
2
            0x14 => visitor.visit_i64_sub128(),
1423
1
            0x15 => visitor.visit_i64_mul_wide_s(),
1424
0
            0x16 => visitor.visit_i64_mul_wide_u(),
1425
1426
7
            _ => bail!(pos, "unknown 0xfc subopcode: 0x{code:x}"),
1427
        })
1428
589
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfc_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>
<wasmparser::binary_reader::BinaryReader>::visit_0xfc_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
Line
Count
Source
1350
4
    fn visit_0xfc_operator<T>(
1351
4
        &mut self,
1352
4
        pos: u64,
1353
4
        visitor: &mut T,
1354
4
    ) -> Result<<T as VisitOperator<'a>>::Output>
1355
4
    where
1356
4
        T: VisitOperator<'a>,
1357
    {
1358
4
        let code = self.read_var_u32()?;
1359
2
        Ok(match code {
1360
2
            0x00 => visitor.visit_i32_trunc_sat_f32_s(),
1361
0
            0x01 => visitor.visit_i32_trunc_sat_f32_u(),
1362
0
            0x02 => visitor.visit_i32_trunc_sat_f64_s(),
1363
0
            0x03 => visitor.visit_i32_trunc_sat_f64_u(),
1364
0
            0x04 => visitor.visit_i64_trunc_sat_f32_s(),
1365
0
            0x05 => visitor.visit_i64_trunc_sat_f32_u(),
1366
0
            0x06 => visitor.visit_i64_trunc_sat_f64_s(),
1367
0
            0x07 => visitor.visit_i64_trunc_sat_f64_u(),
1368
1369
            0x08 => {
1370
0
                let segment = self.read_var_u32()?;
1371
0
                let mem = self.read_var_u32()?;
1372
0
                visitor.visit_memory_init(segment, mem)
1373
            }
1374
            0x09 => {
1375
0
                let segment = self.read_var_u32()?;
1376
0
                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
0
                let mem = self.read_var_u32()?;
1385
0
                visitor.visit_memory_fill(mem)
1386
            }
1387
            0x0c => {
1388
0
                let segment = self.read_var_u32()?;
1389
0
                let table = self.read_var_u32()?;
1390
0
                visitor.visit_table_init(segment, table)
1391
            }
1392
            0x0d => {
1393
0
                let segment = self.read_var_u32()?;
1394
0
                visitor.visit_elem_drop(segment)
1395
            }
1396
            0x0e => {
1397
0
                let dst_table = self.read_var_u32()?;
1398
0
                let src_table = self.read_var_u32()?;
1399
0
                visitor.visit_table_copy(dst_table, src_table)
1400
            }
1401
1402
            0x0f => {
1403
0
                let table = self.read_var_u32()?;
1404
0
                visitor.visit_table_grow(table)
1405
            }
1406
            0x10 => {
1407
0
                let table = self.read_var_u32()?;
1408
0
                visitor.visit_table_size(table)
1409
            }
1410
1411
            0x11 => {
1412
0
                let table = self.read_var_u32()?;
1413
0
                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
0
            0x13 => visitor.visit_i64_add128(),
1422
0
            0x14 => visitor.visit_i64_sub128(),
1423
0
            0x15 => visitor.visit_i64_mul_wide_s(),
1424
0
            0x16 => visitor.visit_i64_mul_wide_u(),
1425
1426
0
            _ => bail!(pos, "unknown 0xfc subopcode: 0x{code:x}"),
1427
        })
1428
4
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfc_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>
Line
Count
Source
1350
582
    fn visit_0xfc_operator<T>(
1351
582
        &mut self,
1352
582
        pos: u64,
1353
582
        visitor: &mut T,
1354
582
    ) -> Result<<T as VisitOperator<'a>>::Output>
1355
582
    where
1356
582
        T: VisitOperator<'a>,
1357
    {
1358
582
        let code = self.read_var_u32()?;
1359
574
        Ok(match code {
1360
36
            0x00 => visitor.visit_i32_trunc_sat_f32_s(),
1361
11
            0x01 => visitor.visit_i32_trunc_sat_f32_u(),
1362
14
            0x02 => visitor.visit_i32_trunc_sat_f64_s(),
1363
5
            0x03 => visitor.visit_i32_trunc_sat_f64_u(),
1364
4
            0x04 => visitor.visit_i64_trunc_sat_f32_s(),
1365
2
            0x05 => visitor.visit_i64_trunc_sat_f32_u(),
1366
16
            0x06 => visitor.visit_i64_trunc_sat_f64_s(),
1367
3
            0x07 => visitor.visit_i64_trunc_sat_f64_u(),
1368
1369
            0x08 => {
1370
20
                let segment = self.read_var_u32()?;
1371
20
                let mem = self.read_var_u32()?;
1372
19
                visitor.visit_memory_init(segment, mem)
1373
            }
1374
            0x09 => {
1375
295
                let segment = self.read_var_u32()?;
1376
293
                visitor.visit_data_drop(segment)
1377
            }
1378
            0x0a => {
1379
10
                let dst = self.read_var_u32()?;
1380
10
                let src = self.read_var_u32()?;
1381
10
                visitor.visit_memory_copy(dst, src)
1382
            }
1383
            0x0b => {
1384
9
                let mem = self.read_var_u32()?;
1385
4
                visitor.visit_memory_fill(mem)
1386
            }
1387
            0x0c => {
1388
1
                let segment = self.read_var_u32()?;
1389
1
                let table = self.read_var_u32()?;
1390
1
                visitor.visit_table_init(segment, table)
1391
            }
1392
            0x0d => {
1393
7
                let segment = self.read_var_u32()?;
1394
6
                visitor.visit_elem_drop(segment)
1395
            }
1396
            0x0e => {
1397
28
                let dst_table = self.read_var_u32()?;
1398
26
                let src_table = self.read_var_u32()?;
1399
26
                visitor.visit_table_copy(dst_table, src_table)
1400
            }
1401
1402
            0x0f => {
1403
6
                let table = self.read_var_u32()?;
1404
6
                visitor.visit_table_grow(table)
1405
            }
1406
            0x10 => {
1407
8
                let table = self.read_var_u32()?;
1408
7
                visitor.visit_table_size(table)
1409
            }
1410
1411
            0x11 => {
1412
12
                let table = self.read_var_u32()?;
1413
11
                visitor.visit_table_fill(table)
1414
            }
1415
1416
            0x12 => {
1417
75
                let mem = self.read_var_u32()?;
1418
75
                visitor.visit_memory_discard(mem)
1419
            }
1420
1421
2
            0x13 => visitor.visit_i64_add128(),
1422
2
            0x14 => visitor.visit_i64_sub128(),
1423
1
            0x15 => visitor.visit_i64_mul_wide_s(),
1424
0
            0x16 => visitor.visit_i64_mul_wide_u(),
1425
1426
7
            _ => bail!(pos, "unknown 0xfc subopcode: 0x{code:x}"),
1427
        })
1428
582
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfc_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
Line
Count
Source
1350
3
    fn visit_0xfc_operator<T>(
1351
3
        &mut self,
1352
3
        pos: u64,
1353
3
        visitor: &mut T,
1354
3
    ) -> Result<<T as VisitOperator<'a>>::Output>
1355
3
    where
1356
3
        T: VisitOperator<'a>,
1357
    {
1358
3
        let code = self.read_var_u32()?;
1359
3
        Ok(match code {
1360
1
            0x00 => visitor.visit_i32_trunc_sat_f32_s(),
1361
0
            0x01 => visitor.visit_i32_trunc_sat_f32_u(),
1362
1
            0x02 => visitor.visit_i32_trunc_sat_f64_s(),
1363
0
            0x03 => visitor.visit_i32_trunc_sat_f64_u(),
1364
0
            0x04 => visitor.visit_i64_trunc_sat_f32_s(),
1365
0
            0x05 => visitor.visit_i64_trunc_sat_f32_u(),
1366
0
            0x06 => visitor.visit_i64_trunc_sat_f64_s(),
1367
0
            0x07 => visitor.visit_i64_trunc_sat_f64_u(),
1368
1369
            0x08 => {
1370
0
                let segment = self.read_var_u32()?;
1371
0
                let mem = self.read_var_u32()?;
1372
0
                visitor.visit_memory_init(segment, mem)
1373
            }
1374
            0x09 => {
1375
0
                let segment = self.read_var_u32()?;
1376
0
                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
0
                let mem = self.read_var_u32()?;
1385
0
                visitor.visit_memory_fill(mem)
1386
            }
1387
            0x0c => {
1388
0
                let segment = self.read_var_u32()?;
1389
0
                let table = self.read_var_u32()?;
1390
0
                visitor.visit_table_init(segment, table)
1391
            }
1392
            0x0d => {
1393
0
                let segment = self.read_var_u32()?;
1394
0
                visitor.visit_elem_drop(segment)
1395
            }
1396
            0x0e => {
1397
0
                let dst_table = self.read_var_u32()?;
1398
0
                let src_table = self.read_var_u32()?;
1399
0
                visitor.visit_table_copy(dst_table, src_table)
1400
            }
1401
1402
            0x0f => {
1403
0
                let table = self.read_var_u32()?;
1404
0
                visitor.visit_table_grow(table)
1405
            }
1406
            0x10 => {
1407
0
                let table = self.read_var_u32()?;
1408
0
                visitor.visit_table_size(table)
1409
            }
1410
1411
            0x11 => {
1412
1
                let table = self.read_var_u32()?;
1413
1
                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
0
            0x13 => visitor.visit_i64_add128(),
1422
0
            0x14 => visitor.visit_i64_sub128(),
1423
0
            0x15 => visitor.visit_i64_mul_wide_s(),
1424
0
            0x16 => visitor.visit_i64_mul_wide_u(),
1425
1426
0
            _ => bail!(pos, "unknown 0xfc subopcode: 0x{code:x}"),
1427
        })
1428
3
    }
1429
1430
    #[cfg(feature = "simd")]
1431
2.09k
    pub(super) fn visit_0xfd_operator<T>(
1432
2.09k
        &mut self,
1433
2.09k
        pos: u64,
1434
2.09k
        visitor: &mut T,
1435
2.09k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1436
2.09k
    where
1437
2.09k
        T: VisitSimdOperator<'a>,
1438
    {
1439
2.09k
        let code = self.read_var_u32()?;
1440
2.08k
        Ok(match code {
1441
32
            0x00 => visitor.visit_v128_load(self.read_memarg(4)?),
1442
37
            0x01 => visitor.visit_v128_load8x8_s(self.read_memarg(3)?),
1443
24
            0x02 => visitor.visit_v128_load8x8_u(self.read_memarg(3)?),
1444
9
            0x03 => visitor.visit_v128_load16x4_s(self.read_memarg(3)?),
1445
14
            0x04 => visitor.visit_v128_load16x4_u(self.read_memarg(3)?),
1446
14
            0x05 => visitor.visit_v128_load32x2_s(self.read_memarg(3)?),
1447
9
            0x06 => visitor.visit_v128_load32x2_u(self.read_memarg(3)?),
1448
18
            0x07 => visitor.visit_v128_load8_splat(self.read_memarg(0)?),
1449
1
            0x08 => visitor.visit_v128_load16_splat(self.read_memarg(1)?),
1450
14
            0x09 => visitor.visit_v128_load32_splat(self.read_memarg(2)?),
1451
8
            0x0a => visitor.visit_v128_load64_splat(self.read_memarg(3)?),
1452
1453
23
            0x0b => visitor.visit_v128_store(self.read_memarg(4)?),
1454
11
            0x0c => visitor.visit_v128_const(self.read_v128()?),
1455
            0x0d => {
1456
24
                let mut lanes: [u8; 16] = [0; 16];
1457
282
                for lane in &mut lanes {
1458
274
                    *lane = self.read_lane_index()?
1459
                }
1460
8
                visitor.visit_i8x16_shuffle(lanes)
1461
            }
1462
1463
30
            0x0e => visitor.visit_i8x16_swizzle(),
1464
14
            0x0f => visitor.visit_i8x16_splat(),
1465
1
            0x10 => visitor.visit_i16x8_splat(),
1466
34
            0x11 => visitor.visit_i32x4_splat(),
1467
11
            0x12 => visitor.visit_i64x2_splat(),
1468
2
            0x13 => visitor.visit_f32x4_splat(),
1469
27
            0x14 => visitor.visit_f64x2_splat(),
1470
1471
12
            0x15 => visitor.visit_i8x16_extract_lane_s(self.read_lane_index()?),
1472
10
            0x16 => visitor.visit_i8x16_extract_lane_u(self.read_lane_index()?),
1473
3
            0x17 => visitor.visit_i8x16_replace_lane(self.read_lane_index()?),
1474
203
            0x18 => visitor.visit_i16x8_extract_lane_s(self.read_lane_index()?),
1475
3
            0x19 => visitor.visit_i16x8_extract_lane_u(self.read_lane_index()?),
1476
11
            0x1a => visitor.visit_i16x8_replace_lane(self.read_lane_index()?),
1477
28
            0x1b => visitor.visit_i32x4_extract_lane(self.read_lane_index()?),
1478
1479
4
            0x1c => visitor.visit_i32x4_replace_lane(self.read_lane_index()?),
1480
7
            0x1d => visitor.visit_i64x2_extract_lane(self.read_lane_index()?),
1481
2
            0x1e => visitor.visit_i64x2_replace_lane(self.read_lane_index()?),
1482
3
            0x1f => visitor.visit_f32x4_extract_lane(self.read_lane_index()?),
1483
5
            0x20 => visitor.visit_f32x4_replace_lane(self.read_lane_index()?),
1484
1
            0x21 => visitor.visit_f64x2_extract_lane(self.read_lane_index()?),
1485
3
            0x22 => visitor.visit_f64x2_replace_lane(self.read_lane_index()?),
1486
1487
6
            0x23 => visitor.visit_i8x16_eq(),
1488
19
            0x24 => visitor.visit_i8x16_ne(),
1489
18
            0x25 => visitor.visit_i8x16_lt_s(),
1490
5
            0x26 => visitor.visit_i8x16_lt_u(),
1491
9
            0x27 => visitor.visit_i8x16_gt_s(),
1492
10
            0x28 => visitor.visit_i8x16_gt_u(),
1493
5
            0x29 => visitor.visit_i8x16_le_s(),
1494
23
            0x2a => visitor.visit_i8x16_le_u(),
1495
0
            0x2b => visitor.visit_i8x16_ge_s(),
1496
2
            0x2c => visitor.visit_i8x16_ge_u(),
1497
8
            0x2d => visitor.visit_i16x8_eq(),
1498
4
            0x2e => visitor.visit_i16x8_ne(),
1499
1
            0x2f => visitor.visit_i16x8_lt_s(),
1500
14
            0x30 => visitor.visit_i16x8_lt_u(),
1501
9
            0x31 => visitor.visit_i16x8_gt_s(),
1502
6
            0x32 => visitor.visit_i16x8_gt_u(),
1503
48
            0x33 => visitor.visit_i16x8_le_s(),
1504
20
            0x34 => visitor.visit_i16x8_le_u(),
1505
6
            0x35 => visitor.visit_i16x8_ge_s(),
1506
3
            0x36 => visitor.visit_i16x8_ge_u(),
1507
13
            0x37 => visitor.visit_i32x4_eq(),
1508
19
            0x38 => visitor.visit_i32x4_ne(),
1509
12
            0x39 => visitor.visit_i32x4_lt_s(),
1510
13
            0x3a => visitor.visit_i32x4_lt_u(),
1511
2
            0x3b => visitor.visit_i32x4_gt_s(),
1512
10
            0x3c => visitor.visit_i32x4_gt_u(),
1513
3
            0x3d => visitor.visit_i32x4_le_s(),
1514
6
            0x3e => visitor.visit_i32x4_le_u(),
1515
7
            0x3f => visitor.visit_i32x4_ge_s(),
1516
10
            0x40 => visitor.visit_i32x4_ge_u(),
1517
5
            0x41 => visitor.visit_f32x4_eq(),
1518
6
            0x42 => visitor.visit_f32x4_ne(),
1519
8
            0x43 => visitor.visit_f32x4_lt(),
1520
13
            0x44 => visitor.visit_f32x4_gt(),
1521
8
            0x45 => visitor.visit_f32x4_le(),
1522
17
            0x46 => visitor.visit_f32x4_ge(),
1523
8
            0x47 => visitor.visit_f64x2_eq(),
1524
7
            0x48 => visitor.visit_f64x2_ne(),
1525
9
            0x49 => visitor.visit_f64x2_lt(),
1526
15
            0x4a => visitor.visit_f64x2_gt(),
1527
0
            0x4b => visitor.visit_f64x2_le(),
1528
4
            0x4c => visitor.visit_f64x2_ge(),
1529
14
            0x4d => visitor.visit_v128_not(),
1530
3
            0x4e => visitor.visit_v128_and(),
1531
12
            0x4f => visitor.visit_v128_andnot(),
1532
14
            0x50 => visitor.visit_v128_or(),
1533
10
            0x51 => visitor.visit_v128_xor(),
1534
5
            0x52 => visitor.visit_v128_bitselect(),
1535
11
            0x53 => visitor.visit_v128_any_true(),
1536
1537
            0x54 => {
1538
8
                let memarg = self.read_memarg(0)?;
1539
7
                let lane = self.read_lane_index()?;
1540
7
                visitor.visit_v128_load8_lane(memarg, lane)
1541
            }
1542
            0x55 => {
1543
31
                let memarg = self.read_memarg(1)?;
1544
29
                let lane = self.read_lane_index()?;
1545
29
                visitor.visit_v128_load16_lane(memarg, lane)
1546
            }
1547
            0x56 => {
1548
21
                let memarg = self.read_memarg(2)?;
1549
20
                let lane = self.read_lane_index()?;
1550
18
                visitor.visit_v128_load32_lane(memarg, lane)
1551
            }
1552
            0x57 => {
1553
11
                let memarg = self.read_memarg(3)?;
1554
11
                let lane = self.read_lane_index()?;
1555
9
                visitor.visit_v128_load64_lane(memarg, lane)
1556
            }
1557
            0x58 => {
1558
7
                let memarg = self.read_memarg(0)?;
1559
7
                let lane = self.read_lane_index()?;
1560
7
                visitor.visit_v128_store8_lane(memarg, lane)
1561
            }
1562
            0x59 => {
1563
7
                let memarg = self.read_memarg(1)?;
1564
6
                let lane = self.read_lane_index()?;
1565
6
                visitor.visit_v128_store16_lane(memarg, lane)
1566
            }
1567
            0x5a => {
1568
5
                let memarg = self.read_memarg(2)?;
1569
5
                let lane = self.read_lane_index()?;
1570
5
                visitor.visit_v128_store32_lane(memarg, lane)
1571
            }
1572
            0x5b => {
1573
8
                let memarg = self.read_memarg(3)?;
1574
8
                let lane = self.read_lane_index()?;
1575
8
                visitor.visit_v128_store64_lane(memarg, lane)
1576
            }
1577
1578
27
            0x5c => visitor.visit_v128_load32_zero(self.read_memarg(2)?),
1579
7
            0x5d => visitor.visit_v128_load64_zero(self.read_memarg(3)?),
1580
8
            0x5e => visitor.visit_f32x4_demote_f64x2_zero(),
1581
14
            0x5f => visitor.visit_f64x2_promote_low_f32x4(),
1582
2
            0x60 => visitor.visit_i8x16_abs(),
1583
12
            0x61 => visitor.visit_i8x16_neg(),
1584
9
            0x62 => visitor.visit_i8x16_popcnt(),
1585
23
            0x63 => visitor.visit_i8x16_all_true(),
1586
4
            0x64 => visitor.visit_i8x16_bitmask(),
1587
5
            0x65 => visitor.visit_i8x16_narrow_i16x8_s(),
1588
2
            0x66 => visitor.visit_i8x16_narrow_i16x8_u(),
1589
1
            0x67 => visitor.visit_f32x4_ceil(),
1590
4
            0x68 => visitor.visit_f32x4_floor(),
1591
12
            0x69 => visitor.visit_f32x4_trunc(),
1592
16
            0x6a => visitor.visit_f32x4_nearest(),
1593
4
            0x6b => visitor.visit_i8x16_shl(),
1594
13
            0x6c => visitor.visit_i8x16_shr_s(),
1595
6
            0x6d => visitor.visit_i8x16_shr_u(),
1596
2
            0x6e => visitor.visit_i8x16_add(),
1597
4
            0x6f => visitor.visit_i8x16_add_sat_s(),
1598
22
            0x70 => visitor.visit_i8x16_add_sat_u(),
1599
11
            0x71 => visitor.visit_i8x16_sub(),
1600
0
            0x72 => visitor.visit_i8x16_sub_sat_s(),
1601
6
            0x73 => visitor.visit_i8x16_sub_sat_u(),
1602
4
            0x74 => visitor.visit_f64x2_ceil(),
1603
6
            0x75 => visitor.visit_f64x2_floor(),
1604
4
            0x76 => visitor.visit_i8x16_min_s(),
1605
0
            0x77 => visitor.visit_i8x16_min_u(),
1606
2
            0x78 => visitor.visit_i8x16_max_s(),
1607
7
            0x79 => visitor.visit_i8x16_max_u(),
1608
31
            0x7a => visitor.visit_f64x2_trunc(),
1609
5
            0x7b => visitor.visit_i8x16_avgr_u(),
1610
16
            0x7c => visitor.visit_i16x8_extadd_pairwise_i8x16_s(),
1611
17
            0x7d => visitor.visit_i16x8_extadd_pairwise_i8x16_u(),
1612
8
            0x7e => visitor.visit_i32x4_extadd_pairwise_i16x8_s(),
1613
31
            0x7f => visitor.visit_i32x4_extadd_pairwise_i16x8_u(),
1614
4
            0x80 => visitor.visit_i16x8_abs(),
1615
2
            0x81 => visitor.visit_i16x8_neg(),
1616
26
            0x82 => visitor.visit_i16x8_q15mulr_sat_s(),
1617
5
            0x83 => visitor.visit_i16x8_all_true(),
1618
5
            0x84 => visitor.visit_i16x8_bitmask(),
1619
4
            0x85 => visitor.visit_i16x8_narrow_i32x4_s(),
1620
5
            0x86 => visitor.visit_i16x8_narrow_i32x4_u(),
1621
0
            0x87 => visitor.visit_i16x8_extend_low_i8x16_s(),
1622
13
            0x88 => visitor.visit_i16x8_extend_high_i8x16_s(),
1623
4
            0x89 => visitor.visit_i16x8_extend_low_i8x16_u(),
1624
9
            0x8a => visitor.visit_i16x8_extend_high_i8x16_u(),
1625
3
            0x8b => visitor.visit_i16x8_shl(),
1626
8
            0x8c => visitor.visit_i16x8_shr_s(),
1627
5
            0x8d => visitor.visit_i16x8_shr_u(),
1628
12
            0x8e => visitor.visit_i16x8_add(),
1629
1
            0x8f => visitor.visit_i16x8_add_sat_s(),
1630
2
            0x90 => visitor.visit_i16x8_add_sat_u(),
1631
2
            0x91 => visitor.visit_i16x8_sub(),
1632
2
            0x92 => visitor.visit_i16x8_sub_sat_s(),
1633
6
            0x93 => visitor.visit_i16x8_sub_sat_u(),
1634
0
            0x94 => visitor.visit_f64x2_nearest(),
1635
5
            0x95 => visitor.visit_i16x8_mul(),
1636
0
            0x96 => visitor.visit_i16x8_min_s(),
1637
6
            0x97 => visitor.visit_i16x8_min_u(),
1638
0
            0x98 => visitor.visit_i16x8_max_s(),
1639
0
            0x99 => visitor.visit_i16x8_max_u(),
1640
2
            0x9b => visitor.visit_i16x8_avgr_u(),
1641
12
            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
1
            0xa1 => visitor.visit_i32x4_neg(),
1647
0
            0xa3 => visitor.visit_i32x4_all_true(),
1648
0
            0xa4 => visitor.visit_i32x4_bitmask(),
1649
2
            0xa7 => visitor.visit_i32x4_extend_low_i16x8_s(),
1650
5
            0xa8 => visitor.visit_i32x4_extend_high_i16x8_s(),
1651
0
            0xa9 => visitor.visit_i32x4_extend_low_i16x8_u(),
1652
11
            0xaa => visitor.visit_i32x4_extend_high_i16x8_u(),
1653
2
            0xab => visitor.visit_i32x4_shl(),
1654
4
            0xac => visitor.visit_i32x4_shr_s(),
1655
4
            0xad => visitor.visit_i32x4_shr_u(),
1656
10
            0xae => visitor.visit_i32x4_add(),
1657
6
            0xb1 => visitor.visit_i32x4_sub(),
1658
2
            0xb5 => visitor.visit_i32x4_mul(),
1659
3
            0xb6 => visitor.visit_i32x4_min_s(),
1660
23
            0xb7 => visitor.visit_i32x4_min_u(),
1661
1
            0xb8 => visitor.visit_i32x4_max_s(),
1662
3
            0xb9 => visitor.visit_i32x4_max_u(),
1663
16
            0xba => visitor.visit_i32x4_dot_i16x8_s(),
1664
6
            0xbc => visitor.visit_i32x4_extmul_low_i16x8_s(),
1665
9
            0xbd => visitor.visit_i32x4_extmul_high_i16x8_s(),
1666
7
            0xbe => visitor.visit_i32x4_extmul_low_i16x8_u(),
1667
2
            0xbf => visitor.visit_i32x4_extmul_high_i16x8_u(),
1668
0
            0xc0 => visitor.visit_i64x2_abs(),
1669
0
            0xc1 => visitor.visit_i64x2_neg(),
1670
2
            0xc3 => visitor.visit_i64x2_all_true(),
1671
10
            0xc4 => visitor.visit_i64x2_bitmask(),
1672
7
            0xc7 => visitor.visit_i64x2_extend_low_i32x4_s(),
1673
0
            0xc8 => visitor.visit_i64x2_extend_high_i32x4_s(),
1674
13
            0xc9 => visitor.visit_i64x2_extend_low_i32x4_u(),
1675
4
            0xca => visitor.visit_i64x2_extend_high_i32x4_u(),
1676
7
            0xcb => visitor.visit_i64x2_shl(),
1677
4
            0xcc => visitor.visit_i64x2_shr_s(),
1678
0
            0xcd => visitor.visit_i64x2_shr_u(),
1679
1
            0xce => visitor.visit_i64x2_add(),
1680
5
            0xd1 => visitor.visit_i64x2_sub(),
1681
3
            0xd5 => visitor.visit_i64x2_mul(),
1682
1
            0xd6 => visitor.visit_i64x2_eq(),
1683
2
            0xd7 => visitor.visit_i64x2_ne(),
1684
2
            0xd8 => visitor.visit_i64x2_lt_s(),
1685
1
            0xd9 => visitor.visit_i64x2_gt_s(),
1686
1
            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
7
            0xde => visitor.visit_i64x2_extmul_low_i32x4_u(),
1691
3
            0xdf => visitor.visit_i64x2_extmul_high_i32x4_u(),
1692
0
            0xe0 => visitor.visit_f32x4_abs(),
1693
4
            0xe1 => visitor.visit_f32x4_neg(),
1694
0
            0xe3 => visitor.visit_f32x4_sqrt(),
1695
3
            0xe4 => visitor.visit_f32x4_add(),
1696
3
            0xe5 => visitor.visit_f32x4_sub(),
1697
0
            0xe6 => visitor.visit_f32x4_mul(),
1698
2
            0xe7 => visitor.visit_f32x4_div(),
1699
1
            0xe8 => visitor.visit_f32x4_min(),
1700
1
            0xe9 => visitor.visit_f32x4_max(),
1701
3
            0xea => visitor.visit_f32x4_pmin(),
1702
1
            0xeb => visitor.visit_f32x4_pmax(),
1703
1
            0xec => visitor.visit_f64x2_abs(),
1704
0
            0xed => visitor.visit_f64x2_neg(),
1705
5
            0xef => visitor.visit_f64x2_sqrt(),
1706
2
            0xf0 => visitor.visit_f64x2_add(),
1707
0
            0xf1 => visitor.visit_f64x2_sub(),
1708
0
            0xf2 => visitor.visit_f64x2_mul(),
1709
2
            0xf3 => visitor.visit_f64x2_div(),
1710
4
            0xf4 => visitor.visit_f64x2_min(),
1711
6
            0xf5 => visitor.visit_f64x2_max(),
1712
17
            0xf6 => visitor.visit_f64x2_pmin(),
1713
1
            0xf7 => visitor.visit_f64x2_pmax(),
1714
6
            0xf8 => visitor.visit_i32x4_trunc_sat_f32x4_s(),
1715
1
            0xf9 => visitor.visit_i32x4_trunc_sat_f32x4_u(),
1716
4
            0xfa => visitor.visit_f32x4_convert_i32x4_s(),
1717
2
            0xfb => visitor.visit_f32x4_convert_i32x4_u(),
1718
13
            0xfc => visitor.visit_i32x4_trunc_sat_f64x2_s_zero(),
1719
5
            0xfd => visitor.visit_i32x4_trunc_sat_f64x2_u_zero(),
1720
0
            0xfe => visitor.visit_f64x2_convert_low_i32x4_s(),
1721
6
            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
1
            0x102 => visitor.visit_i32x4_relaxed_trunc_f32x4_u(),
1725
0
            0x103 => visitor.visit_i32x4_relaxed_trunc_f64x2_s_zero(),
1726
13
            0x104 => visitor.visit_i32x4_relaxed_trunc_f64x2_u_zero(),
1727
4
            0x105 => visitor.visit_f32x4_relaxed_madd(),
1728
2
            0x106 => visitor.visit_f32x4_relaxed_nmadd(),
1729
0
            0x107 => visitor.visit_f64x2_relaxed_madd(),
1730
1
            0x108 => visitor.visit_f64x2_relaxed_nmadd(),
1731
3
            0x109 => visitor.visit_i8x16_relaxed_laneselect(),
1732
6
            0x10a => visitor.visit_i16x8_relaxed_laneselect(),
1733
15
            0x10b => visitor.visit_i32x4_relaxed_laneselect(),
1734
1
            0x10c => visitor.visit_i64x2_relaxed_laneselect(),
1735
0
            0x10d => visitor.visit_f32x4_relaxed_min(),
1736
5
            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
1
            0x112 => visitor.visit_i16x8_relaxed_dot_i8x16_i7x16_s(),
1741
4
            0x113 => visitor.visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(),
1742
1743
23
            _ => bail!(pos, "unknown 0xfd subopcode: 0x{code:x}"),
1744
        })
1745
2.09k
    }
<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
51
    pub(super) fn visit_0xfd_operator<T>(
1432
51
        &mut self,
1433
51
        pos: u64,
1434
51
        visitor: &mut T,
1435
51
    ) -> Result<<T as VisitOperator<'a>>::Output>
1436
51
    where
1437
51
        T: VisitSimdOperator<'a>,
1438
    {
1439
51
        let code = self.read_var_u32()?;
1440
51
        Ok(match code {
1441
0
            0x00 => visitor.visit_v128_load(self.read_memarg(4)?),
1442
1
            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
1
            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
1
            0x0a => visitor.visit_v128_load64_splat(self.read_memarg(3)?),
1452
1453
2
            0x0b => visitor.visit_v128_store(self.read_memarg(4)?),
1454
0
            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
1
            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
1
            0x12 => visitor.visit_i64x2_splat(),
1468
0
            0x13 => visitor.visit_f32x4_splat(),
1469
0
            0x14 => visitor.visit_f64x2_splat(),
1470
1471
1
            0x15 => visitor.visit_i8x16_extract_lane_s(self.read_lane_index()?),
1472
1
            0x16 => visitor.visit_i8x16_extract_lane_u(self.read_lane_index()?),
1473
0
            0x17 => visitor.visit_i8x16_replace_lane(self.read_lane_index()?),
1474
1
            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
1
            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
1
            0x20 => visitor.visit_f32x4_replace_lane(self.read_lane_index()?),
1484
0
            0x21 => visitor.visit_f64x2_extract_lane(self.read_lane_index()?),
1485
1
            0x22 => visitor.visit_f64x2_replace_lane(self.read_lane_index()?),
1486
1487
1
            0x23 => visitor.visit_i8x16_eq(),
1488
0
            0x24 => visitor.visit_i8x16_ne(),
1489
1
            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
1
            0x2e => visitor.visit_i16x8_ne(),
1499
0
            0x2f => visitor.visit_i16x8_lt_s(),
1500
0
            0x30 => visitor.visit_i16x8_lt_u(),
1501
1
            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
1
            0x36 => visitor.visit_i16x8_ge_u(),
1507
1
            0x37 => visitor.visit_i32x4_eq(),
1508
1
            0x38 => visitor.visit_i32x4_ne(),
1509
0
            0x39 => visitor.visit_i32x4_lt_s(),
1510
1
            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
1
            0x42 => visitor.visit_f32x4_ne(),
1519
1
            0x43 => visitor.visit_f32x4_lt(),
1520
0
            0x44 => visitor.visit_f32x4_gt(),
1521
0
            0x45 => visitor.visit_f32x4_le(),
1522
1
            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
1
            0x4f => visitor.visit_v128_andnot(),
1532
1
            0x50 => visitor.visit_v128_or(),
1533
1
            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
1
                let memarg = self.read_memarg(1)?;
1544
1
                let lane = self.read_lane_index()?;
1545
1
                visitor.visit_v128_load16_lane(memarg, lane)
1546
            }
1547
            0x56 => {
1548
2
                let memarg = self.read_memarg(2)?;
1549
2
                let lane = self.read_lane_index()?;
1550
2
                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
1
                let memarg = self.read_memarg(0)?;
1559
1
                let lane = self.read_lane_index()?;
1560
1
                visitor.visit_v128_store8_lane(memarg, lane)
1561
            }
1562
            0x59 => {
1563
2
                let memarg = self.read_memarg(1)?;
1564
2
                let lane = self.read_lane_index()?;
1565
2
                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
1
            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
1
            0x60 => visitor.visit_i8x16_abs(),
1583
0
            0x61 => visitor.visit_i8x16_neg(),
1584
1
            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
1
            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
1
            0x6c => visitor.visit_i8x16_shr_s(),
1595
1
            0x6d => visitor.visit_i8x16_shr_u(),
1596
0
            0x6e => visitor.visit_i8x16_add(),
1597
0
            0x6f => visitor.visit_i8x16_add_sat_s(),
1598
1
            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
1
            0x74 => visitor.visit_f64x2_ceil(),
1603
1
            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
1
            0x79 => visitor.visit_i8x16_max_u(),
1608
0
            0x7a => visitor.visit_f64x2_trunc(),
1609
0
            0x7b => visitor.visit_i8x16_avgr_u(),
1610
1
            0x7c => visitor.visit_i16x8_extadd_pairwise_i8x16_s(),
1611
1
            0x7d => visitor.visit_i16x8_extadd_pairwise_i8x16_u(),
1612
0
            0x7e => visitor.visit_i32x4_extadd_pairwise_i16x8_s(),
1613
3
            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
1
            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
1
            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
1
            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
51
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfd_operator::<&mut dyn wasmparser::readers::core::operators::VisitSimdOperator<Output = wasmparser::readers::core::operators::Operator>>
Line
Count
Source
1431
10
    pub(super) fn visit_0xfd_operator<T>(
1432
10
        &mut self,
1433
10
        pos: u64,
1434
10
        visitor: &mut T,
1435
10
    ) -> Result<<T as VisitOperator<'a>>::Output>
1436
10
    where
1437
10
        T: VisitSimdOperator<'a>,
1438
    {
1439
10
        let code = self.read_var_u32()?;
1440
10
        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
2
            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
2
            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
2
            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
2
            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
2
            _ => bail!(pos, "unknown 0xfd subopcode: 0x{code:x}"),
1744
        })
1745
10
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfd_operator::<&mut dyn wasmparser::readers::core::operators::VisitSimdOperator<Output = bool>>
Line
Count
Source
1431
2.03k
    pub(super) fn visit_0xfd_operator<T>(
1432
2.03k
        &mut self,
1433
2.03k
        pos: u64,
1434
2.03k
        visitor: &mut T,
1435
2.03k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1436
2.03k
    where
1437
2.03k
        T: VisitSimdOperator<'a>,
1438
    {
1439
2.03k
        let code = self.read_var_u32()?;
1440
2.01k
        Ok(match code {
1441
32
            0x00 => visitor.visit_v128_load(self.read_memarg(4)?),
1442
36
            0x01 => visitor.visit_v128_load8x8_s(self.read_memarg(3)?),
1443
24
            0x02 => visitor.visit_v128_load8x8_u(self.read_memarg(3)?),
1444
9
            0x03 => visitor.visit_v128_load16x4_s(self.read_memarg(3)?),
1445
13
            0x04 => visitor.visit_v128_load16x4_u(self.read_memarg(3)?),
1446
14
            0x05 => visitor.visit_v128_load32x2_s(self.read_memarg(3)?),
1447
9
            0x06 => visitor.visit_v128_load32x2_u(self.read_memarg(3)?),
1448
18
            0x07 => visitor.visit_v128_load8_splat(self.read_memarg(0)?),
1449
1
            0x08 => visitor.visit_v128_load16_splat(self.read_memarg(1)?),
1450
14
            0x09 => visitor.visit_v128_load32_splat(self.read_memarg(2)?),
1451
7
            0x0a => visitor.visit_v128_load64_splat(self.read_memarg(3)?),
1452
1453
21
            0x0b => visitor.visit_v128_store(self.read_memarg(4)?),
1454
9
            0x0c => visitor.visit_v128_const(self.read_v128()?),
1455
            0x0d => {
1456
24
                let mut lanes: [u8; 16] = [0; 16];
1457
282
                for lane in &mut lanes {
1458
274
                    *lane = self.read_lane_index()?
1459
                }
1460
8
                visitor.visit_i8x16_shuffle(lanes)
1461
            }
1462
1463
29
            0x0e => visitor.visit_i8x16_swizzle(),
1464
14
            0x0f => visitor.visit_i8x16_splat(),
1465
1
            0x10 => visitor.visit_i16x8_splat(),
1466
34
            0x11 => visitor.visit_i32x4_splat(),
1467
10
            0x12 => visitor.visit_i64x2_splat(),
1468
2
            0x13 => visitor.visit_f32x4_splat(),
1469
25
            0x14 => visitor.visit_f64x2_splat(),
1470
1471
11
            0x15 => visitor.visit_i8x16_extract_lane_s(self.read_lane_index()?),
1472
9
            0x16 => visitor.visit_i8x16_extract_lane_u(self.read_lane_index()?),
1473
3
            0x17 => visitor.visit_i8x16_replace_lane(self.read_lane_index()?),
1474
200
            0x18 => visitor.visit_i16x8_extract_lane_s(self.read_lane_index()?),
1475
3
            0x19 => visitor.visit_i16x8_extract_lane_u(self.read_lane_index()?),
1476
10
            0x1a => visitor.visit_i16x8_replace_lane(self.read_lane_index()?),
1477
28
            0x1b => visitor.visit_i32x4_extract_lane(self.read_lane_index()?),
1478
1479
4
            0x1c => visitor.visit_i32x4_replace_lane(self.read_lane_index()?),
1480
7
            0x1d => visitor.visit_i64x2_extract_lane(self.read_lane_index()?),
1481
2
            0x1e => visitor.visit_i64x2_replace_lane(self.read_lane_index()?),
1482
3
            0x1f => visitor.visit_f32x4_extract_lane(self.read_lane_index()?),
1483
4
            0x20 => visitor.visit_f32x4_replace_lane(self.read_lane_index()?),
1484
1
            0x21 => visitor.visit_f64x2_extract_lane(self.read_lane_index()?),
1485
2
            0x22 => visitor.visit_f64x2_replace_lane(self.read_lane_index()?),
1486
1487
5
            0x23 => visitor.visit_i8x16_eq(),
1488
19
            0x24 => visitor.visit_i8x16_ne(),
1489
17
            0x25 => visitor.visit_i8x16_lt_s(),
1490
5
            0x26 => visitor.visit_i8x16_lt_u(),
1491
9
            0x27 => visitor.visit_i8x16_gt_s(),
1492
10
            0x28 => visitor.visit_i8x16_gt_u(),
1493
5
            0x29 => visitor.visit_i8x16_le_s(),
1494
23
            0x2a => visitor.visit_i8x16_le_u(),
1495
0
            0x2b => visitor.visit_i8x16_ge_s(),
1496
2
            0x2c => visitor.visit_i8x16_ge_u(),
1497
8
            0x2d => visitor.visit_i16x8_eq(),
1498
3
            0x2e => visitor.visit_i16x8_ne(),
1499
1
            0x2f => visitor.visit_i16x8_lt_s(),
1500
14
            0x30 => visitor.visit_i16x8_lt_u(),
1501
8
            0x31 => visitor.visit_i16x8_gt_s(),
1502
6
            0x32 => visitor.visit_i16x8_gt_u(),
1503
48
            0x33 => visitor.visit_i16x8_le_s(),
1504
20
            0x34 => visitor.visit_i16x8_le_u(),
1505
6
            0x35 => visitor.visit_i16x8_ge_s(),
1506
2
            0x36 => visitor.visit_i16x8_ge_u(),
1507
12
            0x37 => visitor.visit_i32x4_eq(),
1508
18
            0x38 => visitor.visit_i32x4_ne(),
1509
12
            0x39 => visitor.visit_i32x4_lt_s(),
1510
12
            0x3a => visitor.visit_i32x4_lt_u(),
1511
2
            0x3b => visitor.visit_i32x4_gt_s(),
1512
10
            0x3c => visitor.visit_i32x4_gt_u(),
1513
3
            0x3d => visitor.visit_i32x4_le_s(),
1514
6
            0x3e => visitor.visit_i32x4_le_u(),
1515
7
            0x3f => visitor.visit_i32x4_ge_s(),
1516
10
            0x40 => visitor.visit_i32x4_ge_u(),
1517
5
            0x41 => visitor.visit_f32x4_eq(),
1518
5
            0x42 => visitor.visit_f32x4_ne(),
1519
7
            0x43 => visitor.visit_f32x4_lt(),
1520
13
            0x44 => visitor.visit_f32x4_gt(),
1521
8
            0x45 => visitor.visit_f32x4_le(),
1522
16
            0x46 => visitor.visit_f32x4_ge(),
1523
8
            0x47 => visitor.visit_f64x2_eq(),
1524
7
            0x48 => visitor.visit_f64x2_ne(),
1525
9
            0x49 => visitor.visit_f64x2_lt(),
1526
15
            0x4a => visitor.visit_f64x2_gt(),
1527
0
            0x4b => visitor.visit_f64x2_le(),
1528
4
            0x4c => visitor.visit_f64x2_ge(),
1529
14
            0x4d => visitor.visit_v128_not(),
1530
3
            0x4e => visitor.visit_v128_and(),
1531
11
            0x4f => visitor.visit_v128_andnot(),
1532
13
            0x50 => visitor.visit_v128_or(),
1533
9
            0x51 => visitor.visit_v128_xor(),
1534
5
            0x52 => visitor.visit_v128_bitselect(),
1535
11
            0x53 => visitor.visit_v128_any_true(),
1536
1537
            0x54 => {
1538
8
                let memarg = self.read_memarg(0)?;
1539
7
                let lane = self.read_lane_index()?;
1540
7
                visitor.visit_v128_load8_lane(memarg, lane)
1541
            }
1542
            0x55 => {
1543
30
                let memarg = self.read_memarg(1)?;
1544
28
                let lane = self.read_lane_index()?;
1545
28
                visitor.visit_v128_load16_lane(memarg, lane)
1546
            }
1547
            0x56 => {
1548
19
                let memarg = self.read_memarg(2)?;
1549
18
                let lane = self.read_lane_index()?;
1550
16
                visitor.visit_v128_load32_lane(memarg, lane)
1551
            }
1552
            0x57 => {
1553
11
                let memarg = self.read_memarg(3)?;
1554
11
                let lane = self.read_lane_index()?;
1555
9
                visitor.visit_v128_load64_lane(memarg, lane)
1556
            }
1557
            0x58 => {
1558
6
                let memarg = self.read_memarg(0)?;
1559
6
                let lane = self.read_lane_index()?;
1560
6
                visitor.visit_v128_store8_lane(memarg, lane)
1561
            }
1562
            0x59 => {
1563
5
                let memarg = self.read_memarg(1)?;
1564
4
                let lane = self.read_lane_index()?;
1565
4
                visitor.visit_v128_store16_lane(memarg, lane)
1566
            }
1567
            0x5a => {
1568
5
                let memarg = self.read_memarg(2)?;
1569
5
                let lane = self.read_lane_index()?;
1570
5
                visitor.visit_v128_store32_lane(memarg, lane)
1571
            }
1572
            0x5b => {
1573
8
                let memarg = self.read_memarg(3)?;
1574
8
                let lane = self.read_lane_index()?;
1575
8
                visitor.visit_v128_store64_lane(memarg, lane)
1576
            }
1577
1578
26
            0x5c => visitor.visit_v128_load32_zero(self.read_memarg(2)?),
1579
7
            0x5d => visitor.visit_v128_load64_zero(self.read_memarg(3)?),
1580
8
            0x5e => visitor.visit_f32x4_demote_f64x2_zero(),
1581
14
            0x5f => visitor.visit_f64x2_promote_low_f32x4(),
1582
1
            0x60 => visitor.visit_i8x16_abs(),
1583
12
            0x61 => visitor.visit_i8x16_neg(),
1584
8
            0x62 => visitor.visit_i8x16_popcnt(),
1585
23
            0x63 => visitor.visit_i8x16_all_true(),
1586
4
            0x64 => visitor.visit_i8x16_bitmask(),
1587
5
            0x65 => visitor.visit_i8x16_narrow_i16x8_s(),
1588
1
            0x66 => visitor.visit_i8x16_narrow_i16x8_u(),
1589
1
            0x67 => visitor.visit_f32x4_ceil(),
1590
4
            0x68 => visitor.visit_f32x4_floor(),
1591
12
            0x69 => visitor.visit_f32x4_trunc(),
1592
16
            0x6a => visitor.visit_f32x4_nearest(),
1593
4
            0x6b => visitor.visit_i8x16_shl(),
1594
12
            0x6c => visitor.visit_i8x16_shr_s(),
1595
5
            0x6d => visitor.visit_i8x16_shr_u(),
1596
2
            0x6e => visitor.visit_i8x16_add(),
1597
4
            0x6f => visitor.visit_i8x16_add_sat_s(),
1598
21
            0x70 => visitor.visit_i8x16_add_sat_u(),
1599
11
            0x71 => visitor.visit_i8x16_sub(),
1600
0
            0x72 => visitor.visit_i8x16_sub_sat_s(),
1601
6
            0x73 => visitor.visit_i8x16_sub_sat_u(),
1602
3
            0x74 => visitor.visit_f64x2_ceil(),
1603
5
            0x75 => visitor.visit_f64x2_floor(),
1604
4
            0x76 => visitor.visit_i8x16_min_s(),
1605
0
            0x77 => visitor.visit_i8x16_min_u(),
1606
2
            0x78 => visitor.visit_i8x16_max_s(),
1607
6
            0x79 => visitor.visit_i8x16_max_u(),
1608
31
            0x7a => visitor.visit_f64x2_trunc(),
1609
5
            0x7b => visitor.visit_i8x16_avgr_u(),
1610
15
            0x7c => visitor.visit_i16x8_extadd_pairwise_i8x16_s(),
1611
16
            0x7d => visitor.visit_i16x8_extadd_pairwise_i8x16_u(),
1612
8
            0x7e => visitor.visit_i32x4_extadd_pairwise_i16x8_s(),
1613
26
            0x7f => visitor.visit_i32x4_extadd_pairwise_i16x8_u(),
1614
4
            0x80 => visitor.visit_i16x8_abs(),
1615
2
            0x81 => visitor.visit_i16x8_neg(),
1616
26
            0x82 => visitor.visit_i16x8_q15mulr_sat_s(),
1617
5
            0x83 => visitor.visit_i16x8_all_true(),
1618
5
            0x84 => visitor.visit_i16x8_bitmask(),
1619
4
            0x85 => visitor.visit_i16x8_narrow_i32x4_s(),
1620
5
            0x86 => visitor.visit_i16x8_narrow_i32x4_u(),
1621
0
            0x87 => visitor.visit_i16x8_extend_low_i8x16_s(),
1622
13
            0x88 => visitor.visit_i16x8_extend_high_i8x16_s(),
1623
4
            0x89 => visitor.visit_i16x8_extend_low_i8x16_u(),
1624
9
            0x8a => visitor.visit_i16x8_extend_high_i8x16_u(),
1625
3
            0x8b => visitor.visit_i16x8_shl(),
1626
8
            0x8c => visitor.visit_i16x8_shr_s(),
1627
5
            0x8d => visitor.visit_i16x8_shr_u(),
1628
12
            0x8e => visitor.visit_i16x8_add(),
1629
1
            0x8f => visitor.visit_i16x8_add_sat_s(),
1630
2
            0x90 => visitor.visit_i16x8_add_sat_u(),
1631
2
            0x91 => visitor.visit_i16x8_sub(),
1632
2
            0x92 => visitor.visit_i16x8_sub_sat_s(),
1633
6
            0x93 => visitor.visit_i16x8_sub_sat_u(),
1634
0
            0x94 => visitor.visit_f64x2_nearest(),
1635
5
            0x95 => visitor.visit_i16x8_mul(),
1636
0
            0x96 => visitor.visit_i16x8_min_s(),
1637
6
            0x97 => visitor.visit_i16x8_min_u(),
1638
0
            0x98 => visitor.visit_i16x8_max_s(),
1639
0
            0x99 => visitor.visit_i16x8_max_u(),
1640
2
            0x9b => visitor.visit_i16x8_avgr_u(),
1641
12
            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
1
            0xa1 => visitor.visit_i32x4_neg(),
1647
0
            0xa3 => visitor.visit_i32x4_all_true(),
1648
0
            0xa4 => visitor.visit_i32x4_bitmask(),
1649
2
            0xa7 => visitor.visit_i32x4_extend_low_i16x8_s(),
1650
5
            0xa8 => visitor.visit_i32x4_extend_high_i16x8_s(),
1651
0
            0xa9 => visitor.visit_i32x4_extend_low_i16x8_u(),
1652
11
            0xaa => visitor.visit_i32x4_extend_high_i16x8_u(),
1653
2
            0xab => visitor.visit_i32x4_shl(),
1654
4
            0xac => visitor.visit_i32x4_shr_s(),
1655
4
            0xad => visitor.visit_i32x4_shr_u(),
1656
10
            0xae => visitor.visit_i32x4_add(),
1657
5
            0xb1 => visitor.visit_i32x4_sub(),
1658
2
            0xb5 => visitor.visit_i32x4_mul(),
1659
3
            0xb6 => visitor.visit_i32x4_min_s(),
1660
23
            0xb7 => visitor.visit_i32x4_min_u(),
1661
1
            0xb8 => visitor.visit_i32x4_max_s(),
1662
3
            0xb9 => visitor.visit_i32x4_max_u(),
1663
16
            0xba => visitor.visit_i32x4_dot_i16x8_s(),
1664
6
            0xbc => visitor.visit_i32x4_extmul_low_i16x8_s(),
1665
9
            0xbd => visitor.visit_i32x4_extmul_high_i16x8_s(),
1666
7
            0xbe => visitor.visit_i32x4_extmul_low_i16x8_u(),
1667
2
            0xbf => visitor.visit_i32x4_extmul_high_i16x8_u(),
1668
0
            0xc0 => visitor.visit_i64x2_abs(),
1669
0
            0xc1 => visitor.visit_i64x2_neg(),
1670
2
            0xc3 => visitor.visit_i64x2_all_true(),
1671
10
            0xc4 => visitor.visit_i64x2_bitmask(),
1672
7
            0xc7 => visitor.visit_i64x2_extend_low_i32x4_s(),
1673
0
            0xc8 => visitor.visit_i64x2_extend_high_i32x4_s(),
1674
13
            0xc9 => visitor.visit_i64x2_extend_low_i32x4_u(),
1675
4
            0xca => visitor.visit_i64x2_extend_high_i32x4_u(),
1676
7
            0xcb => visitor.visit_i64x2_shl(),
1677
4
            0xcc => visitor.visit_i64x2_shr_s(),
1678
0
            0xcd => visitor.visit_i64x2_shr_u(),
1679
1
            0xce => visitor.visit_i64x2_add(),
1680
5
            0xd1 => visitor.visit_i64x2_sub(),
1681
3
            0xd5 => visitor.visit_i64x2_mul(),
1682
1
            0xd6 => visitor.visit_i64x2_eq(),
1683
2
            0xd7 => visitor.visit_i64x2_ne(),
1684
2
            0xd8 => visitor.visit_i64x2_lt_s(),
1685
1
            0xd9 => visitor.visit_i64x2_gt_s(),
1686
1
            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
7
            0xde => visitor.visit_i64x2_extmul_low_i32x4_u(),
1691
3
            0xdf => visitor.visit_i64x2_extmul_high_i32x4_u(),
1692
0
            0xe0 => visitor.visit_f32x4_abs(),
1693
4
            0xe1 => visitor.visit_f32x4_neg(),
1694
0
            0xe3 => visitor.visit_f32x4_sqrt(),
1695
3
            0xe4 => visitor.visit_f32x4_add(),
1696
3
            0xe5 => visitor.visit_f32x4_sub(),
1697
0
            0xe6 => visitor.visit_f32x4_mul(),
1698
2
            0xe7 => visitor.visit_f32x4_div(),
1699
1
            0xe8 => visitor.visit_f32x4_min(),
1700
1
            0xe9 => visitor.visit_f32x4_max(),
1701
3
            0xea => visitor.visit_f32x4_pmin(),
1702
1
            0xeb => visitor.visit_f32x4_pmax(),
1703
1
            0xec => visitor.visit_f64x2_abs(),
1704
0
            0xed => visitor.visit_f64x2_neg(),
1705
5
            0xef => visitor.visit_f64x2_sqrt(),
1706
2
            0xf0 => visitor.visit_f64x2_add(),
1707
0
            0xf1 => visitor.visit_f64x2_sub(),
1708
0
            0xf2 => visitor.visit_f64x2_mul(),
1709
2
            0xf3 => visitor.visit_f64x2_div(),
1710
4
            0xf4 => visitor.visit_f64x2_min(),
1711
6
            0xf5 => visitor.visit_f64x2_max(),
1712
17
            0xf6 => visitor.visit_f64x2_pmin(),
1713
1
            0xf7 => visitor.visit_f64x2_pmax(),
1714
6
            0xf8 => visitor.visit_i32x4_trunc_sat_f32x4_s(),
1715
1
            0xf9 => visitor.visit_i32x4_trunc_sat_f32x4_u(),
1716
4
            0xfa => visitor.visit_f32x4_convert_i32x4_s(),
1717
1
            0xfb => visitor.visit_f32x4_convert_i32x4_u(),
1718
13
            0xfc => visitor.visit_i32x4_trunc_sat_f64x2_s_zero(),
1719
5
            0xfd => visitor.visit_i32x4_trunc_sat_f64x2_u_zero(),
1720
0
            0xfe => visitor.visit_f64x2_convert_low_i32x4_s(),
1721
6
            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
1
            0x102 => visitor.visit_i32x4_relaxed_trunc_f32x4_u(),
1725
0
            0x103 => visitor.visit_i32x4_relaxed_trunc_f64x2_s_zero(),
1726
13
            0x104 => visitor.visit_i32x4_relaxed_trunc_f64x2_u_zero(),
1727
4
            0x105 => visitor.visit_f32x4_relaxed_madd(),
1728
2
            0x106 => visitor.visit_f32x4_relaxed_nmadd(),
1729
0
            0x107 => visitor.visit_f64x2_relaxed_madd(),
1730
1
            0x108 => visitor.visit_f64x2_relaxed_nmadd(),
1731
3
            0x109 => visitor.visit_i8x16_relaxed_laneselect(),
1732
5
            0x10a => visitor.visit_i16x8_relaxed_laneselect(),
1733
15
            0x10b => visitor.visit_i32x4_relaxed_laneselect(),
1734
1
            0x10c => visitor.visit_i64x2_relaxed_laneselect(),
1735
0
            0x10d => visitor.visit_f32x4_relaxed_min(),
1736
5
            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
1
            0x112 => visitor.visit_i16x8_relaxed_dot_i8x16_i7x16_s(),
1741
4
            0x113 => visitor.visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(),
1742
1743
21
            _ => bail!(pos, "unknown 0xfd subopcode: 0x{code:x}"),
1744
        })
1745
2.03k
    }
1746
1747
1.11k
    fn visit_0xfe_operator<T>(
1748
1.11k
        &mut self,
1749
1.11k
        pos: u64,
1750
1.11k
        visitor: &mut T,
1751
1.11k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1752
1.11k
    where
1753
1.11k
        T: VisitOperator<'a>,
1754
    {
1755
1.11k
        let code = self.read_var_u32()?;
1756
1.09k
        Ok(match code {
1757
67
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1758
19
            0x01 => visitor.visit_memory_atomic_wait32(self.read_memarg(2)?),
1759
5
            0x02 => visitor.visit_memory_atomic_wait64(self.read_memarg(3)?),
1760
            0x03 => {
1761
3
                if self.read_u8()? != 0 {
1762
3
                    bail!(pos, "nonzero byte after `atomic.fence`");
1763
0
                }
1764
0
                visitor.visit_atomic_fence()
1765
            }
1766
2
            0x10 => visitor.visit_i32_atomic_load(self.read_memarg(2)?),
1767
11
            0x11 => visitor.visit_i64_atomic_load(self.read_memarg(3)?),
1768
10
            0x12 => visitor.visit_i32_atomic_load8_u(self.read_memarg(0)?),
1769
17
            0x13 => visitor.visit_i32_atomic_load16_u(self.read_memarg(1)?),
1770
1
            0x14 => visitor.visit_i64_atomic_load8_u(self.read_memarg(0)?),
1771
15
            0x15 => visitor.visit_i64_atomic_load16_u(self.read_memarg(1)?),
1772
123
            0x16 => visitor.visit_i64_atomic_load32_u(self.read_memarg(2)?),
1773
4
            0x17 => visitor.visit_i32_atomic_store(self.read_memarg(2)?),
1774
1
            0x18 => visitor.visit_i64_atomic_store(self.read_memarg(3)?),
1775
1
            0x19 => visitor.visit_i32_atomic_store8(self.read_memarg(0)?),
1776
0
            0x1a => visitor.visit_i32_atomic_store16(self.read_memarg(1)?),
1777
2
            0x1b => visitor.visit_i64_atomic_store8(self.read_memarg(0)?),
1778
6
            0x1c => visitor.visit_i64_atomic_store16(self.read_memarg(1)?),
1779
1
            0x1d => visitor.visit_i64_atomic_store32(self.read_memarg(2)?),
1780
4
            0x1e => visitor.visit_i32_atomic_rmw_add(self.read_memarg(2)?),
1781
7
            0x1f => visitor.visit_i64_atomic_rmw_add(self.read_memarg(3)?),
1782
6
            0x20 => visitor.visit_i32_atomic_rmw8_add_u(self.read_memarg(0)?),
1783
12
            0x21 => visitor.visit_i32_atomic_rmw16_add_u(self.read_memarg(1)?),
1784
1
            0x22 => visitor.visit_i64_atomic_rmw8_add_u(self.read_memarg(0)?),
1785
6
            0x23 => visitor.visit_i64_atomic_rmw16_add_u(self.read_memarg(1)?),
1786
12
            0x24 => visitor.visit_i64_atomic_rmw32_add_u(self.read_memarg(2)?),
1787
15
            0x25 => visitor.visit_i32_atomic_rmw_sub(self.read_memarg(2)?),
1788
7
            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
5
            0x28 => visitor.visit_i32_atomic_rmw16_sub_u(self.read_memarg(1)?),
1791
8
            0x29 => visitor.visit_i64_atomic_rmw8_sub_u(self.read_memarg(0)?),
1792
29
            0x2a => visitor.visit_i64_atomic_rmw16_sub_u(self.read_memarg(1)?),
1793
10
            0x2b => visitor.visit_i64_atomic_rmw32_sub_u(self.read_memarg(2)?),
1794
29
            0x2c => visitor.visit_i32_atomic_rmw_and(self.read_memarg(2)?),
1795
12
            0x2d => visitor.visit_i64_atomic_rmw_and(self.read_memarg(3)?),
1796
5
            0x2e => visitor.visit_i32_atomic_rmw8_and_u(self.read_memarg(0)?),
1797
7
            0x2f => visitor.visit_i32_atomic_rmw16_and_u(self.read_memarg(1)?),
1798
13
            0x30 => visitor.visit_i64_atomic_rmw8_and_u(self.read_memarg(0)?),
1799
6
            0x31 => visitor.visit_i64_atomic_rmw16_and_u(self.read_memarg(1)?),
1800
7
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1801
12
            0x33 => visitor.visit_i32_atomic_rmw_or(self.read_memarg(2)?),
1802
7
            0x34 => visitor.visit_i64_atomic_rmw_or(self.read_memarg(3)?),
1803
35
            0x35 => visitor.visit_i32_atomic_rmw8_or_u(self.read_memarg(0)?),
1804
4
            0x36 => visitor.visit_i32_atomic_rmw16_or_u(self.read_memarg(1)?),
1805
10
            0x37 => visitor.visit_i64_atomic_rmw8_or_u(self.read_memarg(0)?),
1806
15
            0x38 => visitor.visit_i64_atomic_rmw16_or_u(self.read_memarg(1)?),
1807
5
            0x39 => visitor.visit_i64_atomic_rmw32_or_u(self.read_memarg(2)?),
1808
18
            0x3a => visitor.visit_i32_atomic_rmw_xor(self.read_memarg(2)?),
1809
6
            0x3b => visitor.visit_i64_atomic_rmw_xor(self.read_memarg(3)?),
1810
10
            0x3c => visitor.visit_i32_atomic_rmw8_xor_u(self.read_memarg(0)?),
1811
6
            0x3d => visitor.visit_i32_atomic_rmw16_xor_u(self.read_memarg(1)?),
1812
4
            0x3e => visitor.visit_i64_atomic_rmw8_xor_u(self.read_memarg(0)?),
1813
4
            0x3f => visitor.visit_i64_atomic_rmw16_xor_u(self.read_memarg(1)?),
1814
18
            0x40 => visitor.visit_i64_atomic_rmw32_xor_u(self.read_memarg(2)?),
1815
3
            0x41 => visitor.visit_i32_atomic_rmw_xchg(self.read_memarg(2)?),
1816
4
            0x42 => visitor.visit_i64_atomic_rmw_xchg(self.read_memarg(3)?),
1817
8
            0x43 => visitor.visit_i32_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1818
1
            0x44 => visitor.visit_i32_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1819
8
            0x45 => visitor.visit_i64_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1820
9
            0x46 => visitor.visit_i64_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1821
5
            0x47 => visitor.visit_i64_atomic_rmw32_xchg_u(self.read_memarg(2)?),
1822
2
            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
1
            0x4b => visitor.visit_i32_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1826
3
            0x4c => visitor.visit_i64_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1827
32
            0x4d => visitor.visit_i64_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1828
2
            0x4e => visitor.visit_i64_atomic_rmw32_cmpxchg_u(self.read_memarg(2)?),
1829
1830
            // Decode shared-everything-threads proposal.
1831
1
            0x4f => visitor.visit_global_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1832
5
            0x50 => visitor.visit_global_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1833
            0x51 => {
1834
26
                visitor.visit_global_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?)
1835
            }
1836
            0x52 => {
1837
3
                visitor.visit_global_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?)
1838
            }
1839
            0x53 => {
1840
50
                visitor.visit_global_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?)
1841
            }
1842
6
            0x54 => visitor.visit_global_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1843
            0x55 => {
1844
8
                visitor.visit_global_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?)
1845
            }
1846
            0x56 => {
1847
15
                visitor.visit_global_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1848
            }
1849
            0x57 => {
1850
22
                visitor.visit_global_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1851
            }
1852
3
            0x58 => visitor.visit_table_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1853
6
            0x59 => visitor.visit_table_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1854
            0x5a => {
1855
15
                visitor.visit_table_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1856
            }
1857
            0x5b => {
1858
11
                visitor.visit_table_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1859
            }
1860
4
            0x5c => visitor.visit_struct_atomic_get(
1861
4
                self.read_ordering()?,
1862
4
                self.read_var_u32()?,
1863
3
                self.read_var_u32()?,
1864
            ),
1865
2
            0x5d => visitor.visit_struct_atomic_get_s(
1866
2
                self.read_ordering()?,
1867
1
                self.read_var_u32()?,
1868
1
                self.read_var_u32()?,
1869
            ),
1870
2
            0x5e => visitor.visit_struct_atomic_get_u(
1871
2
                self.read_ordering()?,
1872
2
                self.read_var_u32()?,
1873
2
                self.read_var_u32()?,
1874
            ),
1875
15
            0x5f => visitor.visit_struct_atomic_set(
1876
15
                self.read_ordering()?,
1877
12
                self.read_var_u32()?,
1878
12
                self.read_var_u32()?,
1879
            ),
1880
11
            0x60 => visitor.visit_struct_atomic_rmw_add(
1881
11
                self.read_ordering()?,
1882
10
                self.read_var_u32()?,
1883
6
                self.read_var_u32()?,
1884
            ),
1885
11
            0x61 => visitor.visit_struct_atomic_rmw_sub(
1886
11
                self.read_ordering()?,
1887
9
                self.read_var_u32()?,
1888
8
                self.read_var_u32()?,
1889
            ),
1890
6
            0x62 => visitor.visit_struct_atomic_rmw_and(
1891
6
                self.read_ordering()?,
1892
4
                self.read_var_u32()?,
1893
4
                self.read_var_u32()?,
1894
            ),
1895
2
            0x63 => visitor.visit_struct_atomic_rmw_or(
1896
2
                self.read_ordering()?,
1897
2
                self.read_var_u32()?,
1898
1
                self.read_var_u32()?,
1899
            ),
1900
3
            0x64 => visitor.visit_struct_atomic_rmw_xor(
1901
3
                self.read_ordering()?,
1902
1
                self.read_var_u32()?,
1903
1
                self.read_var_u32()?,
1904
            ),
1905
3
            0x65 => visitor.visit_struct_atomic_rmw_xchg(
1906
3
                self.read_ordering()?,
1907
2
                self.read_var_u32()?,
1908
2
                self.read_var_u32()?,
1909
            ),
1910
8
            0x66 => visitor.visit_struct_atomic_rmw_cmpxchg(
1911
8
                self.read_ordering()?,
1912
7
                self.read_var_u32()?,
1913
5
                self.read_var_u32()?,
1914
            ),
1915
11
            0x67 => visitor.visit_array_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1916
1
            0x68 => visitor.visit_array_atomic_get_s(self.read_ordering()?, self.read_var_u32()?),
1917
10
            0x69 => visitor.visit_array_atomic_get_u(self.read_ordering()?, self.read_var_u32()?),
1918
18
            0x6a => visitor.visit_array_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1919
2
            0x6b => visitor.visit_array_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?),
1920
4
            0x6c => visitor.visit_array_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?),
1921
2
            0x6d => visitor.visit_array_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?),
1922
5
            0x6e => visitor.visit_array_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1923
6
            0x6f => visitor.visit_array_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?),
1924
            0x70 => {
1925
6
                visitor.visit_array_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1926
            }
1927
            0x71 => {
1928
13
                visitor.visit_array_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1929
            }
1930
0
            0x72 => visitor.visit_ref_i31_shared(),
1931
1932
24
            _ => bail!(pos, "unknown 0xfe subopcode: 0x{code:x}"),
1933
        })
1934
1.11k
    }
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfe_operator::<wasmparser::validator::operators::WasmProposalValidator<wasmparser::validator::core::ValidatorResources>>
Unexecuted instantiation: <wasmparser::binary_reader::BinaryReader>::visit_0xfe_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::OperatorFactory>>
<wasmparser::binary_reader::BinaryReader>::visit_0xfe_operator::<wasmparser::readers::core::operators::FrameStackAdapter<wasmparser::readers::core::operators::IsEndOperatorVisitor>>
Line
Count
Source
1747
1.10k
    fn visit_0xfe_operator<T>(
1748
1.10k
        &mut self,
1749
1.10k
        pos: u64,
1750
1.10k
        visitor: &mut T,
1751
1.10k
    ) -> Result<<T as VisitOperator<'a>>::Output>
1752
1.10k
    where
1753
1.10k
        T: VisitOperator<'a>,
1754
    {
1755
1.10k
        let code = self.read_var_u32()?;
1756
1.08k
        Ok(match code {
1757
66
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1758
17
            0x01 => visitor.visit_memory_atomic_wait32(self.read_memarg(2)?),
1759
5
            0x02 => visitor.visit_memory_atomic_wait64(self.read_memarg(3)?),
1760
            0x03 => {
1761
3
                if self.read_u8()? != 0 {
1762
3
                    bail!(pos, "nonzero byte after `atomic.fence`");
1763
0
                }
1764
0
                visitor.visit_atomic_fence()
1765
            }
1766
2
            0x10 => visitor.visit_i32_atomic_load(self.read_memarg(2)?),
1767
11
            0x11 => visitor.visit_i64_atomic_load(self.read_memarg(3)?),
1768
10
            0x12 => visitor.visit_i32_atomic_load8_u(self.read_memarg(0)?),
1769
17
            0x13 => visitor.visit_i32_atomic_load16_u(self.read_memarg(1)?),
1770
1
            0x14 => visitor.visit_i64_atomic_load8_u(self.read_memarg(0)?),
1771
15
            0x15 => visitor.visit_i64_atomic_load16_u(self.read_memarg(1)?),
1772
122
            0x16 => visitor.visit_i64_atomic_load32_u(self.read_memarg(2)?),
1773
4
            0x17 => visitor.visit_i32_atomic_store(self.read_memarg(2)?),
1774
1
            0x18 => visitor.visit_i64_atomic_store(self.read_memarg(3)?),
1775
1
            0x19 => visitor.visit_i32_atomic_store8(self.read_memarg(0)?),
1776
0
            0x1a => visitor.visit_i32_atomic_store16(self.read_memarg(1)?),
1777
2
            0x1b => visitor.visit_i64_atomic_store8(self.read_memarg(0)?),
1778
6
            0x1c => visitor.visit_i64_atomic_store16(self.read_memarg(1)?),
1779
1
            0x1d => visitor.visit_i64_atomic_store32(self.read_memarg(2)?),
1780
4
            0x1e => visitor.visit_i32_atomic_rmw_add(self.read_memarg(2)?),
1781
7
            0x1f => visitor.visit_i64_atomic_rmw_add(self.read_memarg(3)?),
1782
6
            0x20 => visitor.visit_i32_atomic_rmw8_add_u(self.read_memarg(0)?),
1783
11
            0x21 => visitor.visit_i32_atomic_rmw16_add_u(self.read_memarg(1)?),
1784
1
            0x22 => visitor.visit_i64_atomic_rmw8_add_u(self.read_memarg(0)?),
1785
6
            0x23 => visitor.visit_i64_atomic_rmw16_add_u(self.read_memarg(1)?),
1786
11
            0x24 => visitor.visit_i64_atomic_rmw32_add_u(self.read_memarg(2)?),
1787
15
            0x25 => visitor.visit_i32_atomic_rmw_sub(self.read_memarg(2)?),
1788
7
            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
5
            0x28 => visitor.visit_i32_atomic_rmw16_sub_u(self.read_memarg(1)?),
1791
8
            0x29 => visitor.visit_i64_atomic_rmw8_sub_u(self.read_memarg(0)?),
1792
29
            0x2a => visitor.visit_i64_atomic_rmw16_sub_u(self.read_memarg(1)?),
1793
10
            0x2b => visitor.visit_i64_atomic_rmw32_sub_u(self.read_memarg(2)?),
1794
29
            0x2c => visitor.visit_i32_atomic_rmw_and(self.read_memarg(2)?),
1795
12
            0x2d => visitor.visit_i64_atomic_rmw_and(self.read_memarg(3)?),
1796
5
            0x2e => visitor.visit_i32_atomic_rmw8_and_u(self.read_memarg(0)?),
1797
7
            0x2f => visitor.visit_i32_atomic_rmw16_and_u(self.read_memarg(1)?),
1798
13
            0x30 => visitor.visit_i64_atomic_rmw8_and_u(self.read_memarg(0)?),
1799
6
            0x31 => visitor.visit_i64_atomic_rmw16_and_u(self.read_memarg(1)?),
1800
6
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1801
11
            0x33 => visitor.visit_i32_atomic_rmw_or(self.read_memarg(2)?),
1802
7
            0x34 => visitor.visit_i64_atomic_rmw_or(self.read_memarg(3)?),
1803
35
            0x35 => visitor.visit_i32_atomic_rmw8_or_u(self.read_memarg(0)?),
1804
3
            0x36 => visitor.visit_i32_atomic_rmw16_or_u(self.read_memarg(1)?),
1805
10
            0x37 => visitor.visit_i64_atomic_rmw8_or_u(self.read_memarg(0)?),
1806
15
            0x38 => visitor.visit_i64_atomic_rmw16_or_u(self.read_memarg(1)?),
1807
5
            0x39 => visitor.visit_i64_atomic_rmw32_or_u(self.read_memarg(2)?),
1808
18
            0x3a => visitor.visit_i32_atomic_rmw_xor(self.read_memarg(2)?),
1809
5
            0x3b => visitor.visit_i64_atomic_rmw_xor(self.read_memarg(3)?),
1810
10
            0x3c => visitor.visit_i32_atomic_rmw8_xor_u(self.read_memarg(0)?),
1811
6
            0x3d => visitor.visit_i32_atomic_rmw16_xor_u(self.read_memarg(1)?),
1812
4
            0x3e => visitor.visit_i64_atomic_rmw8_xor_u(self.read_memarg(0)?),
1813
4
            0x3f => visitor.visit_i64_atomic_rmw16_xor_u(self.read_memarg(1)?),
1814
18
            0x40 => visitor.visit_i64_atomic_rmw32_xor_u(self.read_memarg(2)?),
1815
3
            0x41 => visitor.visit_i32_atomic_rmw_xchg(self.read_memarg(2)?),
1816
4
            0x42 => visitor.visit_i64_atomic_rmw_xchg(self.read_memarg(3)?),
1817
8
            0x43 => visitor.visit_i32_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1818
1
            0x44 => visitor.visit_i32_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1819
8
            0x45 => visitor.visit_i64_atomic_rmw8_xchg_u(self.read_memarg(0)?),
1820
9
            0x46 => visitor.visit_i64_atomic_rmw16_xchg_u(self.read_memarg(1)?),
1821
5
            0x47 => visitor.visit_i64_atomic_rmw32_xchg_u(self.read_memarg(2)?),
1822
2
            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
1
            0x4b => visitor.visit_i32_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1826
3
            0x4c => visitor.visit_i64_atomic_rmw8_cmpxchg_u(self.read_memarg(0)?),
1827
32
            0x4d => visitor.visit_i64_atomic_rmw16_cmpxchg_u(self.read_memarg(1)?),
1828
2
            0x4e => visitor.visit_i64_atomic_rmw32_cmpxchg_u(self.read_memarg(2)?),
1829
1830
            // Decode shared-everything-threads proposal.
1831
1
            0x4f => visitor.visit_global_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1832
5
            0x50 => visitor.visit_global_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1833
            0x51 => {
1834
26
                visitor.visit_global_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?)
1835
            }
1836
            0x52 => {
1837
3
                visitor.visit_global_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?)
1838
            }
1839
            0x53 => {
1840
50
                visitor.visit_global_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?)
1841
            }
1842
6
            0x54 => visitor.visit_global_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1843
            0x55 => {
1844
8
                visitor.visit_global_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?)
1845
            }
1846
            0x56 => {
1847
15
                visitor.visit_global_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1848
            }
1849
            0x57 => {
1850
22
                visitor.visit_global_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1851
            }
1852
3
            0x58 => visitor.visit_table_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1853
6
            0x59 => visitor.visit_table_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1854
            0x5a => {
1855
15
                visitor.visit_table_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1856
            }
1857
            0x5b => {
1858
10
                visitor.visit_table_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1859
            }
1860
4
            0x5c => visitor.visit_struct_atomic_get(
1861
4
                self.read_ordering()?,
1862
4
                self.read_var_u32()?,
1863
3
                self.read_var_u32()?,
1864
            ),
1865
2
            0x5d => visitor.visit_struct_atomic_get_s(
1866
2
                self.read_ordering()?,
1867
1
                self.read_var_u32()?,
1868
1
                self.read_var_u32()?,
1869
            ),
1870
2
            0x5e => visitor.visit_struct_atomic_get_u(
1871
2
                self.read_ordering()?,
1872
2
                self.read_var_u32()?,
1873
2
                self.read_var_u32()?,
1874
            ),
1875
15
            0x5f => visitor.visit_struct_atomic_set(
1876
15
                self.read_ordering()?,
1877
12
                self.read_var_u32()?,
1878
12
                self.read_var_u32()?,
1879
            ),
1880
11
            0x60 => visitor.visit_struct_atomic_rmw_add(
1881
11
                self.read_ordering()?,
1882
10
                self.read_var_u32()?,
1883
6
                self.read_var_u32()?,
1884
            ),
1885
11
            0x61 => visitor.visit_struct_atomic_rmw_sub(
1886
11
                self.read_ordering()?,
1887
9
                self.read_var_u32()?,
1888
8
                self.read_var_u32()?,
1889
            ),
1890
6
            0x62 => visitor.visit_struct_atomic_rmw_and(
1891
6
                self.read_ordering()?,
1892
4
                self.read_var_u32()?,
1893
4
                self.read_var_u32()?,
1894
            ),
1895
2
            0x63 => visitor.visit_struct_atomic_rmw_or(
1896
2
                self.read_ordering()?,
1897
2
                self.read_var_u32()?,
1898
1
                self.read_var_u32()?,
1899
            ),
1900
3
            0x64 => visitor.visit_struct_atomic_rmw_xor(
1901
3
                self.read_ordering()?,
1902
1
                self.read_var_u32()?,
1903
1
                self.read_var_u32()?,
1904
            ),
1905
3
            0x65 => visitor.visit_struct_atomic_rmw_xchg(
1906
3
                self.read_ordering()?,
1907
2
                self.read_var_u32()?,
1908
2
                self.read_var_u32()?,
1909
            ),
1910
8
            0x66 => visitor.visit_struct_atomic_rmw_cmpxchg(
1911
8
                self.read_ordering()?,
1912
7
                self.read_var_u32()?,
1913
5
                self.read_var_u32()?,
1914
            ),
1915
11
            0x67 => visitor.visit_array_atomic_get(self.read_ordering()?, self.read_var_u32()?),
1916
1
            0x68 => visitor.visit_array_atomic_get_s(self.read_ordering()?, self.read_var_u32()?),
1917
9
            0x69 => visitor.visit_array_atomic_get_u(self.read_ordering()?, self.read_var_u32()?),
1918
18
            0x6a => visitor.visit_array_atomic_set(self.read_ordering()?, self.read_var_u32()?),
1919
2
            0x6b => visitor.visit_array_atomic_rmw_add(self.read_ordering()?, self.read_var_u32()?),
1920
4
            0x6c => visitor.visit_array_atomic_rmw_sub(self.read_ordering()?, self.read_var_u32()?),
1921
2
            0x6d => visitor.visit_array_atomic_rmw_and(self.read_ordering()?, self.read_var_u32()?),
1922
5
            0x6e => visitor.visit_array_atomic_rmw_or(self.read_ordering()?, self.read_var_u32()?),
1923
6
            0x6f => visitor.visit_array_atomic_rmw_xor(self.read_ordering()?, self.read_var_u32()?),
1924
            0x70 => {
1925
6
                visitor.visit_array_atomic_rmw_xchg(self.read_ordering()?, self.read_var_u32()?)
1926
            }
1927
            0x71 => {
1928
13
                visitor.visit_array_atomic_rmw_cmpxchg(self.read_ordering()?, self.read_var_u32()?)
1929
            }
1930
0
            0x72 => visitor.visit_ref_i31_shared(),
1931
1932
24
            _ => bail!(pos, "unknown 0xfe subopcode: 0x{code:x}"),
1933
        })
1934
1.10k
    }
<wasmparser::binary_reader::BinaryReader>::visit_0xfe_operator::<<wasmparser::validator::core::ModuleState>::check_const_expr::VisitConstOperator>
Line
Count
Source
1747
12
    fn visit_0xfe_operator<T>(
1748
12
        &mut self,
1749
12
        pos: u64,
1750
12
        visitor: &mut T,
1751
12
    ) -> Result<<T as VisitOperator<'a>>::Output>
1752
12
    where
1753
12
        T: VisitOperator<'a>,
1754
    {
1755
12
        let code = self.read_var_u32()?;
1756
12
        Ok(match code {
1757
1
            0x00 => visitor.visit_memory_atomic_notify(self.read_memarg(2)?),
1758
2
            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
1
            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
1
            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
1
            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
1
            0x32 => visitor.visit_i64_atomic_rmw32_and_u(self.read_memarg(2)?),
1801
1
            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
1
            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
1
            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
1
                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
1
            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
12
    }
1935
1936
14.6k
    fn read_memarg(&mut self, max_align: u8) -> Result<MemArg> {
1937
14.6k
        let flags_pos = self.original_position();
1938
14.6k
        let mut flags = self.read_var_u32()?;
1939
1940
14.5k
        let memory = if self.multi_memory() && flags & (1 << 6) != 0 {
1941
1.68k
            flags ^= 1 << 6;
1942
1.68k
            self.read_var_u32()?
1943
        } else {
1944
12.8k
            0
1945
        };
1946
14.5k
        let max_flag_bits = if self.multi_memory() { 6 } else { 5 };
1947
14.5k
        if flags >= (1 << max_flag_bits) {
1948
73
            return Err(Error::new(
1949
73
                "malformed memop alignment: alignment too large",
1950
73
                flags_pos,
1951
73
            ));
1952
14.4k
        }
1953
14.4k
        let align = flags as u8;
1954
14.4k
        let offset = if self.memory64() {
1955
14.4k
            self.read_var_u64()?
1956
        } else {
1957
0
            u64::from(self.read_var_u32()?)
1958
        };
1959
14.3k
        Ok(MemArg {
1960
14.3k
            align,
1961
14.3k
            max_align,
1962
14.3k
            offset,
1963
14.3k
            memory,
1964
14.3k
        })
1965
14.6k
    }
1966
1967
316
    fn read_ordering(&mut self) -> Result<Ordering> {
1968
316
        let byte = self.read_var_u32()?;
1969
310
        match byte {
1970
259
            0 => Ok(Ordering::SeqCst),
1971
26
            1 => Ok(Ordering::AcqRel),
1972
25
            x => Err(Error::new(
1973
25
                format!("invalid atomic consistency ordering {x}"),
1974
25
                self.original_position() - 1,
1975
25
            )),
1976
        }
1977
316
    }
1978
1979
187
    fn read_br_table(&mut self) -> Result<BrTable<'a>> {
1980
187
        let cnt = self.read_size(MAX_WASM_BR_TABLE_SIZE, "br_table")?;
1981
182
        let reader = self.skip(|reader| {
1982
182
            for _ in 0..cnt {
1983
3.46k
                reader.read_var_u32()?;
1984
            }
1985
149
            Ok(())
1986
182
        })?;
1987
149
        let default = self.read_var_u32()?;
1988
145
        Ok(BrTable {
1989
145
            reader,
1990
145
            cnt: cnt as u32,
1991
145
            default,
1992
145
        })
1993
187
    }
1994
1995
    #[cfg(feature = "simd")]
1996
662
    fn read_lane_index(&mut self) -> Result<u8> {
1997
662
        self.read_u8()
1998
662
    }
1999
2000
    #[cfg(feature = "simd")]
2001
11
    fn read_v128(&mut self) -> Result<V128> {
2002
11
        let mut bytes = [0; 16];
2003
11
        bytes.clone_from_slice(self.read_bytes(16)?);
2004
9
        Ok(V128(bytes))
2005
11
    }
2006
2007
1.19k
    fn read_memory_index_or_zero_if_not_multi_memory(&mut self) -> Result<u32> {
2008
1.19k
        if self.multi_memory() {
2009
1.19k
            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
0
            match self.read_u8()? {
2014
0
                0 => Ok(0),
2015
0
                _ => bail!(self.original_position() - 1, "zero byte expected"),
2016
            }
2017
        }
2018
1.19k
    }
2019
2020
663
    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
663
        if self.call_indirect_overlong() {
2025
663
            return self.read_var_u32();
2026
0
        }
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
0
        match self.read_u8()? {
2031
0
            0 => Ok(0),
2032
0
            _ => bail!(self.original_position() - 1, "zero byte expected"),
2033
        }
2034
663
    }
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
}