| 
									
										
										
										
											2014-10-23 15:48:53 +02:00
										 |  |  | // Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This library is free software; you can redistribute it and/or | 
					
						
							|  |  |  | // modify it under the terms of the GNU General Public | 
					
						
							|  |  |  | // License as published by the Free Software Foundation; either | 
					
						
							|  |  |  | // version 2.1 of the License, or (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  | // General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | // along with this library; if not, write to the Free Software | 
					
						
							|  |  |  | // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | 
					
						
							|  |  |  | // MA 02110-1301  USA | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-15 20:34:25 +02:00
										 |  |  | package ethrepl | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bufio" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"io" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"path" | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/ethutil" | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:35 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/javascript" | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/logger" | 
					
						
							| 
									
										
										
										
											2014-07-15 20:34:25 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | var repllogger = logger.NewLogger("REPL") | 
					
						
							| 
									
										
										
										
											2014-07-15 20:34:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | type Repl interface { | 
					
						
							|  |  |  | 	Start() | 
					
						
							|  |  |  | 	Stop() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type JSRepl struct { | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:35 +02:00
										 |  |  | 	re *javascript.JSRE | 
					
						
							| 
									
										
										
										
											2014-07-15 20:34:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	prompt string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	history *os.File | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	running bool | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func NewJSRepl(ethereum *eth.Ethereum) *JSRepl { | 
					
						
							|  |  |  | 	hist, err := os.OpenFile(path.Join(ethutil.Config.ExecPath, "history"), os.O_RDWR|os.O_CREATE, os.ModePerm) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		panic(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:35 +02:00
										 |  |  | 	return &JSRepl{re: javascript.NewJSRE(ethereum), prompt: "> ", history: hist} | 
					
						
							| 
									
										
										
										
											2014-07-15 20:34:25 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *JSRepl) Start() { | 
					
						
							|  |  |  | 	if !self.running { | 
					
						
							|  |  |  | 		self.running = true | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		repllogger.Infoln("init JS Console") | 
					
						
							| 
									
										
										
										
											2014-07-15 20:34:25 +02:00
										 |  |  | 		reader := bufio.NewReader(self.history) | 
					
						
							|  |  |  | 		for { | 
					
						
							|  |  |  | 			line, err := reader.ReadString('\n') | 
					
						
							|  |  |  | 			if err != nil && err == io.EOF { | 
					
						
							|  |  |  | 				break | 
					
						
							|  |  |  | 			} else if err != nil { | 
					
						
							|  |  |  | 				fmt.Println("error reading history", err) | 
					
						
							|  |  |  | 				break | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			addHistory(line[:len(line)-1]) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		self.read() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *JSRepl) Stop() { | 
					
						
							|  |  |  | 	if self.running { | 
					
						
							|  |  |  | 		self.running = false | 
					
						
							|  |  |  | 		self.re.Stop() | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		repllogger.Infoln("exit JS Console") | 
					
						
							| 
									
										
										
										
											2014-07-15 20:34:25 +02:00
										 |  |  | 		self.history.Close() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *JSRepl) parseInput(code string) { | 
					
						
							|  |  |  | 	defer func() { | 
					
						
							|  |  |  | 		if r := recover(); r != nil { | 
					
						
							|  |  |  | 			fmt.Println("[native] error", r) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	value, err := self.re.Run(code) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		fmt.Println(err) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	self.PrintValue(value) | 
					
						
							|  |  |  | } |