diff options
| author | Roland Reichwein <mail@reichwein.it> | 2020-11-16 12:48:44 +0100 | 
|---|---|---|
| committer | Roland Reichwein <mail@reichwein.it> | 2020-11-16 12:48:44 +0100 | 
| commit | c9cb051fae190acfc36813e4a23759fb9b9c3df3 (patch) | |
| tree | fcd8c93cd5dc2a3272eac253b0291611e16ea13f /flowgraph | |
| parent | 300219dc8519720a36525c7b40c6a327580fe0bd (diff) | |
Implement hierarchical evaluation (WIP)
Diffstat (limited to 'flowgraph')
| -rw-r--r-- | flowgraph/node.cpp | 16 | ||||
| -rw-r--r-- | flowgraph/scope.cpp | 10 | ||||
| -rw-r--r-- | flowgraph/scope.h | 4 | ||||
| -rw-r--r-- | flowgraph/storage.cpp | 10 | ||||
| -rw-r--r-- | flowgraph/storage.h | 5 | 
5 files changed, 32 insertions, 13 deletions
| diff --git a/flowgraph/node.cpp b/flowgraph/node.cpp index e0912dc..2d757f9 100644 --- a/flowgraph/node.cpp +++ b/flowgraph/node.cpp @@ -4,6 +4,8 @@  #include <boost/endian/conversion.hpp> +#include <memory> +  using namespace FlowGraph;  FlowGraph::Data& Node::destination() @@ -19,22 +21,28 @@ Data FlowGraph::MakeConstantInt(int i)  {   std::vector<uint8_t> value(size_t(4), uint8_t(0));   *(reinterpret_cast<int32_t*>(value.data())) = boost::endian::native_to_little(static_cast<int32_t>(i)); - return Data(DataType::Int, std::make_shared<Constant>(value)); + return Data{DataType::Int, std::make_shared<Constant>(value)};  }  Data FlowGraph::MakeLocalPointer(FlowGraph::LocalScope& scope, const std::string& name)  { - return Data(DataType::Pointer, std::make_shared<LocalStorage>(scope, name)); + Data data{DataType::Pointer, std::make_shared<LocalStorage>(scope, name)}; + scope.push_back(std::make_shared<Data>(data)); + return data;  }  Data FlowGraph::MakeLocalSize(FlowGraph::LocalScope& scope, const std::string& name)  { - return Data(DataType::Size, std::make_shared<LocalStorage>(scope, name)); + Data data{DataType::Size, std::make_shared<LocalStorage>(scope, name)}; + scope.push_back(std::make_shared<Data>(data)); + return data;  }  Data FlowGraph::MakeTemporaryInt(FlowGraph::LocalScope& scope)  { - return Data(DataType::Int, std::make_shared<TemporaryStorage>(scope)); + Data data{DataType::Int, std::make_shared<TemporaryStorage>(scope)}; + scope.push_back(std::make_shared<Data>(data)); + return data;  }  LocalScope& CreateScopeOp::scope() diff --git a/flowgraph/scope.cpp b/flowgraph/scope.cpp index 6c2e30c..54a3cca 100644 --- a/flowgraph/scope.cpp +++ b/flowgraph/scope.cpp @@ -12,16 +12,14 @@ void FlowGraph::LocalScope::append(const FlowGraph::LocalScope& other)   m_variables.insert(m_variables.end(), other.m_variables.begin(), other.m_variables.end());  } -index_t FlowGraph::LocalScope::indexOfStorage(const TemporaryStorage& storage) const +index_t FlowGraph::LocalScope::indexOfStorage(const Storage& storage) const  { + std::cout << "DEBUG: " << m_variables.size() << std::endl;   for (index_t i = 0; i < m_variables.size(); i++) {    FlowGraph::Storage& i_storage {*(m_variables[i]->storage())}; -  if (typeid(i_storage) == typeid(FlowGraph::TemporaryStorage)) { -   FlowGraph::TemporaryStorage& temporaryStorage{dynamic_cast<FlowGraph::TemporaryStorage&>(i_storage)}; -   if (&temporaryStorage == &storage) // compare addresses -    return i; -  } +  if (&i_storage == &storage) // compare addresses +   return i;   }   throw std::runtime_error("ICE: Storage not found"); diff --git a/flowgraph/scope.h b/flowgraph/scope.h index 50003f4..65898cf 100644 --- a/flowgraph/scope.h +++ b/flowgraph/scope.h @@ -10,7 +10,7 @@  namespace FlowGraph { - class TemporaryStorage; ///< Forward declaration + class Storage; ///< Forward declaration   // Provide a context for local temporaries name generation   class LocalScope @@ -20,7 +20,7 @@ namespace FlowGraph {    void push_back(std::shared_ptr<Data> data);    void append(const LocalScope& other); -  index_t indexOfStorage(const TemporaryStorage& storage) const; +  index_t indexOfStorage(const Storage& storage) const;   private:    std::vector<std::shared_ptr<Data>> m_variables; diff --git a/flowgraph/storage.cpp b/flowgraph/storage.cpp index 7e502de..e9577d6 100644 --- a/flowgraph/storage.cpp +++ b/flowgraph/storage.cpp @@ -11,3 +11,13 @@ std::string FlowGraph::TemporaryStorage::name() const  {   return "__local_"s + std::to_string(m_scope.indexOfStorage(*this));  } + +index_t FlowGraph::TemporaryStorage::indexOfStorage() const +{ + return m_scope.indexOfStorage(*this); +} + +index_t FlowGraph::LocalStorage::indexOfStorage() const +{ + return m_scope.indexOfStorage(*this); +} diff --git a/flowgraph/storage.h b/flowgraph/storage.h index 7f648b0..27c201e 100644 --- a/flowgraph/storage.h +++ b/flowgraph/storage.h @@ -42,10 +42,12 @@ namespace FlowGraph {   class LocalStorage : public Storage   {   public: -  LocalStorage(LocalScope& scope, const std::string& name): m_name(name) {} +  LocalStorage(LocalScope& scope, const std::string& name): m_name(name), m_scope(scope) {}    const std::string& name() const { return m_name; } +  index_t indexOfStorage() const;   private:    std::string m_name; +  LocalScope& m_scope;   };   // intermediate results, anonymous values @@ -55,6 +57,7 @@ namespace FlowGraph {   public:    TemporaryStorage(LocalScope& scope);    std::string name() const; +  index_t indexOfStorage() const;   private:    LocalScope& m_scope;   }; | 
