aboutsummaryrefslogtreecommitdiffstats
path: root/vm/analysis.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-12-20 09:34:12 +0800
committerobscuren <geffobscura@gmail.com>2014-12-20 09:34:12 +0800
commit3983dd2428137211f84f299f9ce8690c22f50afd (patch)
tree3a2dc53b365e6f377fc82a3514150d1297fe549c /vm/analysis.go
parent7daa8c2f6eb25511c6a54ad420709af911fc6748 (diff)
parent0a9dc1536c5d776844d6947a0090ff7e1a7c6ab4 (diff)
downloaddexon-3983dd2428137211f84f299f9ce8690c22f50afd.tar
dexon-3983dd2428137211f84f299f9ce8690c22f50afd.tar.gz
dexon-3983dd2428137211f84f299f9ce8690c22f50afd.tar.bz2
dexon-3983dd2428137211f84f299f9ce8690c22f50afd.tar.lz
dexon-3983dd2428137211f84f299f9ce8690c22f50afd.tar.xz
dexon-3983dd2428137211f84f299f9ce8690c22f50afd.tar.zst
dexon-3983dd2428137211f84f299f9ce8690c22f50afd.zip
Merge branch 'release/v0.7.10'
Diffstat (limited to 'vm/analysis.go')
-rw-r--r--vm/analysis.go35
1 files changed, 35 insertions, 0 deletions
diff --git a/vm/analysis.go b/vm/analysis.go
new file mode 100644
index 000000000..fef448b7b
--- /dev/null
+++ b/vm/analysis.go
@@ -0,0 +1,35 @@
+package vm
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+func analyseJumpDests(code []byte) (dests map[uint64]*big.Int) {
+ dests = make(map[uint64]*big.Int)
+
+ lp := false
+ var lpv *big.Int
+ for pc := uint64(0); pc < uint64(len(code)); pc++ {
+ var op OpCode = OpCode(code[pc])
+ switch op {
+ case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32:
+ a := uint64(op) - uint64(PUSH1) + 1
+ if uint64(len(code)) > pc+1+a {
+ lpv = ethutil.BigD(code[pc+1 : pc+1+a])
+ }
+
+ pc += a
+ lp = true
+ case JUMP, JUMPI:
+ if lp {
+ dests[pc] = lpv
+ }
+
+ default:
+ lp = false
+ }
+ }
+ return
+}