diff options
| author | Mel <einebeere@gmail.com> | 2022-08-31 14:41:19 +0000 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2022-08-31 14:41:19 +0000 |
| commit | 00adb146a20d2985fd014c92b9d5cc07e0ab09b9 (patch) | |
| tree | 6c3e06a6c95c5a6ec4a7654b42599c5aa7a0aa81 /pkg/lang | |
| parent | aeb63ade341572bb307f23ff7c501c48957cc7d4 (diff) | |
| download | jinx-00adb146a20d2985fd014c92b9d5cc07e0ab09b9.tar.zst jinx-00adb146a20d2985fd014c92b9d5cc07e0ab09b9.zip | |
Add FromData function to create values easier
Diffstat (limited to 'pkg/lang')
| -rw-r--r-- | pkg/lang/vm/exec.go | 2 | ||||
| -rw-r--r-- | pkg/lang/vm/utils.go | 2 | ||||
| -rw-r--r-- | pkg/lang/vm/value/cells.go | 3 | ||||
| -rw-r--r-- | pkg/lang/vm/value/data.go | 37 | ||||
| -rw-r--r-- | pkg/lang/vm/value/value.go | 4 |
5 files changed, 44 insertions, 4 deletions
diff --git a/pkg/lang/vm/exec.go b/pkg/lang/vm/exec.go index bca4e03..9464e7a 100644 --- a/pkg/lang/vm/exec.go +++ b/pkg/lang/vm/exec.go @@ -262,7 +262,7 @@ func (vm *VM) execGetMember(name string) error { return err } - method := value.NewFunction(code.Pos{}, 0).WithData(methodData.WithEnv(envPtr)) + method := value.FromData(methodData.WithEnv(envPtr)) // method = method.Clone(vm.memory) will only be necessary when we support methods with environments. vm.stack.Push(method) diff --git a/pkg/lang/vm/utils.go b/pkg/lang/vm/utils.go index 166d404..26703b6 100644 --- a/pkg/lang/vm/utils.go +++ b/pkg/lang/vm/utils.go @@ -31,7 +31,7 @@ func (vm *VM) popCallAndDrop() (code.Pos, error) { return code.Pos{}, err } - if err := value.NewFunction(code.Pos{}, 0).WithData(fn).Drop(vm.memory); err != nil { + if err := value.FromData(fn).Drop(vm.memory); err != nil { return code.Pos{}, err } diff --git a/pkg/lang/vm/value/cells.go b/pkg/lang/vm/value/cells.go index 646f3c1..e08f53f 100644 --- a/pkg/lang/vm/value/cells.go +++ b/pkg/lang/vm/value/cells.go @@ -2,7 +2,6 @@ package value import ( "fmt" - "jinx/pkg/lang/vm/code" "jinx/pkg/lang/vm/mem" ) @@ -68,7 +67,7 @@ func (t TypeCell) DropCell(m mem.Mem) error { typ := t.Get() for _, f := range typ.Methods { // Wrap data in a Value to drop it. - val := NewFunction(code.Pos{}, 0).WithData(f) + val := FromData(f) if err := val.Drop(m); err != nil { return err } diff --git a/pkg/lang/vm/value/data.go b/pkg/lang/vm/value/data.go index 59e4742..fa18b6d 100644 --- a/pkg/lang/vm/value/data.go +++ b/pkg/lang/vm/value/data.go @@ -10,6 +10,7 @@ import ( type Data interface { String(mem.Mem) (string, error) + DataType() TypeKind } type IntData int64 @@ -22,6 +23,10 @@ func (i IntData) String(_ mem.Mem) (string, error) { return strconv.FormatInt(int64(i), 10), nil } +func (i IntData) DataType() TypeKind { + return IntType +} + type FloatData float64 func (f FloatData) Get() float64 { @@ -32,6 +37,10 @@ func (f FloatData) String(_ mem.Mem) (string, error) { return strconv.FormatFloat(float64(f), 'f', -1, 64), nil } +func (f FloatData) DataType() TypeKind { + return FloatType +} + type StringData struct { data mem.Ptr } @@ -52,6 +61,10 @@ func (s StringData) RawString(m mem.Mem) (string, error) { } } +func (s StringData) DataType() TypeKind { + return StringType +} + type BoolData bool func (b BoolData) Get() bool { @@ -62,6 +75,10 @@ func (b BoolData) String(_ mem.Mem) (string, error) { return strconv.FormatBool(bool(b)), nil } +func (b BoolData) DataType() TypeKind { + return BoolType +} + type ArrayData struct { data mem.Ptr } @@ -155,12 +172,20 @@ func (a ArrayData) Pop(m mem.Mem) (Value, error) { return popped, nil } +func (a ArrayData) DataType() TypeKind { + return ArrayType +} + type NullData struct{} func (n NullData) String(_ mem.Mem) (string, error) { return "null", nil } +func (n NullData) DataType() TypeKind { + return NullType +} + type FunctionData struct { pos code.Pos args uint @@ -202,6 +227,10 @@ func (f FunctionData) String(_ mem.Mem) (string, error) { } } +func (f FunctionData) DataType() TypeKind { + return FunctionType +} + type TypeRefData struct { typeRef mem.Ptr } @@ -240,6 +269,10 @@ func (t TypeRefData) AddMethod(m mem.Mem, name string, method FunctionData) erro return nil } +func (t TypeRefData) DataType() TypeKind { + return TypeRefType +} + type ObjectData struct { t mem.Ptr obj mem.Ptr @@ -260,3 +293,7 @@ func (o ObjectData) Type() mem.Ptr { func (o ObjectData) WithType(t mem.Ptr) ObjectData { return ObjectData{t: t, obj: o.obj} } + +func (o ObjectData) DataType() TypeKind { + return ObjectType +} diff --git a/pkg/lang/vm/value/value.go b/pkg/lang/vm/value/value.go index 21cf962..785703f 100644 --- a/pkg/lang/vm/value/value.go +++ b/pkg/lang/vm/value/value.go @@ -89,6 +89,10 @@ func NewType(m mem.Mem, name string) (Value, error) { return Value{t: TypeRefType, d: TypeRefData{typeRef: ptr}}, nil } +func FromData(d Data) Value { + return Value{t: d.DataType(), d: d} +} + func (v Value) Type() TypeKind { return v.t } |
