| Index: src/wasm/encoder.cc
|
| diff --git a/src/wasm/encoder.cc b/src/wasm/encoder.cc
|
| index a95171d0ae54b9ea6a7ac5ee8f70180252815036..3d35128a45b53e522cc57ac41eefabe8c70c5a02 100644
|
| --- a/src/wasm/encoder.cc
|
| +++ b/src/wasm/encoder.cc
|
| @@ -54,7 +54,7 @@ void EmitUint32(byte** b, uint32_t x) {
|
| // We generate a large varint which we then fixup later when the size is known.
|
| //
|
| // TODO(jfb) Not strictly necessary since sizes are calculated ahead of time.
|
| -const size_t padded_varint = 5;
|
| +const size_t kPaddedVarintSize = 5;
|
|
|
| void EmitVarInt(byte** b, size_t val) {
|
| while (true) {
|
| @@ -81,12 +81,12 @@ size_t SizeOfVarInt(size_t value) {
|
|
|
| void FixupSection(byte* start, byte* end) {
|
| // Same as EmitVarInt, but fixed-width with zeroes in the MSBs.
|
| - size_t val = end - start - padded_varint;
|
| + size_t val = end - start - kPaddedVarintSize;
|
| TRACE(" fixup %u\n", (unsigned)val);
|
| - for (size_t pos = 0; pos != padded_varint; ++pos) {
|
| + for (size_t pos = 0; pos != kPaddedVarintSize; ++pos) {
|
| size_t next = val >> 7;
|
| byte out = static_cast<byte>(val & 0x7f);
|
| - if (pos != padded_varint - 1) {
|
| + if (pos != kPaddedVarintSize - 1) {
|
| *(start++) = 0x80 | out;
|
| val = next;
|
| } else {
|
| @@ -98,15 +98,18 @@ void FixupSection(byte* start, byte* end) {
|
|
|
| // Returns the start of the section, where the section VarInt size is.
|
| byte* EmitSection(WasmSection::Code code, byte** b) {
|
| + // Emit a placeholder for the length.
|
| byte* start = *b;
|
| - const char* name = WasmSection::getName(code);
|
| - size_t length = WasmSection::getNameLength(code);
|
| - TRACE("emit section: %s\n", name);
|
| - for (size_t padding = 0; padding != padded_varint; ++padding) {
|
| + for (size_t padding = 0; padding != kPaddedVarintSize; ++padding) {
|
| EmitUint8(b, 0xff); // Will get fixed up later.
|
| }
|
| + // Emit the section name.
|
| + const char* name = WasmSection::getName(code);
|
| + TRACE("emit section: %s\n", name);
|
| + size_t length = WasmSection::getNameLength(code);
|
| EmitVarInt(b, length); // Section name string size.
|
| for (size_t i = 0; i != length; ++i) EmitUint8(b, name[i]);
|
| +
|
| return start;
|
| }
|
| } // namespace
|
| @@ -551,7 +554,7 @@ struct Sizes {
|
| }
|
|
|
| void AddSection(WasmSection::Code code, size_t other_size) {
|
| - Add(padded_varint + SizeOfVarInt(WasmSection::getNameLength(code)) +
|
| + Add(kPaddedVarintSize + SizeOfVarInt(WasmSection::getNameLength(code)) +
|
| WasmSection::getNameLength(code),
|
| 0);
|
| if (other_size) Add(SizeOfVarInt(other_size), 0);
|
| @@ -563,11 +566,6 @@ WasmModuleIndex* WasmModuleWriter::WriteTo(Zone* zone) const {
|
|
|
| sizes.Add(2 * sizeof(uint32_t), 0); // header
|
|
|
| - sizes.AddSection(WasmSection::Code::Memory, 0);
|
| - sizes.Add(kDeclMemorySize, 0);
|
| - TRACE("Size after memory: %u, %u\n", (unsigned)sizes.header_size,
|
| - (unsigned)sizes.body_size);
|
| -
|
| if (globals_.size() > 0) {
|
| sizes.AddSection(WasmSection::Code::Globals, globals_.size());
|
| /* These globals never have names, so are always 3 bytes. */
|
| @@ -596,6 +594,21 @@ WasmModuleIndex* WasmModuleWriter::WriteTo(Zone* zone) const {
|
| (unsigned)sizes.body_size);
|
| }
|
|
|
| + if (indirect_functions_.size() > 0) {
|
| + sizes.AddSection(WasmSection::Code::FunctionTable,
|
| + indirect_functions_.size());
|
| + for (auto function_index : indirect_functions_) {
|
| + sizes.Add(SizeOfVarInt(function_index), 0);
|
| + }
|
| + TRACE("Size after indirect functions: %u, %u\n",
|
| + (unsigned)sizes.header_size, (unsigned)sizes.body_size);
|
| + }
|
| +
|
| + sizes.AddSection(WasmSection::Code::Memory, 0);
|
| + sizes.Add(kDeclMemorySize, 0);
|
| + TRACE("Size after memory: %u, %u\n", (unsigned)sizes.header_size,
|
| + (unsigned)sizes.body_size);
|
| +
|
| if (start_function_index_ >= 0) {
|
| sizes.AddSection(WasmSection::Code::StartFunction, 0);
|
| sizes.Add(SizeOfVarInt(start_function_index_), 0);
|
| @@ -612,16 +625,6 @@ WasmModuleIndex* WasmModuleWriter::WriteTo(Zone* zone) const {
|
| (unsigned)sizes.body_size);
|
| }
|
|
|
| - if (indirect_functions_.size() > 0) {
|
| - sizes.AddSection(WasmSection::Code::FunctionTable,
|
| - indirect_functions_.size());
|
| - for (auto function_index : indirect_functions_) {
|
| - sizes.Add(SizeOfVarInt(function_index), 0);
|
| - }
|
| - TRACE("Size after indirect functions: %u, %u\n",
|
| - (unsigned)sizes.header_size, (unsigned)sizes.body_size);
|
| - }
|
| -
|
| if (sizes.body_size > 0) {
|
| sizes.AddSection(WasmSection::Code::End, 0);
|
| TRACE("Size after end: %u, %u\n", (unsigned)sizes.header_size,
|
| @@ -638,16 +641,6 @@ WasmModuleIndex* WasmModuleWriter::WriteTo(Zone* zone) const {
|
| EmitUint32(&header, kWasmMagic);
|
| EmitUint32(&header, kWasmVersion);
|
|
|
| - // -- emit memory declaration ------------------------------------------------
|
| - {
|
| - byte* section = EmitSection(WasmSection::Code::Memory, &header);
|
| - EmitVarInt(&header, 16); // min memory size
|
| - EmitVarInt(&header, 16); // max memory size
|
| - EmitUint8(&header, 0); // memory export
|
| - static_assert(kDeclMemorySize == 3, "memory size must match emit above");
|
| - FixupSection(section, header);
|
| - }
|
| -
|
| // -- emit globals -----------------------------------------------------------
|
| if (globals_.size() > 0) {
|
| byte* section = EmitSection(WasmSection::Code::Globals, &header);
|
| @@ -691,6 +684,27 @@ WasmModuleIndex* WasmModuleWriter::WriteTo(Zone* zone) const {
|
| FixupSection(section, header);
|
| }
|
|
|
| + // -- emit function table ----------------------------------------------------
|
| + if (indirect_functions_.size() > 0) {
|
| + byte* section = EmitSection(WasmSection::Code::FunctionTable, &header);
|
| + EmitVarInt(&header, indirect_functions_.size());
|
| +
|
| + for (auto index : indirect_functions_) {
|
| + EmitVarInt(&header, index);
|
| + }
|
| + FixupSection(section, header);
|
| + }
|
| +
|
| + // -- emit memory declaration ------------------------------------------------
|
| + {
|
| + byte* section = EmitSection(WasmSection::Code::Memory, &header);
|
| + EmitVarInt(&header, 16); // min memory size
|
| + EmitVarInt(&header, 16); // max memory size
|
| + EmitUint8(&header, 0); // memory export
|
| + static_assert(kDeclMemorySize == 3, "memory size must match emit above");
|
| + FixupSection(section, header);
|
| + }
|
| +
|
| // -- emit start function index ----------------------------------------------
|
| if (start_function_index_ >= 0) {
|
| byte* section = EmitSection(WasmSection::Code::StartFunction, &header);
|
| @@ -709,17 +723,6 @@ WasmModuleIndex* WasmModuleWriter::WriteTo(Zone* zone) const {
|
| FixupSection(section, header);
|
| }
|
|
|
| - // -- emit function table ----------------------------------------------------
|
| - if (indirect_functions_.size() > 0) {
|
| - byte* section = EmitSection(WasmSection::Code::FunctionTable, &header);
|
| - EmitVarInt(&header, indirect_functions_.size());
|
| -
|
| - for (auto index : indirect_functions_) {
|
| - EmitVarInt(&header, index);
|
| - }
|
| - FixupSection(section, header);
|
| - }
|
| -
|
| if (sizes.body_size > 0) {
|
| byte* section = EmitSection(WasmSection::Code::End, &header);
|
| FixupSection(section, header);
|
|
|