summaryrefslogtreecommitdiff
path: root/vm
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2023-11-20 15:54:52 +0100
committerMarc Vertes <mvertes@free.fr>2023-11-20 15:54:52 +0100
commit6a0490257bf235d011004bc303306f617ac6ea31 (patch)
treee04160a26f78afaa60c4b18b3b16662d35106d97 /vm
parent001ca51323a1a54c9b3db377f0783c330666c480 (diff)
parser: add support for unary operators
Diffstat (limited to 'vm')
-rw-r--r--vm/vm.go4
1 files changed, 4 insertions, 0 deletions
diff --git a/vm/vm.go b/vm/vm.go
index fa31ff0..21205de 100644
--- a/vm/vm.go
+++ b/vm/vm.go
@@ -37,6 +37,7 @@ const (
Lower // n1 n2 -- cond ; cond = n1 < n2
Loweri // n1 -- cond ; cond = n1 < $1
Mul // n1 n2 -- prod ; prod = n1*n2
+ Not // c -- r ; r = !c
Pop // v --
Push // -- v
Return // [r1 .. ri] -- ; exit frame: sp = fp, fp = pop
@@ -69,6 +70,7 @@ var strop = [...]string{ // for VM tracing.
Lower: "Lower",
Loweri: "Loweri",
Mul: "Mul",
+ Not: "Not",
Pop: "Pop",
Push: "Push",
Return: "Return",
@@ -210,6 +212,8 @@ func (m *Machine) Run() (err error) {
mem = mem[:sp-1]
case Loweri:
mem[sp-1] = mem[sp-1].(int) < int(op[2])
+ case Not:
+ mem[sp-1] = !mem[sp-1].(bool)
case Pop:
mem = mem[:sp-int(op[2])]
case Push: