mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fix data flow analyzer for function definitions.
This commit is contained in:
parent
bed0368ffa
commit
b2b11eaa00
@ -84,13 +84,26 @@ void DataFlowAnalyzer::operator()(Switch& _switch)
|
||||
|
||||
void DataFlowAnalyzer::operator()(FunctionDefinition& _fun)
|
||||
{
|
||||
// Save all information. We might rather reinstantiate this class,
|
||||
// but this could be difficult if it is subclassed.
|
||||
map<YulString, Expression const*> value;
|
||||
map<YulString, set<YulString>> references;
|
||||
map<YulString, set<YulString>> referencedBy;
|
||||
m_value.swap(value);
|
||||
m_references.swap(references);
|
||||
m_referencedBy.swap(referencedBy);
|
||||
pushScope(true);
|
||||
|
||||
for (auto const& parameter: _fun.parameters)
|
||||
m_variableScopes.back().variables.emplace(parameter.name);
|
||||
for (auto const& var: _fun.returnVariables)
|
||||
m_variableScopes.back().variables.emplace(var.name);
|
||||
ASTModifier::operator()(_fun);
|
||||
|
||||
popScope();
|
||||
m_value.swap(value);
|
||||
m_references.swap(references);
|
||||
m_referencedBy.swap(referencedBy);
|
||||
}
|
||||
|
||||
void DataFlowAnalyzer::operator()(ForLoop& _for)
|
||||
|
@ -0,0 +1,52 @@
|
||||
{
|
||||
let _13 := 0x20
|
||||
let _14 := allocate(_13)
|
||||
pop(_14)
|
||||
let _15 := 2
|
||||
let _16 := 3
|
||||
let _17 := 0x40
|
||||
let _18 := allocate(_17)
|
||||
let _19 := array_index_access(_18, _16)
|
||||
mstore(_19, _15)
|
||||
function allocate(size) -> p
|
||||
{
|
||||
let _1 := 0x40
|
||||
let p_2 := mload(_1)
|
||||
p := p_2
|
||||
let _20 := add(p_2, size)
|
||||
mstore(_1, _20)
|
||||
}
|
||||
function array_index_access(array, index) -> p_1
|
||||
{
|
||||
let _21 := 0x20
|
||||
let _22 := mul(index, _21)
|
||||
p_1 := add(array, _22)
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// commonSubexpressionEliminator
|
||||
// {
|
||||
// let _13 := 0x20
|
||||
// let _14 := allocate(_13)
|
||||
// pop(_14)
|
||||
// let _15 := 2
|
||||
// let _16 := 3
|
||||
// let _17 := 0x40
|
||||
// let _18 := allocate(_17)
|
||||
// let _19 := array_index_access(_18, _16)
|
||||
// mstore(_19, _15)
|
||||
// function allocate(size) -> p
|
||||
// {
|
||||
// let _1 := 0x40
|
||||
// let p_2 := mload(_1)
|
||||
// p := p_2
|
||||
// let _20 := add(p_2, size)
|
||||
// mstore(_1, _20)
|
||||
// }
|
||||
// function array_index_access(array, index) -> p_1
|
||||
// {
|
||||
// let _21 := 0x20
|
||||
// let _22 := mul(index, _21)
|
||||
// p_1 := add(array, _22)
|
||||
// }
|
||||
// }
|
@ -0,0 +1,52 @@
|
||||
{
|
||||
function allocate(size) -> p
|
||||
{
|
||||
let _1 := 0x40
|
||||
p := mload(_1)
|
||||
let _2 := add(p, size)
|
||||
let _3 := 0x40
|
||||
mstore(_3, _2)
|
||||
}
|
||||
function array_index_access(array, index) -> p_1
|
||||
{
|
||||
let _4 := 0x20
|
||||
let _5 := mul(index, _4)
|
||||
p_1 := add(array, _5)
|
||||
}
|
||||
let _6 := 0x20
|
||||
let _7 := allocate(_6)
|
||||
pop(_7)
|
||||
let _8 := 0x40
|
||||
let x := allocate(_8)
|
||||
let _9 := 2
|
||||
let _10 := 3
|
||||
let _11 := array_index_access(x, _10)
|
||||
mstore(_11, _9)
|
||||
}
|
||||
// ----
|
||||
// commonSubexpressionEliminator
|
||||
// {
|
||||
// function allocate(size) -> p
|
||||
// {
|
||||
// let _1 := 0x40
|
||||
// p := mload(_1)
|
||||
// let _2 := add(p, size)
|
||||
// let _3 := _1
|
||||
// mstore(_1, _2)
|
||||
// }
|
||||
// function array_index_access(array, index) -> p_1
|
||||
// {
|
||||
// let _4 := 0x20
|
||||
// let _5 := mul(index, _4)
|
||||
// p_1 := add(array, _5)
|
||||
// }
|
||||
// let _6 := 0x20
|
||||
// let _7 := allocate(_6)
|
||||
// pop(_7)
|
||||
// let _8 := 0x40
|
||||
// let x := allocate(_8)
|
||||
// let _9 := 2
|
||||
// let _10 := 3
|
||||
// let _11 := array_index_access(x, _10)
|
||||
// mstore(_11, _9)
|
||||
// }
|
Loading…
Reference in New Issue
Block a user