mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-09-03 16:16:43 +00:00
LibWasm: Replace a hashtable with an RBTree to make instantiation faster
...by about 40%.
This commit is contained in:
parent
f1abc36689
commit
8cf0f36f7d
Notes:
sideshowbarker
2024-07-18 23:45:29 +09:00
Author: https://github.com/alimpfard
Commit: 8cf0f36f7d
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/671
2 changed files with 13 additions and 6 deletions
|
@ -124,15 +124,18 @@ ErrorOr<void, ValidationError> Validator::validate(Module& module)
|
||||||
// - Exports
|
// - Exports
|
||||||
auto scan_expression_for_function_indices = [&](auto& expression) {
|
auto scan_expression_for_function_indices = [&](auto& expression) {
|
||||||
for (auto& instruction : expression.instructions()) {
|
for (auto& instruction : expression.instructions()) {
|
||||||
if (instruction.opcode() == Instructions::ref_func)
|
if (instruction.opcode() == Instructions::ref_func) {
|
||||||
m_context.references.set(instruction.arguments().template get<FunctionIndex>());
|
auto index = instruction.arguments().template get<FunctionIndex>();
|
||||||
|
m_context.references->tree.insert(index.value(), index);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
module.for_each_section_of_type<ExportSection>([&](ExportSection const& section) {
|
module.for_each_section_of_type<ExportSection>([&](ExportSection const& section) {
|
||||||
for (auto& export_ : section.entries()) {
|
for (auto& export_ : section.entries()) {
|
||||||
if (!export_.description().has<FunctionIndex>())
|
if (!export_.description().has<FunctionIndex>())
|
||||||
continue;
|
continue;
|
||||||
m_context.references.set(export_.description().get<FunctionIndex>());
|
auto index = export_.description().get<FunctionIndex>();
|
||||||
|
m_context.references->tree.insert(index.value(), index);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
module.for_each_section_of_type<ElementSection>([&](ElementSection const& section) {
|
module.for_each_section_of_type<ElementSection>([&](ElementSection const& section) {
|
||||||
|
@ -1313,7 +1316,7 @@ VALIDATE_INSTRUCTION(ref_func)
|
||||||
auto index = instruction.arguments().get<FunctionIndex>();
|
auto index = instruction.arguments().get<FunctionIndex>();
|
||||||
TRY(validate(index));
|
TRY(validate(index));
|
||||||
|
|
||||||
if (!m_context.references.contains(index))
|
if (m_context.references->tree.find(index.value()) == nullptr)
|
||||||
return Errors::invalid("function reference"sv);
|
return Errors::invalid("function reference"sv);
|
||||||
|
|
||||||
is_constant = true;
|
is_constant = true;
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
#include <AK/COWVector.h>
|
#include <AK/COWVector.h>
|
||||||
#include <AK/Debug.h>
|
#include <AK/Debug.h>
|
||||||
#include <AK/HashTable.h>
|
#include <AK/RedBlackTree.h>
|
||||||
#include <AK/SourceLocation.h>
|
#include <AK/SourceLocation.h>
|
||||||
#include <AK/Tuple.h>
|
#include <AK/Tuple.h>
|
||||||
#include <AK/Vector.h>
|
#include <AK/Vector.h>
|
||||||
|
@ -18,6 +18,10 @@
|
||||||
namespace Wasm {
|
namespace Wasm {
|
||||||
|
|
||||||
struct Context {
|
struct Context {
|
||||||
|
struct RefRBTree : RefCounted<RefRBTree> {
|
||||||
|
RedBlackTree<size_t, FunctionIndex> tree;
|
||||||
|
};
|
||||||
|
|
||||||
COWVector<FunctionType> types;
|
COWVector<FunctionType> types;
|
||||||
COWVector<FunctionType> functions;
|
COWVector<FunctionType> functions;
|
||||||
COWVector<TableType> tables;
|
COWVector<TableType> tables;
|
||||||
|
@ -27,7 +31,7 @@ struct Context {
|
||||||
COWVector<bool> datas;
|
COWVector<bool> datas;
|
||||||
COWVector<ValueType> locals;
|
COWVector<ValueType> locals;
|
||||||
Optional<u32> data_count;
|
Optional<u32> data_count;
|
||||||
AK::HashTable<FunctionIndex> references;
|
RefPtr<RefRBTree> references { make_ref_counted<RefRBTree>() };
|
||||||
size_t imported_function_count { 0 };
|
size_t imported_function_count { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue