aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2017-04-12 01:24:38 +0800
committerchriseth <chris@ethereum.org>2017-04-25 22:49:03 +0800
commit34717838da875c5265f005bb92c3349c08063ba5 (patch)
tree4fbd69879a891dd5ff13c79ffb71f26e6e9bc8aa
parent83bf34c571023cb264c56b3bd791a6fd9ebc3bf2 (diff)
downloaddexon-solidity-34717838da875c5265f005bb92c3349c08063ba5.tar.gz
dexon-solidity-34717838da875c5265f005bb92c3349c08063ba5.tar.zst
dexon-solidity-34717838da875c5265f005bb92c3349c08063ba5.zip
Review comments.
-rw-r--r--libsolidity/codegen/CompilerContext.cpp6
-rw-r--r--libsolidity/codegen/ContractCompiler.cpp2
-rw-r--r--test/libsolidity/InlineAssembly.cpp5
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp30
4 files changed, 41 insertions, 2 deletions
diff --git a/libsolidity/codegen/CompilerContext.cpp b/libsolidity/codegen/CompilerContext.cpp
index 977e6c81..51dd9fd2 100644
--- a/libsolidity/codegen/CompilerContext.cpp
+++ b/libsolidity/codegen/CompilerContext.cpp
@@ -270,7 +270,8 @@ void CompilerContext::appendInlineAssembly(
identifierAccess.resolve = [&](
assembly::Identifier const& _identifier,
assembly::IdentifierContext
- ) {
+ )
+ {
auto it = std::find(_localVariables.begin(), _localVariables.end(), _identifier.name);
return it == _localVariables.end() ? size_t(-1) : 1;
};
@@ -278,7 +279,8 @@ void CompilerContext::appendInlineAssembly(
assembly::Identifier const& _identifier,
assembly::IdentifierContext _context,
eth::Assembly& _assembly
- ) {
+ )
+ {
auto it = std::find(_localVariables.begin(), _localVariables.end(), _identifier.name);
solAssert(it != _localVariables.end(), "");
unsigned stackDepth = _localVariables.end() - it;
diff --git a/libsolidity/codegen/ContractCompiler.cpp b/libsolidity/codegen/ContractCompiler.cpp
index c035bd1f..de53f182 100644
--- a/libsolidity/codegen/ContractCompiler.cpp
+++ b/libsolidity/codegen/ContractCompiler.cpp
@@ -538,6 +538,7 @@ bool ContractCompiler::visit(InlineAssembly const& _inlineAssembly)
solAssert(!!decl, "");
if (_context == assembly::IdentifierContext::RValue)
{
+ int const depositBefore = _assembly.deposit();
solAssert(!!decl->type(), "Type of declaration required but not yet determined.");
if (FunctionDefinition const* functionDef = dynamic_cast<FunctionDefinition const*>(decl))
{
@@ -591,6 +592,7 @@ bool ContractCompiler::visit(InlineAssembly const& _inlineAssembly)
}
else
solAssert(false, "Invalid declaration type.");
+ solAssert(_assembly.deposit() - depositBefore == ref->second.valueSize, "");
}
else
{
diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp
index 42aa66a0..bf966510 100644
--- a/test/libsolidity/InlineAssembly.cpp
+++ b/test/libsolidity/InlineAssembly.cpp
@@ -342,6 +342,11 @@ BOOST_AUTO_TEST_CASE(magic_variables)
BOOST_CHECK(successAssemble("{ let ecrecover := 1 ecrecover pop }"));
}
+BOOST_AUTO_TEST_CASE(stack_variables)
+{
+ BOOST_CHECK(successAssemble("{ let y := 3 { 2 { let x := y } pop} }"));
+}
+
BOOST_AUTO_TEST_CASE(imbalanced_stack)
{
BOOST_CHECK(successAssemble("{ 1 2 mul pop }", false));
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index 3b0804f8..73698a8d 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -5078,6 +5078,36 @@ BOOST_AUTO_TEST_CASE(inline_assembly_storage_in_modifiers)
CHECK_ERROR(text, DeclarationError, "Variable not found or variable not lvalue.");
}
+BOOST_AUTO_TEST_CASE(inline_assembly_constant_assign)
+{
+ char const* text = R"(
+ contract test {
+ uint constant x = 1;
+ function f() {
+ assembly {
+ x := 2
+ }
+ }
+ }
+ )";
+ CHECK_ERROR(text, DeclarationError, "Variable not found or variable not lvalue.");
+}
+
+BOOST_AUTO_TEST_CASE(inline_assembly_constant_access)
+{
+ char const* text = R"(
+ contract test {
+ uint constant x = 1;
+ function f() {
+ assembly {
+ let y := x
+ }
+ }
+ }
+ )";
+ CHECK_ERROR(text, TypeError, "Constant variables not yet implemented for inline assembly");
+}
+
BOOST_AUTO_TEST_CASE(invalid_mobile_type)
{
char const* text = R"(