mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Only substitute if all referenced variables are in scope.
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user