@@ -13,7 +13,7 @@ import (
13
13
"github.com/antonmedv/expr/vm/runtime"
14
14
)
15
15
16
- var MemoryBudget int = 1e6
16
+ var MemoryBudget uint = 1e6
17
17
var errorType = reflect .TypeOf ((* error )(nil )).Elem ()
18
18
19
19
type Function = func (params ... any ) (any , error )
@@ -34,8 +34,8 @@ type VM struct {
34
34
debug bool
35
35
step chan struct {}
36
36
curr chan int
37
- memory int
38
- memoryBudget int
37
+ memory uint
38
+ memoryBudget uint
39
39
}
40
40
41
41
type Scope struct {
@@ -269,11 +269,8 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) {
269
269
min := runtime .ToInt (a )
270
270
max := runtime .ToInt (b )
271
271
size := max - min + 1
272
- if vm .memory + size >= vm .memoryBudget {
273
- panic ("memory budget exceeded" )
274
- }
272
+ vm .memGrow (uint (size ))
275
273
vm .push (runtime .MakeRange (min , max ))
276
- vm .memory += size
277
274
278
275
case OpMatches :
279
276
b := vm .pop ()
@@ -395,29 +392,23 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) {
395
392
396
393
case OpArray :
397
394
size := vm .pop ().(int )
395
+ vm .memGrow (uint (size ))
398
396
array := make ([]any , size )
399
397
for i := size - 1 ; i >= 0 ; i -- {
400
398
array [i ] = vm .pop ()
401
399
}
402
400
vm .push (array )
403
- vm .memory += size
404
- if vm .memory >= vm .memoryBudget {
405
- panic ("memory budget exceeded" )
406
- }
407
401
408
402
case OpMap :
409
403
size := vm .pop ().(int )
404
+ vm .memGrow (uint (size ))
410
405
m := make (map [string ]any )
411
406
for i := size - 1 ; i >= 0 ; i -- {
412
407
value := vm .pop ()
413
408
key := vm .pop ()
414
409
m [key .(string )] = value
415
410
}
416
411
vm .push (m )
417
- vm .memory += size
418
- if vm .memory >= vm .memoryBudget {
419
- panic ("memory budget exceeded" )
420
- }
421
412
422
413
case OpLen :
423
414
vm .push (runtime .Len (vm .current ()))
@@ -534,6 +525,13 @@ func (vm *VM) pop() any {
534
525
return value
535
526
}
536
527
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
+
537
535
func (vm * VM ) Stack () []any {
538
536
return vm .stack
539
537
}
0 commit comments