about summary refs log tree commit diff
path: root/pkg/lang/vm/core.go
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-05-29 21:42:32 +0000
committerGitHub <noreply@github.com>2022-05-29 21:42:32 +0000
commitd2f69dccb3643834a79da79be4ece189a7178c9e (patch)
tree7e32365a25f37bee199dde36dfdfef12916de46f /pkg/lang/vm/core.go
parent11bcf772bf8d9aa353eb4c04bfb85378ba392b1e (diff)
downloadjinx-d2f69dccb3643834a79da79be4ece189a7178c9e.tar.zst
jinx-d2f69dccb3643834a79da79be4ece189a7178c9e.zip
Types, Methods and basic Core Lib
Diffstat (limited to 'pkg/lang/vm/core.go')
-rw-r--r--pkg/lang/vm/core.go93
1 files changed, 93 insertions, 0 deletions
diff --git a/pkg/lang/vm/core.go b/pkg/lang/vm/core.go
new file mode 100644
index 0000000..e482211
--- /dev/null
+++ b/pkg/lang/vm/core.go
@@ -0,0 +1,93 @@
+package vm
+
+import (
+	"jinx/pkg/lang/vm/code"
+	"jinx/pkg/lang/vm/value"
+)
+
+func (vm *VM) createCoreNullType() value.Type {
+	return value.Type{
+		Kind: value.NullType,
+	}
+}
+
+func (vm *VM) createCoreIntType() value.Type {
+	return value.Type{
+		Kind: value.IntType,
+	}
+}
+
+func (vm *VM) createCoreFloatType() value.Type {
+	return value.Type{
+		Kind: value.FloatType,
+	}
+}
+
+func (vm *VM) createCoreStringType() value.Type {
+	return value.Type{
+		Kind: value.StringType,
+	}
+}
+
+func (vm *VM) createCoreBoolType() value.Type {
+	return value.Type{
+		Kind: value.BoolType,
+	}
+}
+
+func (vm *VM) createCoreArrayType() value.Type {
+	return value.Type{
+		Kind: value.ArrayType,
+		Methods: map[string]value.FunctionData{
+			"length": makeCoreFn(vm.coreArrayLength),
+		},
+	}
+}
+
+func (vm *VM) createCoreFunctionType() value.Type {
+	return value.Type{
+		Kind: value.FunctionType,
+	}
+}
+
+func (vm *VM) coreArrayLength(args []value.Value) (value.Value, error) {
+	a, err := vm.getThis()
+	if err != nil {
+		return value.Value{}, err
+	}
+
+	switch a.Type() {
+	case value.ArrayType:
+		arr := a.Data().(value.ArrayData)
+		len, err := arr.Len(vm.memory)
+		if err != nil {
+			return value.Value{}, err
+		}
+		res := value.NewInt(int64(len))
+		return res, nil
+	default:
+		return value.Value{}, ErrInvalidOperandType{
+			Op: code.OpTempArrLen,
+			X:  a.Type(),
+		}
+	}
+}
+
+func makeCoreFn(f value.NativeFunc) value.FunctionData {
+	return value.NewNativeFunction(f).Data().(value.FunctionData)
+}
+
+func (vm *VM) getThis() (value.Value, error) {
+	err := vm.execGetEnv(0)
+	if err != nil {
+		return value.Value{}, err
+	}
+
+	// Take it back!
+	this, err := vm.popAndDrop()
+	if err != nil {
+		return value.Value{}, err
+	}
+
+	return this, nil
+}