From 29faf1b298030f23076e8322dafd87df2154b40f Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 3 Feb 2016 21:34:24 +0100 Subject: Index access for bytesXX. --- libsolidity/codegen/ExpressionCompiler.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'libsolidity/codegen/ExpressionCompiler.cpp') 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(*_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(baseType); + solAssert(_indexAccess.indexExpression(), "Index expression expected."); + + _indexAccess.indexExpression()->accept(*this); + // stack layout: + // 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, ""); -- cgit v1.2.3