aboutsummaryrefslogtreecommitdiffstats
path: root/vm/analysis.go
blob: fef448b7ba28d4e9b389aad479ffa7b716d134e6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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
}