about summary refs log tree commit diff
path: root/pkg/lang/vm/value
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-08-31 14:41:19 +0000
committerMel <einebeere@gmail.com>2022-08-31 14:41:19 +0000
commit00adb146a20d2985fd014c92b9d5cc07e0ab09b9 (patch)
tree6c3e06a6c95c5a6ec4a7654b42599c5aa7a0aa81 /pkg/lang/vm/value
parentaeb63ade341572bb307f23ff7c501c48957cc7d4 (diff)
downloadjinx-00adb146a20d2985fd014c92b9d5cc07e0ab09b9.tar.zst
jinx-00adb146a20d2985fd014c92b9d5cc07e0ab09b9.zip
Add FromData function to create values easier
Diffstat (limited to 'pkg/lang/vm/value')
-rw-r--r--pkg/lang/vm/value/cells.go3
-rw-r--r--pkg/lang/vm/value/data.go37
-rw-r--r--pkg/lang/vm/value/value.go4
3 files changed, 42 insertions, 2 deletions
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
 }