summaryrefslogtreecommitdiff
path: root/interp
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2026-01-16 12:30:31 +0100
committerMarc Vertes <mvertes@free.fr>2026-01-16 12:30:31 +0100
commitee9397bc031dc33e4f735b3331643bbf60a0d17a (patch)
tree42087d58e916904af3e70de6171e0f1c9c894d8f /interp
parent31e3793202402fda21905027c18ebfa5c8d8c832 (diff)
feat: handle slice expressions
Diffstat (limited to 'interp')
-rw-r--r--interp/interpreter.go3
-rw-r--r--interp/interpreter_test.go17
2 files changed, 19 insertions, 1 deletions
diff --git a/interp/interpreter.go b/interp/interpreter.go
index 8d372c3..4faba28 100644
--- a/interp/interpreter.go
+++ b/interp/interpreter.go
@@ -42,7 +42,8 @@ func (i *Interp) Eval(src string) (res reflect.Value, err error) {
i.Push(i.Data[dataOffset:]...)
i.PushCode(i.Code[codeOffset:]...)
if s, ok := i.Symbols["main"]; ok {
- i.PushCode(vm.Instruction{Op: vm.Calli, Arg: []int{int(i.Data[s.Index].Int())}})
+ i.PushCode(vm.Instruction{Op: vm.Push, Arg: []int{int(i.Data[s.Index].Int())}})
+ i.PushCode(vm.Instruction{Op: vm.Call, Arg: []int{0}})
}
i.PushCode(vm.Instruction{Op: vm.Exit})
i.SetIP(max(codeOffset, i.Entry))
diff --git a/interp/interpreter_test.go b/interp/interpreter_test.go
index bf90357..7a974d1 100644
--- a/interp/interpreter_test.go
+++ b/interp/interpreter_test.go
@@ -230,6 +230,23 @@ func TestMap(t *testing.T) {
})
}
+func TestSlice(t *testing.T) {
+ src0 := `s := []int{0, 1, 2, 3};`
+ run(t, []etest{
+ {src: src0 + `s`, res: `[0 1 2 3]`}, // #00
+ {src: src0 + `s[:]`, res: `[0 1 2 3]`}, // #01
+ {src: src0 + `s[1:3]`, res: `[1 2]`}, // #02
+ {src: src0 + `s[1:3:4]`, res: `[1 2]`}, // #03
+ {src: src0 + `s[:3:4]`, res: `[0 1 2]`}, // #04
+ {src: src0 + `s[:2:]`, err: `final index required in 3-index slice`}, // #05
+ {src: src0 + `s[:3:4:]`, err: `expected ']', found ':'`}, // #06
+ {src: src0 + `s[2:]`, res: `[2 3]`}, // #07
+ {src: src0 + `s[:0]`, res: `[]`}, // #08
+ {src: `"Hello"[1:3]`, res: `el`}, // #09
+ {src: `s := "Hello"; s[1:3]`, res: `el`}, // #10
+ })
+}
+
func TestType(t *testing.T) {
src0 := `type (
I int