about summary refs log tree commit diff
path: root/pkg/lang/vm/exec.go
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-05-27 00:09:27 +0000
committerGitHub <noreply@github.com>2022-05-27 00:09:27 +0000
commitc2d4bf51de9a2d721168c62b14b89f5281ed366e (patch)
tree09329cd24249e46fe6660fa9bd1f0efac29af38f /pkg/lang/vm/exec.go
parent3f4efe745a0404953266476ec52db54b182de2f8 (diff)
downloadjinx-c2d4bf51de9a2d721168c62b14b89f5281ed366e.tar.zst
jinx-c2d4bf51de9a2d721168c62b14b89f5281ed366e.zip
VM ARC
Diffstat (limited to 'pkg/lang/vm/exec.go')
-rw-r--r--pkg/lang/vm/exec.go53
1 files changed, 30 insertions, 23 deletions
diff --git a/pkg/lang/vm/exec.go b/pkg/lang/vm/exec.go
index 655f7f1..90b79a9 100644
--- a/pkg/lang/vm/exec.go
+++ b/pkg/lang/vm/exec.go
@@ -14,7 +14,7 @@ func (vm *VM) execPushFloat(x float64) {
 }
 
 func (vm *VM) execPushString(str string) {
-	vm.stack.Push(value.NewString(str))
+	vm.stack.Push(value.NewString(&vm.memory, str))
 }
 
 func (vm *VM) execPushBool(b bool) {
@@ -26,7 +26,7 @@ func (vm *VM) execPushNull() {
 }
 
 func (vm *VM) execPushArray() {
-	vm.stack.Push(value.NewArray([]value.Value{}))
+	vm.stack.Push(value.NewArray(&vm.memory, []value.Value{}))
 }
 
 func (vm *VM) execPushFunction(pc int) {
@@ -39,16 +39,18 @@ func (vm *VM) execGetLocal(offset int) error {
 		return err
 	}
 
-	vm.stack.Push(local)
+	v := local.Clone(&vm.memory)
+
+	vm.stack.Push(v)
 	return nil
 }
 
 func (vm *VM) execAdd() error {
-	x, err := vm.stack.Pop()
+	x, err := vm.popAndDrop()
 	if err != nil {
 		return err
 	}
-	y, err := vm.stack.Pop()
+	y, err := vm.popAndDrop()
 	if err != nil {
 		return err
 	}
@@ -91,7 +93,8 @@ func (vm *VM) execAdd() error {
 	case value.StringType:
 		switch y.Type().Kind {
 		case value.StringType:
-			res = value.NewString(x.Data().(value.StringData).Get() + y.Data().(value.StringData).Get())
+			panic("not implemented")
+			// res = value.NewString(x.Data().(value.StringData).Get() + y.Data().(value.StringData).Get())
 		default:
 			return ErrInvalidOperandTypes{
 				Op: code.OpAdd,
@@ -112,11 +115,11 @@ func (vm *VM) execAdd() error {
 }
 
 func (vm *VM) execSub() error {
-	x, err := vm.stack.Pop()
+	x, err := vm.popAndDrop()
 	if err != nil {
 		return err
 	}
-	y, err := vm.stack.Pop()
+	y, err := vm.popAndDrop()
 	if err != nil {
 		return err
 	}
@@ -169,11 +172,11 @@ func (vm *VM) execSub() error {
 }
 
 func (vm *VM) execIndex() error {
-	v, err := vm.stack.Pop()
+	v, err := vm.popAndDrop()
 	if err != nil {
 		return err
 	}
-	i, err := vm.stack.Pop()
+	i, err := vm.popAndDrop()
 	if err != nil {
 		return err
 	}
@@ -184,13 +187,16 @@ func (vm *VM) execIndex() error {
 		switch i.Type().Kind {
 		case value.IntType:
 			idx := i.Data().(value.IntData).Get()
-			if idx < 0 || idx >= int64(arr.Len()) {
+			len := int64(arr.Len(&vm.memory))
+			if idx < 0 || idx >= len {
 				return ErrArrayIndexOutOfBounds{
 					Index: int(idx),
-					Len:   arr.Len(),
+					Len:   int(len),
 				}
 			}
-			vm.stack.Push(arr.At(int(idx)))
+
+			val := arr.At(&vm.memory, int(idx)).Clone(&vm.memory)
+			vm.stack.Push(val)
 		default:
 			return ErrInvalidOperandTypes{
 				Op: code.OpIndex,
@@ -210,11 +216,11 @@ func (vm *VM) execIndex() error {
 }
 
 func (vm *VM) execLte() error {
-	x, err := vm.stack.Pop()
+	x, err := vm.popAndDrop()
 	if err != nil {
 		return err
 	}
-	y, err := vm.stack.Pop()
+	y, err := vm.popAndDrop()
 	if err != nil {
 		return err
 	}
@@ -267,7 +273,7 @@ func (vm *VM) execLte() error {
 }
 
 func (vm *VM) execCall() error {
-	f, err := vm.stack.Pop()
+	f, err := vm.popAndDrop()
 	if err != nil {
 		return err
 	}
@@ -291,7 +297,7 @@ func (vm *VM) execCall() error {
 }
 
 func (vm *VM) execJumpIf(pc int, cond bool) error {
-	b, err := vm.stack.Pop()
+	b, err := vm.popAndDrop()
 	if err != nil {
 		return err
 	}
@@ -325,7 +331,7 @@ func (vm *VM) execRet() error {
 		return err
 	}
 
-	pc, err := vm.stack.PopCall()
+	pc, err := vm.popCallAndDrop()
 	if err != nil {
 		return err
 	}
@@ -336,7 +342,7 @@ func (vm *VM) execRet() error {
 }
 
 func (vm *VM) execTempArrLen() error {
-	a, err := vm.stack.Pop()
+	a, err := vm.popAndDrop()
 	if err != nil {
 		return err
 	}
@@ -344,7 +350,8 @@ func (vm *VM) execTempArrLen() error {
 	switch a.Type().Kind {
 	case value.ArrayType:
 		arr := a.Data().(value.ArrayData)
-		res := value.NewInt(int64(arr.Len()))
+		len := int64(arr.Len(&vm.memory))
+		res := value.NewInt(len)
 		vm.stack.Push(res)
 	default:
 		return ErrInvalidOperandTypes{
@@ -357,11 +364,11 @@ func (vm *VM) execTempArrLen() error {
 }
 
 func (vm *VM) execTempArrPush() error {
-	a, err := vm.stack.Pop()
+	a, err := vm.popAndDrop()
 	if err != nil {
 		return err
 	}
-	e, err := vm.stack.Pop()
+	e, err := vm.popAndDrop()
 	if err != nil {
 		return err
 	}
@@ -369,7 +376,7 @@ func (vm *VM) execTempArrPush() error {
 	switch a.Type().Kind {
 	case value.ArrayType:
 		arr := a.Data().(value.ArrayData)
-		arr.Push(e)
+		arr.Push(&vm.memory, e)
 	default:
 		return ErrInvalidOperandType{
 			Op: code.OpTempArrPush,