diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2017-05-23 16:39:53 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2017-05-23 16:39:53 +0800 |
commit | a816e756625d39fc9b544f97dfa218d885996f33 (patch) | |
tree | 724b97e491a02b8935b8856f4585405178dd3e45 /core/vm/instructions.go | |
parent | 3ee75bec9fd3a023b9636a9f09cce99dc487bfaa (diff) | |
download | go-tangerine-a816e756625d39fc9b544f97dfa218d885996f33.tar.gz go-tangerine-a816e756625d39fc9b544f97dfa218d885996f33.tar.zst go-tangerine-a816e756625d39fc9b544f97dfa218d885996f33.zip |
core/vm: improved push instructions
Improved push instructions by removing unnecessary big int allocations
and by making it int instead of big.Int
Diffstat (limited to 'core/vm/instructions.go')
-rw-r--r-- | core/vm/instructions.go | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/core/vm/instructions.go b/core/vm/instructions.go index fa4dbe428..c0ac911ac 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -706,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 } |