aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2015-08-04 22:58:31 +0800
committerchriseth <c@ethdev.com>2015-08-04 22:59:37 +0800
commitb5d37adfb5bc4e1077ec26650a7306c6d2ca629d (patch)
tree814b418a1bafb4251a8b7c49b023a3a90d8bb51c
parent858e7b83b5f11360afa4d6224e13950abd173aed (diff)
downloaddexon-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.cpp14
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));