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  }