Revert Wasm parsing to improved old style, fixing singlepass

This commit is contained in:
Mark McCaskey 2020-02-26 16:35:25 -08:00
parent cb20cd9b2d
commit 56e47c17b0

View File

@ -266,27 +266,21 @@ pub fn read_module<
} }
} }
let mut operator_parser = parser.create_binary_reader(); let info_read = info.read().unwrap();
let mut cur_pos = parser.current_poisiton() as u32;
// read locals in function body let mut state = parser.read();
{ // loop until the function body starts
let local_count = operator_parser.read_local_count().unwrap(); loop {
let mut total = 0; match state {
for _ in 0..local_count { ParserState::Error(err) => return Err(err.into()),
let cur_pos = ParserState::FunctionBodyLocals { ref locals } => {
range.start as u32 + operator_parser.current_position() as u32; for &(count, ty) in locals.iter() {
let (count, ty) = operator_parser
.read_local_decl(&mut total)
.expect("Expected local");
fcg.feed_local(ty, count as usize, cur_pos) fcg.feed_local(ty, count as usize, cur_pos)
.map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?;
} }
} }
ParserState::CodeOperator(_) => {
{ // the body of the function has started
let info_read = info.read().unwrap();
let mut cur_pos =
range.start as u32 + operator_parser.current_position() as u32;
fcg.begin_body(&info_read) fcg.begin_body(&info_read)
.map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?;
middlewares middlewares
@ -297,15 +291,31 @@ pub fn read_module<
cur_pos, cur_pos,
) )
.map_err(LoadError::Codegen)?; .map_err(LoadError::Codegen)?;
// go to other loop
while let Ok(op) = operator_parser.read_operator() { break;
middlewares }
.run(Some(fcg), Event::WasmOwned(op), &info_read, cur_pos) ParserState::EndFunctionBody => break,
.map_err(LoadError::Codegen)?; _ => unreachable!(),
cur_pos = range.start as u32 + operator_parser.current_position() as u32; }
cur_pos = parser.current_poisiton() as u32;
state = parser.read();
} }
cur_pos = range.start as u32 + operator_parser.current_position() as u32; // loop until the function body ends
loop {
match state {
ParserState::Error(err) => return Err(err.into()),
ParserState::CodeOperator(op) => {
middlewares
.run(Some(fcg), Event::Wasm(op), &info_read, cur_pos)
.map_err(LoadError::Codegen)?;
}
ParserState::EndFunctionBody => break,
_ => unreachable!(),
}
cur_pos = parser.current_poisiton() as u32;
state = parser.read();
}
middlewares middlewares
.run( .run(
Some(fcg), Some(fcg),
@ -314,7 +324,6 @@ pub fn read_module<
cur_pos, cur_pos,
) )
.map_err(LoadError::Codegen)?; .map_err(LoadError::Codegen)?;
}
fcg.finalize() fcg.finalize()
.map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?;