Only substitute if all referenced variables are in scope.

This commit is contained in:
chriseth
2018-02-06 12:31:43 +01:00
parent 30e6f69bfd
commit 22c4d282aa
3 changed files with 68 additions and 2 deletions
+9
View File
@@ -44,20 +44,29 @@ public:
virtual void operator()(VariableDeclaration& _varDecl) override;
virtual void operator()(If& _if) override;
virtual void operator()(Switch& _switch) override;
virtual void operator()(FunctionDefinition&) override;
virtual void operator()(ForLoop&) override;
virtual void operator()(Block& _block) override;
protected:
using ASTModifier::visit;
virtual void visit(Expression& _e) override;
private:
void handleAssignment(std::set<std::string> const& _names, Expression* _value);
/// Returns true iff the variable is in scope.
bool inScope(std::string const& _variableName) const;
/// Substitutions to be performed, if possible.
std::map<std::string, Expression const*> m_substitutions;
/// m_references[a].contains(b) <=> the current expression assigned to a references b
std::map<std::string, std::set<std::string>> m_references;
/// m_referencedBy[b].contains(a) <=> the current expression assigned to a references b
std::map<std::string, std::set<std::string>> m_referencedBy;
/// List of scopes, where each scope is a set of variables and a bool that tells
/// whether it is a function body (true) or not.
std::vector<std::pair<std::set<std::string>, bool>> m_variableScopes;
};
}