From 8cfbf1836d68c49242703e3f59e4d0a06754c02b Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 4 Nov 2014 18:17:38 +0100 Subject: Added JUMP analysis (WIP) --- vm/analysis.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 vm/analysis.go (limited to 'vm') 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 +} -- cgit v1.2.3