Skip to content

Commit

Permalink
Tariff: fix memory leak when using formula (#18098)
Browse files Browse the repository at this point in the history
  • Loading branch information
andig authored Jan 7, 2025
1 parent 3e6f23e commit d78d4bd
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 36 deletions.
13 changes: 1 addition & 12 deletions provider/golang/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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 {
Expand Down
36 changes: 12 additions & 24 deletions tariff/embed.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand All @@ -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
}
Expand Down

0 comments on commit d78d4bd

Please sign in to comment.