diff options
| author | Marc Vertes <mvertes@free.fr> | 2026-01-07 19:06:23 +0100 |
|---|---|---|
| committer | Marc Vertes <mvertes@free.fr> | 2026-01-07 19:06:23 +0100 |
| commit | 6875facb39de63eb6353be2f700b9eacb631e9fa (patch) | |
| tree | 31b8d7c8701df2f52a7b3cecc82dd775c9d9f428 /vm/vm.go | |
| parent | ca80eeaa812b49afea75d3084d0c62770e4a8d18 (diff) | |
fix: improve handling of composite literal struct expressions
Diffstat (limited to 'vm/vm.go')
| -rw-r--r-- | vm/vm.go | 14 |
1 files changed, 11 insertions, 3 deletions
@@ -37,6 +37,7 @@ const ( Exit // -- ; Field // s -- f ; f = s.FieldIndex($1, ...) FieldSet // s d -- s ; s.FieldIndex($1, ...) = d + FieldFset // s i v -- s; s.FieldIndex(i) = v Greater // n1 n2 -- cond; cond = n1 > n2 Grow // -- ; sp += $1 Index // a i -- a[i] ; @@ -177,14 +178,21 @@ func (m *Machine) Run() (err error) { } mem[sp-1].Value = fv case FieldSet: - fv := mem[sp-1].FieldByIndex(c.Arg) + fv := mem[sp-2].FieldByIndex(c.Arg) if !fv.CanSet() { // Normally private fields can not bet set via reflect. Override this limitation. fv = reflect.NewAt(fv.Type(), unsafe.Pointer(fv.UnsafeAddr())).Elem() } - fv.Set(mem[sp-2].Value) - mem[sp-2] = mem[sp-1] + fv.Set(mem[sp-1].Value) mem = mem[:sp-1] + case FieldFset: + fv := mem[sp-3].Field(int(mem[sp-2].Int())) + if !fv.CanSet() { + // Normally private fields can not bet set via reflect. Override this limitation. + fv = reflect.NewAt(fv.Type(), unsafe.Pointer(fv.UnsafeAddr())).Elem() + } + fv.Set(mem[sp-1].Value) + mem = mem[:sp-2] case Jump: ip += c.Arg[0] continue |
