diff options
Diffstat (limited to 'vm')
| -rw-r--r-- | vm/op_string.go | 39 | ||||
| -rw-r--r-- | vm/vm.go | 10 |
2 files changed, 29 insertions, 20 deletions
diff --git a/vm/op_string.go b/vm/op_string.go index 15cc938..a39dcfa 100644 --- a/vm/op_string.go +++ b/vm/op_string.go @@ -30,28 +30,29 @@ func _() { _ = 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] + _ = x[IndexSet-22] + _ = x[Jump-23] + _ = x[JumpTrue-24] + _ = x[JumpFalse-25] + _ = x[JumpSetTrue-26] + _ = x[JumpSetFalse-27] + _ = x[Lower-28] + _ = x[Loweri-29] + _ = x[Mul-30] + _ = x[New-31] + _ = x[Negate-32] + _ = x[Not-33] + _ = x[Pop-34] + _ = x[Push-35] + _ = x[Return-36] + _ = x[Sub-37] + _ = x[Subi-38] + _ = x[Swap-39] } -const _Op_name = "NopAddAddrAssignFassignVassignCallCalliCallXDerefDupFdupFnewEqualEqualSetExitFieldFieldSetFieldFsetGreaterGrowIndexJumpJumpTrueJumpFalseJumpSetTrueJumpSetFalseLowerLoweriMulNewNegateNotPopPushReturnSubSubiSwap" +const _Op_name = "NopAddAddrAssignFassignVassignCallCalliCallXDerefDupFdupFnewEqualEqualSetExitFieldFieldSetFieldFsetGreaterGrowIndexIndexSetJumpJumpTrueJumpFalseJumpSetTrueJumpSetFalseLowerLoweriMulNewNegateNotPopPushReturnSubSubiSwap" -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} +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, 123, 127, 135, 144, 155, 167, 172, 178, 181, 184, 190, 193, 196, 200, 206, 209, 213, 217} func (i Op) String() string { idx := int(i) - 0 @@ -41,6 +41,7 @@ const ( Greater // n1 n2 -- cond; cond = n1 > n2 Grow // -- ; sp += $1 Index // a i -- a[i] ; + IndexSet // a i v -- a; a[i] = v Jump // -- ; ip += $1 JumpTrue // cond -- ; if cond { ip += $1 } JumpFalse // cond -- ; if cond { ip += $1 } @@ -170,6 +171,10 @@ func (m *Machine) Run() (err error) { mem = append(mem, mem[c.Arg[0]+fp-1]) case Fnew: mem = append(mem, NewValue(mem[c.Arg[0]].Type)) + if len(c.Arg) > 1 { + mem[len(mem)-1].Grow(c.Arg[1]) + mem[len(mem)-1].SetLen(c.Arg[1]) + } case Field: fv := mem[sp-1].FieldByIndex(c.Arg) if !fv.CanSet() { @@ -262,8 +267,11 @@ func (m *Machine) Run() (err error) { case Index: mem[sp-2].Value = mem[sp-2].Index(int(mem[sp-1].Int())) mem = mem[:sp-1] + case IndexSet: + log.Println("## IndexSet:", sp-3, mem[sp-3].Type) + mem[sp-3].Value.Index(int(mem[sp-2].Int())).Set(mem[sp-1].Value) + mem = mem[:sp-2] case Vassign: - // mem[sp-1].Set(mem[sp-2].Value) mem[sp-2].Set(mem[sp-1].Value) mem = mem[:sp-2] } |
