aboutsummaryrefslogtreecommitdiffstats
path: root/vm
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 /vm
parent78fb2af6f17a1636f5f12856e8e39114915f0d56 (diff)
downloadgo-tangerine-8cfbf1836d68c49242703e3f59e4d0a06754c02b.tar.gz
go-tangerine-8cfbf1836d68c49242703e3f59e4d0a06754c02b.tar.zst
go-tangerine-8cfbf1836d68c49242703e3f59e4d0a06754c02b.zip
Added JUMP analysis (WIP)
Diffstat (limited to 'vm')
-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
+}