mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Refactor variable access.
This commit is contained in:
parent
f4f82615b1
commit
caa3761dc9
@ -140,28 +140,11 @@ public:
|
|||||||
if (m_scope.lookup(_identifier.name, Scope::NonconstVisitor(
|
if (m_scope.lookup(_identifier.name, Scope::NonconstVisitor(
|
||||||
[=](Scope::Variable& _var)
|
[=](Scope::Variable& _var)
|
||||||
{
|
{
|
||||||
if (!_var.active)
|
if (int heightDiff = variableHeightDiff(_var, _identifier.location, false))
|
||||||
{
|
|
||||||
m_state.addError(
|
|
||||||
Error::Type::TypeError,
|
|
||||||
"Variable used before it was declared",
|
|
||||||
_identifier.location
|
|
||||||
);
|
|
||||||
m_state.assembly.append(u256(0));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int heightDiff = m_state.assembly.deposit() - _var.stackHeight;
|
|
||||||
if (heightDiff <= 0 || heightDiff > 16)
|
|
||||||
{
|
|
||||||
m_state.addError(
|
|
||||||
Error::Type::TypeError,
|
|
||||||
"Variable inaccessible, too deep inside stack (" + boost::lexical_cast<string>(heightDiff) + ")",
|
|
||||||
_identifier.location
|
|
||||||
);
|
|
||||||
m_state.assembly.append(u256(0));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
m_state.assembly.append(solidity::dupInstruction(heightDiff));
|
m_state.assembly.append(solidity::dupInstruction(heightDiff));
|
||||||
|
else
|
||||||
|
// Store something to balance the stack
|
||||||
|
m_state.assembly.append(u256(0));
|
||||||
},
|
},
|
||||||
[=](Scope::Label& _label)
|
[=](Scope::Label& _label)
|
||||||
{
|
{
|
||||||
@ -266,25 +249,8 @@ private:
|
|||||||
if (m_scope.lookup(_variableName.name, Scope::Visitor(
|
if (m_scope.lookup(_variableName.name, Scope::Visitor(
|
||||||
[=](Scope::Variable const& _var)
|
[=](Scope::Variable const& _var)
|
||||||
{
|
{
|
||||||
if (!_var.active)
|
if (int heightDiff = variableHeightDiff(_var, _location, true))
|
||||||
{
|
m_state.assembly.append(solidity::swapInstruction(heightDiff - 1));
|
||||||
m_state.addError(
|
|
||||||
Error::Type::TypeError,
|
|
||||||
"Variable used before it was declared",
|
|
||||||
_location
|
|
||||||
);
|
|
||||||
m_state.assembly.append(u256(0));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int heightDiff = m_state.assembly.deposit() - _var.stackHeight - 1;
|
|
||||||
if (heightDiff <= 0 || heightDiff > 16)
|
|
||||||
m_state.addError(
|
|
||||||
Error::Type::TypeError,
|
|
||||||
"Variable inaccessible, too deep inside stack (" + boost::lexical_cast<string>(heightDiff) + ")",
|
|
||||||
_location
|
|
||||||
);
|
|
||||||
else
|
|
||||||
m_state.assembly.append(solidity::swapInstruction(heightDiff));
|
|
||||||
m_state.assembly.append(solidity::Instruction::POP);
|
m_state.assembly.append(solidity::Instruction::POP);
|
||||||
},
|
},
|
||||||
[=](Scope::Label const&)
|
[=](Scope::Label const&)
|
||||||
@ -304,6 +270,30 @@ private:
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Determines the stack height difference to the given variables. Automatically generates
|
||||||
|
/// errors if it is not yet in scope or the height difference is too large. Returns 0 on
|
||||||
|
/// errors and the (positive) stack height difference otherwise.
|
||||||
|
int variableHeightDiff(Scope::Variable const& _var, SourceLocation const& _location, bool _forSwap)
|
||||||
|
{
|
||||||
|
if (!_var.active)
|
||||||
|
{
|
||||||
|
m_state.addError( Error::Type::TypeError, "Variable used before it was declared", _location);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int heightDiff = m_state.assembly.deposit() - _var.stackHeight;
|
||||||
|
if (heightDiff <= (_forSwap ? 1 : 0) || heightDiff > (_forSwap ? 17 : 16))
|
||||||
|
{
|
||||||
|
m_state.addError(
|
||||||
|
Error::Type::TypeError,
|
||||||
|
"Variable inaccessible, too deep inside stack (" + boost::lexical_cast<string>(heightDiff) + ")",
|
||||||
|
_location
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return heightDiff;
|
||||||
|
}
|
||||||
|
|
||||||
void expectDeposit(int _deposit, int _oldHeight, SourceLocation const& _location)
|
void expectDeposit(int _deposit, int _oldHeight, SourceLocation const& _location)
|
||||||
{
|
{
|
||||||
if (m_state.assembly.deposit() != _oldHeight + 1)
|
if (m_state.assembly.deposit() != _oldHeight + 1)
|
||||||
|
Loading…
Reference in New Issue
Block a user