aboutsummaryrefslogtreecommitdiffstats
path: root/vm/memory.go
blob: 2a1e6e1b90572238dd76d76e6fdffa4185b585ea (plain) (blame)
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package vm

import "fmt"

type Memory struct {
    store []byte
}

func NewMemory() *Memory {
    return &Memory{nil}
}

func (m *Memory) Set(offset, size uint64, value []byte) {
    if len(value) > 0 {
        totSize := offset + size
        lenSize := uint64(len(m.store) - 1)
        if totSize > lenSize {
            // Calculate the diff between the sizes
            diff := totSize - lenSize
            if diff > 0 {
                // Create a new empty slice and append it
                newSlice := make([]byte, diff-1)
                // Resize slice
                m.store = append(m.store, newSlice...)
            }
        }
        copy(m.store[offset:offset+size], value)
    }
}

func (m *Memory) Resize(size uint64) {
    if uint64(m.Len()) < size {
        m.store = append(m.store, make([]byte, size-uint64(m.Len()))...)
    }
}

func (self *Memory) Get(offset, size int64) (cpy []byte) {
    if size == 0 {
        return nil
    }

    if len(self.store) > int(offset) {
        cpy = make([]byte, size)
        copy(cpy, self.store[offset:offset+size])

        return
    }

    return
}

func (m *Memory) Len() int {
    return len(m.store)
}

func (m *Memory) Data() []byte {
    return m.store
}

func (m *Memory) Print() {
    fmt.Printf("### mem %d bytes ###\n", len(m.store))
    if len(m.store) > 0 {
        addr := 0
        for i := 0; i+32 <= len(m.store); i += 32 {
            fmt.Printf("%03d: % x\n", addr, m.store[i:i+32])
            addr++
        }
    } else {
        fmt.Println("-- empty --")
    }
    fmt.Println("####################")
}