Merge pull request #6171 from ethereum/ignorePrefixWhileInlining

Do not prepend function name to all variables when inlining.
This commit is contained in:
chriseth 2019-03-05 11:36:53 +01:00 committed by GitHub
commit d0ab5454f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 322 additions and 339 deletions

View File

@ -177,7 +177,7 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
// helper function to create a new variable that is supposed to model
// an existing variable.
auto newVariable = [&](TypedName const& _existingVariable, Expression* _value) {
YulString newName = m_nameDispenser.newName(_existingVariable.name, function->name);
YulString newName = m_nameDispenser.newName(_existingVariable.name);
variableReplacements[_existingVariable.name] = newName;
VariableDeclaration varDecl{_funCall.location, {{_funCall.location, newName, _existingVariable.type}}, {}};
if (_value)
@ -192,7 +192,7 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
for (auto const& var: function->returnVariables)
newVariable(var, nullptr);
Statement newBody = BodyCopier(m_nameDispenser, function->name, variableReplacements)(function->body);
Statement newBody = BodyCopier(m_nameDispenser, variableReplacements)(function->body);
newStatements += std::move(boost::get<Block>(newBody).statements);
boost::apply_visitor(GenericFallbackVisitor<Assignment, VariableDeclaration>{
@ -228,7 +228,7 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
Statement BodyCopier::operator()(VariableDeclaration const& _varDecl)
{
for (auto const& var: _varDecl.variables)
m_variableReplacements[var.name] = m_nameDispenser.newName(var.name, m_varNamePrefix);
m_variableReplacements[var.name] = m_nameDispenser.newName(var.name);
return ASTCopier::operator()(_varDecl);
}

View File

@ -140,11 +140,9 @@ class BodyCopier: public ASTCopier
public:
BodyCopier(
NameDispenser& _nameDispenser,
YulString _varNamePrefix,
std::map<YulString, YulString> const& _variableReplacements
):
m_nameDispenser(_nameDispenser),
m_varNamePrefix(_varNamePrefix),
m_variableReplacements(_variableReplacements)
{}
@ -156,7 +154,6 @@ public:
YulString translateIdentifier(YulString _name) override;
NameDispenser& m_nameDispenser;
YulString m_varNamePrefix;
std::map<YulString, YulString> m_variableReplacements;
};

View File

@ -39,18 +39,7 @@ NameDispenser::NameDispenser(Dialect const& _dialect, set<YulString> _usedNames)
{
}
YulString NameDispenser::newName(YulString _nameHint, YulString _context)
{
// Shortening rules: Use a suffix of _prefix and a prefix of _context.
YulString prefix = _nameHint;
if (!_context.empty())
prefix = YulString{_context.str().substr(0, 10) + "_" + prefix.str()};
return newNameInternal(prefix);
}
YulString NameDispenser::newNameInternal(YulString _nameHint)
YulString NameDispenser::newName(YulString _nameHint)
{
YulString name = _nameHint;
while (name.empty() || m_usedNames.count(name) || m_dialect.builtin(name))

View File

@ -43,14 +43,10 @@ public:
/// Initialize the name dispenser with the given used names.
explicit NameDispenser(Dialect const& _dialect, std::set<YulString> _usedNames);
/// @returns a currently unused name that should be similar to _nameHint
/// and prefixed by _context if present.
/// If the resulting name would be too long, trims the context at the end
/// and the name hint at the start.
YulString newName(YulString _nameHint, YulString _context = {});
/// @returns a currently unused name that should be similar to _nameHint.
YulString newName(YulString _nameHint);
private:
YulString newNameInternal(YulString _nameHint);
Dialect const& m_dialect;
std::set<YulString> m_usedNames;

View File

@ -8,19 +8,19 @@
// fullInliner
// {
// {
// let f_a := calldataload(0)
// let f_b := 0
// let f_c := 0
// f_b := sload(mload(f_a))
// f_c := 3
// let b3 := f_b
// let f_a_2 := f_c
// let f_b_3 := 0
// let f_c_4 := 0
// f_b_3 := sload(mload(f_a_2))
// f_c_4 := 3
// let b4 := f_b_3
// let c4 := f_c_4
// let a_2 := calldataload(0)
// let b_3 := 0
// let c_4 := 0
// b_3 := sload(mload(a_2))
// c_4 := 3
// let b3 := b_3
// let a_6 := c_4
// let b_7 := 0
// let c_8 := 0
// b_7 := sload(mload(a_6))
// c_8 := 3
// let b4 := b_7
// let c4 := c_8
// }
// function f(a) -> b, c
// {

View File

@ -13,11 +13,11 @@
// {
// {
// let _2 := mload(0)
// let f_a := mload(1)
// let f_r := 0
// f_a := mload(f_a)
// f_r := add(f_a, calldatasize())
// if gt(f_r, _2)
// let a_10 := mload(1)
// let r_11 := 0
// a_10 := mload(a_10)
// r_11 := add(a_10, calldatasize())
// if gt(r_11, _2)
// {
// sstore(0, 2)
// }

View File

@ -21,28 +21,28 @@
// {
// let a_1 := mload(2)
// let a2 := 2
// let f_a := a_1
// let f_b := 0
// let f_x := mload(f_a)
// f_b := sload(f_x)
// let f_y := add(f_a, f_x)
// sstore(f_y, 10)
// let r := f_b
// let f_a_3 := a2
// let f_b_4 := 0
// let f_x_5 := mload(f_a_3)
// f_b_4 := sload(f_x_5)
// let f_y_6 := add(f_a_3, f_x_5)
// sstore(f_y_6, 10)
// let t := f_b_4
// let a_3 := a_1
// let b_4 := 0
// let x_5 := mload(a_3)
// b_4 := sload(x_5)
// let y_6 := add(a_3, x_5)
// sstore(y_6, 10)
// let r := b_4
// let a_8 := a2
// let b_9 := 0
// let x_10 := mload(a_8)
// b_9 := sload(x_10)
// let y_11 := add(a_8, x_10)
// sstore(y_11, 10)
// let t := b_9
// let a3
// let f_a_8 := a3
// let f_b_9 := 0
// let f_x_10 := mload(f_a_8)
// f_b_9 := sload(f_x_10)
// let f_y_11 := add(f_a_8, f_x_10)
// sstore(f_y_11, 10)
// let s := f_b_9
// let a_13 := a3
// let b_14 := 0
// let x_15 := mload(a_13)
// b_14 := sload(x_15)
// let y_16 := add(a_13, x_15)
// sstore(y_16, 10)
// let s := b_14
// }
// function f(a) -> b
// {

View File

@ -14,15 +14,15 @@
// fullInliner
// {
// {
// let f_a := mload(1)
// let f_b := 0
// let f_x := mload(f_a)
// f_b := sload(f_x)
// let f_c := 3
// mstore(mul(f_a, f_b), mload(f_x))
// let f_y := add(f_a, f_x)
// sstore(f_y, 10)
// let r := f_b
// let a_6 := mload(1)
// let b_7 := 0
// let x_8 := mload(a_6)
// b_7 := sload(x_8)
// let c_9 := 3
// mstore(mul(a_6, b_7), mload(x_8))
// let y_12 := add(a_6, x_8)
// sstore(y_12, 10)
// let r := b_7
// }
// function f(a) -> b
// {

View File

@ -12,10 +12,10 @@
// {
// {
// let verylongvariablename2_1 := 3
// let verylongfu_verylongvariablename := verylongvariablename2_1
// let verylongfu_verylongvariablename2 := 0
// verylongfu_verylongvariablename2 := add(verylongfu_verylongvariablename, verylongfu_verylongvariablename)
// mstore(0, verylongfu_verylongvariablename2)
// let verylongvariablename_4 := verylongvariablename2_1
// let verylongvariablename2_5 := 0
// verylongvariablename2_5 := add(verylongvariablename_4, verylongvariablename_4)
// mstore(0, verylongvariablename2_5)
// mstore(1, verylongvariablename2_1)
// }
// function verylongfunctionname(verylongvariablename) -> verylongvariablename2

View File

@ -12,13 +12,13 @@
// let _2 := mload(5)
// let _4 := mload(4)
// let _6 := mload(3)
// let f_a := mload(2)
// let f_b := _6
// let f_c := _4
// let f_x := 0
// f_x := add(f_a, f_b)
// f_x := mul(f_x, f_c)
// let _10 := add(f_x, _2)
// let a_13 := mload(2)
// let b_14 := _6
// let c_15 := _4
// let x_16 := 0
// x_16 := add(a_13, b_14)
// x_16 := mul(x_16, c_15)
// let _10 := add(x_16, _2)
// let y := add(mload(1), _10)
// }
// function f(a, b, c) -> x

View File

@ -8,14 +8,14 @@
// {
// {
// let _1 := 7
// let f_a := 3
// let f_x := 0
// f_x := add(f_a, f_a)
// let g_b := f_x
// let g_c := _1
// let g_y := 0
// g_y := mul(mload(g_c), f(g_b))
// let y_1 := g_y
// let a_6 := 3
// let x_7 := 0
// x_7 := add(a_6, a_6)
// let b_8 := x_7
// let c_9 := _1
// let y_10 := 0
// y_10 := mul(mload(c_9), f(b_8))
// let y_1 := y_10
// }
// function f(a) -> x
// {
@ -23,9 +23,9 @@
// }
// function g(b, c) -> y
// {
// let f_a_6 := b
// let f_x_7 := 0
// f_x_7 := add(f_a_6, f_a_6)
// y := mul(mload(c), f_x_7)
// let a_13 := b
// let x_14 := 0
// x_14 := add(a_13, a_13)
// y := mul(mload(c), x_14)
// }
// }

View File

@ -26,33 +26,33 @@
// fullInliner
// {
// {
// let f_x := 100
// mstore(0, f_x)
// let x_8 := 100
// mstore(0, x_8)
// mstore(7, h())
// g(10)
// mstore(1, f_x)
// mstore(1, x_8)
// }
// function f(x)
// {
// mstore(0, x)
// let h_t := 0
// h_t := 2
// mstore(7, h_t)
// let g_x_1 := 10
// let g_f_x_8 := 1
// mstore(0, g_f_x_8)
// let t_20 := 0
// t_20 := 2
// mstore(7, t_20)
// let x_1_21 := 10
// let x_14_23 := 1
// mstore(0, x_14_23)
// mstore(7, h())
// g(10)
// mstore(1, g_f_x_8)
// mstore(1, x_14_23)
// mstore(1, x)
// }
// function g(x_1)
// {
// let f_x_8 := 1
// mstore(0, f_x_8)
// let x_14 := 1
// mstore(0, x_14)
// mstore(7, h())
// g(10)
// mstore(1, f_x_8)
// mstore(1, x_14)
// }
// function h() -> t
// {

View File

@ -10,13 +10,13 @@
// fullInliner
// {
// {
// let f_a := mload(0)
// let f_x := 0
// let f_y := 0
// f_x := mul(f_a, f_a)
// f_y := add(f_a, f_x)
// let r := f_x
// mstore(r, f_y)
// let a_3 := mload(0)
// let x_4 := 0
// let y_5 := 0
// x_4 := mul(a_3, a_3)
// y_5 := add(a_3, x_4)
// let r := x_4
// mstore(r, y_5)
// }
// function f(a) -> x, y
// {

View File

@ -18,45 +18,45 @@
// }
// function g() -> x_1
// {
// let f_a := 2
// let f_b := 0
// f_b := sload(mload(f_a))
// let f_a_20 := f_b
// let f_b_21 := 0
// f_b_21 := sload(mload(f_a_20))
// let f_a_23 := f_b_21
// let f_b_24 := 0
// f_b_24 := sload(mload(f_a_23))
// let f_a_26 := f_b_24
// let f_b_27 := 0
// f_b_27 := sload(mload(f_a_26))
// let f_a_29 := f_b_27
// let f_b_30 := 0
// f_b_30 := sload(mload(f_a_29))
// let f_a_32 := f_b_30
// let f_b_33 := 0
// f_b_33 := sload(mload(f_a_32))
// let f_a_35 := f_b_33
// let f_b_36 := 0
// f_b_36 := sload(mload(f_a_35))
// let f_a_38 := f_b_36
// let f_b_39 := 0
// f_b_39 := sload(mload(f_a_38))
// let f_a_41 := f_b_39
// let f_b_42 := 0
// f_b_42 := sload(mload(f_a_41))
// let f_a_44 := f_b_42
// let f_b_45 := 0
// f_b_45 := sload(mload(f_a_44))
// let f_a_47 := f_b_45
// let f_b_48 := 0
// f_b_48 := sload(mload(f_a_47))
// let f_a_50 := f_b_48
// let f_b_51 := 0
// f_b_51 := sload(mload(f_a_50))
// let f_a_53 := f_b_51
// let f_b_54 := 0
// f_b_54 := sload(mload(f_a_53))
// x_1 := f(f(f(f(f(f(f_b_54))))))
// let a_20 := 2
// let b_21 := 0
// b_21 := sload(mload(a_20))
// let a_23 := b_21
// let b_24 := 0
// b_24 := sload(mload(a_23))
// let a_26 := b_24
// let b_27 := 0
// b_27 := sload(mload(a_26))
// let a_29 := b_27
// let b_30 := 0
// b_30 := sload(mload(a_29))
// let a_32 := b_30
// let b_33 := 0
// b_33 := sload(mload(a_32))
// let a_35 := b_33
// let b_36 := 0
// b_36 := sload(mload(a_35))
// let a_38 := b_36
// let b_39 := 0
// b_39 := sload(mload(a_38))
// let a_41 := b_39
// let b_42 := 0
// b_42 := sload(mload(a_41))
// let a_44 := b_42
// let b_45 := 0
// b_45 := sload(mload(a_44))
// let a_47 := b_45
// let b_48 := 0
// b_48 := sload(mload(a_47))
// let a_50 := b_48
// let b_51 := 0
// b_51 := sload(mload(a_50))
// let a_53 := b_51
// let b_54 := 0
// b_54 := sload(mload(a_53))
// let a_56 := b_54
// let b_57 := 0
// b_57 := sload(mload(a_56))
// x_1 := f(f(f(f(f(f(b_57))))))
// }
// }

View File

@ -11,46 +11,46 @@
// fullInliner
// {
// {
// let f_a := 2
// let f_b := 0
// f_b := sload(mload(f_a))
// let f_a_20 := f_b
// let f_b_21 := 0
// f_b_21 := sload(mload(f_a_20))
// let f_a_23 := f_b_21
// let f_b_24 := 0
// f_b_24 := sload(mload(f_a_23))
// let f_a_26 := f_b_24
// let f_b_27 := 0
// f_b_27 := sload(mload(f_a_26))
// let f_a_29 := f_b_27
// let f_b_30 := 0
// f_b_30 := sload(mload(f_a_29))
// let f_a_32 := f_b_30
// let f_b_33 := 0
// f_b_33 := sload(mload(f_a_32))
// let f_a_35 := f_b_33
// let f_b_36 := 0
// f_b_36 := sload(mload(f_a_35))
// let f_a_38 := f_b_36
// let f_b_39 := 0
// f_b_39 := sload(mload(f_a_38))
// let f_a_41 := f_b_39
// let f_b_42 := 0
// f_b_42 := sload(mload(f_a_41))
// let f_a_44 := f_b_42
// let f_b_45 := 0
// f_b_45 := sload(mload(f_a_44))
// let f_a_47 := f_b_45
// let f_b_48 := 0
// f_b_48 := sload(mload(f_a_47))
// let f_a_50 := f_b_48
// let f_b_51 := 0
// f_b_51 := sload(mload(f_a_50))
// let f_a_53 := f_b_51
// let f_b_54 := 0
// f_b_54 := sload(mload(f_a_53))
// let x_1 := f(f(f(f(f(f(f_b_54))))))
// let a_20 := 2
// let b_21 := 0
// b_21 := sload(mload(a_20))
// let a_23 := b_21
// let b_24 := 0
// b_24 := sload(mload(a_23))
// let a_26 := b_24
// let b_27 := 0
// b_27 := sload(mload(a_26))
// let a_29 := b_27
// let b_30 := 0
// b_30 := sload(mload(a_29))
// let a_32 := b_30
// let b_33 := 0
// b_33 := sload(mload(a_32))
// let a_35 := b_33
// let b_36 := 0
// b_36 := sload(mload(a_35))
// let a_38 := b_36
// let b_39 := 0
// b_39 := sload(mload(a_38))
// let a_41 := b_39
// let b_42 := 0
// b_42 := sload(mload(a_41))
// let a_44 := b_42
// let b_45 := 0
// b_45 := sload(mload(a_44))
// let a_47 := b_45
// let b_48 := 0
// b_48 := sload(mload(a_47))
// let a_50 := b_48
// let b_51 := 0
// b_51 := sload(mload(a_50))
// let a_53 := b_51
// let b_54 := 0
// b_54 := sload(mload(a_53))
// let a_56 := b_54
// let b_57 := 0
// b_57 := sload(mload(a_56))
// let x_1 := f(f(f(f(f(f(b_57))))))
// }
// function f(a) -> b
// {

View File

@ -8,8 +8,8 @@
// fullInliner
// {
// {
// let f_a := mload(0)
// sstore(f_a, f_a)
// let a_3 := mload(0)
// sstore(a_3, a_3)
// }
// function f(a)
// {

View File

@ -13,26 +13,26 @@
// {
// {
// for {
// let f_a := 0
// let f_r := 0
// sstore(f_a, 0)
// f_r := f_a
// let x := f_r
// let a_3 := 0
// let r_4 := 0
// sstore(a_3, 0)
// r_4 := a_3
// let x := r_4
// }
// f(x)
// {
// let f_a_3 := x
// let f_r_4 := 0
// sstore(f_a_3, 0)
// f_r_4 := f_a_3
// x := f_r_4
// let a_6 := x
// let r_7 := 0
// sstore(a_6, 0)
// r_7 := a_6
// x := r_7
// }
// {
// let f_a_6 := x
// let f_r_7 := 0
// sstore(f_a_6, 0)
// f_r_7 := f_a_6
// let t := f_r_7
// let a_9 := x
// let r_10 := 0
// sstore(a_9, 0)
// r_10 := a_9
// let t := r_10
// }
// }
// function f(a) -> r

View File

@ -13,11 +13,11 @@
// {
// {
// let _1 := 2
// let f_a := 7
// let f_x := 0
// let f_r := mul(f_a, f_a)
// f_x := add(f_r, f_r)
// pop(add(f_x, _1))
// let a_5 := 7
// let x_6 := 0
// let r_7 := mul(a_5, a_5)
// x_6 := add(r_7, r_7)
// pop(add(x_6, _1))
// }
// function f(a) -> x
// {

View File

@ -8,7 +8,7 @@
// fullInliner
// {
// {
// let f_a := mload(0)
// let a_4 := mload(0)
// f(1)
// }
// function f(a)

View File

@ -10,11 +10,11 @@
// {
// {
// let _2 := mload(7)
// let f_a := sload(mload(2))
// let f_x := 0
// let f_r := mul(f_a, f_a)
// f_x := add(f_r, f_r)
// let y := add(f_x, _2)
// let a_7 := sload(mload(2))
// let x_8 := 0
// let r_9 := mul(a_7, a_7)
// x_8 := add(r_9, r_9)
// let y := add(x_8, _2)
// }
// function f(a) -> x
// {

View File

@ -1103,17 +1103,17 @@
// {
// revert(value4, value4)
// }
// let abi_decode_length := calldataload(_2)
// if gt(abi_decode_length, _1)
// let length := calldataload(_2)
// if gt(length, _1)
// {
// revert(value4, value4)
// }
// if gt(add(add(_2, abi_decode_length), 32), dataEnd)
// if gt(add(add(_2, length), 32), dataEnd)
// {
// revert(value4, value4)
// }
// value2 := add(_2, 32)
// value3 := abi_decode_length
// value3 := length
// let _3 := calldataload(add(headStart, 96))
// if iszero(lt(_3, 3))
// {

View File

@ -461,36 +461,36 @@
// let _1 := 0x20
// let _2 := 0
// let _3 := mload(_2)
// let abi_encode_pos := _1
// let abi_encode_length := mload(_3)
// mstore(_1, abi_encode_length)
// abi_encode_pos := 64
// let abi_encode_srcPtr := add(_3, _1)
// let abi_encode_i := _2
// let pos := _1
// let length := mload(_3)
// mstore(_1, length)
// pos := 64
// let srcPtr := add(_3, _1)
// let i := _2
// for {
// }
// lt(abi_encode_i, abi_encode_length)
// lt(i, length)
// {
// abi_encode_i := add(abi_encode_i, 1)
// i := add(i, 1)
// }
// {
// let _4 := mload(abi_encode_srcPtr)
// let abi_encode_pos_1 := abi_encode_pos
// let abi_encode_srcPtr_1 := _4
// let abi_encode_i_1 := _2
// let _4 := mload(srcPtr)
// let pos_1 := pos
// let srcPtr_1 := _4
// let i_1 := _2
// for {
// }
// lt(abi_encode_i_1, 0x3)
// lt(i_1, 0x3)
// {
// abi_encode_i_1 := add(abi_encode_i_1, 1)
// i_1 := add(i_1, 1)
// }
// {
// mstore(abi_encode_pos_1, and(mload(abi_encode_srcPtr_1), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))
// abi_encode_srcPtr_1 := add(abi_encode_srcPtr_1, _1)
// abi_encode_pos_1 := add(abi_encode_pos_1, _1)
// mstore(pos_1, and(mload(srcPtr_1), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))
// srcPtr_1 := add(srcPtr_1, _1)
// pos_1 := add(pos_1, _1)
// }
// abi_encode_srcPtr := add(abi_encode_srcPtr, _1)
// abi_encode_pos := add(abi_encode_pos, 0x60)
// srcPtr := add(srcPtr, _1)
// pos := add(pos, 0x60)
// }
// let _5 := mload(64)
// let _6 := mload(_1)
@ -498,22 +498,22 @@
// {
// revert(_2, _2)
// }
// let abi_decode_offset := calldataload(add(_6, 64))
// let abi_decode := 0xffffffffffffffff
// if gt(abi_decode_offset, abi_decode)
// let offset := calldataload(add(_6, 64))
// let _7 := 0xffffffffffffffff
// if gt(offset, _7)
// {
// revert(_2, _2)
// }
// let abi_decode_value2 := abi_decode_t_array$_t_uint256_$dyn_memory_ptr(add(_6, abi_decode_offset), _5)
// let abi_decode_offset_1 := calldataload(add(_6, 96))
// if gt(abi_decode_offset_1, abi_decode)
// let value2 := abi_decode_t_array$_t_uint256_$dyn_memory_ptr(add(_6, offset), _5)
// let offset_1 := calldataload(add(_6, 96))
// if gt(offset_1, _7)
// {
// revert(_2, _2)
// }
// let abi_decode_value3 := abi_decode_t_array$_t_array$_t_uint256_$2_memory_$dyn_memory_ptr(add(_6, abi_decode_offset_1), _5)
// let value3 := abi_decode_t_array$_t_array$_t_uint256_$2_memory_$dyn_memory_ptr(add(_6, offset_1), _5)
// sstore(calldataload(_6), calldataload(add(_6, _1)))
// sstore(abi_decode_value2, abi_decode_value3)
// sstore(_2, abi_encode_pos)
// sstore(value2, value3)
// sstore(_2, pos)
// function abi_decode_t_array$_t_array$_t_uint256_$2_memory_$dyn_memory_ptr(offset, end) -> array
// {
// if iszero(slt(add(offset, 0x1f), end))
@ -543,29 +543,29 @@
// {
// revert(0, 0)
// }
// let abi_decode_dst := allocateMemory(array_allocation_size_t_array$_t_uint256_$2_memory(0x2))
// let abi_decode_dst_1 := abi_decode_dst
// let abi_decode_src := src
// let abi_decode := add(src, 0x40)
// if gt(abi_decode, end)
// let dst_1 := allocateMemory(array_allocation_size_t_array$_t_uint256_$2_memory(0x2))
// let dst_2 := dst_1
// let src_1 := src
// let _2 := add(src, 0x40)
// if gt(_2, end)
// {
// revert(0, 0)
// }
// let abi_decode_i := 0
// let i_1 := 0
// for {
// }
// lt(abi_decode_i, 0x2)
// lt(i_1, 0x2)
// {
// abi_decode_i := add(abi_decode_i, 1)
// i_1 := add(i_1, 1)
// }
// {
// mstore(abi_decode_dst, calldataload(abi_decode_src))
// abi_decode_dst := add(abi_decode_dst, _1)
// abi_decode_src := add(abi_decode_src, _1)
// mstore(dst_1, calldataload(src_1))
// dst_1 := add(dst_1, _1)
// src_1 := add(src_1, _1)
// }
// mstore(dst, abi_decode_dst_1)
// mstore(dst, dst_2)
// dst := add(dst, _1)
// src := abi_decode
// src := _2
// }
// }
// function abi_decode_t_array$_t_uint256_$dyn_memory_ptr(offset, end) -> array

View File

@ -231,107 +231,108 @@
// ----
// fullSuite
// {
// let validateJo := 0x80
// mstore(validateJo, 7673901602397024137095011250362199966051872585513276903826533215767972925880)
// let _1 := 0x80
// mstore(_1, 7673901602397024137095011250362199966051872585513276903826533215767972925880)
// mstore(0xa0, 8489654445897228341090914135473290831551238522473825886865492707826370766375)
// let validateJo_m := calldataload(0x24)
// let validateJo_n := calldataload(add(0x04, calldataload(0x04)))
// let validateJo_gen_order := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001
// let validateJo_challenge := mod(calldataload(0x44), validateJo_gen_order)
// if gt(validateJo_m, validateJo_n)
// let m := calldataload(0x24)
// let n := calldataload(add(0x04, calldataload(0x04)))
// let gen_order := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001
// let challenge := mod(calldataload(0x44), gen_order)
// if gt(m, n)
// {
// mstore(0x00, 404)
// revert(0x00, 0x20)
// }
// let validateJo_kn := calldataload(add(calldatasize(), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff40))
// let kn := calldataload(add(calldatasize(), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff40))
// mstore(0x2a0, caller())
// mstore(0x2c0, validateJo_kn)
// mstore(0x2e0, validateJo_m)
// validateJo_kn := mulmod(sub(validateJo_gen_order, validateJo_kn), validateJo_challenge, validateJo_gen_order)
// hashCommitments(add(0x04, calldataload(0x04)), validateJo_n)
// let validateJo_b := add(0x300, mul(validateJo_n, validateJo))
// let validateJo_i := 0
// let validateJo_i_1 := validateJo_i
// mstore(0x2c0, kn)
// mstore(0x2e0, m)
// kn := mulmod(sub(gen_order, kn), challenge, gen_order)
// hashCommitments(add(0x04, calldataload(0x04)), n)
// let b := add(0x300, mul(n, _1))
// let i := 0
// let i_1 := i
// for {
// }
// lt(validateJo_i, validateJo_n)
// lt(i, n)
// {
// validateJo_i := add(validateJo_i, 0x01)
// i := add(i, 0x01)
// }
// {
// let validateJo_1 := add(calldataload(0x04), mul(validateJo_i, 0xc0))
// let validateJo_k := validateJo_i_1
// let validateJo_a := calldataload(add(validateJo_1, 0x44))
// let validateJo_c := validateJo_challenge
// switch eq(add(validateJo_i, 0x01), validateJo_n)
// let _2 := add(calldataload(0x04), mul(i, 0xc0))
// let k := i_1
// let a := calldataload(add(_2, 0x44))
// let c := challenge
// switch eq(add(i, 0x01), n)
// case 1 {
// validateJo_k := validateJo_kn
// if eq(validateJo_m, validateJo_n)
// k := kn
// if eq(m, n)
// {
// validateJo_k := sub(validateJo_gen_order, validateJo_kn)
// k := sub(gen_order, kn)
// }
// }
// case 0 {
// validateJo_k := calldataload(add(validateJo_1, 0x24))
// k := calldataload(add(_2, 0x24))
// }
// validateCommitment(add(validateJo_1, 0x24), validateJo_k, validateJo_a)
// switch gt(add(validateJo_i, 0x01), validateJo_m)
// validateCommitment(add(_2, 0x24), k, a)
// switch gt(add(i, 0x01), m)
// case 1 {
// validateJo_kn := addmod(validateJo_kn, sub(validateJo_gen_order, validateJo_k), validateJo_gen_order)
// let validateJo_x := mod(mload(validateJo_i_1), validateJo_gen_order)
// validateJo_k := mulmod(validateJo_k, validateJo_x, validateJo_gen_order)
// validateJo_a := mulmod(validateJo_a, validateJo_x, validateJo_gen_order)
// validateJo_c := mulmod(validateJo_challenge, validateJo_x, validateJo_gen_order)
// mstore(validateJo_i_1, keccak256(validateJo_i_1, 0x20))
// kn := addmod(kn, sub(gen_order, k), gen_order)
// let x := mod(mload(i_1), gen_order)
// k := mulmod(k, x, gen_order)
// a := mulmod(a, x, gen_order)
// c := mulmod(challenge, x, gen_order)
// mstore(i_1, keccak256(i_1, 0x20))
// }
// case 0 {
// validateJo_kn := addmod(validateJo_kn, validateJo_k, validateJo_gen_order)
// kn := addmod(kn, k, gen_order)
// }
// let validateJo_2 := 0x40
// calldatacopy(0xe0, add(validateJo_1, 164), validateJo_2)
// calldatacopy(0x20, add(validateJo_1, 100), validateJo_2)
// mstore(0x120, sub(validateJo_gen_order, validateJo_c))
// mstore(0x60, validateJo_k)
// mstore(0xc0, validateJo_a)
// let validateJo_result := call(gas(), 7, validateJo_i_1, 0xe0, 0x60, 0x1a0, validateJo_2)
// let validateJo_result_1 := and(validateJo_result, call(gas(), 7, validateJo_i_1, 0x20, 0x60, 0x120, validateJo_2))
// let validateJo_result_2 := and(validateJo_result_1, call(gas(), 7, validateJo_i_1, validateJo, 0x60, 0x160, validateJo_2))
// let validateJo_result_3 := and(validateJo_result_2, call(gas(), 6, validateJo_i_1, 0x120, validateJo, 0x160, validateJo_2))
// validateJo_result := and(validateJo_result_3, call(gas(), 6, validateJo_i_1, 0x160, validateJo, validateJo_b, validateJo_2))
// if eq(validateJo_i, validateJo_m)
// let _3 := 0x40
// calldatacopy(0xe0, add(_2, 164), _3)
// calldatacopy(0x20, add(_2, 100), _3)
// mstore(0x120, sub(gen_order, c))
// let _4 := 0x60
// mstore(_4, k)
// mstore(0xc0, a)
// let result := call(gas(), 7, i_1, 0xe0, _4, 0x1a0, _3)
// let result_1 := and(result, call(gas(), 7, i_1, 0x20, _4, 0x120, _3))
// let result_2 := and(result_1, call(gas(), 7, i_1, _1, _4, 0x160, _3))
// let result_3 := and(result_2, call(gas(), 6, i_1, 0x120, _1, 0x160, _3))
// result := and(result_3, call(gas(), 6, i_1, 0x160, _1, b, _3))
// if eq(i, m)
// {
// mstore(0x260, mload(0x20))
// mstore(0x280, mload(validateJo_2))
// mstore(0x280, mload(_3))
// mstore(0x1e0, mload(0xe0))
// mstore(0x200, sub(0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47, mload(0x100)))
// }
// if gt(validateJo_i, validateJo_m)
// if gt(i, m)
// {
// mstore(0x60, validateJo_c)
// let validateJo_result_4 := and(validateJo_result, call(gas(), 7, validateJo_i_1, 0x20, 0x60, 0x220, validateJo_2))
// let validateJo_result_5 := and(validateJo_result_4, call(gas(), 6, validateJo_i_1, 0x220, validateJo, 0x260, validateJo_2))
// validateJo_result := and(validateJo_result_5, call(gas(), 6, validateJo_i_1, 0x1a0, validateJo, 0x1e0, validateJo_2))
// mstore(_4, c)
// let result_4 := and(result, call(gas(), 7, i_1, 0x20, _4, 0x220, _3))
// let result_5 := and(result_4, call(gas(), 6, i_1, 0x220, _1, 0x260, _3))
// result := and(result_5, call(gas(), 6, i_1, 0x1a0, _1, 0x1e0, _3))
// }
// if iszero(validateJo_result)
// if iszero(result)
// {
// mstore(validateJo_i_1, 400)
// revert(validateJo_i_1, 0x20)
// mstore(i_1, 400)
// revert(i_1, 0x20)
// }
// validateJo_b := add(validateJo_b, validateJo_2)
// b := add(b, _3)
// }
// if lt(validateJo_m, validateJo_n)
// if lt(m, n)
// {
// validatePairing(0x64)
// }
// if iszero(eq(mod(keccak256(0x2a0, add(validateJo_b, 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd60)), validateJo_gen_order), validateJo_challenge))
// if iszero(eq(mod(keccak256(0x2a0, add(b, 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd60)), gen_order), challenge))
// {
// mstore(validateJo_i_1, 404)
// revert(validateJo_i_1, 0x20)
// mstore(i_1, 404)
// revert(i_1, 0x20)
// }
// mstore(validateJo_i_1, 0x01)
// return(validateJo_i_1, 0x20)
// mstore(validateJo_i_1, 404)
// revert(validateJo_i_1, 0x20)
// mstore(i_1, 0x01)
// return(i_1, 0x20)
// mstore(i_1, 404)
// revert(i_1, 0x20)
// function validatePairing(t2)
// {
// let t2_x := calldataload(t2)

View File

@ -19,10 +19,10 @@
// ----
// fullSuite
// {
// let allocate := 0x40
// mstore(allocate, add(mload(allocate), 0x20))
// let allocate_p := mload(allocate)
// mstore(allocate, add(allocate_p, allocate))
// mstore(add(allocate_p, 96), 2)
// mstore(allocate, 0x20)
// let _1 := 0x40
// mstore(_1, add(mload(_1), 0x20))
// let p := mload(_1)
// mstore(_1, add(p, _1))
// mstore(add(p, 96), 2)
// mstore(_1, 0x20)
// }