@ -603,24 +603,20 @@ func opCreate(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *S
}
}
func opCall ( pc * uint64 , evm * EVM , contract * Contract , memory * Memory , stack * Stack ) ( [ ] byte , error ) {
func opCall ( pc * uint64 , evm * EVM , contract * Contract , memory * Memory , stack * Stack ) ( [ ] byte , error ) {
gas := stack . pop ( ) . Uint64 ( )
// Pop gas. The actual gas in in evm.callGasTemp.
// pop gas and value of the stack.
evm . interpreter . intPool . put ( stack . pop ( ) )
addr , value := stack . pop ( ) , stack . pop ( )
gas := evm . callGasTemp
// Pop other call parameters.
addr , value , inOffset , inSize , retOffset , retSize := stack . pop ( ) , stack . pop ( ) , stack . pop ( ) , stack . pop ( ) , stack . pop ( ) , stack . pop ( )
toAddr := common . BigToAddress ( addr )
value = math . U256 ( value )
value = math . U256 ( value )
// pop input size and offset
// Get the arguments from the memory.
inOffset , inSize := stack . pop ( ) , stack . pop ( )
// pop return size and offset
retOffset , retSize := stack . pop ( ) , stack . pop ( )
address := common . BigToAddress ( addr )
// Get the arguments from the memory
args := memory . Get ( inOffset . Int64 ( ) , inSize . Int64 ( ) )
args := memory . Get ( inOffset . Int64 ( ) , inSize . Int64 ( ) )
if value . Sign ( ) != 0 {
if value . Sign ( ) != 0 {
gas += params . CallStipend
gas += params . CallStipend
}
}
ret , returnGas , err := evm . Call ( contract , address , args , gas , value )
ret , returnGas , err := evm . Call ( contract , toAddr , args , gas , value )
if err != nil {
if err != nil {
stack . push ( new ( big . Int ) )
stack . push ( new ( big . Int ) )
} else {
} else {
@ -636,25 +632,20 @@ func opCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Sta
}
}
func opCallCode ( pc * uint64 , evm * EVM , contract * Contract , memory * Memory , stack * Stack ) ( [ ] byte , error ) {
func opCallCode ( pc * uint64 , evm * EVM , contract * Contract , memory * Memory , stack * Stack ) ( [ ] byte , error ) {
gas := stack . pop ( ) . Uint64 ( )
// Pop gas. The actual gas is in evm.callGasTemp.
// pop gas and value of the stack.
evm . interpreter . intPool . put ( stack . pop ( ) )
addr , value := stack . pop ( ) , stack . pop ( )
gas := evm . callGasTemp
// Pop other call parameters.
addr , value , inOffset , inSize , retOffset , retSize := stack . pop ( ) , stack . pop ( ) , stack . pop ( ) , stack . pop ( ) , stack . pop ( ) , stack . pop ( )
toAddr := common . BigToAddress ( addr )
value = math . U256 ( value )
value = math . U256 ( value )
// pop input size and offset
// Get arguments from the memory.
inOffset , inSize := stack . pop ( ) , stack . pop ( )
// pop return size and offset
retOffset , retSize := stack . pop ( ) , stack . pop ( )
address := common . BigToAddress ( addr )
// Get the arguments from the memory
args := memory . Get ( inOffset . Int64 ( ) , inSize . Int64 ( ) )
args := memory . Get ( inOffset . Int64 ( ) , inSize . Int64 ( ) )
if value . Sign ( ) != 0 {
if value . Sign ( ) != 0 {
gas += params . CallStipend
gas += params . CallStipend
}
}
ret , returnGas , err := evm . CallCode ( contract , toAddr , args , gas , value )
ret , returnGas , err := evm . CallCode ( contract , address , args , gas , value )
if err != nil {
if err != nil {
stack . push ( new ( big . Int ) )
stack . push ( new ( big . Int ) )
} else {
} else {
@ -670,9 +661,13 @@ func opCallCode(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack
}
}
func opDelegateCall ( pc * uint64 , evm * EVM , contract * Contract , memory * Memory , stack * Stack ) ( [ ] byte , error ) {
func opDelegateCall ( pc * uint64 , evm * EVM , contract * Contract , memory * Memory , stack * Stack ) ( [ ] byte , error ) {
gas , to , inOffset , inSize , outOffset , outSize := stack . pop ( ) . Uint64 ( ) , stack . pop ( ) , stack . pop ( ) , stack . pop ( ) , stack . pop ( ) , stack . pop ( )
// Pop gas. The actual gas is in evm.callGasTemp.
evm . interpreter . intPool . put ( stack . pop ( ) )
toAddr := common . BigToAddress ( to )
gas := evm . callGasTemp
// Pop other call parameters.
addr , inOffset , inSize , retOffset , retSize := stack . pop ( ) , stack . pop ( ) , stack . pop ( ) , stack . pop ( ) , stack . pop ( )
toAddr := common . BigToAddress ( addr )
// Get arguments from the memory.
args := memory . Get ( inOffset . Int64 ( ) , inSize . Int64 ( ) )
args := memory . Get ( inOffset . Int64 ( ) , inSize . Int64 ( ) )
ret , returnGas , err := evm . DelegateCall ( contract , toAddr , args , gas )
ret , returnGas , err := evm . DelegateCall ( contract , toAddr , args , gas )
@ -682,30 +677,25 @@ func opDelegateCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, st
stack . push ( big . NewInt ( 1 ) )
stack . push ( big . NewInt ( 1 ) )
}
}
if err == nil || err == errExecutionReverted {
if err == nil || err == errExecutionReverted {
memory . Set ( ou tOffset. Uint64 ( ) , ou tSize. Uint64 ( ) , ret )
memory . Set ( re tOffset. Uint64 ( ) , re tSize. Uint64 ( ) , ret )
}
}
contract . Gas += returnGas
contract . Gas += returnGas
evm . interpreter . intPool . put ( to , inOffset , inSize , outOffset , ou tSize)
evm . interpreter . intPool . put ( addr , inOffset , inSize , retOffset , re tSize)
return ret , nil
return ret , nil
}
}
func opStaticCall ( pc * uint64 , evm * EVM , contract * Contract , memory * Memory , stack * Stack ) ( [ ] byte , error ) {
func opStaticCall ( pc * uint64 , evm * EVM , contract * Contract , memory * Memory , stack * Stack ) ( [ ] byte , error ) {
// pop gas
// Pop gas. The actual gas is in evm.callGasTemp.
gas := stack . pop ( ) . Uint64 ( )
evm . interpreter . intPool . put ( stack . pop ( ) )
// pop address
gas := evm . callGasTemp
addr := stack . pop ( )
// Pop other call parameters.
// pop input size and offset
addr , inOffset , inSize , retOffset , retSize := stack . pop ( ) , stack . pop ( ) , stack . pop ( ) , stack . pop ( ) , stack . pop ( )
inOffset , inSize := stack . pop ( ) , stack . pop ( )
toAddr := common . BigToAddress ( addr )
// pop return size and offset
// Get arguments from the memory.
retOffset , retSize := stack . pop ( ) , stack . pop ( )
address := common . BigToAddress ( addr )
// Get the arguments from the memory
args := memory . Get ( inOffset . Int64 ( ) , inSize . Int64 ( ) )
args := memory . Get ( inOffset . Int64 ( ) , inSize . Int64 ( ) )
ret , returnGas , err := evm . StaticCall ( contract , address , args , gas )
ret , returnGas , err := evm . StaticCall ( contract , toAddr , args , gas )
if err != nil {
if err != nil {
stack . push ( new ( big . Int ) )
stack . push ( new ( big . Int ) )
} else {
} else {