Skip to content

Commit 4762edf

Browse files
committed
Change memoryBudget type to uint
Fixes #427
1 parent 369aaec commit 4762edf

File tree

1 file changed

+13
-15
lines changed

1 file changed

+13
-15
lines changed

vm/vm.go

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"github.com/antonmedv/expr/vm/runtime"
1414
)
1515

16-
var MemoryBudget int = 1e6
16+
var MemoryBudget uint = 1e6
1717
var errorType = reflect.TypeOf((*error)(nil)).Elem()
1818

1919
type 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

4141
type 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+
537535
func (vm *VM) Stack() []any {
538536
return vm.stack
539537
}

0 commit comments

Comments
 (0)