diff options
author | Jeffrey Wilcke <geffobscura@gmail.com> | 2015-10-07 05:39:43 +0800 |
---|---|---|
committer | Jeffrey Wilcke <geffobscura@gmail.com> | 2015-10-17 04:30:42 +0800 |
commit | b19627804400901ba003f6e401366cb7d3c4290f (patch) | |
tree | 0fbfa3f118df85737b72764b0765a22cbf4c7b2a /core/vm/segments.go | |
parent | 9d61d78de6ad20822b2b48d6c4e3779369ea7331 (diff) | |
download | dexon-b19627804400901ba003f6e401366cb7d3c4290f.tar dexon-b19627804400901ba003f6e401366cb7d3c4290f.tar.gz dexon-b19627804400901ba003f6e401366cb7d3c4290f.tar.bz2 dexon-b19627804400901ba003f6e401366cb7d3c4290f.tar.lz dexon-b19627804400901ba003f6e401366cb7d3c4290f.tar.xz dexon-b19627804400901ba003f6e401366cb7d3c4290f.tar.zst dexon-b19627804400901ba003f6e401366cb7d3c4290f.zip |
core/vm: added JIT segmenting / optimisations
* multi-push segments
* static jumps segments
Diffstat (limited to 'core/vm/segments.go')
-rw-r--r-- | core/vm/segments.go | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/core/vm/segments.go b/core/vm/segments.go new file mode 100644 index 000000000..fd4065149 --- /dev/null +++ b/core/vm/segments.go @@ -0,0 +1,44 @@ +package vm + +import "math/big" + +type jumpSeg struct { + pos uint64 + err error + gas *big.Int +} + +func (j jumpSeg) do(program *Program, pc *uint64, env Environment, contract *Contract, memory *Memory, stack *stack) ([]byte, error) { + if !contract.UseGas(j.gas) { + return nil, OutOfGasError + } + if j.err != nil { + return nil, j.err + } + *pc = j.pos + return nil, nil +} +func (s jumpSeg) halts() bool { return false } +func (s jumpSeg) Op() OpCode { return 0 } + +type pushSeg struct { + data []*big.Int + gas *big.Int +} + +func (s pushSeg) do(program *Program, pc *uint64, env Environment, contract *Contract, memory *Memory, stack *stack) ([]byte, error) { + // Use the calculated gas. When insufficient gas is present, use all gas and return an + // Out Of Gas error + if !contract.UseGas(s.gas) { + return nil, OutOfGasError + } + + for _, d := range s.data { + stack.push(new(big.Int).Set(d)) + } + *pc += uint64(len(s.data)) + return nil, nil +} + +func (s pushSeg) halts() bool { return false } +func (s pushSeg) Op() OpCode { return 0 } |