diff options
Diffstat (limited to 'pkg/lang/vm/core.go')
| -rw-r--r-- | pkg/lang/vm/core.go | 93 |
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 +} |
