aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/ast
diff options
context:
space:
mode:
authorYoichi Hirai <i@yoichihirai.com>2017-03-15 17:03:35 +0800
committerGitHub <noreply@github.com>2017-03-15 17:03:35 +0800
commitd134fda0c05640992941087139316d2b8fb3f816 (patch)
treea26d7b2f78f6c167af83216545219d4e892f8e13 /libsolidity/ast
parent64e00e5371e2620a0bbd945d37e799e1e0309668 (diff)
parent9f328ff749477106a569e679e5eeed5c7e78d29d (diff)
downloaddexon-solidity-d134fda0c05640992941087139316d2b8fb3f816.tar.gz
dexon-solidity-d134fda0c05640992941087139316d2b8fb3f816.tar.zst
dexon-solidity-d134fda0c05640992941087139316d2b8fb3f816.zip
Merge pull request #1729 from ethereum/constantvariables
Only allow pure expressions for constant state variables.
Diffstat (limited to 'libsolidity/ast')
-rw-r--r--libsolidity/ast/ASTAnnotations.h2
-rw-r--r--libsolidity/ast/Types.cpp12
-rw-r--r--libsolidity/ast/Types.h4
3 files changed, 18 insertions, 0 deletions
diff --git a/libsolidity/ast/ASTAnnotations.h b/libsolidity/ast/ASTAnnotations.h
index 9c4c3ae8..bd297f9e 100644
--- a/libsolidity/ast/ASTAnnotations.h
+++ b/libsolidity/ast/ASTAnnotations.h
@@ -156,6 +156,8 @@ struct ExpressionAnnotation: ASTAnnotation
TypePointer type;
/// Whether the expression is a constant variable
bool isConstant = false;
+ /// Whether the expression is pure, i.e. compile-time constant.
+ bool isPure = false;
/// Whether it is an LValue (i.e. something that can be assigned to).
bool isLValue = false;
/// Whether the expression is used in a context where the LValue is actually required.
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp
index d2793b6d..0e11c3ec 100644
--- a/libsolidity/ast/Types.cpp
+++ b/libsolidity/ast/Types.cpp
@@ -2456,6 +2456,18 @@ u256 FunctionType::externalIdentifier() const
return FixedHash<4>::Arith(FixedHash<4>(dev::keccak256(externalSignature())));
}
+bool FunctionType::isPure() const
+{
+ return
+ m_location == Location::SHA3 ||
+ m_location == Location::ECRecover ||
+ m_location == Location::SHA256 ||
+ m_location == Location::RIPEMD160 ||
+ m_location == Location::AddMod ||
+ m_location == Location::MulMod ||
+ m_location == Location::ObjectCreation;
+}
+
TypePointers FunctionType::parseElementaryTypeVector(strings const& _types)
{
TypePointers pointers;
diff --git a/libsolidity/ast/Types.h b/libsolidity/ast/Types.h
index 960b7e86..0a4878b8 100644
--- a/libsolidity/ast/Types.h
+++ b/libsolidity/ast/Types.h
@@ -973,6 +973,10 @@ public:
}
bool hasDeclaration() const { return !!m_declaration; }
bool isConstant() const { return m_isConstant; }
+ /// @returns true if the the result of this function only depends on its arguments
+ /// and it does not modify the state.
+ /// Currently, this will only return true for internal functions like keccak and ecrecover.
+ bool isPure() const;
bool isPayable() const { return m_isPayable; }
/// @return A shared pointer of an ASTString.
/// Can contain a nullptr in which case indicates absence of documentation