aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm/instructions.go
diff options
context:
space:
mode:
authorFelix Lange <fjl@users.noreply.github.com>2017-05-25 04:28:22 +0800
committerGitHub <noreply@github.com>2017-05-25 04:28:22 +0800
commit261b3e235160d30cc7176e02fd0a43f2b60409c6 (patch)
tree9d3eb6eec9fc2d30badba7bc6824560bcb317132 /core/vm/instructions.go
parent344f25fb3ec26818c673a5b68b21b527759d7499 (diff)
parent11cf5b7eadb7fcfa56a0cb98ec4ebbddce00f4c0 (diff)
downloadgo-tangerine-261b3e235160d30cc7176e02fd0a43f2b60409c6.tar
go-tangerine-261b3e235160d30cc7176e02fd0a43f2b60409c6.tar.gz
go-tangerine-261b3e235160d30cc7176e02fd0a43f2b60409c6.tar.bz2
go-tangerine-261b3e235160d30cc7176e02fd0a43f2b60409c6.tar.lz
go-tangerine-261b3e235160d30cc7176e02fd0a43f2b60409c6.tar.xz
go-tangerine-261b3e235160d30cc7176e02fd0a43f2b60409c6.tar.zst
go-tangerine-261b3e235160d30cc7176e02fd0a43f2b60409c6.zip
Merge pull request #14336 from obscuren/metropolis-preparation
consensus, core/*, params: metropolis preparation refactor
Diffstat (limited to 'core/vm/instructions.go')
-rw-r--r--core/vm/instructions.go38
1 files changed, 24 insertions, 14 deletions
diff --git a/core/vm/instructions.go b/core/vm/instructions.go
index bfc0a668e..42f1781d8 100644
--- a/core/vm/instructions.go
+++ b/core/vm/instructions.go
@@ -27,7 +27,9 @@ import (
"github.com/ethereum/go-ethereum/params"
)
-var bigZero = new(big.Int)
+var (
+ bigZero = new(big.Int)
+)
func opAdd(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
x, y := stack.pop(), stack.pop()
@@ -599,7 +601,7 @@ func opCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Sta
contract.Gas += returnGas
evm.interpreter.intPool.put(addr, value, inOffset, inSize, retOffset, retSize)
- return nil, nil
+ return ret, nil
}
func opCallCode(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
@@ -633,16 +635,10 @@ func opCallCode(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack
contract.Gas += returnGas
evm.interpreter.intPool.put(addr, value, inOffset, inSize, retOffset, retSize)
- return nil, nil
+ return ret, nil
}
func opDelegateCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
- // if not homestead return an error. DELEGATECALL is not supported
- // during pre-homestead.
- if !evm.ChainConfig().IsHomestead(evm.BlockNumber) {
- return nil, fmt.Errorf("invalid opcode %x", DELEGATECALL)
- }
-
gas, to, inOffset, inSize, outOffset, outSize := stack.pop().Uint64(), stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop()
toAddr := common.BigToAddress(to)
@@ -658,7 +654,7 @@ func opDelegateCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, st
contract.Gas += returnGas
evm.interpreter.intPool.put(to, inOffset, inSize, outOffset, outSize)
- return nil, nil
+ return ret, nil
}
func opReturn(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
@@ -666,6 +662,7 @@ func opReturn(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *S
ret := memory.GetPtr(offset.Int64(), size.Int64())
evm.interpreter.intPool.put(offset, size)
+
return ret, nil
}
@@ -709,10 +706,23 @@ func makeLog(size int) executionFunc {
}
// make push instruction function
-func makePush(size uint64, bsize *big.Int) executionFunc {
+func makePush(size uint64, pushByteSize int) executionFunc {
return func(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
- byts := getData(contract.Code, evm.interpreter.intPool.get().SetUint64(*pc+1), bsize)
- stack.push(new(big.Int).SetBytes(byts))
+ codeLen := len(contract.Code)
+
+ startMin := codeLen
+ if int(*pc+1) < startMin {
+ startMin = int(*pc + 1)
+ }
+
+ endMin := codeLen
+ if startMin+pushByteSize < endMin {
+ endMin = startMin + pushByteSize
+ }
+
+ integer := evm.interpreter.intPool.get()
+ stack.push(integer.SetBytes(common.RightPadBytes(contract.Code[startMin:endMin], pushByteSize)))
+
*pc += size
return nil, nil
}
@@ -721,7 +731,7 @@ func makePush(size uint64, bsize *big.Int) executionFunc {
// make push instruction function
func makeDup(size int64) executionFunc {
return func(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
- stack.dup(int(size))
+ stack.dup(evm.interpreter.intPool, int(size))
return nil, nil
}
}