aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-11-05 01:17:38 +0800
committerobscuren <geffobscura@gmail.com>2014-11-05 01:17:38 +0800
commit8cfbf1836d68c49242703e3f59e4d0a06754c02b (patch)
treeadd38ec1154dd8e54f8ce3cdc825b1ca33de42ee
parent78fb2af6f17a1636f5f12856e8e39114915f0d56 (diff)
downloadgo-tangerine-8cfbf1836d68c49242703e3f59e4d0a06754c02b.tar
go-tangerine-8cfbf1836d68c49242703e3f59e4d0a06754c02b.tar.gz
go-tangerine-8cfbf1836d68c49242703e3f59e4d0a06754c02b.tar.bz2
go-tangerine-8cfbf1836d68c49242703e3f59e4d0a06754c02b.tar.lz
go-tangerine-8cfbf1836d68c49242703e3f59e4d0a06754c02b.tar.xz
go-tangerine-8cfbf1836d68c49242703e3f59e4d0a06754c02b.tar.zst
go-tangerine-8cfbf1836d68c49242703e3f59e4d0a06754c02b.zip
Added JUMP analysis (WIP)
-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..784b55459
--- /dev/null
+++ b/vm/analysis.go
@@ -0,0 +1,35 @@
+package vm
+
+import (
+ "math/big"
+
+ "github.com/ethgo.old/ethutil"
+)
+
+func analyseJumpDests(code []byte) (dests map[int64]*big.Int) {
+ dests = make(map[int64]*big.Int)
+
+ lp := false
+ var lpv *big.Int
+ for pc := int64(0); pc < int64(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 := int64(op) - int64(PUSH1) + 1
+ if int64(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
+}