github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/internal/compiler_pool/pool.go (about) 1 package compiler_pool 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 "strings" 8 "sync" 9 10 "github.com/hirochachacha/plua/compiler" 11 "github.com/hirochachacha/plua/compiler/codegen" 12 "github.com/hirochachacha/plua/compiler/dump" 13 "github.com/hirochachacha/plua/compiler/parser" 14 "github.com/hirochachacha/plua/compiler/scanner" 15 "github.com/hirochachacha/plua/compiler/undump" 16 "github.com/hirochachacha/plua/object" 17 ) 18 19 var pool = &sync.Pool{ 20 New: func() interface{} { 21 return new(compiler.Compiler) 22 }, 23 } 24 25 func CompileFile(path string, typ compiler.FormatType) (*object.Proto, *object.RuntimeError) { 26 var r io.Reader 27 28 if len(path) == 0 { 29 r = os.Stdin 30 31 path = "=stdin" 32 } else { 33 f, err := os.Open(path) 34 if err != nil { 35 return nil, newRuntimeError(err) 36 } 37 defer f.Close() 38 39 r = f 40 41 path = "@" + path 42 } 43 44 c := pool.Get().(*compiler.Compiler) 45 46 p, err := c.Compile(r, path, typ) 47 48 pool.Put(c) 49 50 return p, newRuntimeError(err) 51 } 52 53 func CompileString(s, srcname string, typ compiler.FormatType) (*object.Proto, *object.RuntimeError) { 54 c := pool.Get().(*compiler.Compiler) 55 56 p, err := c.Compile(strings.NewReader(s), srcname, typ) 57 58 pool.Put(c) 59 60 return p, newRuntimeError(err) 61 } 62 63 func newRuntimeError(err error) *object.RuntimeError { 64 switch err := err.(type) { 65 case nil: 66 return nil 67 case *compiler.Error: 68 return object.NewRuntimeError(err.Err.Error()) 69 case *scanner.Error: 70 return &object.RuntimeError{ 71 RawValue: object.String(fmt.Sprintf("%s: %v", err.Pos, err.Err)), 72 Level: 0, 73 } 74 case *parser.Error: 75 return &object.RuntimeError{ 76 RawValue: object.String(fmt.Sprintf("%s: %v", err.Pos, err.Err)), 77 Level: 0, 78 } 79 case *codegen.Error: 80 return &object.RuntimeError{ 81 RawValue: object.String(fmt.Sprintf("%s: %v", err.Pos, err.Err)), 82 Level: 0, 83 } 84 case *dump.Error: 85 return object.NewRuntimeError(err.Err.Error()) 86 case *undump.Error: 87 return object.NewRuntimeError(err.Err.Error()) 88 default: 89 return object.NewRuntimeError(err.Error()) 90 } 91 }