asm.go 1012 Bytes
Newer Older
obscuren's avatar
obscuren committed
1
package vm
2 3 4 5

import (
	"fmt"
	"math/big"
obscuren's avatar
obscuren committed
6

obscuren's avatar
obscuren committed
7
	"github.com/ethereum/go-ethereum/common"
8 9 10 11 12 13 14 15 16 17 18 19 20 21
)

func Disassemble(script []byte) (asm []string) {
	pc := new(big.Int)
	for {
		if pc.Cmp(big.NewInt(int64(len(script)))) >= 0 {
			return
		}

		// Get the memory location of pc
		val := script[pc.Int64()]
		// Get the opcode (it must be an opcode!)
		op := OpCode(val)

22
		asm = append(asm, fmt.Sprintf("%v", op))
23 24 25

		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:
obscuren's avatar
obscuren committed
26
			pc.Add(pc, common.Big1)
27 28 29 30 31 32 33 34 35
			a := int64(op) - int64(PUSH1) + 1
			if int(pc.Int64()+a) > len(script) {
				return nil
			}

			data := script[pc.Int64() : pc.Int64()+a]
			if len(data) == 0 {
				data = []byte{0}
			}
36
			asm = append(asm, fmt.Sprintf("0x%x", data))
37 38 39 40

			pc.Add(pc, big.NewInt(a-1))
		}

obscuren's avatar
obscuren committed
41
		pc.Add(pc, common.Big1)
42 43 44 45
	}

	return
}