Last active
June 9, 2021 14:00
-
-
Save ekpyron/b5a00f3d09b132ed415acd4fb51b929a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// test/libsolidity/semanticTests/calldata/calldata_internal_function_pointer.sol --evm-version homestead --optimize | |
// function call to g() reverts, even though it should not | |
object "C_71" { | |
code { | |
{ | |
mstore(64, 128) | |
if callvalue() { revert(0, 0) } | |
sstore(0x00, or(and(sload(0x00), not(sub(exp(2, 64), 1))), 28)) | |
let _1 := datasize("C_71_deployed") | |
codecopy(128, dataoffset("C_71_deployed"), _1) | |
return(128, _1) | |
} | |
} | |
object "C_71_deployed" { | |
code { | |
{ | |
let _1 := 64 | |
mstore(_1, 128) | |
if iszero(lt(calldatasize(), 4)) | |
{ | |
let _2 := 0 | |
switch div(calldataload(_2), exp(2, 224)) | |
case 0xb2e4ec10 { | |
if callvalue() { revert(_2, _2) } | |
if slt(add(calldatasize(), not(3)), 32) { revert(_2, _2) } | |
let offset := calldataload(4) | |
let _3 := 0xffffffffffffffff | |
if gt(offset, _3) { revert(_2, _2) } | |
if iszero(slt(add(offset, 35), calldatasize())) { revert(_2, _2) } | |
let length := calldataload(add(4, offset)) | |
if gt(length, _3) { revert(_2, _2) } | |
if gt(add(add(offset, length), 36), calldatasize()) { revert(_2, _2) } | |
let value := and(sload(_2), _3) | |
let out := _2 | |
switch value | |
case 28 { | |
if iszero(lt(0x02, length)) { panic_error_0x32() } | |
out := and(calldataload(add(offset, 38)), 0xff00000000000000000000000000000000000000000000000000000000000000) | |
} | |
default { | |
mstore(_2, 35408467139433450592217433187231851964531694900788300625387963629091585785856) | |
mstore(4, 0x51) | |
revert(_2, 36) | |
} | |
let memPos := mload(_1) | |
mstore(memPos, and(out, 0xff00000000000000000000000000000000000000000000000000000000000000)) | |
return(memPos, 32) | |
} | |
case 0xe2179b8e { | |
if callvalue() { revert(_2, _2) } | |
if slt(add(calldatasize(), not(3)), _2) { revert(_2, _2) } | |
let memPtr := mload(_1) | |
let newFreePtr := add(memPtr, 96) | |
let _4 := 0xffffffffffffffff | |
if or(gt(newFreePtr, _4), lt(newFreePtr, memPtr)) { panic_error_0x41() } | |
mstore(_1, newFreePtr) | |
mstore(memPtr, 0x22) | |
let _5 := 32 | |
calldatacopy(add(memPtr, _5), calldatasize(), _1) | |
if iszero(lt(0x02, mload(memPtr))) { panic_error_0x32() } | |
mstore8(add(memPtr, 0x22), 0x07) | |
mstore(add(mload(_1), _5), _2) | |
if iszero(extcodesize(address())) { revert(_2, _2) } | |
let _6 := mload(_1) | |
mstore(_6, 0xb2e4ec1000000000000000000000000000000000000000000000000000000000) | |
mstore(add(_6, 4), _5) | |
let length_1 := mload(memPtr) | |
mstore(add(_6, 36), length_1) | |
let i := _2 | |
for { } lt(i, length_1) { i := add(i, _5) } | |
{ | |
mstore(add(add(_6, i), 68), mload(add(add(memPtr, i), _5))) | |
} | |
if gt(i, length_1) | |
{ | |
mstore(add(add(_6, length_1), 68), _2) | |
} | |
let _7 := call(add(gas(), not(49)), address(), _2, _6, add(sub(add(_6, and(add(length_1, 31), not(31))), _6), 68), _6, _5) | |
if iszero(_7) { revert(_2, _2) } | |
let expr := _2 | |
if _7 | |
{ | |
let newFreePtr_1 := add(_6, _5) | |
if or(gt(newFreePtr_1, _4), lt(newFreePtr_1, _6)) { panic_error_0x41() } | |
mstore(_1, newFreePtr_1) | |
let value_1 := mload(_6) | |
if iszero(eq(value_1, and(value_1, 0xff00000000000000000000000000000000000000000000000000000000000000))) { revert(_2, _2) } | |
expr := value_1 | |
} | |
let memPos_1 := mload(_1) | |
mstore(memPos_1, and(expr, 0xff00000000000000000000000000000000000000000000000000000000000000)) | |
return(memPos_1, _5) | |
} | |
} | |
revert(0, 0) | |
} | |
function panic_error_0x32() | |
{ | |
mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856) | |
mstore(4, 0x32) | |
revert(0, 0x24) | |
} | |
function panic_error_0x41() | |
{ | |
mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856) | |
mstore(4, 0x41) | |
revert(0, 0x24) | |
} | |
} | |
} | |
} | |
// ==== | |
// stackOptimization: true | |
// ---- | |
// /* "":61:64 */ | |
// 0x80 // [ 128 ] | |
// /* "":57:59 */ | |
// 0x40 // [ 128, 64 ] | |
// /* "":50:65 */ | |
// mstore // [] statement correct | |
// /* "":81:92 */ | |
// jumpi(tag_1, callvalue) // [] condition correct | |
// tag_2: // [] | |
// /* "":181:183 */ | |
// 0x1c // [ 28 ] | |
// /* "":175:176 */ | |
// 0x01 // [ 28, 1 ] | |
// /* "":170:172 */ | |
// 0x40 // [ 28, 1, 64 ] | |
// /* "":167:168 */ | |
// 0x02 // [ 28, 1, 64, 2 ] | |
// /* "":163:173 */ | |
// exp // [ 28, 1, exp(2,64) ] | |
// /* "":159:177 */ | |
// sub // [ 28, sub(exp(2,64),1) ] | |
// /* "":155:178 */ | |
// not // [ 28, not(sub(exp(2,64),1)) ] | |
// /* "":148:152 */ | |
// 0x00 // [ 28, not(sub(exp(2,64),1)), 0x00 ] | |
// /* "":142:153 */ | |
// sload // [ 28, not(sub(exp(2,64),1)), sload(0x00) ] | |
// /* "":138:179 */ | |
// and // [ 28, and(sload(0x00),not(sub(exp(2,64),1))) ] | |
// /* "":135:184 */ | |
// or // [ or(and(sload(0x00),not(sub(exp(2,64),1))),28) ] | |
// /* "":129:133 */ | |
// 0x00 // [ or(and(sload(0x00),not(sub(exp(2,64),1))), 28), 0x00 ] | |
// /* "":122:185 */ | |
// sstore // [ ] statement correct | |
// /* "":208:233 */ | |
// dataSize(sub_0) // [ dataSize(sub_0) ] | |
// dup1 // [ dataSize(sub_0), dataSize(sub_0) ] | |
// /* "":260:287 */ | |
// dataOffset(sub_0) // [ dataSize(sub_0), dataSize(sub_0), dataOffset(sub_0) ] | |
// /* "":255:258 */ | |
// 0x80 // [ dataSize(sub_0), dataSize(sub_0), dataOffset(sub_0), 128 ] | |
// /* "":246:292 */ | |
// codecopy // [ dataSize(sub_0) ] statement correct | |
// /* "":312:315 */ | |
// 0x80 // [ dataSize(sub_0), 128 ] | |
// /* "":305:320 */ | |
// return // [ ] statement correct | |
// tag_1: // [] | |
// /* "":105:106 */ | |
// 0x00 // [ 0x00 ] | |
// dup1 // [ 0x00, 0x00 ] | |
// /* "":95:107 */ | |
// revert // [ revert ] | |
// stop | |
// | |
// sub_0: assembly { | |
// /* "":421:423 */ | |
// 0x40 // [ _1 ] | |
// /* "":451:454 */ | |
// 0x80 // [ _1, 128 ] | |
// dup2 // [ _1, 128, _1 ] | |
// /* "":440:455 */ | |
// mstore // [ _1 ] statement correct | |
// /* "":501:502 */ | |
// 0x04 // [ _1, 0x04 ] | |
// /* "":485:499 */ | |
// calldatasize // [ _1, 0x04, calldatasize() ] | |
// /* "":482:503 */ | |
// lt // [ _1, lt(calldatasize(),0x04) ] | |
// /* "":475:504 */ | |
// iszero // [ _1, iszero(lt(calldatasize(),0x04)) ] | |
// tag_1 // [ _1, iszero(lt(calldatasize(),0x04)), tag_1 ] | |
// jumpi // [ _1 ] condition correct | |
// tag_2: // [ JUNK ] | |
// pop // [ ] | |
// /* "":4867:4868 */ | |
// 0x00 // [ 0x00 ] | |
// dup1 // [ 0x00, 0x00 ] | |
// /* "":4857:4869 */ | |
// revert // [ ] statement correct | |
// tag_1: // [ _1 ] | |
// /* "":553:554 */ | |
// 0x00 // [ _1, _2 ] | |
// /* "":611:614 */ | |
// 0xe0 // [ _1, _2, 224 ] | |
// /* "":608:609 */ | |
// 0x02 // [ _1, _2, 224, 2 ] | |
// /* "":604:615 */ | |
// exp // [ _1, _2, exp(2,224) ] | |
// dup2 // [ _1, _2, exp(2,224), _2 ] | |
// /* "":586:602 */ | |
// calldataload // [ _1, _2, exp(2,224), calldataload(_2) ] | |
// /* "":582:616 */ | |
// div // [ _1, _2, div(calldataload(_2),exp(2,224)) ] = [ _1, _2, switchExpression ] | |
// dup1 // [ _1, _2, switchExpression, switchExpression ] | |
// /* "":642:652 */ | |
// 0xb2e4ec10 // [ _1, _2, switchExpression, switchExpression, 0xb2e4ec10 ] | |
// eq // [ _1, _2, switchExpression, eq(0xb2e4ec10,switchExpression) ] | |
// tag_3 // [ _1, _2, switchExpression, eq(0xb2e4ec10,switchExpression), tag_3 ] | |
// jumpi // [ _1, _2, switchExpression ] condition correct | |
// tag_4: // note: unused tag | |
// /* "":2206:2216 */ | |
// 0xe2179b8e // [ _1, _2, switchExpression, 0xe2179b8e ] | |
// eq // [ _1, _2, eq(0xe2179b8e,switchExpression) ] | |
// tag_5 // [ _1, _2, eq(0xe2179b8e,switchExpression), tag_5 ] | |
// jumpi // [ _1, _2 ] condition correct | |
// tag_6: // [ _1, _2 ] code after switch | |
// pop // [ _1 ] | |
// pop // [ ] | |
// pc // [ JUNK ] note: better not to pop before, i.e. stack shuffling should be junk-aware | |
// jump(tag_2) // layout compatible | |
// tag_5: // [ _1, _2 ] start of switch case 0xe2179b8e | |
// /* "":2246:2257 */ | |
// jumpi(tag_7, callvalue) // [ _1, _2 ] condition correct | |
// tag_8: | |
// dup1 // [ _1, _2, _2 ] | |
// /* "":2332:2333 */ | |
// 0x03 // [ _1, _2, _2, 3 ] | |
// /* "":2328:2334 */ | |
// not // [ _1, _2, _2, not(3) ] | |
// /* "":2312:2326 */ | |
// calldatasize // [ _1, _2, _2, not(3), calldatasize() ] | |
// /* "":2308:2335 */ | |
// add // [ _1, _2, _2, add(calldatasize(),not(3)) ] | |
// /* "":2304:2340 */ | |
// slt // [ _1, _2, slt(add(calldatasize(),not(3)),_2) ] | |
// tag_9 // [ _1, _2, slt(add(calldatasize(),not(3)),_2), tag_9 ] | |
// jumpi // [ _1, _2 ] condition correct | |
// tag_10: | |
// dup2 // [ _1, _2, _1 ] | |
// /* "":2398:2407 */ | |
// mload // [ _1, _2, mload(_1) ] = [ _1, _2, memPtr ] | |
// swap2 // [ memPtr, _2, _1 ] | |
// dup3 // [ memPtr, _2, _1, memPtr ] | |
// /* "":2462:2464 */ | |
// 0x60 // [ memPtr, _2, _1, memPtr, 96 ] | |
// swap1 // [ memPtr, _2, _1, 96, memPtr ] | |
// /* "":2450:2465 */ | |
// add // [ memPtr, _2, _1, add(memPtr,96) ] = [ memPtr, _2, _1, newFreePtr ] | |
// swap2 // [ memPtr, newFreePtr, _1, _2 ] | |
// /* "":2500:2518 */ | |
// 0xffffffffffffffff // [ memPtr, newFreePtr, _1, _2, 0xff..ff ] = [ memPtr, newFreePtr, _1, _2, _4 ] | |
// swap3 // [ memPtr, _4, _1, _2, newFreePtr ] | |
// dup1 // [ memPtr, _4, _1, _2, newFreePtr, newFreePtr ] | |
// dup6 // [ memPtr, _4, _1, _2, newFreePtr, newFreePtr, memPtr ] | |
// swap1 // [ memPtr, _4, _1, _2, newFreePtr, memPtr, newFreePtr ] | |
// /* "":2569:2591 */ | |
// lt // [ memPtr, _4, _1, _2, newFreePtr, lt(newFreePtr,memPtr) ] | |
// dup5 // [ memPtr, _4, _1, _2, newFreePtr, lt(newFreePtr,memPtr), _4 ] | |
// dup3 // [ memPtr, _4, _1, _2, newFreePtr, lt(newFreePtr,memPtr), _4, newFreePtr ] | |
// /* "":2549:2567 */ | |
// gt // [ memPtr, _4, _1, _2, newFreePtr, lt(newFreePtr,memPtr), gt(newFreePtr,_4) ] | |
// /* "":2546:2592 */ | |
// or // [ memPtr, _4, _1, _2, newFreePtr, or(gt(newFreePtr,_4),lt(newFreePtr,memPtr)) ] | |
// tag_11 // [ memPtr, _4, _1, _2, newFreePtr, or(gt(newFreePtr,_4),lt(newFreePtr,memPtr)), tag_11 ] | |
// jumpi // [ memPtr, _4, _1, _2, newFreePtr ] condition correct | |
// tag_12: | |
// dup3 // [ memPtr, _4, _1, _2, newFreePtr, _1 ] | |
// /* "":2640:2662 */ | |
// mstore // [ memPtr, _4, _1, _2 ] statement correct | |
// /* "":2702:2706 */ | |
// 0x22 // [ memPtr, _4, _1, _2, 0x22 ] | |
// dup5 // [ memPtr, _4, _1, _2, 0x22, memPtr ] | |
// /* "":2687:2707 */ | |
// mstore // [ memPtr, _4, _1, _2 ] statement correct | |
// /* "":2742:2744 */ | |
// 0x20 // [ memPtr, _4, _1, _2, 32 ] = [ memPtr, _4, _1, _2, _5 ] | |
// swap4 // [ _5, _4, _1, _2, memPtr ] | |
// dup3 // [ _5, _4, _1, _2, memPtr, _1 ] | |
// /* "":2799:2813 */ | |
// calldatasize // [ _5, _4, _1, _2, memPtr, _1, calldatasize() ] | |
// dup7 // [ _5, _4, _1, _2, memPtr, _1, calldatasize(), _5 ] | |
// dup4 // [ _5, _4, _1, _2, memPtr, _1, calldatasize(), _5, memPtr ] | |
// /* "":2782:2797 */ | |
// add // [ _5, _4, _1, _2, memPtr, _1, calldatasize(), add(memPtr,_5) ] | |
// /* "":2769:2818 */ | |
// calldatacopy // [ _5, _4, _1, _2, memPtr ] statement correct | |
// dup1 // [ _5, _4, _1, _2, memPtr, memPtr ] | |
// /* "":2862:2875 */ | |
// mload // [ _5, _4, _1, _2, memPtr, mload(memPtr) ] | |
// /* "":2856:2860 */ | |
// 0x02 // [ _5, _4, _1, _2, memPtr, mload(memPtr), 2 ] | |
// /* "":2853:2876 */ | |
// lt // [ _5, _4, _1, _2, memPtr, lt(2,mload(memPtr)) ] | |
// /* "":2846:2877 */ | |
// iszero // [ _5, _4, _1, _2, memPtr, iszero(lt(2,mload(memPtr))) ] | |
// tag_13 // [ _5, _4, _1, _2, memPtr, iszero(lt(2,mload(memPtr))), tag_13 ] | |
// jumpi // [ _5, _4, _1, _2, memPtr ] condition correct | |
// tag_14: // [ _5, _4, _1, _2, memPtr ] | |
// /* "":2952:2956 */ | |
// 0x07 // [ _5, _4, _1, _2, memPtr, 0x07 ] | |
// /* "":2945:2949 */ | |
// 0x22 // [ _5, _4, _1, _2, memPtr, 0x07, 0x22 ] | |
// dup3 // [ _5, _4, _1, _2, memPtr, 0x07, 0x22, memPtr ] | |
// /* "":2933:2950 */ | |
// add // [ _5, _4, _1, _2, memPtr, 0x07, add(memPtr,0x22) ] | |
// /* "":2925:2957 */ | |
// mstore8 // [ _5, _4, _1, _2, memPtr ] statement correct | |
// dup2 // [ _5, _4, _1, _2, memPtr, _2 ] | |
// dup6 // [ _5, _4, _1, _2, memPtr, _2, _5 ] | |
// dup5 // [ _5, _4, _1, _2, memPtr, _2, _5, _1 ] | |
// /* "":2993:3002 */ | |
// mload // [ _5, _4, _1, _2, memPtr, _2, _5, mload(_1) ] | |
// /* "":2989:3007 */ | |
// add // [ _5, _4, _1, _2, memPtr, _2, add(mload(_1),_5) ] | |
// /* "":2982:3012 */ | |
// mstore // [ _5, _4, _1, _2, memPtr ] statement correct | |
// /* "":3059:3068 */ | |
// address // [ _5, _4, _1, _2, memPtr, address() ] | |
// /* "":3047:3069 */ | |
// extcodesize // [ _5, _4, _1, _2, memPtr, extcodesize(address()) ] | |
// /* "":3040:3070 */ | |
// iszero // [ _5, _4, _1, _2, memPtr, iszero(extcodesize(address())) ] | |
// tag_15 // [ _5, _4, _1, _2, memPtr, iszero(extcodesize(address())), tag_15 ] | |
// jumpi // [ _5, _4, _1, _2, memPtr ] condition correct | |
// tag_16: | |
// dup3 // [ _5, _4, _1, _2, memPtr, _1 ] | |
// /* "":3124:3133 */ | |
// mload // [ _5, _4, _1, _2, memPtr, mload(_1) ] = [ _5, _4, _1, _2, memPtr, _6 ] | |
// swap1 // [ _5, _4, _1, _2, memPtr, mload(_1) ] = [ _5, _4, _1, _2, _6, memPtr ] | |
// dup2 // [ _5, _4, _1, _2, memPtr, mload(_1) ] = [ _5, _4, _1, _2, _6, memPtr, _6 ] | |
// /* "":3169:3235 */ | |
// 0xb2e4ec1000000000000000000000000000000000000000000000000000000000 // [ _5, _4, _1, _2, memPtr, mload(_1) ] = [ _5, _4, _1, _2, _6, memPtr, _6, left(0xb2e4ec1) ] | |
// swap1 // [ _5, _4, _1, _2, memPtr, mload(_1) ] = [ _5, _4, _1, _2, _6, memPtr, left(0xb2e4ec1), _6 ] | |
// /* "":3158:3236 */ | |
// mstore // [ _5, _4, _1, _2, memPtr, mload(_1) ] = [ _5, _4, _1, _2, _6, memPtr ] statement correct | |
// dup6 // [ _5, _4, _1, _2, _6, memPtr, _5 ] | |
// /* "":3276:3277 */ | |
// 0x04 // [ _5, _4, _1, _2, _6, memPtr, _5, 4 ] | |
// dup4 // [ _5, _4, _1, _2, _6, memPtr, _5, 4, _6 ] | |
// /* "":3268:3278 */ | |
// add // [ _5, _4, _1, _2, _6, memPtr, _5, add(_6,4) ] | |
// /* "":3261:3283 */ | |
// mstore // [ _5, _4, _1, _2, _6, memPtr ] statement correct | |
// dup2 // [ _5, _4, _1, _2, _6, memPtr, _6 ] | |
// dup2 // [ _5, _4, _1, _2, _6, memPtr, _6, memPtr ] | |
// /* "":3324:3337 */ | |
// mload // [ _5, _4, _1, _2, _6, memPtr, _6, mload(memPtr) ] = [ _5, _4, _1, _2, _6, memPtr, _6, length_1 ] | |
// swap2 // [ _5, _4, _1, _2, _6, length_1, _6, memPtr ] | |
// dup3 // [ _5, _4, _1, _2, _6, length_1, _6, memPtr, length_1 ] | |
// dup3 // [ _5, _4, _1, _2, _6, length_1, _6, memPtr, length_1, _6 ] | |
// /* "":3377:3379 */ | |
// 0x24 // [ _5, _4, _1, _2, _6, length_1, _6, memPtr, length_1, _6, 36 ] | |
// swap1 // [ _5, _4, _1, _2, _6, length_1, _6, memPtr, length_1, 36, _6 ] | |
// /* "":3369:3380 */ | |
// add // [ _5, _4, _1, _2, _6, length_1, _6, memPtr, length_1, add(_6,36) ] | |
// /* "":3362:3391 */ | |
// mstore // [ _5, _4, _1, _2, _6, length_1, _6, memPtr ] statement correct | |
// dup5 // [ _5, _4, _1, _2, _6, length_1, _6, memPtr, _2 ] = [ _5, _4, _1, _2, _6, length_1, _6, memPtr, i ] | |
// swap1 // [ _5, _4, _1, _2, _6, length_1, _6, i, memPtr ] | |
// jump(tag_17) // entering for loop | |
// tag_17: // [ _5, _4, _1, _2, _6, length_1, _6, i, memPtr ] for loop condition | |
// dup4 // [ _5, _4, _1, _2, _6, length_1, _6, i, memPtr, length_1 ] | |
// dup3 // [ _5, _4, _1, _2, _6, length_1, _6, i, memPtr, length_1, i ] | |
// /* "":3460:3475 */ | |
// lt // [ _5, _4, _1, _2, _6, length_1, _6, i, memPtr, lt(i,length_1) ] | |
// tag_18 // [ _5, _4, _1, _2, _6, length_1, _6, i, memPtr, lt(i,length_1), tag_18 ] | |
// jumpi // [ _5, _4, _1, _2, _6, length_1, _6, i, memPtr ] condition correct | |
// tag_19: // [ _5, _4, _1, _2, _6, length_1, _6, i, memPtr ] after for loop | |
// pop // [ _5, _4, _1, _2, _6, length_1, _6, i ] | |
// dup3 // [ _5, _4, _1, _2, _6, length_1, _6, i, length_1 ] | |
// /* "":3932:3934 */ | |
// 0x44 // [ _5, _4, _1, _2, _6, length_1, _6, i, length_1, 68 ] | |
// swap4 // [ _5, _4, _1, _2, _6, 68, _6, i, length_1, length_1 ] | |
// swap2 // [ _5, _4, _1, _2, _6, 68, _6, length_1, length_1, i ] | |
// /* "":3663:3678 */ | |
// gt // [ _5, _4, _1, _2, _6, 68, _6, length_1, gt(i,length_1) ] | |
// tag_20 // [ _5, _4, _1, _2, _6, 68, _6, length_1, gt(i,length_1), tag_20 ] | |
// jumpi // [ _5, _4, _1, _2, _6, 68, _6, length_1 ] condition correct | |
// tag_21: // [ _5, _4, _1, _2, _6, 68, _6, length_1 ] | |
// /* "":3911:3913 */ | |
// 0x1f // [ _5, _4, _1, _2, _6, 68, _6, length_1, 31 ] | |
// dup1 // [ _5, _4, _1, _2, _6, 68, _6, length_1, 31, 31 ] | |
// /* "":3916:3923 */ | |
// not // [ _5, _4, _1, _2, _6, 68, _6, length_1, 31, not(31) ] | |
// swap2 // [ _5, _4, _1, _2, _6, 68, _6, not(31), 31, length_1 ] | |
// /* "":3897:3914 */ | |
// add // [ _5, _4, _1, _2, _6, 68, _6, not(31), add(length_1,31) ] | |
// /* "":3893:3924 */ | |
// and // [ _5, _4, _1, _2, _6, 68, _6, and(add(length_1,31),not(31)) ] | |
// dup2 // [ _5, _4, _1, _2, _6, 68, _6, and(add(length_1,31),not(31)), _6 ] | |
// /* "":3885:3925 */ | |
// add // [ _5, _4, _1, _2, _6, 68, _6, add(_6,and(add(length_1,31),not(31))) ] | |
// /* "":3881:3930 */ | |
// sub // [ _5, _4, _1, _2, _6, 68, sub(add(_6,and(add(length_1,31),not(31))),_6) ] | |
// /* "":3877:3935 */ | |
// add // [ _5, _4, _1, _2, _6, add(sub(add(_6,and(add(length_1,31),not(31))),_6),68) ] | |
// /* "":3858:3867 */ | |
// address // [ _5, _4, _1, _2, _6, add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), address() ] | |
// /* "":3852:3854 */ | |
// 0x31 // [ _5, _4, _1, _2, _6, add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), address(), 49 ] | |
// /* "":3848:3855 */ | |
// not // [ _5, _4, _1, _2, _6, add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), address(), not(49) ] | |
// /* "":3841:3846 */ | |
// gas // [ _5, _4, _1, _2, _6, add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), address(), not(49), gas() ] | |
// dup9 // [ _5, _4, _1, _2, _6, add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), address(), not(49), gas(), _5 ] | |
// swap4 // [ _5, _4, _1, _2, _6, _5, address(), not(49), gas(), add(sub(add(_6,and(add(length_1,31),not(31))),_6),68) ] | |
// swap2 // [ _5, _4, _1, _2, _6, _5, address(), add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), gas(), not(49) ] | |
// dup6 // [ _5, _4, _1, _2, _6, _5, address(), add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), gas(), not(49), _6 ] | |
// swap4 // [ _5, _4, _1, _2, _6, _5, _6, add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), gas(), not(49), address() ] | |
// dup5 // [ _5, _4, _1, _2, _6, _5, _6, add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), gas(), not(49), address(), _6 ] | |
// swap3 // [ _5, _4, _1, _2, _6, _5, _6, add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), _6, not(49), address(), gas() ] | |
// dup9 // [ _5, _4, _1, _2, _6, _5, _6, add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), _6, not(49), address(), gas(), _2 ] | |
// swap3 // [ _5, _4, _1, _2, _6, _5, _6, add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), _6, _2, address(), gas(), not(49) ] | |
// swap1 // [ _5, _4, _1, _2, _6, _5, _6, add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), _6, _2, address(), not(49), gas() ] | |
// /* "":3837:3856 */ | |
// add // [ _5, _4, _1, _2, _6, _5, _6, add(sub(add(_6,and(add(length_1,31),not(31))),_6),68), _6, _2, address(), add(gas(),not(49)) ] | |
// /* "":3832:3944 */ | |
// call // [ _5, _4, _1, _2, _6, _7 ] arguments correct | |
// swap4 // [ _5, _7, _1, _2, _6, _4 ] | |
// dup5 // [ _5, _7, _1, _2, _6, _4, _7 ] | |
// /* "":3972:3982 */ | |
// iszero // [ _5, _7, _1, _2, _6, _4, iszero(_7) ] | |
// tag_22 // [ _5, _7, _1, _2, _6, _4, iszero(_7), tag_22 ] | |
// jumpi // [ _5, _7, _1, _2, _6, _4 ] condition correct | |
// tag_23: | |
// dup3 // [ _5, _7, _1, _2, _6, _4, _2 ] = [ _5, _7, _1, _2, _6, _4, expr ] | |
// swap5 // [ _5, expr, _1, _2, _6, _4, _7 ] | |
// tag_24 // [ _5, expr, _1, _2, _6, _4, _7, tag_24 ] | |
// jumpi // [ _5, expr, _1, _2, _6, _4 ] condition correct | |
// tag_25: // [ _5, expr, _1, JUNK, JUNK, JUNK ] | |
// pop // [ _5, expr, _1, JUNK, JUNK ] | |
// pop // [ _5, expr, _1, JUNK ] | |
// pop // [ _5, expr, _1 ] | |
// /* "":4687:4753 */ | |
// 0xff00000000000000000000000000000000000000000000000000000000000000 // [ _5, expr, _1, left(0xff) ] | |
// swap1 // [ _5, expr, left(0xff), _1 ] | |
// /* "":4626:4635 */ | |
// mload // [ _5, expr, left(0xff), memPos_1 ] | |
// swap2 // [ _5, memPos_1, left(0xff), expr ] | |
// /* "":4677:4754 */ | |
// and // [ _5, memPos_1, and(expr,left(0xff)) ] | |
// dup2 // [ _5, memPos_1, and(expr,left(0xff)), memPos_1 ] | |
// /* "":4660:4755 */ | |
// mstore // [ _5, memPos_1 ] statement correct | |
// /* "":4780:4800 */ | |
// return // [] statement correct | |
// tag_24: // [ _5, expr, _1, _2, _6, _4 ] note: this starts of a bit curious, I guess it's generating the initial layout for the branch or does some weird compression | |
// swap1 // [ _5, expr, _1, _2, _4, _6 ] | |
// swap2 // [ _5, expr, _1, _6, _4, _2 ] | |
// swap3 // [ _5, expr, _2, _6, _4, _1 ] | |
// swap4 // [ _5, _1, _2, _6, _4, expr ] | |
// pop // [ _5, _1, _2, _6, _4 ] | |
// dup2 // [ _5, _1, _2, _6, _4, _6 ] | |
// dup6 // [ _5, _1, _2, _6, _4, _6, _5 ] | |
// swap1 // [ _5, _1, _2, _6, _4, _5, _6 ] | |
// /* "":4145:4156 */ | |
// add // [ _5, _1, _2, _6, _4, add(_6,_5) ] = [ _5, _1, _2, _6, _4, newFreePtr_1 ] | |
// swap1 // [ _5, _1, _2, _6, newFreePtr_1, _4 ] | |
// dup2 // [ _5, _1, _2, _6, newFreePtr_1, _4, newFreePtr_1 ] | |
// dup4 // [ _5, _1, _2, _6, newFreePtr_1, _4, newFreePtr_1, _6 ] | |
// swap1 // [ _5, _1, _2, _6, newFreePtr_1, _4, _6, newFreePtr_1 ] | |
// /* "":4213:4233 */ | |
// lt // [ _5, _1, _2, _6, newFreePtr_1, _4, lt(newFreePtr_1,_6) ] | |
// swap1 // [ _5, _1, _2, _6, newFreePtr_1, lt(newFreePtr_1,_6), _4 ] | |
// dup3 // [ _5, _1, _2, _6, newFreePtr_1, lt(newFreePtr_1,_6), _4, newFreePtr_1 ] | |
// /* "":4191:4211 */ | |
// gt // [ _5, _1, _2, _6, newFreePtr_1, lt(newFreePtr_1,_6), gt(newFreePtr_1,_4) ] | |
// /* "":4188:4234 */ | |
// or // [ _5, _1, _2, _6, newFreePtr_1, or(gt(newFreePtr_1,_4),lt(newFreePtr_1,_6)) ] | |
// tag_26 // [ _5, _1, _2, _6, newFreePtr_1, or(gt(newFreePtr_1,_4),lt(newFreePtr_1,_6)), tag_26 ] | |
// jumpi // [ _5, _1, _2, _6, newFreePtr_1 ] condition correct | |
// tag_27: // [ _5, _1, _2, _6, newFreePtr_1 ] | |
// dup4 // [ _5, _1, _2, _6, newFreePtr_1, _1 ] | |
// /* "":4286:4310 */ | |
// mstore // [ _5, _1, _2, _6 ] statement correct | |
// /* "":4354:4363 */ | |
// mload // [ _5, _1, _2, mload(_6) ] = [ _5, _1, _2, value_1 ] | |
// swap1 // [ _5, _1, value_1, _2 ] | |
// dup2 // [ _5, _1, value_1, _2, value_1 ] | |
// /* "":4427:4493 */ | |
// 0xff00000000000000000000000000000000000000000000000000000000000000 // [ _5, _1, value_1, _2, value_1, left(0xff) ] | |
// swap1 // [ _5, _1, value_1, _2, left(0xff), value_1 ] | |
// /* "":4414:4494 */ | |
// and // [ _5, _1, value_1, _2, and(value_1,left(0xff)) ] | |
// dup3 // [ _5, _1, value_1, _2, and(value_1,left(0xff)), value_1 ] | |
// /* "":4402:4495 */ | |
// eq // [ _5, _1, value_1, _2, eq(value_1,and(value_1,left(0xff))) ] | |
// /* "":4395:4496 */ | |
// iszero // [ _5, _1, value_1, _2, iszero(eq(value_1,and(value_1,left(0xff)))) ] | |
// tag_28 // [ _5, _1, value_1, _2, iszero(eq(value_1,and(value_1,left(0xff)))), tag_28 ] | |
// jumpi // [ _5, _1, value_1, _2 ] condition correct | |
// tag_29: // [ _5, _1, value_1, _2 ] | |
// pop // [ _5, _1, value_1 ] | |
// /* "":4687:4753 */ | |
// 0xff00000000000000000000000000000000000000000000000000000000000000 // [ _5, _1, value_1, left(0xff) ] | |
// swap1 // [ _5, _1, left(0xff), value_1 ] | |
// swap2 // [ _5, value_1, left(0xff), _1 ] | |
// swap1 // [ _5, value_1, _1, left(0xff) ] | |
// pop // [ _5, value_1, _1 ] | |
// pc // [ _5, value_1, _1, JUNK ] | |
// dup1 // [ _5, value_1, _1, JUNK, JUNK ] | |
// dup1 // [ _5, value_1, _1, JUNK, JUNK, JUNK ] | |
// jump(tag_25) // correct layout, given the expr := value_1 assignment in the branch | |
// tag_28: // [ _5, _1, value_1, _2 ] | |
// swap3 // [ _2, _1, value_1, _5 ] | |
// pop // [ _2, _1, value_1 ] | |
// pop // [ _2, _1 ] | |
// pop // [ _2 ] | |
// dup1 // [ _2, _2 ] | |
// /* "":4499:4513 */ | |
// revert // [] statement correct | |
// tag_26: // [ _5, _1, _2, _6, newFreePtr_1 ] | |
// tag_30 // [ _5, _1, _2, _6, newFreePtr_1, tag_30 ] | |
// /* "":4237:4255 */ | |
// tag_31 // [ _5, _1, _2, _6, newFreePtr_1, tag_30, tag_31 ] | |
// jump // in panic_error_0x41([RET]) | |
// tag_30: // unreachable | |
// jump(tag_27) | |
// tag_22: // [ _5, _7, _1, _2, _6, _4 ] | |
// pop // [ _5, _7, _1, _2, _6 ] | |
// pop // [ _5, _7, _1, _2 ] | |
// swap3 // [ _2, _7, _1, _5 ] | |
// pop // [ _2, _7, _1 ] | |
// pop // [ _2, _7 ] | |
// pop // [ _2 ] | |
// dup1 // [ _2, _2 ] | |
// /* "":3985:3999 */ | |
// revert // [ ] statement correct | |
// tag_20: // [ _5, _4, _1, _2, _6, 68, _6, length_1 ] | |
// dup5 // [ _5, _4, _1, _2, _6, 68, _6, length_1, _2 ] | |
// dup4 // [ _5, _4, _1, _2, _6, 68, _6, length_1, _2, 68 ] | |
// dup3 // [ _5, _4, _1, _2, _6, 68, _6, length_1, _2, 68, length_1 ] | |
// dup5 // [ _5, _4, _1, _2, _6, 68, _6, length_1, _2, 68, length_1, _6 ] | |
// /* "":3744:3761 */ | |
// add // [ _5, _4, _1, _2, _6, 68, _6, length_1, _2, 68, add(_6,length_1) ] | |
// /* "":3740:3766 */ | |
// add // [ _5, _4, _1, _2, _6, 68, _6, length_1, _2, add(add(_6,length_1),68) ] | |
// /* "":3733:3771 */ | |
// mstore // [ _5, _4, _1, _2, _6, 68, _6, length_1 ] statement correct | |
// jump(tag_21) // layout matches | |
// tag_18: // [ _5, _4, _1, _2, _6, length_1, _6, i, memPtr ] for loop body | |
// swap2 // [ _5, _4, _1, _2, _6, length_1, memPtr, i, _6 ] | |
// pop // [ _5, _4, _1, _2, _6, length_1, memPtr, i ] | |
// dup2 // [ _5, _4, _1, _2, _6, length_1, memPtr, i, memPtr ] | |
// dup2 // [ _5, _4, _1, _2, _6, length_1, memPtr, i, memPtr, i ] | |
// dup10 // [ _5, _4, _1, _2, _6, length_1, memPtr, i, memPtr, i, _5 ] | |
// swap2 // [ _5, _4, _1, _2, _6, length_1, memPtr, i, _5, i, memPtr ] | |
// /* "":3588:3602 */ | |
// add // [ _5, _4, _1, _2, _6, length_1, memPtr, i, _5, add(memPtr,i) ] | |
// /* "":3584:3607 */ | |
// add // [ _5, _4, _1, _2, _6, length_1, memPtr, i, add(add(memPtr,i),_5) ] | |
// /* "":3578:3608 */ | |
// mload // [ _5, _4, _1, _2, _6, length_1, memPtr, i, mload(add(add(memPtr,i),_5)) ] | |
// dup2 // [ _5, _4, _1, _2, _6, length_1, memPtr, i, mload(add(add(memPtr,i),_5)), i ] | |
// dup6 // [ _5, _4, _1, _2, _6, length_1, memPtr, i, mload(add(add(memPtr,i),_5)), i, _6 ] | |
// /* "":3561:3571 */ | |
// add // [ _5, _4, _1, _2, _6, length_1, memPtr, i, mload(add(add(memPtr,i),_5)), add(_6,i) ] | |
// dup10 // [ _5, _4, _1, _2, _6, length_1, memPtr, i, mload(add(add(memPtr,i),_5)), add(_6,i), _5 ] | |
// swap3 // [ _5, _4, _1, _2, _6, length_1, memPtr, _5, mload(add(add(memPtr,i),_5)), add(_6,i), i ] | |
// swap1 // [ _5, _4, _1, _2, _6, length_1, memPtr, _5, mload(add(add(memPtr,i),_5)), i, add(_6,i) ] | |
// dup4 // [ _5, _4, _1, _2, _6, length_1, memPtr, _5, mload(add(add(memPtr,i),_5)), i, add(_6,i), _5 ] | |
// swap3 // [ _5, _4, _1, _2, _6, length_1, memPtr, _5, _5, i, add(_6,i), mload(add(add(memPtr,i),_5)) ] | |
// swap1 // [ _5, _4, _1, _2, _6, length_1, memPtr, _5, _5, i, mload(add(add(memPtr,i),_5)), add(_6,i) ] | |
// /* "":3573:3575 */ | |
// 0x44 // [ _5, _4, _1, _2, _6, length_1, memPtr, _5, _5, i, mload(add(add(memPtr,i),_5)), add(_6,i), 68 ] | |
// swap1 // [ _5, _4, _1, _2, _6, length_1, memPtr, _5, _5, i, mload(add(add(memPtr,i),_5)), 68, add(_6,i) ] | |
// /* "":3557:3576 */ | |
// add // [ _5, _4, _1, _2, _6, length_1, memPtr, _5, _5, i, mload(add(add(memPtr,i),_5)), add(add(_6,i),68) ] | |
// /* "":3550:3609 */ | |
// mstore // [ _5, _4, _1, _2, _6, length_1, memPtr, _5, _5, i ] statemeent correct | |
// /* "":3483:3493 */ | |
// add // [ _5, _4, _1, _2, _6, length_1, memPtr, _5, add(i,_5) ] = [ _5, _4, _1, _2, _6, length_1, memPtr, _5, i' ] | |
// swap2 // [ _5, _4, _1, _2, _6, length_1, i', _5, memPtr ] | |
// dup5 // [ _5, _4, _1, _2, _6, length_1, i', _5, memPtr, _6 ] | |
// swap3 // [ _5, _4, _1, _2, _6, length_1, _6, _5, memPtr, i' ] | |
// swap2 // [ _5, _4, _1, _2, _6, length_1, _6, i', memPtr, _5 ] | |
// pop // [ _5, _4, _1, _2, _6, length_1, _6, i', memPtr ] | |
// jump(tag_17) // jump back to for loop body; layout matches; i is properly updated | |
// tag_15: // [ _5, _4, _1, _2, memPtr ] note: hm, here it's getting excessive, maybe it's worth avoiding the popping | |
// pop // [ _5, _4, _1, _2 ] | |
// swap3 // [ _2, _4, _1, _5 ] | |
// pop // [ _2, _4, _1 ] | |
// pop // [ _2, _4 ] | |
// pop // [ _2 ] | |
// dup1 // [ _2, _2 ] | |
// /* "":3073:3087 */ | |
// revert // [] statement correct | |
// tag_13: // [ _5, _4, _1, _2, memPtr ] | |
// tag_32 // [ _5, _4, _1, _2, memPtr, tag_32 ] | |
// /* "":2880:2898 */ | |
// tag_33 // [ _5, _4, _1, _2, memPtr, tag_32, tag_33 ] | |
// jump // in panic_error_0x32([RET]) | |
// tag_32: // as noted elsewhere: unreachable | |
// jump(tag_14) | |
// tag_11: // [ memPtr, _4, _1, _2, newFreePtr ] | |
// tag_34 // [ memPtr, _4, _1, _2, newFreePtr, tag_34 ] | |
// /* "":2595:2613 */ | |
// tag_31 // [ memPtr, _4, _1, _2, newFreePtr, tag_34, tag_31 ] | |
// jump // in panic_error_0x41([ RET ]) | |
// tag_34: // note: this will never be reached because tag_31, resp. panic_error_0x41 never returns - need to propagate control flow side effects to user-defined functions and take them into account | |
// jump(tag_12) | |
// tag_9: // [ _1, _2 ] | |
// dup1 // [ _1, _2, _2 ] | |
// swap2 // [ _2, _2, _1 ] note: as noted a few lines down: funny thing to do | |
// pop // [ _2, _2 ] | |
// /* "":2343:2357 */ | |
// revert // [] statement correct | |
// tag_7: // [ _1, _2 ] | |
// dup1 // [ _1, _2, _2 ] | |
// swap2 // [ _2, _2, _1 ] note: funny that it does this, but makes sense and not too bad, but maybe we can avoid | |
// pop // [ _2, _2 ] | |
// /* "":2260:2274 */ | |
// revert // [] statement correct | |
// tag_3: // [ _1, _2, switchExpression ] start of switch case 0xb2e4ec10 | |
// pop // [ _1, _2 ] | |
// swap1 // [ _2, _1 ] | |
// /* "":682:693 */ | |
// jumpi(tag_35, callvalue) // [ _2, _1 ] condition correct | |
// tag_36: | |
// /* "":773:775 */ | |
// 0x20 // [ _2, _1, 32 ] | |
// /* "":768:769 */ | |
// 0x03 // [ _2, _1, 32, 3 ] | |
// /* "":764:770 */ | |
// not // [ _2, _1, 32, not(3) ] | |
// /* "":748:762 */ | |
// calldatasize // [ _2, _1, 32, not(3), calldatasize() ] | |
// /* "":744:771 */ | |
// add // [ _2, _1, 32, add(calldatasize(),not(3)) ] | |
// /* "":740:776 */ | |
// slt // [ _2, _1, slt(add(calldatasize(),not(3)),32) ] | |
// tag_37 // [ _2, _1, slt(add(calldatasize(),not(3)),32), tag_37 ] | |
// jumpi // [ _2, _1 ] condition correct | |
// tag_38: | |
// /* "":847:848 */ | |
// 0x04 // [ _2, _1, 4 ] | |
// /* "":834:849 */ | |
// calldataload // [ _2, _1, calldataload(4) ] = [ _2, _1, offset ] | |
// /* "":884:902 */ | |
// 0xffffffffffffffff // [ _2, _1, offset, 0xff..ff ] = [ _2, _1, offset, _3 ] | |
// dup1 // [ _2, _1, offset, _3, _3 ] | |
// dup3 // [ _2, _1, offset, _3, _3, offset ] | |
// /* "":930:944 */ | |
// gt // [ _2, _1, offset, _3, gt(offset,_3) ] | |
// tag_39 // [ _2, _1, offset, _3, gt(offset,_3), tag_39 ] | |
// jumpi // [ _2, _1, offset, _3 ] condition correct | |
// tag_40: | |
// /* "":1019:1033 */ | |
// calldatasize // [ _2, _1, offset, _3, calldatasize() ] | |
// /* "":1014:1016 */ | |
// 0x23 // [ _2, _1, offset, _3, calldatasize(), 35 ] | |
// dup4 // [ _2, _1, offset, _3, calldatasize(), 35, offset ] | |
// /* "":1002:1017 */ | |
// add // [ _2, _1, offset, _3, calldatasize(), add(offset,35) ] | |
// /* "":998:1034 */ | |
// slt // [ _2, _1, offset, _3, slt(add(offset,35),calldatasize()) ] | |
// /* "":991:1035 */ | |
// iszero // [ _2, _1, offset, _3, iszero(slt(add(offset,35),calldatasize())) ] | |
// tag_41 // [ _2, _1, offset, _3, iszero(slt(add(offset,35),calldatasize())), tag_41 ] | |
// jumpi // [ _2, _1, offset, _3 ] condition correct | |
// tag_42: // [ _2, _1, offset, _3 ] | |
// dup2 // [ _2, _1, offset, _3, offset ] | |
// /* "":1110:1111 */ | |
// 0x04 // [ _2, _1, offset, _3, offset, 4 ] | |
// /* "":1106:1120 */ | |
// add // [ _2, _1, offset, _3, add(4,offset) ] | |
// /* "":1093:1121 */ | |
// calldataload // [ _2, _1, offset, _3, calldataload(add(4,offset)) ] = [ _2, _1, offset, _3, length ] | |
// swap1 // [ _2, _1, offset, length, _3 ] | |
// dup2 // [ _2, _1, offset, length, _3, length ] | |
// dup2 // [ _2, _1, offset, length, _3, length, _3 ] | |
// swap1 // [ _2, _1, offset, length, _3, _3, length ] | |
// /* "":1149:1163 */ | |
// gt // [ _2, _1, offset, length, _3, gt(length,_3) ] | |
// tag_43 // [ _2, _1, offset, length, _3, gt(length,_3), tag_43 ] | |
// jumpi // [ _2, _1, offset, length, _3 ] | |
// tag_44: // [ _2, _1, offset, length, _3 ] | |
// /* "":1243:1257 */ | |
// calldatasize // [ _2, _1, offset, length, _3, calldatasize() ] | |
// /* "":1238:1240 */ | |
// 0x24 // [ _2, _1, offset, length, _3, calldatasize(), 36 ] | |
// dup4 // [ _2, _1, offset, length, _3, calldatasize(), 36, length ] | |
// dup6 // [ _2, _1, offset, length, _3, calldatasize(), 36, length, offset ] | |
// /* "":1217:1236 */ | |
// add // [ _2, _1, offset, length, _3, calldatasize(), 36, add(offset,length) ] | |
// /* "":1213:1241 */ | |
// add // [ _2, _1, offset, length, _3, calldatasize(), add(add(offset,length),36) ] | |
// /* "":1210:1258 */ | |
// gt // [ _2, _1, offset, length, _3, gt(add(add(offset,length),36),calldatasize()) ] | |
// tag_45 // [ _2, _1, offset, length, _3, gt(add(add(offset,length),36),calldatasize()), tag_45 ] | |
// jumpi // [ _2, _1, offset, length, _3 ] condition correct | |
// tag_46: | |
// dup5 // [ _2, _1, offset, length, _3, _2 ] | |
// /* "":1319:1328 */ | |
// sload // [ _2, _1, offset, length, _3, sload(_2) ] | |
// /* "":1315:1333 */ | |
// and // [ _2, _1, offset, length, and(sload(_2),_3) ] = [ _2, _1, offset, length, value ] | |
// dup5 // [ _2, _1, offset, length, value, _2 ] = [ _2, _1, offset, length, value, out ] | |
// pop // [ _2, _1, offset, length, value ] note: this looks weird, but as a matter of fact the value of out is not needed later, so this is actually a flaw in the yul optimizer, that doesn't take into account that the default case of the following switch reverts | |
// /* "":1438:1440 */ | |
// 0x1c // [ _2, _1, offset, length, value, 28 ] | |
// eq // [ _2, _1, offset, length, eq(28,value) ] | |
// tag_47 // [ _2, _1, offset, length, eq(28,value), tag_47 ] | |
// jumpi // [ _2, _1, offset, length ] condition correct | |
// tag_48: // [ _2, _1, offset, length ] start of switch default case | |
// pop // [ _2, _1, offset ] | |
// pop // [ _2, _1 ] | |
// pop // [ _2 ] | |
// dup1 // [ _2, _2 ] | |
// /* "":1921:1923 */ | |
// 0x24 // [ _2, _2, 36 ] | |
// swap2 // [ 36, _2, _2 ] | |
// /* "":1759:1836 */ | |
// 0x4e487b7100000000000000000000000000000000000000000000000000000000 // [ 36, _2, _2, left(0x4e487b71) ] | |
// swap1 // [ 36, _2, left(0x4e487b71), _2 ] | |
// /* "":1748:1837 */ | |
// mstore // [ 36, _2 ] statement correct | |
// /* "":1876:1880 */ | |
// 0x51 // [ 36, _2, 0x51 ] | |
// /* "":1873:1874 */ | |
// 0x04 // [ 36, _2, 0x51, 4 ] | |
// /* "":1866:1881 */ | |
// mstore // [ 36, _2 ] statement correct | |
// /* "":1910:1924 */ | |
// revert // [] statement correct | |
// tag_47: // [ _2, _1, offset, length ] start of switch case 28 | |
// /* "":2155:2157 */ | |
// 0x20 // [ _2, _1, offset, length, 32 ] | |
// swap4 // [ 32, _1, offset, length, _2 ] | |
// pop // [ 32, _1, offset, length ] | |
// /* "":2047:2113 */ | |
// 0xff00000000000000000000000000000000000000000000000000000000000000 // [ 32, _1, offset, length, left(0xff) ] | |
// swap2 // [ 32, _1, left(0xff), length, offset ] | |
// dup3 // [ 32, _1, left(0xff), length, offset, left(0xff) ] | |
// swap2 // [ 32, _1, left(0xff), left(0xff), offset, length ] | |
// /* "":1586:1588 */ | |
// 0x26 // [ 32, _1, left(0xff), left(0xff), offset, length, 38 ] | |
// swap2 // [ 32, _1, left(0xff), left(0xff), 38, length, offset ] | |
// swap1 // [ 32, _1, left(0xff), left(0xff), 38, offset, length ] | |
// /* "":1484:1488 */ | |
// 0x02 // [ 32, _1, left(0xff), left(0xff), 38, offset, length, 0x02 ] | |
// /* "":1481:1497 */ | |
// lt // [ 32, _1, left(0xff), left(0xff), 38, offset, lt(0x02,length) ] | |
// /* "":1474:1498 */ | |
// iszero // [ 32, _1, left(0xff), left(0xff), 38, offset, iszero(lt(0x02,length)) ] | |
// tag_49 // [ 32, _1, left(0xff), left(0xff), 38, offset, iszero(lt(0x02,length)), tag_49 ] | |
// jumpi // [ 32, _1, left(0xff), left(0xff), 38, offset ] condition correct | |
// tag_50: // [ 32, _1, left(0xff), left(0xff), 38, offset ] | |
// /* "":1574:1589 */ | |
// add // [ 32, _1, left(0xff), left(0xff), add(offset,38) ] | |
// /* "":1561:1590 */ | |
// calldataload // [ 32, _1, left(0xff), left(0xff), calldataload(add(offset,38)) ] | |
// /* "":1557:1659 */ | |
// and // [ 32, _1, left(0xff), and(calldataload(add(offset,38)),left(0xff)) ] = [ 32, _1, left(0xff), out ] | |
// swap2 // [ 32, out, left(0xff), _1 ] note: this is the direct transition to post the switch | |
// /* "":1989:1998 */ | |
// mload // [ 32, out, left(0xff), mload(_1) ] = [ 32, out, left(0xff), memPos ] | |
// swap2 // [ 32, memPos, left(0xff), out ] | |
// /* "":2038:2114 */ | |
// and // [ 32, memPos, and(out,left(0xff)) ] | |
// dup2 // [ 32, memPos, and(out,left(0xff)), memPos ] | |
// /* "":2023:2115 */ | |
// mstore // [ 32, memPos ] statement correct | |
// /* "":2140:2158 */ | |
// return // [] statement correct | |
// tag_49: // [ 32, _1, left(0xff), left(0xff), 38, offset ] | |
// tag_51 // [ 32, _1, left(0xff), left(0xff), 38, offset, tag_51 ] | |
// /* "":1501:1519 */ | |
// tag_33 // [ 32, _1, left(0xff), left(0xff), 38, offset, tag_51, tag_33 ] | |
// jump // in panic_error_0x32([RET]) | |
// tag_51: // unreachable | |
// jump(tag_50) | |
// tag_45: // [ _2, _1, offset, length, _3 ] | |
// pop // [ _2, _1, offset, length ] | |
// pop // [ _2, _1, offset ] | |
// pop // [ _2, _1 ] | |
// pop // [ _2 ] | |
// dup1 // [ _2, _2 ] | |
// /* "":1261:1275 */ | |
// revert // [] statement correct | |
// tag_43: // [ _2, _1, offset, length, _3 ] | |
// pop // [ _2, _1, offset, length ] | |
// pop // [ _2, _1, offset ] | |
// pop // [ _2, _1 ] | |
// pop // [ _2 ] | |
// dup1 // [ _2, _2 ] | |
// /* "":1166:1180 */ | |
// revert // [ ] | |
// tag_41: // [ _2, _1, offset, _3 ] | |
// pop // [ _2, _1, offset ] | |
// pop // [ _2, _1 ] | |
// pop // [ _2 ] | |
// dup1 // [ _2, _2 ] | |
// /* "":1038:1052 */ | |
// revert // [ ] statement correct | |
// tag_39: // [ _2, _1, offset, _3 ] | |
// pop // [ _2, _1, offset ] | |
// pop // [ _2, _1 ] | |
// pop // [ _2 ] | |
// dup1 // [ _2, _2 ] | |
// /* "":947:961 */ | |
// revert // [ ] statement correct | |
// tag_37: // [ _2, _1 ] | |
// pop // [ _2 ] | |
// dup1 // [ _2, _2 ] | |
// /* "":779:793 */ | |
// revert // [ ] statement correct | |
// tag_35: // [ _2, _1 ] | |
// pop // [ _2 ] | |
// dup1 // [ _2, _2 ] | |
// /* "":696:710 */ | |
// revert // [] statement correct | |
// /* "":4896:5120 */ | |
// tag_33: // [RET] start of panic_error_0x32() | |
// pop // [] | |
// /* "":4964:5041 */ | |
// 0x4e487b7100000000000000000000000000000000000000000000000000000000 // [ left(errsig) ] | |
// /* "":4961:4962 */ | |
// 0x00 // [ left(errsig), 0 ] | |
// /* "":4954:5042 */ | |
// mstore // [ ] statement correct | |
// /* "":5069:5073 */ | |
// 0x32 // [ 0x32 ] | |
// /* "":5066:5067 */ | |
// 0x04 // [ 0x32, 4 ] | |
// /* "":5059:5074 */ | |
// mstore // [ ] statement correct | |
// /* "":5101:5105 */ | |
// 0x24 // [ 0x24 ] | |
// /* "":5098:5099 */ | |
// 0x00 // [ 0x24, 0x00 ] | |
// /* "":5091:5106 */ | |
// revert // [] statement correct | |
// /* "":5133:5357 */ | |
// tag_31: // [ RET ] entry of panic_error_0x41 | |
// pop // [ ] note: interesting - of course better to just keep it and ignore it. | |
// /* "":5201:5278 */ | |
// 0x4e487b7100000000000000000000000000000000000000000000000000000000 // [ left(errsig) ] | |
// /* "":5198:5199 */ | |
// 0x00 // [ left(errsig), 0 ] | |
// /* "":5191:5279 */ | |
// mstore // [ ] statement correct | |
// /* "":5306:5310 */ | |
// 0x41 // [ 0x42 ] | |
// /* "":5303:5304 */ | |
// 0x04 // [ 0x42, 4 ] | |
// /* "":5296:5311 */ | |
// mstore // [ ] statement correct | |
// /* "":5338:5342 */ | |
// 0x24 // [ 0x24 ] | |
// /* "":5335:5336 */ | |
// 0x00 // [ 0x24, 0 ] | |
// /* "":5328:5343 */ | |
// revert // [ ] statement correct | |
// } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment