| 
									
										
										
										
											2015-03-10 00:25:27 +01:00
										 |  |  | package vm | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-20 20:37:56 +01:00
										 |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2015-03-10 00:25:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | type Memory struct { | 
					
						
							|  |  |  | 	store []byte | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func NewMemory() *Memory { | 
					
						
							|  |  |  | 	return &Memory{nil} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (m *Memory) Set(offset, size uint64, value []byte) { | 
					
						
							| 
									
										
										
										
											2015-03-27 16:09:57 +01:00
										 |  |  | 	// length of store may never be less than offset + size. | 
					
						
							|  |  |  | 	// The store should be resized PRIOR to setting the memory | 
					
						
							|  |  |  | 	if size > uint64(len(m.store)) { | 
					
						
							| 
									
										
										
										
											2015-03-27 14:22:38 +01:00
										 |  |  | 		panic("INVALID memory: store empty") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-27 16:09:57 +01:00
										 |  |  | 	// It's possible the offset is greater than 0 and size equals 0. This is because | 
					
						
							|  |  |  | 	// the calcMemSize (common.go) could potentially return 0 when size is zero (NO-OP) | 
					
						
							|  |  |  | 	if size > 0 { | 
					
						
							|  |  |  | 		copy(m.store[offset:offset+size], common.RightPadBytes(value, int(size))) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-10 00:25:27 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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("####################") | 
					
						
							|  |  |  | } |