diff options
author | chriseth <c@ethdev.com> | 2015-08-04 22:58:31 +0800 |
---|---|---|
committer | chriseth <c@ethdev.com> | 2015-08-04 22:59:37 +0800 |
commit | b5d37adfb5bc4e1077ec26650a7306c6d2ca629d (patch) | |
tree | 814b418a1bafb4251a8b7c49b023a3a90d8bb51c | |
parent | 858e7b83b5f11360afa4d6224e13950abd173aed (diff) | |
download | dexon-solidity-b5d37adfb5bc4e1077ec26650a7306c6d2ca629d.tar dexon-solidity-b5d37adfb5bc4e1077ec26650a7306c6d2ca629d.tar.gz dexon-solidity-b5d37adfb5bc4e1077ec26650a7306c6d2ca629d.tar.bz2 dexon-solidity-b5d37adfb5bc4e1077ec26650a7306c6d2ca629d.tar.lz dexon-solidity-b5d37adfb5bc4e1077ec26650a7306c6d2ca629d.tar.xz dexon-solidity-b5d37adfb5bc4e1077ec26650a7306c6d2ca629d.tar.zst dexon-solidity-b5d37adfb5bc4e1077ec26650a7306c6d2ca629d.zip |
Fix for strings as keys in mappings.
-rw-r--r-- | ExpressionCompiler.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/ExpressionCompiler.cpp b/ExpressionCompiler.cpp index f27cf5fe..0841089b 100644 --- a/ExpressionCompiler.cpp +++ b/ExpressionCompiler.cpp @@ -807,16 +807,20 @@ bool ExpressionCompiler::visit(IndexAccess const& _indexAccess) if (baseType.getCategory() == Type::Category::Mapping) { // stack: storage_base_ref - auto const& mapping = dynamic_cast<MappingType const&>(baseType); - Type const& keyType = *mapping.getKeyType(); + TypePointer keyType = dynamic_cast<MappingType const&>(baseType).getKeyType(); solAssert(_indexAccess.getIndexExpression(), "Index expression expected."); - if (keyType.isDynamicallySized()) + if (keyType->isDynamicallySized()) { _indexAccess.getIndexExpression()->accept(*this); utils().fetchFreeMemoryPointer(); // stack: base index mem // note: the following operations must not allocate memory! - utils().encodeToMemory(TypePointers{mapping.getKeyType()}, TypePointers(), false, true); + utils().encodeToMemory( + TypePointers{_indexAccess.getIndexExpression()->getType()}, + TypePointers{keyType}, + false, + true + ); m_context << eth::Instruction::SWAP1; utils().storeInMemoryDynamic(IntegerType(256)); utils().toSizeAfterFreeMemoryPointer(); @@ -824,7 +828,7 @@ bool ExpressionCompiler::visit(IndexAccess const& _indexAccess) else { m_context << u256(0); // memory position - appendExpressionCopyToMemory(keyType, *_indexAccess.getIndexExpression()); + appendExpressionCopyToMemory(*keyType, *_indexAccess.getIndexExpression()); m_context << eth::Instruction::SWAP1; solAssert(CompilerUtils::freeMemoryPointer >= 0x40, ""); utils().storeInMemoryDynamic(IntegerType(256)); |