diff options
author | chriseth <chris@ethereum.org> | 2017-04-12 01:24:38 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2017-04-25 22:49:03 +0800 |
commit | 34717838da875c5265f005bb92c3349c08063ba5 (patch) | |
tree | 4fbd69879a891dd5ff13c79ffb71f26e6e9bc8aa | |
parent | 83bf34c571023cb264c56b3bd791a6fd9ebc3bf2 (diff) | |
download | dexon-solidity-34717838da875c5265f005bb92c3349c08063ba5.tar.gz dexon-solidity-34717838da875c5265f005bb92c3349c08063ba5.tar.zst dexon-solidity-34717838da875c5265f005bb92c3349c08063ba5.zip |
Review comments.
-rw-r--r-- | libsolidity/codegen/CompilerContext.cpp | 6 | ||||
-rw-r--r-- | libsolidity/codegen/ContractCompiler.cpp | 2 | ||||
-rw-r--r-- | test/libsolidity/InlineAssembly.cpp | 5 | ||||
-rw-r--r-- | test/libsolidity/SolidityNameAndTypeResolution.cpp | 30 |
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"( |