diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2017-08-16 18:07:33 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2017-08-16 18:43:08 +0800 |
commit | 9bd6068fefe5687735bed342f3545f515fa717c8 (patch) | |
tree | d68767398eedd0a07c055fc8e880c4b4ab565a70 /core/vm/instructions.go | |
parent | 76069eef38082089d2eaf99661a80e1a953bf271 (diff) | |
download | go-tangerine-9bd6068fefe5687735bed342f3545f515fa717c8.tar.gz go-tangerine-9bd6068fefe5687735bed342f3545f515fa717c8.tar.zst go-tangerine-9bd6068fefe5687735bed342f3545f515fa717c8.zip |
core/vm: implement RETURNDATA metropolis opcodes
Diffstat (limited to 'core/vm/instructions.go')
-rw-r--r-- | core/vm/instructions.go | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/core/vm/instructions.go b/core/vm/instructions.go index aaa8d7945..0dd9af096 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -31,6 +31,7 @@ import ( var ( bigZero = new(big.Int) errWriteProtection = errors.New("evm: write protection") + errReadOutOfBound = errors.New("evm: read out of bound") ) func opAdd(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { @@ -360,6 +361,28 @@ func opCalldataCopy(pc *uint64, evm *EVM, contract *Contract, memory *Memory, st return nil, nil } +func opReturnDataSize(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { + stack.push(evm.interpreter.intPool.get().SetUint64(uint64(len(evm.interpreter.returnData)))) + return nil, nil +} + +func opReturnDataCopy(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { + var ( + mOff = stack.pop() + cOff = stack.pop() + l = stack.pop() + ) + defer evm.interpreter.intPool.put(mOff, cOff, l) + + cEnd := new(big.Int).Add(cOff, l) + if cEnd.BitLen() > 64 || uint64(len(evm.interpreter.returnData)) < cEnd.Uint64() { + return nil, errReadOutOfBound + } + memory.Set(mOff.Uint64(), l.Uint64(), evm.interpreter.returnData[cOff.Uint64():cEnd.Uint64()]) + + return nil, nil +} + func opExtCodeSize(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { a := stack.pop() |