Browse Source

Merge pull request #1325 from LefterisJP/sol_MsgSig

Adding msg.sig Solidity Magic type
cl-refactor
chriseth 10 years ago
parent
commit
24dd2582e8
  1. 3
      libsolidity/ExpressionCompiler.cpp
  2. 3
      libsolidity/Types.cpp
  3. 29
      test/SolidityEndToEndTest.cpp

3
libsolidity/ExpressionCompiler.cpp

@ -652,6 +652,9 @@ void ExpressionCompiler::endVisit(MemberAccess const& _memberAccess)
m_context << eth::Instruction::GASPRICE;
else if (member == "data")
m_context << u256(0) << eth::Instruction::CALLDATASIZE;
else if (member == "sig")
m_context << u256(0) << eth::Instruction::CALLDATALOAD
<< (u256(0xffffffff) << (256 - 32)) << eth::Instruction::AND;
else
BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Unknown magic member."));
break;

3
libsolidity/Types.cpp

@ -1160,7 +1160,8 @@ MagicType::MagicType(MagicType::Kind _kind):
m_members = MemberList({{"sender", make_shared<IntegerType>(0, IntegerType::Modifier::Address)},
{"gas", make_shared<IntegerType>(256)},
{"value", make_shared<IntegerType>(256)},
{"data", make_shared<ArrayType>(ArrayType::Location::CallData)}});
{"data", make_shared<ArrayType>(ArrayType::Location::CallData)},
{"sig", make_shared<FixedBytesType>(4)}});
break;
case Kind::Transaction:
m_members = MemberList({{"origin", make_shared<IntegerType>(0, IntegerType::Modifier::Address)},

29
test/SolidityEndToEndTest.cpp

@ -1031,6 +1031,35 @@ BOOST_AUTO_TEST_CASE(blockchain)
BOOST_CHECK(callContractFunctionWithValue("someInfo()", 28) == encodeArgs(28, 0, 1));
}
BOOST_AUTO_TEST_CASE(msg_sig)
{
char const* sourceCode = R"(
contract test {
function foo(uint256 a) returns (bytes4 value) {
return msg.sig;
}
}
)";
compileAndRun(sourceCode);
BOOST_CHECK(callContractFunctionWithValue("foo(uint256)", 13) == encodeArgs(asString(FixedHash<4>(dev::sha3("foo(uint256)")).asBytes())));
}
BOOST_AUTO_TEST_CASE(msg_sig_after_internal_call_is_same)
{
char const* sourceCode = R"(
contract test {
function boo() returns (bytes4 value) {
return msg.sig;
}
function foo(uint256 a) returns (bytes4 value) {
return boo();
}
}
)";
compileAndRun(sourceCode);
BOOST_CHECK(callContractFunctionWithValue("foo(uint256)", 13) == encodeArgs(asString(FixedHash<4>(dev::sha3("foo(uint256)")).asBytes())));
}
BOOST_AUTO_TEST_CASE(now)
{
char const* sourceCode = "contract test {\n"

Loading…
Cancel
Save