diff options
| author | Mel <einebeere@gmail.com> | 2022-08-11 01:25:47 +0000 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2022-08-11 01:25:47 +0000 |
| commit | 86f31acf6789be116dcc54ed85b069a37c0f7aa8 (patch) | |
| tree | bc7afd6a8c340825996d29c6cfd392ae42b4fbd5 /pkg/lang/vm/core.go | |
| parent | c46b2bc7ce6df1f2c6c9494ef08015ec29992da5 (diff) | |
| download | jinx-86f31acf6789be116dcc54ed85b069a37c0f7aa8.tar.zst jinx-86f31acf6789be116dcc54ed85b069a37c0f7aa8.zip | |
Actual modules and core
Diffstat (limited to 'pkg/lang/vm/core.go')
| -rw-r--r-- | pkg/lang/vm/core.go | 146 |
1 files changed, 0 insertions, 146 deletions
diff --git a/pkg/lang/vm/core.go b/pkg/lang/vm/core.go deleted file mode 100644 index 477cee8..0000000 --- a/pkg/lang/vm/core.go +++ /dev/null @@ -1,146 +0,0 @@ -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, 0), - "push": makeCoreFn(vm.coreArrayPush, 1), - }, - } -} - -func (vm *VM) createCoreFunctionType() value.Type { - return value.Type{ - Kind: value.FunctionType, - } -} - -func (vm *VM) createCoreTypeRefType() value.Type { - return value.Type{ - Kind: value.TypeRefType, - Methods: map[string]value.FunctionData{ - "$add_method": makeCoreFn(vm.coreTypeRefIntrAddMethod, 2), - }, - } -} - -func (vm *VM) coreArrayLength(args []value.Value) (value.Value, error) { - a, err := ensureTypeThis[value.ArrayData](vm, value.ArrayType) - if err != nil { - return value.Value{}, err - } - - len, err := a.Len(vm.memory) - if err != nil { - return value.Value{}, err - } - res := value.NewInt(int64(len)) - return res, nil -} - -func (vm *VM) coreArrayPush(args []value.Value) (value.Value, error) { - a, err := ensureTypeThis[value.ArrayData](vm, value.ArrayType) - if err != nil { - return value.Value{}, err - } - - return value.Value{}, a.Push(vm.memory, args[0]) -} - -func (vm *VM) coreTypeRefIntrAddMethod(args []value.Value) (value.Value, error) { - ref, err := ensureTypeThis[value.TypeRefData](vm, value.TypeRefType) - if err != nil { - return value.Value{}, err - } - - fn, err := ensureType[value.FunctionData](args[0], value.FunctionType) - if err != nil { - return value.Value{}, err - } - - nameData, err := ensureType[value.StringData](args[1], value.StringType) - if err != nil { - return value.Value{}, err - } - name, err := nameData.RawString(vm.memory) - if err != nil { - return value.Value{}, err - } - - return value.Value{}, ref.AddMethod(vm.memory, name, fn) -} - -func ensureTypeThis[D value.Data](vm *VM, t value.TypeKind) (D, error) { - this, err := vm.getThis() - if err != nil { - return *new(D), err - } - - return ensureType[D](this, t) -} - -func ensureType[D value.Data](val value.Value, t value.TypeKind) (D, error) { - if val.Type() != t { - return *new(D), ErrInvalidOperandType{ - Op: code.OpNop, // TODO: Add error not dependent on op. - X: val.Type(), - } - } - - return val.Data().(D), nil -} - -func makeCoreFn(f value.NativeFunc, argCount uint) value.FunctionData { - return value.NewNativeFunction(f, argCount).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 -} |
