summaryrefslogtreecommitdiff
path: root/vm
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2026-01-07 19:06:23 +0100
committerMarc Vertes <mvertes@free.fr>2026-01-07 19:06:23 +0100
commit6875facb39de63eb6353be2f700b9eacb631e9fa (patch)
tree31b8d7c8701df2f52a7b3cecc82dd775c9d9f428 /vm
parentca80eeaa812b49afea75d3084d0c62770e4a8d18 (diff)
fix: improve handling of composite literal struct expressions
Diffstat (limited to 'vm')
-rw-r--r--vm/op_string.go45
-rw-r--r--vm/vm.go14
2 files changed, 34 insertions, 25 deletions
diff --git a/vm/op_string.go b/vm/op_string.go
index 7eb0e5d..15cc938 100644
--- a/vm/op_string.go
+++ b/vm/op_string.go
@@ -26,31 +26,32 @@ func _() {
_ = x[Exit-15]
_ = x[Field-16]
_ = x[FieldSet-17]
- _ = x[Greater-18]
- _ = x[Grow-19]
- _ = x[Index-20]
- _ = x[Jump-21]
- _ = x[JumpTrue-22]
- _ = x[JumpFalse-23]
- _ = x[JumpSetTrue-24]
- _ = x[JumpSetFalse-25]
- _ = x[Lower-26]
- _ = x[Loweri-27]
- _ = x[Mul-28]
- _ = x[New-29]
- _ = x[Negate-30]
- _ = x[Not-31]
- _ = x[Pop-32]
- _ = x[Push-33]
- _ = x[Return-34]
- _ = x[Sub-35]
- _ = x[Subi-36]
- _ = x[Swap-37]
+ _ = x[FieldFset-18]
+ _ = x[Greater-19]
+ _ = x[Grow-20]
+ _ = x[Index-21]
+ _ = x[Jump-22]
+ _ = x[JumpTrue-23]
+ _ = x[JumpFalse-24]
+ _ = x[JumpSetTrue-25]
+ _ = x[JumpSetFalse-26]
+ _ = x[Lower-27]
+ _ = x[Loweri-28]
+ _ = x[Mul-29]
+ _ = x[New-30]
+ _ = x[Negate-31]
+ _ = x[Not-32]
+ _ = x[Pop-33]
+ _ = x[Push-34]
+ _ = x[Return-35]
+ _ = x[Sub-36]
+ _ = x[Subi-37]
+ _ = x[Swap-38]
}
-const _Op_name = "NopAddAddrAssignFassignVassignCallCalliCallXDerefDupFdupFnewEqualEqualSetExitFieldFieldSetGreaterGrowIndexJumpJumpTrueJumpFalseJumpSetTrueJumpSetFalseLowerLoweriMulNewNegateNotPopPushReturnSubSubiSwap"
+const _Op_name = "NopAddAddrAssignFassignVassignCallCalliCallXDerefDupFdupFnewEqualEqualSetExitFieldFieldSetFieldFsetGreaterGrowIndexJumpJumpTrueJumpFalseJumpSetTrueJumpSetFalseLowerLoweriMulNewNegateNotPopPushReturnSubSubiSwap"
-var _Op_index = [...]uint8{0, 3, 6, 10, 16, 23, 30, 34, 39, 44, 49, 52, 56, 60, 65, 73, 77, 82, 90, 97, 101, 106, 110, 118, 127, 138, 150, 155, 161, 164, 167, 173, 176, 179, 183, 189, 192, 196, 200}
+var _Op_index = [...]uint8{0, 3, 6, 10, 16, 23, 30, 34, 39, 44, 49, 52, 56, 60, 65, 73, 77, 82, 90, 99, 106, 110, 115, 119, 127, 136, 147, 159, 164, 170, 173, 176, 182, 185, 188, 192, 198, 201, 205, 209}
func (i Op) String() string {
idx := int(i) - 0
diff --git a/vm/vm.go b/vm/vm.go
index caf9189..ed27148 100644
--- a/vm/vm.go
+++ b/vm/vm.go
@@ -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