aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2017-06-01 21:47:11 +0800
committerAlex Beregszaszi <alex@rtfs.hu>2017-06-16 17:56:21 +0800
commit78b49db779376b8ddedc0abb91a82a3384def4f1 (patch)
tree38aa28acbdf1e7c072a3fe301c8d7b06a105be50 /libsolidity
parent8e5c4bf21dfd9cfaa8de35aef034bb32be290a48 (diff)
downloaddexon-solidity-78b49db779376b8ddedc0abb91a82a3384def4f1.tar
dexon-solidity-78b49db779376b8ddedc0abb91a82a3384def4f1.tar.gz
dexon-solidity-78b49db779376b8ddedc0abb91a82a3384def4f1.tar.bz2
dexon-solidity-78b49db779376b8ddedc0abb91a82a3384def4f1.tar.lz
dexon-solidity-78b49db779376b8ddedc0abb91a82a3384def4f1.tar.xz
dexon-solidity-78b49db779376b8ddedc0abb91a82a3384def4f1.tar.zst
dexon-solidity-78b49db779376b8ddedc0abb91a82a3384def4f1.zip
Helper to count the number of variables in a scope.
Diffstat (limited to 'libsolidity')
-rw-r--r--libsolidity/inlineasm/AsmAnalysis.cpp4
-rw-r--r--libsolidity/inlineasm/AsmScope.cpp9
-rw-r--r--libsolidity/inlineasm/AsmScope.h2
3 files changed, 12 insertions, 3 deletions
diff --git a/libsolidity/inlineasm/AsmAnalysis.cpp b/libsolidity/inlineasm/AsmAnalysis.cpp
index 548f1a74..2891ec95 100644
--- a/libsolidity/inlineasm/AsmAnalysis.cpp
+++ b/libsolidity/inlineasm/AsmAnalysis.cpp
@@ -349,9 +349,7 @@ bool AsmAnalyzer::operator()(Block const& _block)
if (!boost::apply_visitor(*this, s))
success = false;
- for (auto const& identifier: scope(&_block).identifiers)
- if (identifier.second.type() == typeid(Scope::Variable))
- --m_stackHeight;
+ m_stackHeight -= scope(&_block).numberOfVariables();
int const stackDiff = m_stackHeight - initialStackHeight;
if (stackDiff != 0)
diff --git a/libsolidity/inlineasm/AsmScope.cpp b/libsolidity/inlineasm/AsmScope.cpp
index 1db5ca41..315d5953 100644
--- a/libsolidity/inlineasm/AsmScope.cpp
+++ b/libsolidity/inlineasm/AsmScope.cpp
@@ -80,6 +80,15 @@ bool Scope::exists(string const& _name)
return false;
}
+size_t Scope::numberOfVariables() const
+{
+ size_t count = 0;
+ for (auto const& identifier: identifiers)
+ if (identifier.second.type() == typeid(Scope::Variable))
+ count++;
+ return count;
+}
+
bool Scope::insideFunction() const
{
for (Scope const* s = this; s; s = s->superScope)
diff --git a/libsolidity/inlineasm/AsmScope.h b/libsolidity/inlineasm/AsmScope.h
index de9119e0..cc240565 100644
--- a/libsolidity/inlineasm/AsmScope.h
+++ b/libsolidity/inlineasm/AsmScope.h
@@ -109,6 +109,8 @@ struct Scope
/// across function and assembly boundaries).
bool exists(std::string const& _name);
+ /// @returns the number of variables directly registered inside the scope.
+ size_t numberOfVariables() const;
/// @returns true if this scope is inside a function.
bool insideFunction() const;