diff options
author | chriseth <c@ethdev.com> | 2015-03-13 20:14:51 +0800 |
---|---|---|
committer | chriseth <c@ethdev.com> | 2015-03-14 00:31:56 +0800 |
commit | a16677dcfbd7fd7d42fbd6166e234b1b7001ec59 (patch) | |
tree | 2a885476ca571246df3615f4fcd79e3c74353879 /ExpressionCompiler.cpp | |
parent | 039b133c180b15863ee3104637c97822d815d932 (diff) | |
download | dexon-solidity-a16677dcfbd7fd7d42fbd6166e234b1b7001ec59.tar.gz dexon-solidity-a16677dcfbd7fd7d42fbd6166e234b1b7001ec59.tar.zst dexon-solidity-a16677dcfbd7fd7d42fbd6166e234b1b7001ec59.zip |
Fix gas for builtin.
Fixes #1300
Diffstat (limited to 'ExpressionCompiler.cpp')
-rw-r--r-- | ExpressionCompiler.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/ExpressionCompiler.cpp b/ExpressionCompiler.cpp index 3cee40df..331979c7 100644 --- a/ExpressionCompiler.cpp +++ b/ExpressionCompiler.cpp @@ -233,9 +233,12 @@ bool ExpressionCompiler::visit(Assignment const& _assignment) m_currentLValue->retrieveValue(_assignment.getLocation(), true); appendOrdinaryBinaryOperatorCode(Token::AssignmentToBinaryOp(op), *_assignment.getType()); if (lvalueSize > 0) + { + solAssert(itemSize + lvalueSize <= 16, "Stack too deep."); // value [lvalue_ref] updated_value for (unsigned i = 0; i < itemSize; ++i) m_context << eth::swapInstruction(itemSize + lvalueSize) << eth::Instruction::POP; + } } m_currentLValue->storeValue(*_assignment.getRightHandSide().getType(), _assignment.getLocation()); m_currentLValue.reset(); @@ -557,10 +560,13 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) case Location::SHA256: case Location::RIPEMD160: { + _functionCall.getExpression().accept(*this); static const map<Location, u256> contractAddresses{{Location::ECRecover, 1}, {Location::SHA256, 2}, {Location::RIPEMD160, 3}}; m_context << contractAddresses.find(function.getLocation())->second; + for (unsigned i = function.getSizeOnStack(); i > 0; --i) + m_context << eth::swapInstruction(i); appendExternalFunctionCall(function, arguments, true); break; } |