forked from cerc-io/plugeth
core/vm: improved push instructions
Improved push instructions by removing unnecessary big int allocations and by making it int instead of big.Int
This commit is contained in:
parent
3ee75bec9f
commit
a816e75662
@ -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
|
||||
}
|
||||
|
@ -421,193 +421,193 @@ func NewFrontierInstructionSet() [256]operation {
|
||||
valid: true,
|
||||
},
|
||||
PUSH1: {
|
||||
execute: makePush(1, big.NewInt(1)),
|
||||
execute: makePush(1, 1),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH2: {
|
||||
execute: makePush(2, big.NewInt(2)),
|
||||
execute: makePush(2, 2),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH3: {
|
||||
execute: makePush(3, big.NewInt(3)),
|
||||
execute: makePush(3, 3),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH4: {
|
||||
execute: makePush(4, big.NewInt(4)),
|
||||
execute: makePush(4, 4),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH5: {
|
||||
execute: makePush(5, big.NewInt(5)),
|
||||
execute: makePush(5, 5),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH6: {
|
||||
execute: makePush(6, big.NewInt(6)),
|
||||
execute: makePush(6, 6),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH7: {
|
||||
execute: makePush(7, big.NewInt(7)),
|
||||
execute: makePush(7, 7),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH8: {
|
||||
execute: makePush(8, big.NewInt(8)),
|
||||
execute: makePush(8, 8),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH9: {
|
||||
execute: makePush(9, big.NewInt(9)),
|
||||
execute: makePush(9, 9),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH10: {
|
||||
execute: makePush(10, big.NewInt(10)),
|
||||
execute: makePush(10, 10),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH11: {
|
||||
execute: makePush(11, big.NewInt(11)),
|
||||
execute: makePush(11, 11),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH12: {
|
||||
execute: makePush(12, big.NewInt(12)),
|
||||
execute: makePush(12, 12),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH13: {
|
||||
execute: makePush(13, big.NewInt(13)),
|
||||
execute: makePush(13, 13),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH14: {
|
||||
execute: makePush(14, big.NewInt(14)),
|
||||
execute: makePush(14, 14),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH15: {
|
||||
execute: makePush(15, big.NewInt(15)),
|
||||
execute: makePush(15, 15),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH16: {
|
||||
execute: makePush(16, big.NewInt(16)),
|
||||
execute: makePush(16, 16),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH17: {
|
||||
execute: makePush(17, big.NewInt(17)),
|
||||
execute: makePush(17, 17),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH18: {
|
||||
execute: makePush(18, big.NewInt(18)),
|
||||
execute: makePush(18, 18),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH19: {
|
||||
execute: makePush(19, big.NewInt(19)),
|
||||
execute: makePush(19, 19),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH20: {
|
||||
execute: makePush(20, big.NewInt(20)),
|
||||
execute: makePush(20, 20),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH21: {
|
||||
execute: makePush(21, big.NewInt(21)),
|
||||
execute: makePush(21, 21),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH22: {
|
||||
execute: makePush(22, big.NewInt(22)),
|
||||
execute: makePush(22, 22),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH23: {
|
||||
execute: makePush(23, big.NewInt(23)),
|
||||
execute: makePush(23, 23),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH24: {
|
||||
execute: makePush(24, big.NewInt(24)),
|
||||
execute: makePush(24, 24),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH25: {
|
||||
execute: makePush(25, big.NewInt(25)),
|
||||
execute: makePush(25, 25),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH26: {
|
||||
execute: makePush(26, big.NewInt(26)),
|
||||
execute: makePush(26, 26),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH27: {
|
||||
execute: makePush(27, big.NewInt(27)),
|
||||
execute: makePush(27, 27),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH28: {
|
||||
execute: makePush(28, big.NewInt(28)),
|
||||
execute: makePush(28, 28),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH29: {
|
||||
execute: makePush(29, big.NewInt(29)),
|
||||
execute: makePush(29, 29),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH30: {
|
||||
execute: makePush(30, big.NewInt(30)),
|
||||
execute: makePush(30, 30),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH31: {
|
||||
execute: makePush(31, big.NewInt(31)),
|
||||
execute: makePush(31, 31),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
},
|
||||
PUSH32: {
|
||||
execute: makePush(32, big.NewInt(32)),
|
||||
execute: makePush(32, 32),
|
||||
gasCost: gasPush,
|
||||
validateStack: makeStackFunc(0, 1),
|
||||
valid: true,
|
||||
|
Loading…
Reference in New Issue
Block a user