63 lines
1.5 KiB
Rust
63 lines
1.5 KiB
Rust
|
|
use std::borrow::Cow;
|
||
|
|
use wasm_encoder::*;
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn big_type_indices() {
|
||
|
|
const N: u32 = 100_000;
|
||
|
|
let mut module = Module::new();
|
||
|
|
let mut types = TypeSection::new();
|
||
|
|
for _ in 0..N {
|
||
|
|
types.ty().function([], []);
|
||
|
|
}
|
||
|
|
module.section(&types);
|
||
|
|
let mut funcs = FunctionSection::new();
|
||
|
|
funcs.function(N - 1);
|
||
|
|
module.section(&funcs);
|
||
|
|
|
||
|
|
let mut elems = ElementSection::new();
|
||
|
|
elems.declared(Elements::Functions(Cow::Borrowed(&[0])));
|
||
|
|
module.section(&elems);
|
||
|
|
|
||
|
|
let mut code = CodeSection::new();
|
||
|
|
let mut body = Function::new([]);
|
||
|
|
body.instructions().ref_func(0);
|
||
|
|
body.instructions().drop();
|
||
|
|
body.instructions().end();
|
||
|
|
code.function(&body);
|
||
|
|
module.section(&code);
|
||
|
|
|
||
|
|
let wasm = module.finish();
|
||
|
|
|
||
|
|
wasmparser::Validator::default()
|
||
|
|
.validate_all(&wasm)
|
||
|
|
.unwrap();
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn big_function_body() {
|
||
|
|
let mut module = Module::new();
|
||
|
|
|
||
|
|
let mut types = TypeSection::new();
|
||
|
|
types.ty().function([], []);
|
||
|
|
module.section(&types);
|
||
|
|
let mut funcs = FunctionSection::new();
|
||
|
|
funcs.function(0);
|
||
|
|
module.section(&funcs);
|
||
|
|
|
||
|
|
let mut code = CodeSection::new();
|
||
|
|
let mut body = Function::new([]);
|
||
|
|
// Function body larger than the 7_654_321-byte implementation
|
||
|
|
// limit.
|
||
|
|
for _ in 0..8_000_000 {
|
||
|
|
body.instructions().unreachable();
|
||
|
|
}
|
||
|
|
body.instructions().end();
|
||
|
|
code.function(&body);
|
||
|
|
module.section(&code);
|
||
|
|
|
||
|
|
let wasm = module.finish();
|
||
|
|
|
||
|
|
let result = wasmparser::Validator::default().validate_all(&wasm);
|
||
|
|
assert!(result.is_err());
|
||
|
|
}
|