1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 19:07:35 +00:00

LibRegex: Use a plain array to store opcodes

Using a hash map is unnecessary because the number of opcodes and their
IDs never change.
This commit is contained in:
Gunnar Beutner 2021-06-13 22:10:25 +02:00 committed by Ali Mohammad Pur
parent c38f051bf7
commit 1fb4471506
2 changed files with 23 additions and 20 deletions

View file

@ -87,69 +87,71 @@ static const char* character_class_name(CharClass ch_class)
} }
} }
HashMap<u32, OwnPtr<OpCode>> ByteCode::s_opcodes {}; OwnPtr<OpCode> ByteCode::s_opcodes[(size_t)OpCodeId::Last + 1];
bool ByteCode::s_opcodes_initialized { false };
ALWAYS_INLINE OpCode* ByteCode::get_opcode_by_id(OpCodeId id) const ALWAYS_INLINE OpCode* ByteCode::get_opcode_by_id(OpCodeId id) const
{ {
if (!s_opcodes.size()) { if (!s_opcodes_initialized) {
for (u32 i = (u32)OpCodeId::First; i <= (u32)OpCodeId::Last; ++i) { for (u32 i = (u32)OpCodeId::First; i <= (u32)OpCodeId::Last; ++i) {
switch ((OpCodeId)i) { switch ((OpCodeId)i) {
case OpCodeId::Exit: case OpCodeId::Exit:
s_opcodes.set(i, make<OpCode_Exit>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_Exit>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::Jump: case OpCodeId::Jump:
s_opcodes.set(i, make<OpCode_Jump>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_Jump>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::Compare: case OpCodeId::Compare:
s_opcodes.set(i, make<OpCode_Compare>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_Compare>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::CheckEnd: case OpCodeId::CheckEnd:
s_opcodes.set(i, make<OpCode_CheckEnd>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_CheckEnd>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::CheckBoundary: case OpCodeId::CheckBoundary:
s_opcodes.set(i, make<OpCode_CheckBoundary>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_CheckBoundary>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::ForkJump: case OpCodeId::ForkJump:
s_opcodes.set(i, make<OpCode_ForkJump>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_ForkJump>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::ForkStay: case OpCodeId::ForkStay:
s_opcodes.set(i, make<OpCode_ForkStay>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_ForkStay>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::FailForks: case OpCodeId::FailForks:
s_opcodes.set(i, make<OpCode_FailForks>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_FailForks>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::Save: case OpCodeId::Save:
s_opcodes.set(i, make<OpCode_Save>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_Save>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::Restore: case OpCodeId::Restore:
s_opcodes.set(i, make<OpCode_Restore>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_Restore>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::GoBack: case OpCodeId::GoBack:
s_opcodes.set(i, make<OpCode_GoBack>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_GoBack>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::CheckBegin: case OpCodeId::CheckBegin:
s_opcodes.set(i, make<OpCode_CheckBegin>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_CheckBegin>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::SaveLeftCaptureGroup: case OpCodeId::SaveLeftCaptureGroup:
s_opcodes.set(i, make<OpCode_SaveLeftCaptureGroup>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_SaveLeftCaptureGroup>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::SaveRightCaptureGroup: case OpCodeId::SaveRightCaptureGroup:
s_opcodes.set(i, make<OpCode_SaveRightCaptureGroup>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_SaveRightCaptureGroup>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::SaveLeftNamedCaptureGroup: case OpCodeId::SaveLeftNamedCaptureGroup:
s_opcodes.set(i, make<OpCode_SaveLeftNamedCaptureGroup>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_SaveLeftNamedCaptureGroup>(*const_cast<ByteCode*>(this));
break; break;
case OpCodeId::SaveRightNamedCaptureGroup: case OpCodeId::SaveRightNamedCaptureGroup:
s_opcodes.set(i, make<OpCode_SaveRightNamedCaptureGroup>(*const_cast<ByteCode*>(this))); s_opcodes[i] = make<OpCode_SaveRightNamedCaptureGroup>(*const_cast<ByteCode*>(this));
break; break;
} }
} }
s_opcodes_initialized = true;
} }
if (id > OpCodeId::Last) if (id > OpCodeId::Last)
return nullptr; return nullptr;
return const_cast<OpCode*>(s_opcodes.get((u32)id).value())->set_bytecode(*const_cast<ByteCode*>(this)); return const_cast<OpCode*>(s_opcodes[(u32)id]->set_bytecode(*const_cast<ByteCode*>(this)));
} }
OpCode* ByteCode::get_opcode(MatchState& state) const OpCode* ByteCode::get_opcode(MatchState& state) const

View file

@ -450,7 +450,8 @@ private:
} }
ALWAYS_INLINE OpCode* get_opcode_by_id(OpCodeId id) const; ALWAYS_INLINE OpCode* get_opcode_by_id(OpCodeId id) const;
static HashMap<u32, OwnPtr<OpCode>> s_opcodes; static OwnPtr<OpCode> s_opcodes[(size_t)OpCodeId::Last + 1];
static bool s_opcodes_initialized;
}; };
#define ENUMERATE_EXECUTION_RESULTS \ #define ENUMERATE_EXECUTION_RESULTS \