aboutsummaryrefslogtreecommitdiffstats
path: root/ethvm/asm.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-07-24 20:16:04 +0800
committerobscuren <geffobscura@gmail.com>2014-07-24 20:16:04 +0800
commit702cf5a3e19e33616e7e98ec8ab7a00d56dd7e85 (patch)
treecf025478adbc2243a5b11d4c5e1dda7acf0d3086 /ethvm/asm.go
parent92b16618edf6bbb6d98659050d8bf0d538285491 (diff)
parentdcf4fad97156f431612ed3915e167ce5a5314588 (diff)
downloaddexon-702cf5a3e19e33616e7e98ec8ab7a00d56dd7e85.tar
dexon-702cf5a3e19e33616e7e98ec8ab7a00d56dd7e85.tar.gz
dexon-702cf5a3e19e33616e7e98ec8ab7a00d56dd7e85.tar.bz2
dexon-702cf5a3e19e33616e7e98ec8ab7a00d56dd7e85.tar.lz
dexon-702cf5a3e19e33616e7e98ec8ab7a00d56dd7e85.tar.xz
dexon-702cf5a3e19e33616e7e98ec8ab7a00d56dd7e85.tar.zst
dexon-702cf5a3e19e33616e7e98ec8ab7a00d56dd7e85.zip
Merge branch 'feature/refactor_vm' into develop
Diffstat (limited to 'ethvm/asm.go')
-rw-r--r--ethvm/asm.go44
1 files changed, 44 insertions, 0 deletions
diff --git a/ethvm/asm.go b/ethvm/asm.go
new file mode 100644
index 000000000..7ff15a240
--- /dev/null
+++ b/ethvm/asm.go
@@ -0,0 +1,44 @@
+package ethvm
+
+import (
+ "fmt"
+ "github.com/ethereum/eth-go/ethutil"
+ "math/big"
+)
+
+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
+}