mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 18:17:44 +00:00
LibRegex: Always inline get_opcode()
This function's prologue was showing up as very hot in profiles, taking almost 9% of runtime in our Regex test suite.
This commit is contained in:
parent
a539c261b1
commit
11abca421a
2 changed files with 22 additions and 22 deletions
|
@ -181,28 +181,6 @@ void ByteCode::ensure_opcodes_initialized()
|
||||||
s_opcodes_initialized = true;
|
s_opcodes_initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ALWAYS_INLINE OpCode& ByteCode::get_opcode_by_id(OpCodeId id) const
|
|
||||||
{
|
|
||||||
VERIFY(id >= OpCodeId::First && id <= OpCodeId::Last);
|
|
||||||
|
|
||||||
auto& opcode = s_opcodes[(u32)id];
|
|
||||||
opcode->set_bytecode(*const_cast<ByteCode*>(this));
|
|
||||||
return *opcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
OpCode& ByteCode::get_opcode(MatchState& state) const
|
|
||||||
{
|
|
||||||
OpCodeId opcode_id;
|
|
||||||
if (auto opcode_ptr = static_cast<DisjointChunks<ByteCodeValueType> const&>(*this).find(state.instruction_position))
|
|
||||||
opcode_id = (OpCodeId)*opcode_ptr;
|
|
||||||
else
|
|
||||||
opcode_id = OpCodeId::Exit;
|
|
||||||
|
|
||||||
auto& opcode = get_opcode_by_id(opcode_id);
|
|
||||||
opcode.set_state(state);
|
|
||||||
return opcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
ALWAYS_INLINE ExecutionResult OpCode_Exit::execute(MatchInput const& input, MatchState& state) const
|
ALWAYS_INLINE ExecutionResult OpCode_Exit::execute(MatchInput const& input, MatchState& state) const
|
||||||
{
|
{
|
||||||
if (state.string_position > input.view.length() || state.instruction_position >= m_bytecode->size())
|
if (state.string_position > input.view.length() || state.instruction_position >= m_bytecode->size())
|
||||||
|
|
|
@ -822,6 +822,28 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ALWAYS_INLINE OpCode& ByteCode::get_opcode(regex::MatchState& state) const
|
||||||
|
{
|
||||||
|
OpCodeId opcode_id;
|
||||||
|
if (auto opcode_ptr = static_cast<DisjointChunks<ByteCodeValueType> const&>(*this).find(state.instruction_position))
|
||||||
|
opcode_id = (OpCodeId)*opcode_ptr;
|
||||||
|
else
|
||||||
|
opcode_id = OpCodeId::Exit;
|
||||||
|
|
||||||
|
auto& opcode = get_opcode_by_id(opcode_id);
|
||||||
|
opcode.set_state(state);
|
||||||
|
return opcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALWAYS_INLINE OpCode& ByteCode::get_opcode_by_id(OpCodeId id) const
|
||||||
|
{
|
||||||
|
VERIFY(id >= OpCodeId::First && id <= OpCodeId::Last);
|
||||||
|
|
||||||
|
auto& opcode = s_opcodes[(u32)id];
|
||||||
|
opcode->set_bytecode(*const_cast<ByteCode*>(this));
|
||||||
|
return *opcode;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
bool is(OpCode const&);
|
bool is(OpCode const&);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue