mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-01 05:39:11 +00:00
LibWasm: Fix nested structured instruction parsing
Previously, the ip would not be propagated correctly, and we would produce invalid jumps when more than one level of nesting was involved. This makes loops work :P
This commit is contained in:
parent
29b193d25d
commit
207379165f
Notes:
sideshowbarker
2024-07-18 17:39:30 +09:00
Author: https://github.com/alimpfard
Commit: 207379165f
Pull-request: https://github.com/SerenityOS/serenity/pull/7239
Reviewed-by: https://github.com/linusg
2 changed files with 12 additions and 8 deletions
|
@ -82,7 +82,7 @@ struct ParseUntilAnyOfResult {
|
|||
Vector<T> values;
|
||||
};
|
||||
template<typename T, u8... terminators, typename... Args>
|
||||
static ParseResult<ParseUntilAnyOfResult<T>> parse_until_any_of(InputStream& stream, Args... args) requires(requires(InputStream& stream, Args... args) { T::parse(stream, args...); })
|
||||
static ParseResult<ParseUntilAnyOfResult<T>> parse_until_any_of(InputStream& stream, Args&... args) requires(requires(InputStream& stream, Args... args) { T::parse(stream, args...); })
|
||||
{
|
||||
ScopeLogger<WASM_BINPARSER_DEBUG> logger;
|
||||
ReconsumableStream new_stream { stream };
|
||||
|
@ -305,7 +305,8 @@ ParseResult<Vector<Instruction>> Instruction::parse(InputStream& stream, Instruc
|
|||
result.value().values.append(Instruction { Instructions::structured_end });
|
||||
|
||||
// Transform op(..., instr*) -> op(...) instr* op(end(ip))
|
||||
result.value().values.prepend(Instruction { opcode, StructuredInstructionArgs { BlockType { block_type.release_value() }, ++ip, {} } });
|
||||
result.value().values.prepend(Instruction { opcode, StructuredInstructionArgs { BlockType { block_type.release_value() }, ip.value(), {} } });
|
||||
++ip;
|
||||
return result.release_value().values;
|
||||
}
|
||||
|
||||
|
@ -314,7 +315,7 @@ ParseResult<Vector<Instruction>> Instruction::parse(InputStream& stream, Instruc
|
|||
instructions.append(result.release_value().values);
|
||||
instructions.append(Instruction { Instructions::structured_else });
|
||||
++ip;
|
||||
else_ip = ip;
|
||||
else_ip = ip.value();
|
||||
}
|
||||
// if with else
|
||||
{
|
||||
|
@ -324,7 +325,7 @@ ParseResult<Vector<Instruction>> Instruction::parse(InputStream& stream, Instruc
|
|||
instructions.append(result.release_value().values);
|
||||
instructions.append(Instruction { Instructions::structured_end });
|
||||
++ip;
|
||||
end_ip = ip;
|
||||
end_ip = ip.value();
|
||||
}
|
||||
|
||||
instructions.prepend(Instruction { opcode, StructuredInstructionArgs { BlockType { block_type.release_value() }, end_ip, else_ip } });
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue