about summary refs log tree commit diff
path: root/pkg/lang/vm/exec.go
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-06-02 00:07:20 +0000
committerGitHub <noreply@github.com>2022-06-02 00:07:20 +0000
commit87d115da565618b2f2f1cbbdcca883bbc0c57e60 (patch)
treeb962cfd3ba765277e25b67fa2ec39576a1d1f589 /pkg/lang/vm/exec.go
parentedca72c160967f1918b65c91a40de89ecd8badda (diff)
downloadjinx-87d115da565618b2f2f1cbbdcca883bbc0c57e60.tar.zst
jinx-87d115da565618b2f2f1cbbdcca883bbc0c57e60.zip
OpMod and OpSetLocal for prime test
Diffstat (limited to 'pkg/lang/vm/exec.go')
-rw-r--r--pkg/lang/vm/exec.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/pkg/lang/vm/exec.go b/pkg/lang/vm/exec.go
index be72158..4fbc516 100644
--- a/pkg/lang/vm/exec.go
+++ b/pkg/lang/vm/exec.go
@@ -69,6 +69,23 @@ func (vm *VM) execGetLocal(offset int) error {
 	return nil
 }
 
+func (vm *VM) execSetLocal(offset int) error {
+	new, err := vm.stack.Pop()
+	if err != nil {
+		return err
+	}
+
+	local, err := vm.stack.Local(int(offset))
+	if err != nil {
+		return err
+	}
+
+	local.Drop(vm.memory)
+
+	stackIndex := vm.stack.LocalToStackIndex(offset)
+	return vm.stack.Set(stackIndex, new)
+}
+
 func (vm *VM) execPushType(name string) error {
 	ref, err := value.NewType(vm.memory, name)
 	if err != nil {
@@ -556,6 +573,44 @@ func (vm *VM) execSub() error {
 	return nil
 }
 
+func (vm *VM) execMod() error {
+	x, err := vm.popAndDrop()
+	if err != nil {
+		return err
+	}
+	y, err := vm.popAndDrop()
+	if err != nil {
+		return err
+	}
+
+	var res value.Value
+
+	switch x.Type() {
+	case value.IntType:
+		xv := x.Data().(value.IntData).Get()
+		switch y.Type() {
+		case value.IntType:
+			yv := y.Data().(value.IntData).Get()
+			res = value.NewInt(xv % yv)
+		default:
+			return ErrInvalidOperandTypes{
+				Op: code.OpMod,
+				X:  x.Type(),
+				Y:  y.Type(),
+			}
+		}
+	default:
+		return ErrInvalidOperandTypes{
+			Op: code.OpMod,
+			X:  x.Type(),
+			Y:  y.Type(),
+		}
+	}
+
+	vm.stack.Push(res)
+	return nil
+}
+
 func (vm *VM) execIndex() error {
 	v, err := vm.popAndDrop()
 	if err != nil {