aboutsummaryrefslogtreecommitdiffstats
path: root/vm/asm.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-10-18 19:31:20 +0800
committerobscuren <geffobscura@gmail.com>2014-10-18 19:31:20 +0800
commit20c742e47406c13ebc6427951f6fcf1b0056ea26 (patch)
treee8112a93626c0f20ca5aa9ac91ea2d1be07150d9 /vm/asm.go
parenta02dc4ccc321bdee2a670eecdf5c3bac01fc290b (diff)
downloadgo-tangerine-20c742e47406c13ebc6427951f6fcf1b0056ea26.tar.gz
go-tangerine-20c742e47406c13ebc6427951f6fcf1b0056ea26.tar.zst
go-tangerine-20c742e47406c13ebc6427951f6fcf1b0056ea26.zip
Moved ethvm => vm
Diffstat (limited to 'vm/asm.go')
-rw-r--r--vm/asm.go45
1 files changed, 45 insertions, 0 deletions
diff --git a/vm/asm.go b/vm/asm.go
new file mode 100644
index 000000000..d081e2b09
--- /dev/null
+++ b/vm/asm.go
@@ -0,0 +1,45 @@
+package vm
+
+import (
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/eth-go/ethutil"
+)
+
+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)
+
+ asm = append(asm, fmt.Sprintf("%v", op))
+
+ 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:
+ pc.Add(pc, ethutil.Big1)
+ 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}
+ }
+ asm = append(asm, fmt.Sprintf("0x%x", data))
+
+ pc.Add(pc, big.NewInt(a-1))
+ }
+
+ pc.Add(pc, ethutil.Big1)
+ }
+
+ return
+}