diff options
Diffstat (limited to 'pkg/lang/vm/exec.go')
| -rw-r--r-- | pkg/lang/vm/exec.go | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/pkg/lang/vm/exec.go b/pkg/lang/vm/exec.go index 93b8845..181d74e 100644 --- a/pkg/lang/vm/exec.go +++ b/pkg/lang/vm/exec.go @@ -662,6 +662,63 @@ func (vm *VM) execIndex() error { return nil } +func (vm *VM) execLt() error { + y, err := vm.popAndDrop() + if err != nil { + return err + } + x, err := vm.popAndDrop() + if err != nil { + return err + } + + var res value.Value + + switch x.Type() { + case value.IntType: + xv := x.Data().(value.IntData).Get() + switch y.Type() { + case value.IntType: + yv := y.Data().(value.IntData).Get() + res = value.NewBool(xv < yv) + case value.FloatType: + yv := y.Data().(value.FloatData).Get() + res = value.NewBool(float64(xv) < yv) + default: + return ErrInvalidOperandTypes{ + Op: code.OpLte, + X: x.Type(), + Y: y.Type(), + } + } + case value.FloatType: + xv := x.Data().(value.FloatData).Get() + switch y.Type() { + case value.IntType: + yv := y.Data().(value.IntData).Get() + res = value.NewBool(xv < float64(yv)) + case value.FloatType: + yv := y.Data().(value.FloatData).Get() + res = value.NewBool(xv < yv) + default: + return ErrInvalidOperandTypes{ + Op: code.OpLte, + X: x.Type(), + Y: y.Type(), + } + } + default: + return ErrInvalidOperandTypes{ + Op: code.OpLte, + X: x.Type(), + Y: y.Type(), + } + } + + vm.stack.Push(res) + return nil +} + func (vm *VM) execLte() error { y, err := vm.popAndDrop() if err != nil { |
