summaryrefslogtreecommitdiff
path: root/comp/compiler.go
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 /comp/compiler.go
parent31e3793202402fda21905027c18ebfa5c8d8c832 (diff)
feat: handle slice expressions
Diffstat (limited to 'comp/compiler.go')
-rw-r--r--comp/compiler.go20
1 files changed, 15 insertions, 5 deletions
diff --git a/comp/compiler.go b/comp/compiler.go
index 8a7db22..4c691b2 100644
--- a/comp/compiler.go
+++ b/comp/compiler.go
@@ -178,7 +178,6 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) {
emit(t, vm.CallX, t.Beg)
case lang.Colon:
- showStack()
pop()
ks := pop()
ts := top()
@@ -242,7 +241,7 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) {
}
emit(t, vm.Vassign)
- case lang.MapAssign:
+ case lang.IndexAssign:
s := stack[len(stack)-3]
switch s.Type.Rtype.Kind() {
case reflect.Array, reflect.Slice:
@@ -318,6 +317,10 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) {
c.Symbols[t.Str] = &symbol.Symbol{Kind: symbol.Label, Value: vm.ValueOf(lc)}
}
+ case lang.Len:
+ push(&symbol.Symbol{Type: c.Symbols["int"].Type})
+ emit(t, vm.Len, t.Beg)
+
case lang.JumpFalse:
var i int
if s, ok := c.Symbols[t.Str]; !ok {
@@ -393,8 +396,6 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) {
case symbol.Unset:
return errorf("invalid symbol: %s", s.Name)
default:
- // FIXME: handle pointer indirection here
- log.Println("## XXX", s.Type, s.Type.IsPtr())
typ := s.Type.Rtype
isPtr := typ.Kind() == reflect.Pointer
if isPtr {
@@ -416,6 +417,15 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) {
case lang.Return:
emit(t, vm.Return, t.Beg, t.End)
+ case lang.Slice:
+ if stack[len(stack)-3].IsInt() {
+ emit(t, vm.Slice3)
+ stack = stack[:len(stack)-4]
+ } else {
+ emit(t, vm.Slice)
+ stack = stack[:len(stack)-3]
+ }
+
default:
return fmt.Errorf("generate: unsupported token %v", t)
}
@@ -457,7 +467,7 @@ func (c *Compiler) PrintCode() {
}
extra := ""
switch l.Op {
- case vm.Jump, vm.JumpFalse, vm.JumpTrue, vm.JumpSetFalse, vm.JumpSetTrue, vm.Calli:
+ case vm.Jump, vm.JumpFalse, vm.JumpTrue, vm.JumpSetFalse, vm.JumpSetTrue:
if d, ok := labels[i+l.Arg[0]]; ok {
extra = "// " + d[0]
}