diff options
author | chriseth <c@ethdev.com> | 2016-02-04 04:34:24 +0800 |
---|---|---|
committer | chriseth <c@ethdev.com> | 2016-02-10 00:07:04 +0800 |
commit | 29faf1b298030f23076e8322dafd87df2154b40f (patch) | |
tree | 5e2d1d37aac3ab11b3015365a33f945bf9a145aa /libsolidity/codegen | |
parent | fad2d4df222f3fc306eda84a6a3842955541f9d0 (diff) | |
download | dexon-solidity-29faf1b298030f23076e8322dafd87df2154b40f.tar.gz dexon-solidity-29faf1b298030f23076e8322dafd87df2154b40f.tar.zst dexon-solidity-29faf1b298030f23076e8322dafd87df2154b40f.zip |
Index access for bytesXX.
Diffstat (limited to 'libsolidity/codegen')
-rw-r--r-- | libsolidity/codegen/ExpressionCompiler.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/libsolidity/codegen/ExpressionCompiler.cpp b/libsolidity/codegen/ExpressionCompiler.cpp index 9536c727..58db07b1 100644 --- a/libsolidity/codegen/ExpressionCompiler.cpp +++ b/libsolidity/codegen/ExpressionCompiler.cpp @@ -1004,6 +1004,16 @@ void ExpressionCompiler::endVisit(MemberAccess const& _memberAccess) solAssert(false, "Illegal array member."); break; } + case Type::Category::FixedBytes: + { + auto const& type = dynamic_cast<FixedBytesType const&>(*_memberAccess.expression().annotation().type); + utils().popStackElement(type); + if (member == "length") + m_context << u256(type.numBytes()); + else + solAssert(false, "Illegal fixed bytes member."); + break; + } default: BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Member access to unknown type.")); } @@ -1085,6 +1095,22 @@ bool ExpressionCompiler::visit(IndexAccess const& _indexAccess) break; } } + else if (baseType.category() == Type::Category::FixedBytes) + { + FixedBytesType const& fixedBytesType = dynamic_cast<FixedBytesType const&>(baseType); + solAssert(_indexAccess.indexExpression(), "Index expression expected."); + + _indexAccess.indexExpression()->accept(*this); + // stack layout: <value> <index> + // check out-of-bounds access + m_context << u256(fixedBytesType.numBytes()); + m_context << eth::Instruction::DUP2 << eth::Instruction::LT << eth::Instruction::ISZERO; + // out-of-bounds access throws exception + m_context.appendConditionalJumpTo(m_context.errorTag()); + + m_context << eth::Instruction::BYTE; + m_context << (u256(1) << (256 - 8)) << eth::Instruction::MUL; + } else if (baseType.category() == Type::Category::TypeType) { solAssert(baseType.sizeOnStack() == 0, ""); |