summaryrefslogtreecommitdiff
path: root/vm/vm.go
blob: 209ab7134f431c347e59cb30d0120e66d7f38d06 (plain)
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
36
37
38
39
40
41
42
43
44
45
package main

import (
	"fmt"
	"github.com/holiman/uint256"
)

type Evm struct {
	code Rom
	stack Stack
	memory Memory
	pc uint64
	stopped bool
}

func NewEvm(_code []byte) *Evm {
	return &Evm{
		pc: 0,
		stopped: true,
		stack : Stack{},
		code: _code,
	}
}

func (vm *Evm) Start() {
	vm.stopped = false
	for !(vm.stopped) {
		op := vm.code.Fetch(&(vm.pc), 1)[0] 
		fmt.Printf("pc: %d | opcode: %x -> string: %s\n", vm.pc, op, Instructions[op].name)
		if op >= PUSH1 && op <= PUSH32 {
			nb := op - PUSH1 + 1
			fmt.Printf("pushing %d byte value to the stack!\n", vm.pc, nb)
			b := vm.code.Fetch(&(vm.pc), uint64(nb))
		        x := uint256.NewInt(0)
			x = x.SetBytes(b)
			vm.stack.Push(x)
		} else {
			vm.Execute(op)
		}
	}
}

func (vm *Evm) Execute(op byte) { 
	Instructions[op].handler(vm)
}