Index: src/wasm/encoder.cc |
diff --git a/src/wasm/encoder.cc b/src/wasm/encoder.cc |
index 1246907a8d23ab98cbe06cd76c081e732055139b..863739b4037c20fe22b12f69fa1c07ddd5fd6bc2 100644 |
--- a/src/wasm/encoder.cc |
+++ b/src/wasm/encoder.cc |
@@ -80,11 +80,6 @@ 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; |
- 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); |
@@ -92,6 +87,12 @@ byte* EmitSection(WasmSection::Code code, byte** b) { |
EmitVarInt(b, length); // Section name string size. |
for (size_t i = 0; i != length; ++i) EmitUint8(b, name[i]); |
+ // Emit a placeholder for the length. |
+ byte* start = *b; |
+ for (size_t padding = 0; padding != kPaddedVarintSize; ++padding) { |
+ EmitUint8(b, 0xff); // Will get fixed up later. |
+ } |
+ |
return start; |
} |
} // namespace |
@@ -586,7 +587,9 @@ WasmModuleIndex* WasmModuleWriter::WriteTo(Zone* zone) const { |
sizes.AddSection(WasmSection::Code::Signatures, signatures_.size()); |
for (auto sig : signatures_) { |
sizes.Add(1 + LEBHelper::sizeof_u32v(sig->parameter_count()) + |
- sig->parameter_count(), |
+ sig->parameter_count() + |
+ LEBHelper::sizeof_u32v(sig->return_count()) + |
+ sig->return_count(), |
0); |
} |
TRACE("Size after signatures: %u, %u\n", (unsigned)sizes.header_size, |
@@ -594,7 +597,7 @@ WasmModuleIndex* WasmModuleWriter::WriteTo(Zone* zone) const { |
} |
if (functions_.size() > 0) { |
- sizes.AddSection(WasmSection::Code::Functions, functions_.size()); |
+ sizes.AddSection(WasmSection::Code::OldFunctions, functions_.size()); |
for (auto function : functions_) { |
sizes.Add(function->HeaderSize() + function->BodySize(), |
function->NameSize()); |
@@ -669,22 +672,22 @@ WasmModuleIndex* WasmModuleWriter::WriteTo(Zone* zone) const { |
EmitVarInt(&header, signatures_.size()); |
for (FunctionSig* sig : signatures_) { |
+ EmitUint8(&header, kWasmFunctionTypeForm); |
EmitVarInt(&header, sig->parameter_count()); |
- if (sig->return_count() > 0) { |
- EmitUint8(&header, WasmOpcodes::LocalTypeCodeFor(sig->GetReturn())); |
- } else { |
- EmitUint8(&header, kLocalVoid); |
- } |
for (size_t j = 0; j < sig->parameter_count(); j++) { |
EmitUint8(&header, WasmOpcodes::LocalTypeCodeFor(sig->GetParam(j))); |
} |
+ EmitVarInt(&header, sig->return_count()); |
+ for (size_t j = 0; j < sig->return_count(); j++) { |
+ EmitUint8(&header, WasmOpcodes::LocalTypeCodeFor(sig->GetReturn(j))); |
+ } |
} |
FixupSection(section, header); |
} |
// -- emit functions --------------------------------------------------------- |
if (functions_.size() > 0) { |
- byte* section = EmitSection(WasmSection::Code::Functions, &header); |
+ byte* section = EmitSection(WasmSection::Code::OldFunctions, &header); |
EmitVarInt(&header, functions_.size()); |
for (auto func : functions_) { |