diff options
Diffstat (limited to 'pkg/lang/vm')
| -rw-r--r-- | pkg/lang/vm/code/op.go | 1 | ||||
| -rw-r--r-- | pkg/lang/vm/exec.go | 57 | ||||
| -rw-r--r-- | pkg/lang/vm/text/decompiler.go | 1 | ||||
| -rw-r--r-- | pkg/lang/vm/text/op.go | 1 | ||||
| -rw-r--r-- | pkg/lang/vm/vm.go | 2 |
5 files changed, 62 insertions, 0 deletions
diff --git a/pkg/lang/vm/code/op.go b/pkg/lang/vm/code/op.go index 8b8ff3a..d0b2555 100644 --- a/pkg/lang/vm/code/op.go +++ b/pkg/lang/vm/code/op.go @@ -35,6 +35,7 @@ const ( OpSub OpMod OpIndex + OpLt OpLte OpCall 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 { diff --git a/pkg/lang/vm/text/decompiler.go b/pkg/lang/vm/text/decompiler.go index c8922ec..bef066b 100644 --- a/pkg/lang/vm/text/decompiler.go +++ b/pkg/lang/vm/text/decompiler.go @@ -61,6 +61,7 @@ func (d *Decompiler) decompileInstruction(bc code.Raw) (string, code.Raw) { code.OpSub, code.OpMod, code.OpIndex, + code.OpLt, code.OpLte, code.OpRet, code.OpTempArrLen, diff --git a/pkg/lang/vm/text/op.go b/pkg/lang/vm/text/op.go index 0d01bdb..17f4847 100644 --- a/pkg/lang/vm/text/op.go +++ b/pkg/lang/vm/text/op.go @@ -30,6 +30,7 @@ var ( code.OpSub: "sub", code.OpMod: "mod", code.OpIndex: "index", + code.OpLt: "lt", code.OpLte: "lte", code.OpCall: "call", code.OpJmp: "jmp", diff --git a/pkg/lang/vm/vm.go b/pkg/lang/vm/vm.go index e483176..3f0703a 100644 --- a/pkg/lang/vm/vm.go +++ b/pkg/lang/vm/vm.go @@ -168,6 +168,8 @@ func (vm *VM) step(op code.Op) (stepDecision, error) { err = vm.execMod() case code.OpIndex: err = vm.execIndex() + case code.OpLt: + err = vm.execLt() case code.OpLte: err = vm.execLte() case code.OpCall: |
