about summary refs log tree commit diff
path: root/pkg/lang/vm/setup.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/setup.go
parent11bcf772bf8d9aa353eb4c04bfb85378ba392b1e (diff)
downloadjinx-d2f69dccb3643834a79da79be4ece189a7178c9e.tar.zst
jinx-d2f69dccb3643834a79da79be4ece189a7178c9e.zip
Types, Methods and basic Core Lib
Diffstat (limited to 'pkg/lang/vm/setup.go')
-rw-r--r--pkg/lang/vm/setup.go43
1 files changed, 43 insertions, 0 deletions
diff --git a/pkg/lang/vm/setup.go b/pkg/lang/vm/setup.go
new file mode 100644
index 0000000..754fd3a
--- /dev/null
+++ b/pkg/lang/vm/setup.go
@@ -0,0 +1,43 @@
+package vm
+
+import (
+	"jinx/pkg/lang/vm/mem"
+	"jinx/pkg/lang/vm/value"
+)
+
+func (vm *VM) setup() error {
+	if err := vm.setupCoreLib(); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (vm *VM) setupCoreLib() error {
+	type allocationJob struct {
+		at mem.Ptr
+		t  value.Type
+	}
+
+	toAllocate := []allocationJob{
+		{at: value.CORE_TYPE_NULL, t:  vm.createCoreNullType()},
+		{at: value.CORE_TYPE_INT, t:  vm.createCoreIntType()},
+		{at: value.CORE_TYPE_FLOAT, t:  vm.createCoreFloatType()},
+		{at: value.CORE_TYPE_STRING, t:  vm.createCoreStringType()},
+		{at: value.CORE_TYPE_BOOL, t:  vm.createCoreBoolType()},
+		{at: value.CORE_TYPE_ARRAY, t:  vm.createCoreArrayType()},
+		{at: value.CORE_TYPE_FUNCTION, t:  vm.createCoreFunctionType()},
+	}
+
+	for _, job := range toAllocate {
+		if err := vm.memory.AllocateAt(job.at, mem.CellKindType); err != nil {
+			return err
+		}
+
+		if err := vm.memory.Set(job.at, value.TypeCell(job.t)); err != nil {
+			return err
+		}
+	}
+
+	return nil
+}