1 // Copyright 2017 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/wasm/local-decl-encoder.h" 6 7 #include "src/signature.h" 8 #include "src/wasm/leb-helper.h" 9 10 namespace v8 { 11 namespace internal { 12 namespace wasm { 13 14 void LocalDeclEncoder::Prepend(Zone* zone, const byte** start, 15 const byte** end) const { 16 size_t size = (*end - *start); 17 byte* buffer = reinterpret_cast<byte*>(zone->New(Size() + size)); 18 size_t pos = Emit(buffer); 19 memcpy(buffer + pos, *start, size); 20 pos += size; 21 *start = buffer; 22 *end = buffer + pos; 23 } 24 25 size_t LocalDeclEncoder::Emit(byte* buffer) const { 26 byte* pos = buffer; 27 LEBHelper::write_u32v(&pos, static_cast<uint32_t>(local_decls.size())); 28 for (auto& local_decl : local_decls) { 29 LEBHelper::write_u32v(&pos, local_decl.first); 30 *pos = ValueTypes::ValueTypeCodeFor(local_decl.second); 31 ++pos; 32 } 33 DCHECK_EQ(Size(), pos - buffer); 34 return static_cast<size_t>(pos - buffer); 35 } 36 37 uint32_t LocalDeclEncoder::AddLocals(uint32_t count, ValueType type) { 38 uint32_t result = 39 static_cast<uint32_t>(total + (sig ? sig->parameter_count() : 0)); 40 total += count; 41 if (local_decls.size() > 0 && local_decls.back().second == type) { 42 count += local_decls.back().first; 43 local_decls.pop_back(); 44 } 45 local_decls.push_back(std::pair<uint32_t, ValueType>(count, type)); 46 return result; 47 } 48 49 size_t LocalDeclEncoder::Size() const { 50 size_t size = LEBHelper::sizeof_u32v(local_decls.size()); 51 for (auto p : local_decls) size += 1 + LEBHelper::sizeof_u32v(p.first); 52 return size; 53 } 54 55 } // namespace wasm 56 } // namespace internal 57 } // namespace v8 58