| Index: src/wasm/encoder.cc
|
| diff --git a/src/wasm/encoder.cc b/src/wasm/encoder.cc
|
| index 70d739ec67277e4606aae5f574e8d505ef5c7996..21799eff5271a7e60343c120757304981e33f0fb 100644
|
| --- a/src/wasm/encoder.cc
|
| +++ b/src/wasm/encoder.cc
|
| @@ -10,6 +10,7 @@
|
|
|
| #include "src/wasm/ast-decoder.h"
|
| #include "src/wasm/encoder.h"
|
| +#include "src/wasm/wasm-macro-gen.h"
|
| #include "src/wasm/wasm-module.h"
|
| #include "src/wasm/wasm-opcodes.h"
|
|
|
| @@ -250,7 +251,6 @@ WasmFunctionEncoder::WasmFunctionEncoder(Zone* zone, LocalType return_type,
|
|
|
| uint32_t WasmFunctionEncoder::HeaderSize() const {
|
| uint32_t size = 3;
|
| - if (HasLocals()) size += 8;
|
| if (!external_) size += 2;
|
| if (HasName()) size += 4;
|
| return size;
|
| @@ -258,7 +258,15 @@ uint32_t WasmFunctionEncoder::HeaderSize() const {
|
|
|
|
|
| uint32_t WasmFunctionEncoder::BodySize(void) const {
|
| - return external_ ? 0 : static_cast<uint32_t>(body_.size());
|
| + // TODO(titzer): embed a LocalDeclEncoder in the WasmFunctionEncoder
|
| + LocalDeclEncoder local_decl;
|
| + local_decl.AddLocals(local_i32_count_, kAstI32);
|
| + local_decl.AddLocals(local_i64_count_, kAstI64);
|
| + local_decl.AddLocals(local_f32_count_, kAstF32);
|
| + local_decl.AddLocals(local_f64_count_, kAstF64);
|
| +
|
| + return external_ ? 0
|
| + : static_cast<uint32_t>(body_.size() + local_decl.Size());
|
| }
|
|
|
|
|
| @@ -271,7 +279,6 @@ void WasmFunctionEncoder::Serialize(byte* buffer, byte** header,
|
| byte** body) const {
|
| uint8_t decl_bits = (exported_ ? kDeclFunctionExport : 0) |
|
| (external_ ? kDeclFunctionImport : 0) |
|
| - (HasLocals() ? kDeclFunctionLocals : 0) |
|
| (HasName() ? kDeclFunctionName : 0);
|
|
|
| EmitUint8(header, decl_bits);
|
| @@ -284,15 +291,17 @@ void WasmFunctionEncoder::Serialize(byte* buffer, byte** header,
|
| (*body) += name_.size();
|
| }
|
|
|
| - if (HasLocals()) {
|
| - EmitUint16(header, local_i32_count_);
|
| - EmitUint16(header, local_i64_count_);
|
| - EmitUint16(header, local_f32_count_);
|
| - EmitUint16(header, local_f64_count_);
|
| - }
|
|
|
| if (!external_) {
|
| - EmitUint16(header, static_cast<uint16_t>(body_.size()));
|
| + // TODO(titzer): embed a LocalDeclEncoder in the WasmFunctionEncoder
|
| + LocalDeclEncoder local_decl;
|
| + local_decl.AddLocals(local_i32_count_, kAstI32);
|
| + local_decl.AddLocals(local_i64_count_, kAstI64);
|
| + local_decl.AddLocals(local_f32_count_, kAstF32);
|
| + local_decl.AddLocals(local_f64_count_, kAstF64);
|
| +
|
| + EmitUint16(header, static_cast<uint16_t>(body_.size() + local_decl.Size()));
|
| + (*header) += local_decl.Emit(*header);
|
| if (body_.size() > 0) {
|
| std::memcpy(*header, &body_[0], body_.size());
|
| (*header) += body_.size();
|
|
|