mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
LLL: implement WITH keyword
This commit is contained in:
parent
dcfa5f4ea0
commit
7c051f1e32
@ -285,6 +285,35 @@ void CodeFragment::constructOperation(sp::utree const& _t, CompilerState& _s)
|
|||||||
m_asm.append((u256)varAddress(firstAsString()));
|
m_asm.append((u256)varAddress(firstAsString()));
|
||||||
m_asm.append(Instruction::MLOAD);
|
m_asm.append(Instruction::MLOAD);
|
||||||
}
|
}
|
||||||
|
else if (us == "WITH")
|
||||||
|
{
|
||||||
|
if (_t.size() != 4)
|
||||||
|
error<IncorrectParameterCount>();
|
||||||
|
string key = firstAsString();
|
||||||
|
if (_s.vars.find(key) != _s.vars.end())
|
||||||
|
error<InvalidName>(string("Symbol already used: ") + key);
|
||||||
|
|
||||||
|
// Create variable
|
||||||
|
// TODO: move this to be a stack variable (and not a memory variable)
|
||||||
|
size_t c = 0;
|
||||||
|
for (auto const& i: _t)
|
||||||
|
if (c++ == 2)
|
||||||
|
m_asm.append(CodeFragment(i, _s, m_readFile, false).m_asm);
|
||||||
|
m_asm.append((u256)varAddress(key, true));
|
||||||
|
m_asm.append(Instruction::MSTORE);
|
||||||
|
|
||||||
|
// Insert sub with variable access, but new state
|
||||||
|
CompilerState ns = _s;
|
||||||
|
c = 0;
|
||||||
|
for (auto const& i: _t)
|
||||||
|
if (c++ == 3)
|
||||||
|
m_asm.append(CodeFragment(i, _s, m_readFile, false).m_asm);
|
||||||
|
|
||||||
|
// Remove variable
|
||||||
|
auto it = _s.vars.find(key);
|
||||||
|
if (it != _s.vars.end())
|
||||||
|
_s.vars.erase(it);
|
||||||
|
}
|
||||||
else if (us == "REF")
|
else if (us == "REF")
|
||||||
m_asm.append((u256)varAddress(firstAsString()));
|
m_asm.append((u256)varAddress(firstAsString()));
|
||||||
else if (us == "DEF")
|
else if (us == "DEF")
|
||||||
|
@ -109,6 +109,19 @@ BOOST_AUTO_TEST_CASE(variables)
|
|||||||
BOOST_CHECK(callFallback() == encodeArgs(u256(488)));
|
BOOST_CHECK(callFallback() == encodeArgs(u256(488)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(with)
|
||||||
|
{
|
||||||
|
char const* sourceCode = R"(
|
||||||
|
(returnlll
|
||||||
|
(seq
|
||||||
|
(set 'x 11)
|
||||||
|
(with 'y 22 { [0]:(+ (get 'x) (get 'y)) })
|
||||||
|
(return 0 32)))
|
||||||
|
)";
|
||||||
|
compileAndRun(sourceCode);
|
||||||
|
BOOST_CHECK(callFallback() == toBigEndian(u256(33)));
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(when)
|
BOOST_AUTO_TEST_CASE(when)
|
||||||
{
|
{
|
||||||
char const* sourceCode = R"(
|
char const* sourceCode = R"(
|
||||||
|
Loading…
Reference in New Issue
Block a user