| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2015 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-10 19:56:40 +02:00
										 |  |  | package vm | 
					
						
							| 
									
										
										
										
											2015-06-10 12:23:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2015-06-12 11:18:17 +02:00
										 |  |  | 	"unicode" | 
					
						
							| 
									
										
										
										
											2015-06-10 12:23:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | // StdErrFormat formats a slice of StructLogs to human readable format | 
					
						
							| 
									
										
										
										
											2015-06-10 19:56:40 +02:00
										 |  |  | func StdErrFormat(logs []StructLog) { | 
					
						
							| 
									
										
										
										
											2015-06-12 13:35:14 +02:00
										 |  |  | 	fmt.Fprintf(os.Stderr, "VM STAT %d OPs\n", len(logs)) | 
					
						
							| 
									
										
										
										
											2015-06-10 12:23:49 +02:00
										 |  |  | 	for _, log := range logs { | 
					
						
							| 
									
										
										
										
											2015-06-12 13:35:14 +02:00
										 |  |  | 		fmt.Fprintf(os.Stderr, "PC %08d: %s GAS: %v COST: %v", log.Pc, log.Op, log.Gas, log.GasCost) | 
					
						
							|  |  |  | 		if log.Err != nil { | 
					
						
							|  |  |  | 			fmt.Fprintf(os.Stderr, " ERROR: %v", log.Err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		fmt.Fprintf(os.Stderr, "\n") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-10 12:23:49 +02:00
										 |  |  | 		fmt.Fprintln(os.Stderr, "STACK =", len(log.Stack)) | 
					
						
							| 
									
										
										
										
											2015-06-10 21:08:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		for i := len(log.Stack) - 1; i >= 0; i-- { | 
					
						
							|  |  |  | 			fmt.Fprintf(os.Stderr, "%04d: %x\n", len(log.Stack)-i-1, common.LeftPadBytes(log.Stack[i].Bytes(), 32)) | 
					
						
							| 
									
										
										
										
											2015-06-10 12:23:49 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		const maxMem = 10 | 
					
						
							|  |  |  | 		addr := 0 | 
					
						
							|  |  |  | 		fmt.Fprintln(os.Stderr, "MEM =", len(log.Memory)) | 
					
						
							|  |  |  | 		for i := 0; i+16 <= len(log.Memory) && addr < maxMem; i += 16 { | 
					
						
							|  |  |  | 			data := log.Memory[i : i+16] | 
					
						
							|  |  |  | 			str := fmt.Sprintf("%04d: % x  ", addr*16, data) | 
					
						
							|  |  |  | 			for _, r := range data { | 
					
						
							|  |  |  | 				if r == 0 { | 
					
						
							|  |  |  | 					str += "." | 
					
						
							| 
									
										
										
										
											2015-06-12 11:18:17 +02:00
										 |  |  | 				} else if unicode.IsPrint(rune(r)) { | 
					
						
							| 
									
										
										
										
											2015-06-10 12:23:49 +02:00
										 |  |  | 					str += fmt.Sprintf("%s", string(r)) | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					str += "?" | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			addr++ | 
					
						
							|  |  |  | 			fmt.Fprintln(os.Stderr, str) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-06-10 12:57:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		fmt.Fprintln(os.Stderr, "STORAGE =", len(log.Storage)) | 
					
						
							|  |  |  | 		for h, item := range log.Storage { | 
					
						
							|  |  |  | 			fmt.Fprintf(os.Stderr, "%x: %x\n", h, common.LeftPadBytes(item, 32)) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-06-10 19:56:40 +02:00
										 |  |  | 		fmt.Fprintln(os.Stderr) | 
					
						
							| 
									
										
										
										
											2015-06-10 12:23:49 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |