Tariff: fix memory leak when using formula (#18098)
This commit is contained in:
parent
3e6f23e39b
commit
d78d4bda02
2 changed files with 13 additions and 36 deletions
|
|
@ -8,13 +8,6 @@ import (
|
|||
"github.com/traefik/yaegi/interp"
|
||||
)
|
||||
|
||||
const Imports = `import (
|
||||
"fmt"
|
||||
"math"
|
||||
"strings"
|
||||
"time"
|
||||
)`
|
||||
|
||||
var (
|
||||
mu sync.Mutex
|
||||
registry = make(map[string]*interp.Interpreter)
|
||||
|
|
@ -31,14 +24,10 @@ func RegisteredVM(name, init string) (*interp.Interpreter, error) {
|
|||
// create new VM
|
||||
if !ok {
|
||||
vm = interp.New(interp.Options{})
|
||||
|
||||
if err := vm.Use(stdlib.Symbols); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if _, err := vm.Eval(Imports); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
vm.ImportUsed()
|
||||
|
||||
if init != "" {
|
||||
if _, err := vm.Eval(init); err != nil {
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ import (
|
|||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/evcc-io/evcc/provider/golang"
|
||||
"github.com/evcc-io/evcc/provider/golang/stdlib"
|
||||
"github.com/traefik/yaegi/interp"
|
||||
)
|
||||
|
|
@ -29,35 +28,24 @@ func (t *embed) init() (err error) {
|
|||
return nil
|
||||
}
|
||||
|
||||
vm := interp.New(interp.Options{})
|
||||
if err := vm.Use(stdlib.Symbols); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := vm.Eval(fmt.Sprintf(`%s
|
||||
var (
|
||||
price float64
|
||||
charges float64 = %f
|
||||
tax float64 = %f
|
||||
ts time.Time
|
||||
)`, golang.Imports, t.Charges, t.Tax)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
prg, err := vm.Compile(t.Formula)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
t.calc = func(price float64, ts time.Time) (float64, error) {
|
||||
vm := interp.New(interp.Options{})
|
||||
if err := vm.Use(stdlib.Symbols); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
vm.ImportUsed()
|
||||
|
||||
if _, err := vm.Eval(fmt.Sprintf(`
|
||||
price = %f
|
||||
var (
|
||||
price float64 = %f
|
||||
charges float64 = %f
|
||||
tax float64 = %f
|
||||
ts = time.Unix(%d, 0).Local()
|
||||
`, price, ts.Unix())); err != nil {
|
||||
)`, price, t.Charges, t.Tax, ts.Unix())); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
res, err := vm.Execute(prg)
|
||||
res, err := vm.Eval(t.Formula)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue