core/vm, common/math: Add fast getByte for bigints, improve opByte

This commit is contained in:
Martin Holst Swende
2017-05-28 23:39:33 +02:00
parent 6171d01b11
commit 3285a0fda3
4 changed files with 169 additions and 8 deletions

View File

@ -256,15 +256,14 @@ func opXor(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stac
}
func opByte(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
th, val := stack.pop(), stack.pop()
if th.Cmp(big.NewInt(32)) < 0 {
byte := evm.interpreter.intPool.get().SetInt64(int64(math.PaddedBigBytes(val, 32)[th.Int64()]))
stack.push(byte)
th, val := stack.pop(), stack.peek()
if th.Cmp(common.Big32) < 0 {
b := math.BigEndian32ByteAt(val, int(th.Int64()))
val.SetInt64(int64(b))
} else {
stack.push(new(big.Int))
val.SetUint64(0)
}
evm.interpreter.intPool.put(th, val)
evm.interpreter.intPool.put(th)
return nil, nil
}
func opAddmod(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {