Browse Source

special handle of send

cl-refactor
Liana Husikyan 10 years ago
parent
commit
a723fb7e81
  1. 18
      libsolidity/ExpressionCompiler.cpp
  2. 3
      libsolidity/ExpressionCompiler.h
  3. 1
      test/libsolidity/SolidityEndToEndTest.cpp

18
libsolidity/ExpressionCompiler.cpp

@ -534,7 +534,8 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall)
true, true,
true true
), ),
{} {},
true
); );
break; break;
case Location::Suicide: case Location::Suicide:
@ -1034,8 +1035,8 @@ void ExpressionCompiler::appendHighBitsCleanup(IntegerType const& _typeOnStack)
void ExpressionCompiler::appendExternalFunctionCall( void ExpressionCompiler::appendExternalFunctionCall(
FunctionType const& _functionType, FunctionType const& _functionType,
vector<ASTPointer<Expression const>> const& _arguments vector<ASTPointer<Expression const>> const& _arguments,
) bool isSend)
{ {
solAssert(_functionType.takesArbitraryParameters() || solAssert(_functionType.takesArbitraryParameters() ||
_arguments.size() == _functionType.getParameterTypes().size(), ""); _arguments.size() == _functionType.getParameterTypes().size(), "");
@ -1105,8 +1106,15 @@ void ExpressionCompiler::appendExternalFunctionCall(
m_context << eth::Instruction::CALL; m_context << eth::Instruction::CALL;
//Propagate error condition (if CALL pushes 0 on stack). //Propagate error condition (if CALL pushes 0 on stack).
m_context << eth::Instruction::ISZERO; if (!isSend)
m_context.appendConditionalJumpTo(m_context.errorTag()); {
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()) if (_functionType.valueSet())
m_context << eth::Instruction::POP; m_context << eth::Instruction::POP;

3
libsolidity/ExpressionCompiler.h

@ -100,7 +100,8 @@ private:
/// Appends code to call a function of the given type with the given arguments. /// Appends code to call a function of the given type with the given arguments.
void appendExternalFunctionCall( void appendExternalFunctionCall(
FunctionType const& _functionType, FunctionType const& _functionType,
std::vector<ASTPointer<Expression const>> const& _arguments std::vector<ASTPointer<Expression const>> const& _arguments,
bool isSend = false
); );
/// Appends code that evaluates the given arguments and moves the result to memory encoded as /// Appends code that evaluates the given arguments and moves the result to memory encoded as
/// specified by the ABI. The memory offset is expected to be on the stack and is updated by /// specified by the ABI. The memory offset is expected to be on the stack and is updated by

1
test/libsolidity/SolidityEndToEndTest.cpp

@ -4167,7 +4167,6 @@ BOOST_AUTO_TEST_CASE(evm_exceptions_in_constructor_call_fail)
function A() function A()
{ {
this.call("123"); this.call("123");
} }
} }
contract B { contract B {

Loading…
Cancel
Save