| 
									
										
										
										
											2014-10-24 01:04:10 +02:00
										 |  |  | // +build !windows | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | package ethutil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2014-08-24 00:16:32 +02:00
										 |  |  | 	"strings" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-05 00:32:51 +01:00
										 |  |  | 	"github.com/ethereum/serpent-go" | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	"github.com/obscuren/mutan" | 
					
						
							| 
									
										
										
										
											2014-06-25 17:26:34 +02:00
										 |  |  | 	"github.com/obscuren/mutan/backends" | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // General compile function | 
					
						
							| 
									
										
										
										
											2014-07-04 15:32:10 +02:00
										 |  |  | func Compile(script string, silent bool) (ret []byte, err error) { | 
					
						
							| 
									
										
										
										
											2014-07-04 13:05:07 +02:00
										 |  |  | 	if len(script) > 2 { | 
					
						
							|  |  |  | 		line := strings.Split(script, "\n")[0] | 
					
						
							| 
									
										
										
										
											2014-06-21 02:40:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-04 13:34:50 +02:00
										 |  |  | 		if len(line) > 1 && line[0:2] == "#!" { | 
					
						
							| 
									
										
										
										
											2014-07-04 13:05:07 +02:00
										 |  |  | 			switch line { | 
					
						
							| 
									
										
										
										
											2014-08-24 00:16:32 +02:00
										 |  |  | 			case "#!serpent": | 
					
						
							|  |  |  | 				byteCode, err := serpent.Compile(script) | 
					
						
							|  |  |  | 				if err != nil { | 
					
						
							|  |  |  | 					return nil, err | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-07-04 13:05:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-24 00:16:32 +02:00
										 |  |  | 				return byteCode, nil | 
					
						
							| 
									
										
										
										
											2014-07-04 13:05:07 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2014-06-21 02:40:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-04 13:05:07 +02:00
										 |  |  | 			compiler := mutan.NewCompiler(backend.NewEthereumBackend()) | 
					
						
							| 
									
										
										
										
											2014-07-04 15:32:10 +02:00
										 |  |  | 			compiler.Silent = silent | 
					
						
							| 
									
										
										
										
											2014-07-04 13:05:07 +02:00
										 |  |  | 			byteCode, errors := compiler.Compile(strings.NewReader(script)) | 
					
						
							|  |  |  | 			if len(errors) > 0 { | 
					
						
							|  |  |  | 				var errs string | 
					
						
							|  |  |  | 				for _, er := range errors { | 
					
						
							|  |  |  | 					if er != nil { | 
					
						
							|  |  |  | 						errs += er.Error() | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-06-21 02:40:25 +02:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-07-04 13:05:07 +02:00
										 |  |  | 				return nil, fmt.Errorf("%v", errs) | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-04 13:05:07 +02:00
										 |  |  | 			return byteCode, nil | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-06-21 02:40:25 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-07-04 13:05:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return nil, nil | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | } |