mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 11:58:12 +00:00
LibRegex: Avoid initialization checks in get_opcode_by_id()
This commit is contained in:
parent
794dc368f1
commit
d3c2a3caea
2 changed files with 67 additions and 127 deletions
|
@ -90,64 +90,67 @@ static const char* character_class_name(CharClass ch_class)
|
|||
OwnPtr<OpCode> ByteCode::s_opcodes[(size_t)OpCodeId::Last + 1];
|
||||
bool ByteCode::s_opcodes_initialized { false };
|
||||
|
||||
void ByteCode::ensure_opcodes_initialized()
|
||||
{
|
||||
if (s_opcodes_initialized)
|
||||
return;
|
||||
for (u32 i = (u32)OpCodeId::First; i <= (u32)OpCodeId::Last; ++i) {
|
||||
switch ((OpCodeId)i) {
|
||||
case OpCodeId::Exit:
|
||||
s_opcodes[i] = make<OpCode_Exit>();
|
||||
break;
|
||||
case OpCodeId::Jump:
|
||||
s_opcodes[i] = make<OpCode_Jump>();
|
||||
break;
|
||||
case OpCodeId::Compare:
|
||||
s_opcodes[i] = make<OpCode_Compare>();
|
||||
break;
|
||||
case OpCodeId::CheckEnd:
|
||||
s_opcodes[i] = make<OpCode_CheckEnd>();
|
||||
break;
|
||||
case OpCodeId::CheckBoundary:
|
||||
s_opcodes[i] = make<OpCode_CheckBoundary>();
|
||||
break;
|
||||
case OpCodeId::ForkJump:
|
||||
s_opcodes[i] = make<OpCode_ForkJump>();
|
||||
break;
|
||||
case OpCodeId::ForkStay:
|
||||
s_opcodes[i] = make<OpCode_ForkStay>();
|
||||
break;
|
||||
case OpCodeId::FailForks:
|
||||
s_opcodes[i] = make<OpCode_FailForks>();
|
||||
break;
|
||||
case OpCodeId::Save:
|
||||
s_opcodes[i] = make<OpCode_Save>();
|
||||
break;
|
||||
case OpCodeId::Restore:
|
||||
s_opcodes[i] = make<OpCode_Restore>();
|
||||
break;
|
||||
case OpCodeId::GoBack:
|
||||
s_opcodes[i] = make<OpCode_GoBack>();
|
||||
break;
|
||||
case OpCodeId::CheckBegin:
|
||||
s_opcodes[i] = make<OpCode_CheckBegin>();
|
||||
break;
|
||||
case OpCodeId::SaveLeftCaptureGroup:
|
||||
s_opcodes[i] = make<OpCode_SaveLeftCaptureGroup>();
|
||||
break;
|
||||
case OpCodeId::SaveRightCaptureGroup:
|
||||
s_opcodes[i] = make<OpCode_SaveRightCaptureGroup>();
|
||||
break;
|
||||
case OpCodeId::SaveLeftNamedCaptureGroup:
|
||||
s_opcodes[i] = make<OpCode_SaveLeftNamedCaptureGroup>();
|
||||
break;
|
||||
case OpCodeId::SaveRightNamedCaptureGroup:
|
||||
s_opcodes[i] = make<OpCode_SaveRightNamedCaptureGroup>();
|
||||
break;
|
||||
}
|
||||
}
|
||||
s_opcodes_initialized = true;
|
||||
}
|
||||
|
||||
ALWAYS_INLINE OpCode& ByteCode::get_opcode_by_id(OpCodeId id) const
|
||||
{
|
||||
if (!s_opcodes_initialized) {
|
||||
for (u32 i = (u32)OpCodeId::First; i <= (u32)OpCodeId::Last; ++i) {
|
||||
switch ((OpCodeId)i) {
|
||||
case OpCodeId::Exit:
|
||||
s_opcodes[i] = make<OpCode_Exit>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::Jump:
|
||||
s_opcodes[i] = make<OpCode_Jump>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::Compare:
|
||||
s_opcodes[i] = make<OpCode_Compare>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::CheckEnd:
|
||||
s_opcodes[i] = make<OpCode_CheckEnd>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::CheckBoundary:
|
||||
s_opcodes[i] = make<OpCode_CheckBoundary>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::ForkJump:
|
||||
s_opcodes[i] = make<OpCode_ForkJump>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::ForkStay:
|
||||
s_opcodes[i] = make<OpCode_ForkStay>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::FailForks:
|
||||
s_opcodes[i] = make<OpCode_FailForks>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::Save:
|
||||
s_opcodes[i] = make<OpCode_Save>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::Restore:
|
||||
s_opcodes[i] = make<OpCode_Restore>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::GoBack:
|
||||
s_opcodes[i] = make<OpCode_GoBack>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::CheckBegin:
|
||||
s_opcodes[i] = make<OpCode_CheckBegin>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::SaveLeftCaptureGroup:
|
||||
s_opcodes[i] = make<OpCode_SaveLeftCaptureGroup>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::SaveRightCaptureGroup:
|
||||
s_opcodes[i] = make<OpCode_SaveRightCaptureGroup>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::SaveLeftNamedCaptureGroup:
|
||||
s_opcodes[i] = make<OpCode_SaveLeftNamedCaptureGroup>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
case OpCodeId::SaveRightNamedCaptureGroup:
|
||||
s_opcodes[i] = make<OpCode_SaveRightNamedCaptureGroup>(*const_cast<ByteCode*>(this));
|
||||
break;
|
||||
}
|
||||
}
|
||||
s_opcodes_initialized = true;
|
||||
}
|
||||
|
||||
VERIFY(id >= OpCodeId::First && id <= OpCodeId::Last);
|
||||
|
||||
auto& opcode = s_opcodes[(u32)id];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue