@@ -13,7 +13,7 @@ import (
1313 "github.com/antonmedv/expr/vm/runtime"
1414)
1515
16- var MemoryBudget int = 1e6
16+ var MemoryBudget uint = 1e6
1717var errorType = reflect .TypeOf ((* error )(nil )).Elem ()
1818
1919type Function = func (params ... any ) (any , error )
@@ -34,8 +34,8 @@ type VM struct {
3434 debug bool
3535 step chan struct {}
3636 curr chan int
37- memory int
38- memoryBudget int
37+ memory uint
38+ memoryBudget uint
3939}
4040
4141type Scope struct {
@@ -269,11 +269,8 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) {
269269 min := runtime .ToInt (a )
270270 max := runtime .ToInt (b )
271271 size := max - min + 1
272- if vm .memory + size >= vm .memoryBudget {
273- panic ("memory budget exceeded" )
274- }
272+ vm .memGrow (uint (size ))
275273 vm .push (runtime .MakeRange (min , max ))
276- vm .memory += size
277274
278275 case OpMatches :
279276 b := vm .pop ()
@@ -395,29 +392,23 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) {
395392
396393 case OpArray :
397394 size := vm .pop ().(int )
395+ vm .memGrow (uint (size ))
398396 array := make ([]any , size )
399397 for i := size - 1 ; i >= 0 ; i -- {
400398 array [i ] = vm .pop ()
401399 }
402400 vm .push (array )
403- vm .memory += size
404- if vm .memory >= vm .memoryBudget {
405- panic ("memory budget exceeded" )
406- }
407401
408402 case OpMap :
409403 size := vm .pop ().(int )
404+ vm .memGrow (uint (size ))
410405 m := make (map [string ]any )
411406 for i := size - 1 ; i >= 0 ; i -- {
412407 value := vm .pop ()
413408 key := vm .pop ()
414409 m [key .(string )] = value
415410 }
416411 vm .push (m )
417- vm .memory += size
418- if vm .memory >= vm .memoryBudget {
419- panic ("memory budget exceeded" )
420- }
421412
422413 case OpLen :
423414 vm .push (runtime .Len (vm .current ()))
@@ -534,6 +525,13 @@ func (vm *VM) pop() any {
534525 return value
535526}
536527
528+ func (vm * VM ) memGrow (size uint ) {
529+ vm .memory += size
530+ if vm .memory >= vm .memoryBudget {
531+ panic ("memory budget exceeded" )
532+ }
533+ }
534+
537535func (vm * VM ) Stack () []any {
538536 return vm .stack
539537}
0 commit comments