diff options
author | Liana Husikyan <liana@ethdev.com> | 2015-05-26 21:05:58 +0800 |
---|---|---|
committer | Liana Husikyan <liana@ethdev.com> | 2015-06-01 19:06:12 +0800 |
commit | e72a014cf44d086f3cb12bf1f4e2cfa02d781d38 (patch) | |
tree | 24d82fd9f75ac4d23e9d6eecbfb38c136f0088af /ExpressionCompiler.cpp | |
parent | ce6126094ac0aa6f6eb8158d10534079021a90b9 (diff) | |
download | dexon-solidity-e72a014cf44d086f3cb12bf1f4e2cfa02d781d38.tar.gz dexon-solidity-e72a014cf44d086f3cb12bf1f4e2cfa02d781d38.tar.zst dexon-solidity-e72a014cf44d086f3cb12bf1f4e2cfa02d781d38.zip |
special handle of send
Diffstat (limited to 'ExpressionCompiler.cpp')
-rw-r--r-- | ExpressionCompiler.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/ExpressionCompiler.cpp b/ExpressionCompiler.cpp index ae8bcaee..e8ac8ff8 100644 --- a/ExpressionCompiler.cpp +++ b/ExpressionCompiler.cpp @@ -534,7 +534,8 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) true, true ), - {} + {}, + true ); break; case Location::Suicide: @@ -1034,8 +1035,8 @@ void ExpressionCompiler::appendHighBitsCleanup(IntegerType const& _typeOnStack) void ExpressionCompiler::appendExternalFunctionCall( FunctionType const& _functionType, - vector<ASTPointer<Expression const>> const& _arguments -) + vector<ASTPointer<Expression const>> const& _arguments, + bool isSend) { solAssert(_functionType.takesArbitraryParameters() || _arguments.size() == _functionType.getParameterTypes().size(), ""); @@ -1105,8 +1106,15 @@ void ExpressionCompiler::appendExternalFunctionCall( m_context << eth::Instruction::CALL; //Propagate error condition (if CALL pushes 0 on stack). - m_context << eth::Instruction::ISZERO; - m_context.appendConditionalJumpTo(m_context.errorTag()); + if (!isSend) + { + m_context << eth::Instruction::ISZERO; + m_context.appendConditionalJumpTo(m_context.errorTag()); + } else + { + auto tag = m_context.appendConditionalJump(); + m_context << eth::Instruction::STOP << tag; + } if (_functionType.valueSet()) m_context << eth::Instruction::POP; |