aboutsummaryrefslogtreecommitdiffstats
path: root/ethvm/asm.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-07-22 17:54:48 +0800
committerobscuren <geffobscura@gmail.com>2014-07-22 17:54:48 +0800
commit1e8b54abfb7129fcdf4812ad01b6a7cd61e4f65d (patch)
tree6ad93d5117d8194ee700e3347b59d0602cd4c40c /ethvm/asm.go
parent20ee1ae65e57ef7d60404277162c84c572c6bb10 (diff)
downloadgo-tangerine-1e8b54abfb7129fcdf4812ad01b6a7cd61e4f65d.tar
go-tangerine-1e8b54abfb7129fcdf4812ad01b6a7cd61e4f65d.tar.gz
go-tangerine-1e8b54abfb7129fcdf4812ad01b6a7cd61e4f65d.tar.bz2
go-tangerine-1e8b54abfb7129fcdf4812ad01b6a7cd61e4f65d.tar.lz
go-tangerine-1e8b54abfb7129fcdf4812ad01b6a7cd61e4f65d.tar.xz
go-tangerine-1e8b54abfb7129fcdf4812ad01b6a7cd61e4f65d.tar.zst
go-tangerine-1e8b54abfb7129fcdf4812ad01b6a7cd61e4f65d.zip
Refactored state, state object and vm
* The State and StateObject have been moved to their own package * The VM is moved to it's own package
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..fd559d1dc
--- /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("%04v: %v", pc, 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("%04v: 0x%x", pc, data))
+
+ pc.Add(pc, big.NewInt(a-1))
+ }
+
+ pc.Add(pc, ethutil.Big1)
+ }
+
+ return
+}