diff options
author | Felix Lange <fjl@twurst.com> | 2015-03-11 00:14:31 +0800 |
---|---|---|
committer | Felix Lange <fjl@twurst.com> | 2015-03-11 00:14:31 +0800 |
commit | 269cfbb8ace76ddc1f50dbd5b218c499308c8a5c (patch) | |
tree | c2e9e274c64f431f03b9a6b8b3de22585c016027 /vm/memory.go | |
parent | 972e2c1e31067a9bab77228c19348b66964ce643 (diff) | |
parent | 0542df941f57a75fa7b699089db1d9ae40e4ff71 (diff) | |
download | dexon-269cfbb8ace76ddc1f50dbd5b218c499308c8a5c.tar dexon-269cfbb8ace76ddc1f50dbd5b218c499308c8a5c.tar.gz dexon-269cfbb8ace76ddc1f50dbd5b218c499308c8a5c.tar.bz2 dexon-269cfbb8ace76ddc1f50dbd5b218c499308c8a5c.tar.lz dexon-269cfbb8ace76ddc1f50dbd5b218c499308c8a5c.tar.xz dexon-269cfbb8ace76ddc1f50dbd5b218c499308c8a5c.tar.zst dexon-269cfbb8ace76ddc1f50dbd5b218c499308c8a5c.zip |
Merge branch origin/develop into accounts-integration
Conflicts:
cmd/blocktest/main.go
cmd/mist/debugger.go
cmd/utils/cmd.go
Diffstat (limited to 'vm/memory.go')
-rw-r--r-- | vm/memory.go | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/vm/memory.go b/vm/memory.go new file mode 100644 index 000000000..2a1e6e1b9 --- /dev/null +++ b/vm/memory.go @@ -0,0 +1,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("####################") +} |