summaryrefslogtreecommitdiff
path: root/vm
diff options
context:
space:
mode:
Diffstat (limited to 'vm')
-rw-r--r--vm/op_string.go39
-rw-r--r--vm/vm.go10
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
diff --git a/vm/vm.go b/vm/vm.go
index ed27148..b5c6cf5 100644
--- a/vm/vm.go
+++ b/vm/vm.go
@@ -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]
}