| Index: src/wasm/ast-decoder.cc
|
| diff --git a/src/wasm/ast-decoder.cc b/src/wasm/ast-decoder.cc
|
| index 524a4c82c1bf06db3376a14d39fdfbbd2e85e52a..e2f6a046b36d59acefe8f28b3650e6c377c4ebf4 100644
|
| --- a/src/wasm/ast-decoder.cc
|
| +++ b/src/wasm/ast-decoder.cc
|
| @@ -412,15 +412,23 @@ class SR_WasmDecoder : public WasmDecoder {
|
| return toResult(tree);
|
| }
|
|
|
| - std::vector<LocalType>* DecodeLocalDeclsForTesting() {
|
| + bool DecodeLocalDecls(AstLocalDecls& decls) {
|
| DecodeLocalDecls();
|
| - if (failed()) return nullptr;
|
| - auto result = new std::vector<LocalType>();
|
| - result->reserve(local_type_vec_.size());
|
| - for (size_t i = 0; i < local_type_vec_.size(); i++) {
|
| - result->push_back(local_type_vec_[i]);
|
| + if (failed()) return false;
|
| + decls.decls_encoded_size = pc_offset();
|
| + decls.total_local_count = 0;
|
| + decls.local_types.reserve(local_type_vec_.size());
|
| + for (size_t pos = 0; pos < local_type_vec_.size();) {
|
| + uint32_t count = 0;
|
| + LocalType type = local_type_vec_[pos];
|
| + while (pos < local_type_vec_.size() && local_type_vec_[pos] == type) {
|
| + pos++;
|
| + count++;
|
| + }
|
| + decls.total_local_count += count;
|
| + decls.local_types.push_back(std::pair<LocalType, uint32_t>(type, count));
|
| }
|
| - return result;
|
| + return true;
|
| }
|
|
|
| BitVector* AnalyzeLoopAssignmentForTesting(const byte* pc,
|
| @@ -1626,12 +1634,13 @@ class SR_WasmDecoder : public WasmDecoder {
|
| }
|
| };
|
|
|
| -std::vector<LocalType>* DecodeLocalDeclsForTesting(
|
| - base::AccountingAllocator* allocator, const byte* start, const byte* end) {
|
| - Zone zone(allocator);
|
| +bool DecodeLocalDecls(AstLocalDecls& decls, const byte* start,
|
| + const byte* end) {
|
| + base::AccountingAllocator allocator;
|
| + Zone tmp(&allocator);
|
| FunctionBody body = {nullptr, nullptr, nullptr, start, end};
|
| - SR_WasmDecoder decoder(&zone, nullptr, body);
|
| - return decoder.DecodeLocalDeclsForTesting();
|
| + SR_WasmDecoder decoder(&tmp, nullptr, body);
|
| + return decoder.DecodeLocalDecls(decls);
|
| }
|
|
|
| TreeResult VerifyWasmCode(base::AccountingAllocator* allocator,
|
| @@ -1700,19 +1709,14 @@ void PrintAst(base::AccountingAllocator* allocator, FunctionBody& body) {
|
| }
|
|
|
| // Print the local declarations.
|
| - std::vector<LocalType>* decls = decoder.DecodeLocalDeclsForTesting();
|
| + AstLocalDecls decls(&zone);
|
| + decoder.DecodeLocalDecls(decls);
|
| const byte* pc = decoder.pc();
|
| if (body.start != decoder.pc()) {
|
| printf("// locals:");
|
| - size_t pos = 0;
|
| - while (pos < decls->size()) {
|
| - LocalType type = decls->at(pos++);
|
| - size_t count = 1;
|
| - while (pos < decls->size() && decls->at(pos) == type) {
|
| - pos++;
|
| - count++;
|
| - }
|
| -
|
| + for (auto p : decls.local_types) {
|
| + LocalType type = p.first;
|
| + uint32_t count = p.second;
|
| os << " " << count << " " << WasmOpcodes::TypeName(type);
|
| }
|
| os << std::endl;
|
| @@ -1722,7 +1726,6 @@ void PrintAst(base::AccountingAllocator* allocator, FunctionBody& body) {
|
| }
|
| printf("\n");
|
| }
|
| - delete decls;
|
|
|
| printf("// body: \n");
|
| std::vector<int> arity_stack;
|
|
|