Index: src/wasm/encoder.cc |
diff --git a/src/wasm/encoder.cc b/src/wasm/encoder.cc |
index c563e22411033400e641dd4a882d9f0882d1e017..c834ce61a4467559c22380a450429456f08116d5 100644 |
--- a/src/wasm/encoder.cc |
+++ b/src/wasm/encoder.cc |
@@ -50,8 +50,13 @@ void FixupSection(ZoneBuffer& buffer, size_t start) { |
kPaddedVarInt32Size)); |
} |
-WasmFunctionBuilder::WasmFunctionBuilder(Zone* zone) |
- : locals_(zone), exported_(0), body_(zone), name_(zone) {} |
+WasmFunctionBuilder::WasmFunctionBuilder(WasmModuleBuilder* builder) |
+ : builder_(builder), |
+ locals_(builder->zone()), |
+ signature_index_(0), |
+ exported_(0), |
+ body_(builder->zone()), |
+ name_(builder->zone()) {} |
void WasmFunctionBuilder::EmitVarInt(uint32_t val) { |
byte buffer[8]; |
@@ -65,6 +70,7 @@ void WasmFunctionBuilder::EmitVarInt(uint32_t val) { |
void WasmFunctionBuilder::SetSignature(FunctionSig* sig) { |
DCHECK(!locals_.has_sig()); |
locals_.set_sig(sig); |
+ signature_index_ = builder_->AddSignature(sig); |
} |
uint32_t WasmFunctionBuilder::AddLocal(LocalType type) { |
@@ -118,7 +124,7 @@ void WasmFunctionBuilder::EmitI32Const(int32_t value) { |
} |
} |
-void WasmFunctionBuilder::Exported(uint8_t flag) { exported_ = flag; } |
+void WasmFunctionBuilder::SetExported() { exported_ = true; } |
void WasmFunctionBuilder::SetName(const char* name, int name_length) { |
name_.clear(); |
@@ -129,26 +135,11 @@ void WasmFunctionBuilder::SetName(const char* name, int name_length) { |
} |
} |
-WasmFunctionEncoder* WasmFunctionBuilder::Build(Zone* zone, |
- WasmModuleBuilder* mb) const { |
- WasmFunctionEncoder* e = |
- new (zone) WasmFunctionEncoder(zone, locals_, exported_); |
- // TODO(titzer): lame memcpy here. |
- e->body_.insert(e->body_.begin(), body_.begin(), body_.end()); |
- e->signature_index_ = mb->AddSignature(locals_.get_sig()); |
- e->name_.insert(e->name_.begin(), name_.begin(), name_.end()); |
- return e; |
-} |
- |
-WasmFunctionEncoder::WasmFunctionEncoder(Zone* zone, LocalDeclEncoder locals, |
- bool exported) |
- : locals_(locals), exported_(exported), body_(zone), name_(zone) {} |
- |
-void WasmFunctionEncoder::WriteSignature(ZoneBuffer& buffer) const { |
+void WasmFunctionBuilder::WriteSignature(ZoneBuffer& buffer) const { |
buffer.write_u32v(signature_index_); |
} |
-void WasmFunctionEncoder::WriteExport(ZoneBuffer& buffer, |
+void WasmFunctionBuilder::WriteExport(ZoneBuffer& buffer, |
uint32_t func_index) const { |
if (exported_) { |
buffer.write_u32v(func_index); |
@@ -159,7 +150,7 @@ void WasmFunctionEncoder::WriteExport(ZoneBuffer& buffer, |
} |
} |
-void WasmFunctionEncoder::WriteBody(ZoneBuffer& buffer) const { |
+void WasmFunctionBuilder::WriteBody(ZoneBuffer& buffer) const { |
size_t locals_size = locals_.Size(); |
buffer.write_size(locals_size + body_.size()); |
buffer.EnsureSpace(locals_size); |
@@ -197,7 +188,7 @@ WasmModuleBuilder::WasmModuleBuilder(Zone* zone) |
start_function_index_(-1) {} |
uint32_t WasmModuleBuilder::AddFunction() { |
- functions_.push_back(new (zone_) WasmFunctionBuilder(zone_)); |
+ functions_.push_back(new (zone_) WasmFunctionBuilder(this)); |
return static_cast<uint32_t>(functions_.size() - 1); |
} |
@@ -256,44 +247,12 @@ void WasmModuleBuilder::MarkStartFunction(uint32_t index) { |
start_function_index_ = index; |
} |
-WasmModuleWriter* WasmModuleBuilder::Build(Zone* zone) { |
- WasmModuleWriter* writer = new (zone) WasmModuleWriter(zone); |
- for (auto import : imports_) { |
- writer->imports_.push_back(import); |
- } |
- for (auto function : functions_) { |
- writer->functions_.push_back(function->Build(zone, this)); |
- } |
- for (auto segment : data_segments_) { |
- writer->data_segments_.push_back(segment); |
- } |
- for (auto sig : signatures_) { |
- writer->signatures_.push_back(sig); |
- } |
- for (auto index : indirect_functions_) { |
- writer->indirect_functions_.push_back(index); |
- } |
- for (auto global : globals_) { |
- writer->globals_.push_back(global); |
- } |
- writer->start_function_index_ = start_function_index_; |
- return writer; |
-} |
- |
uint32_t WasmModuleBuilder::AddGlobal(MachineType type, bool exported) { |
globals_.push_back(std::make_pair(type, exported)); |
return static_cast<uint32_t>(globals_.size() - 1); |
} |
-WasmModuleWriter::WasmModuleWriter(Zone* zone) |
- : imports_(zone), |
- functions_(zone), |
- data_segments_(zone), |
- signatures_(zone), |
- indirect_functions_(zone), |
- globals_(zone) {} |
- |
-void WasmModuleWriter::WriteTo(ZoneBuffer& buffer) const { |
+void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const { |
uint32_t exports = 0; |
// == Emit magic ============================================================= |