Move generators to unique pointers.
This Cl will setup the code to allow a Reset method to be added to the
generators.
Bug: tint:211
Change-Id: I41c3aaf0daf832729aea9c76500e297ae32d7f5e
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/28042
Commit-Queue: David Neto <dneto@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/writer/hlsl/generator.cc b/src/writer/hlsl/generator.cc
index 84c6999..f38f0a3 100644
--- a/src/writer/hlsl/generator.cc
+++ b/src/writer/hlsl/generator.cc
@@ -21,14 +21,15 @@
namespace hlsl {
Generator::Generator(ast::Module module)
- : Text(std::move(module)), impl_(&module_) {}
+ : Text(std::move(module)),
+ impl_(std::make_unique<GeneratorImpl>(&module_)) {}
Generator::~Generator() = default;
bool Generator::Generate() {
- auto ret = impl_.Generate(out_);
+ auto ret = impl_->Generate(out_);
if (!ret) {
- error_ = impl_.error();
+ error_ = impl_->error();
}
return ret;
}
@@ -38,7 +39,7 @@
}
std::string Generator::error() const {
- return impl_.error();
+ return impl_->error();
}
} // namespace hlsl
diff --git a/src/writer/hlsl/generator.h b/src/writer/hlsl/generator.h
index 9820fab..f664e26 100644
--- a/src/writer/hlsl/generator.h
+++ b/src/writer/hlsl/generator.h
@@ -15,6 +15,7 @@
#ifndef SRC_WRITER_HLSL_GENERATOR_H_
#define SRC_WRITER_HLSL_GENERATOR_H_
+#include <memory>
#include <sstream>
#include <string>
@@ -45,7 +46,7 @@
private:
std::ostringstream out_;
- GeneratorImpl impl_;
+ std::unique_ptr<GeneratorImpl> impl_;
};
} // namespace hlsl
diff --git a/src/writer/msl/generator.cc b/src/writer/msl/generator.cc
index ce3c1a0..1f1af8b 100644
--- a/src/writer/msl/generator.cc
+++ b/src/writer/msl/generator.cc
@@ -21,24 +21,25 @@
namespace msl {
Generator::Generator(ast::Module module)
- : Text(std::move(module)), impl_(&module_) {}
+ : Text(std::move(module)),
+ impl_(std::make_unique<GeneratorImpl>(&module_)) {}
Generator::~Generator() = default;
bool Generator::Generate() {
- auto ret = impl_.Generate();
+ auto ret = impl_->Generate();
if (!ret) {
- error_ = impl_.error();
+ error_ = impl_->error();
}
return ret;
}
std::string Generator::result() const {
- return impl_.result();
+ return impl_->result();
}
std::string Generator::error() const {
- return impl_.error();
+ return impl_->error();
}
} // namespace msl
diff --git a/src/writer/msl/generator.h b/src/writer/msl/generator.h
index fcee316..df0f832 100644
--- a/src/writer/msl/generator.h
+++ b/src/writer/msl/generator.h
@@ -15,6 +15,7 @@
#ifndef SRC_WRITER_MSL_GENERATOR_H_
#define SRC_WRITER_MSL_GENERATOR_H_
+#include <memory>
#include <string>
#include "src/writer/msl/generator_impl.h"
@@ -43,7 +44,7 @@
std::string error() const;
private:
- GeneratorImpl impl_;
+ std::unique_ptr<GeneratorImpl> impl_;
};
} // namespace msl
diff --git a/src/writer/spirv/binary_writer.cc b/src/writer/spirv/binary_writer.cc
index c414b08..9f8bab5 100644
--- a/src/writer/spirv/binary_writer.cc
+++ b/src/writer/spirv/binary_writer.cc
@@ -29,9 +29,9 @@
BinaryWriter::~BinaryWriter() = default;
-void BinaryWriter::WriteBuilder(const Builder& builder) {
- out_.reserve(builder.total_size());
- builder.iterate(
+void BinaryWriter::WriteBuilder(Builder* builder) {
+ out_.reserve(builder->total_size());
+ builder->iterate(
[this](const Instruction& inst) { this->process_instruction(inst); });
}
diff --git a/src/writer/spirv/binary_writer.h b/src/writer/spirv/binary_writer.h
index 84fd53e..2ca007a 100644
--- a/src/writer/spirv/binary_writer.h
+++ b/src/writer/spirv/binary_writer.h
@@ -38,7 +38,7 @@
/// the SPIR-V header. You |must| call |WriteHeader| before |WriteBuilder|
/// if you want the SPIR-V to be emitted.
/// @param builder the builder to assemble from
- void WriteBuilder(const Builder& builder);
+ void WriteBuilder(Builder* builder);
/// Writes the given instruction into the binary.
/// @param inst the instruction to assemble
diff --git a/src/writer/spirv/binary_writer_test.cc b/src/writer/spirv/binary_writer_test.cc
index 9589761..46a7544 100644
--- a/src/writer/spirv/binary_writer_test.cc
+++ b/src/writer/spirv/binary_writer_test.cc
@@ -47,7 +47,7 @@
Builder b(&mod);
b.push_preamble(spv::Op::OpKill, {Operand::Float(2.4f)});
BinaryWriter bw;
- bw.WriteBuilder(b);
+ bw.WriteBuilder(&b);
auto res = bw.result();
ASSERT_EQ(res.size(), 2u);
@@ -61,7 +61,7 @@
Builder b(&mod);
b.push_preamble(spv::Op::OpKill, {Operand::Int(2)});
BinaryWriter bw;
- bw.WriteBuilder(b);
+ bw.WriteBuilder(&b);
auto res = bw.result();
ASSERT_EQ(res.size(), 2u);
@@ -73,7 +73,7 @@
Builder b(&mod);
b.push_preamble(spv::Op::OpKill, {Operand::String("my_string")});
BinaryWriter bw;
- bw.WriteBuilder(b);
+ bw.WriteBuilder(&b);
auto res = bw.result();
ASSERT_EQ(res.size(), 4u);
@@ -98,7 +98,7 @@
Builder b(&mod);
b.push_preamble(spv::Op::OpKill, {Operand::String("mystring")});
BinaryWriter bw;
- bw.WriteBuilder(b);
+ bw.WriteBuilder(&b);
auto res = bw.result();
ASSERT_EQ(res.size(), 4u);
diff --git a/src/writer/spirv/generator.cc b/src/writer/spirv/generator.cc
index c3b5720..33652cf 100644
--- a/src/writer/spirv/generator.cc
+++ b/src/writer/spirv/generator.cc
@@ -21,18 +21,20 @@
namespace spirv {
Generator::Generator(ast::Module module)
- : writer::Writer(std::move(module)), builder_(&module_) {}
+ : writer::Writer(std::move(module)),
+ builder_(std::make_unique<Builder>(&module_)),
+ writer_(std::make_unique<BinaryWriter>()) {}
Generator::~Generator() = default;
bool Generator::Generate() {
- if (!builder_.Build()) {
- set_error(builder_.error());
+ if (!builder_->Build()) {
+ set_error(builder_->error());
return false;
}
- writer_.WriteHeader(builder_.id_bound());
- writer_.WriteBuilder(builder_);
+ writer_->WriteHeader(builder_->id_bound());
+ writer_->WriteBuilder(builder_.get());
return true;
}
diff --git a/src/writer/spirv/generator.h b/src/writer/spirv/generator.h
index 3a14ec5..49d8ce3 100644
--- a/src/writer/spirv/generator.h
+++ b/src/writer/spirv/generator.h
@@ -15,6 +15,7 @@
#ifndef SRC_WRITER_SPIRV_GENERATOR_H_
#define SRC_WRITER_SPIRV_GENERATOR_H_
+#include <memory>
#include <vector>
#include "src/ast/module.h"
@@ -39,11 +40,11 @@
bool Generate() override;
/// @returns the result data
- const std::vector<uint32_t>& result() const { return writer_.result(); }
+ const std::vector<uint32_t>& result() const { return writer_->result(); }
private:
- Builder builder_;
- BinaryWriter writer_;
+ std::unique_ptr<Builder> builder_;
+ std::unique_ptr<BinaryWriter> writer_;
};
} // namespace spirv
diff --git a/src/writer/spirv/spv_dump.cc b/src/writer/spirv/spv_dump.cc
index 6c5cd8f..1b7f5ed 100644
--- a/src/writer/spirv/spv_dump.cc
+++ b/src/writer/spirv/spv_dump.cc
@@ -61,10 +61,10 @@
} // namespace
-std::string DumpBuilder(const Builder& builder) {
+std::string DumpBuilder(Builder& builder) {
BinaryWriter writer;
writer.WriteHeader(builder.id_bound());
- writer.WriteBuilder(builder);
+ writer.WriteBuilder(&builder);
return Disassemble(writer.result());
}
diff --git a/src/writer/spirv/spv_dump.h b/src/writer/spirv/spv_dump.h
index deae123..3513290 100644
--- a/src/writer/spirv/spv_dump.h
+++ b/src/writer/spirv/spv_dump.h
@@ -28,7 +28,7 @@
/// Dumps the given builder to a SPIR-V disassembly string
/// @param builder the builder to convert
/// @returns the builder as a SPIR-V disassembly string
-std::string DumpBuilder(const Builder& builder);
+std::string DumpBuilder(Builder& builder);
/// Dumps the given instruction to a SPIR-V disassembly string
/// @param inst the instruction to dump
diff --git a/src/writer/wgsl/generator.cc b/src/writer/wgsl/generator.cc
index d077e22..23b3d99 100644
--- a/src/writer/wgsl/generator.cc
+++ b/src/writer/wgsl/generator.cc
@@ -20,24 +20,25 @@
namespace writer {
namespace wgsl {
-Generator::Generator(ast::Module module) : Text(std::move(module)) {}
+Generator::Generator(ast::Module module)
+ : Text(std::move(module)), impl_(std::make_unique<GeneratorImpl>()) {}
Generator::~Generator() = default;
bool Generator::Generate() {
- auto ret = impl_.Generate(module_);
+ auto ret = impl_->Generate(module_);
if (!ret) {
- error_ = impl_.error();
+ error_ = impl_->error();
}
return ret;
}
std::string Generator::result() const {
- return impl_.result();
+ return impl_->result();
}
std::string Generator::error() const {
- return impl_.error();
+ return impl_->error();
}
} // namespace wgsl
diff --git a/src/writer/wgsl/generator.h b/src/writer/wgsl/generator.h
index 400d855..abf3d38 100644
--- a/src/writer/wgsl/generator.h
+++ b/src/writer/wgsl/generator.h
@@ -15,6 +15,7 @@
#ifndef SRC_WRITER_WGSL_GENERATOR_H_
#define SRC_WRITER_WGSL_GENERATOR_H_
+#include <memory>
#include <string>
#include "src/writer/text.h"
@@ -43,7 +44,7 @@
std::string error() const;
private:
- GeneratorImpl impl_;
+ std::unique_ptr<GeneratorImpl> impl_;
};
} // namespace wgsl