diff options
-rw-r--r-- | src/binary-reader-ir.cc | 22 | ||||
-rw-r--r-- | src/common.h | 5 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/binary-reader-ir.cc b/src/binary-reader-ir.cc index bd48f51d..7d9c301f 100644 --- a/src/binary-reader-ir.cc +++ b/src/binary-reader-ir.cc @@ -302,7 +302,9 @@ bool BinaryReaderIR::OnError(const char* message) { } Result BinaryReaderIR::OnTypeCount(Index count) { + WABT_TRY module_->func_types.reserve(count); + WABT_CATCH_BAD_ALLOC return Result::Ok; } @@ -320,7 +322,9 @@ Result BinaryReaderIR::OnType(Index index, } Result BinaryReaderIR::OnImportCount(Index count) { + WABT_TRY module_->imports.reserve(count); + WABT_CATCH_BAD_ALLOC return Result::Ok; } @@ -400,7 +404,9 @@ Result BinaryReaderIR::OnImportException(Index import_index, } Result BinaryReaderIR::OnFunctionCount(Index count) { + WABT_TRY module_->funcs.reserve(module_->num_func_imports + count); + WABT_CATCH_BAD_ALLOC return Result::Ok; } @@ -415,7 +421,9 @@ Result BinaryReaderIR::OnFunction(Index index, Index sig_index) { } Result BinaryReaderIR::OnTableCount(Index count) { + WABT_TRY module_->tables.reserve(module_->num_table_imports + count); + WABT_CATCH_BAD_ALLOC return Result::Ok; } @@ -430,7 +438,9 @@ Result BinaryReaderIR::OnTable(Index index, } Result BinaryReaderIR::OnMemoryCount(Index count) { + WABT_TRY module_->memories.reserve(module_->num_memory_imports + count); + WABT_CATCH_BAD_ALLOC return Result::Ok; } @@ -443,7 +453,9 @@ Result BinaryReaderIR::OnMemory(Index index, const Limits* page_limits) { } Result BinaryReaderIR::OnGlobalCount(Index count) { + WABT_TRY module_->globals.reserve(module_->num_global_imports + count); + WABT_CATCH_BAD_ALLOC return Result::Ok; } @@ -469,7 +481,9 @@ Result BinaryReaderIR::EndGlobalInitExpr(Index index) { } Result BinaryReaderIR::OnExportCount(Index count) { + WABT_TRY module_->exports.reserve(count); + WABT_CATCH_BAD_ALLOC return Result::Ok; } @@ -523,7 +537,9 @@ Result BinaryReaderIR::BeginFunctionBody(Index index) { Result BinaryReaderIR::OnLocalDecl(Index decl_index, Index count, Type type) { TypeVector& types = current_func_->local_types; + WABT_TRY types.reserve(types.size() + count); + WABT_CATCH_BAD_ALLOC for (size_t i = 0; i < count; ++i) types.push_back(type); return Result::Ok; @@ -802,7 +818,9 @@ Result BinaryReaderIR::EndFunctionBody(Index index) { } Result BinaryReaderIR::OnElemSegmentCount(Index count) { + WABT_TRY module_->elem_segments.reserve(count); + WABT_CATCH_BAD_ALLOC return Result::Ok; } @@ -830,7 +848,9 @@ Result BinaryReaderIR::OnElemSegmentFunctionIndexCount(Index index, Index count) { assert(index == module_->elem_segments.size() - 1); ElemSegment* segment = module_->elem_segments[index]; + WABT_TRY segment->vars.reserve(count); + WABT_CATCH_BAD_ALLOC return Result::Ok; } @@ -845,7 +865,9 @@ Result BinaryReaderIR::OnElemSegmentFunctionIndex(Index segment_index, } Result BinaryReaderIR::OnDataSegmentCount(Index count) { + WABT_TRY module_->data_segments.reserve(count); + WABT_CATCH_BAD_ALLOC return Result::Ok; } diff --git a/src/common.h b/src/common.h index dbbf28b8..d12edb0a 100644 --- a/src/common.h +++ b/src/common.h @@ -76,6 +76,10 @@ #if WITH_EXCEPTIONS #define WABT_TRY try { +#define WABT_CATCH_BAD_ALLOC \ + } \ + catch (std::bad_alloc&) { \ + } #define WABT_CATCH_BAD_ALLOC_AND_EXIT \ } \ catch (std::bad_alloc&) { \ @@ -83,6 +87,7 @@ } #else #define WABT_TRY +#define WABT_CATCH_BAD_ALLOC #define WABT_CATCH_BAD_ALLOC_AND_EXIT #endif |