aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm/segments.go
diff options
context:
space:
mode:
authorJeffrey Wilcke <geffobscura@gmail.com>2015-10-07 05:39:43 +0800
committerJeffrey Wilcke <geffobscura@gmail.com>2015-10-17 04:30:42 +0800
commitb19627804400901ba003f6e401366cb7d3c4290f (patch)
tree0fbfa3f118df85737b72764b0765a22cbf4c7b2a /core/vm/segments.go
parent9d61d78de6ad20822b2b48d6c4e3779369ea7331 (diff)
downloaddexon-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.go44
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 }