about summary refs log tree commit diff
path: root/pkg
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-08-10 23:05:35 +0000
committerMel <einebeere@gmail.com>2022-08-10 23:05:35 +0000
commitc46b2bc7ce6df1f2c6c9494ef08015ec29992da5 (patch)
tree49cac24a33e85907878248aac973e967765bf79d /pkg
parent42e78f469ca71360943f95c54080c89d39346cd7 (diff)
downloadjinx-c46b2bc7ce6df1f2c6c9494ef08015ec29992da5.tar.zst
jinx-c46b2bc7ce6df1f2c6c9494ef08015ec29992da5.zip
Use TypeKind instead of Ptr to deduce Value types
Diffstat (limited to 'pkg')
-rw-r--r--pkg/lang/vm/exec.go8
-rw-r--r--pkg/lang/vm/value/data.go9
-rw-r--r--pkg/lang/vm/value/value.go78
3 files changed, 54 insertions, 41 deletions
diff --git a/pkg/lang/vm/exec.go b/pkg/lang/vm/exec.go
index 353d8ac..eeb8710 100644
--- a/pkg/lang/vm/exec.go
+++ b/pkg/lang/vm/exec.go
@@ -490,14 +490,16 @@ func (vm *VM) execAnchorType() error {
 		}
 	}
 
-	if !o.TypePtr().IsNull() {
+	obj := o.Data().(value.ObjectData)
+	typeRef := t.Data().(value.TypeRefData)
+
+	if obj.Type() != mem.NullPtr {
 		return ErrCantReanchorType{
 			Type: o.Type(),
 		}
 	}
 
-	o = o.WithType(t.Data().(value.TypeRefData).TypeRef())
-
+	o = o.WithData(obj.WithType(typeRef.TypeRef()))
 	vm.stack.Push(o)
 	return nil
 }
diff --git a/pkg/lang/vm/value/data.go b/pkg/lang/vm/value/data.go
index 6ec7be9..39193d5 100644
--- a/pkg/lang/vm/value/data.go
+++ b/pkg/lang/vm/value/data.go
@@ -207,6 +207,7 @@ func (t TypeRefData) AddMethod(m mem.Mem, name string, method FunctionData) erro
 }
 
 type ObjectData struct {
+	t   mem.Ptr
 	obj mem.Ptr
 }
 
@@ -217,3 +218,11 @@ func (o ObjectData) String(_ mem.Mem) (string, error) {
 func (o ObjectData) Ptr() mem.Ptr {
 	return o.obj
 }
+
+func (o ObjectData) Type() mem.Ptr {
+	return o.t
+}
+
+func (o ObjectData) WithType(t mem.Ptr) ObjectData {
+	return ObjectData{t: t, obj: o.obj}
+}
diff --git a/pkg/lang/vm/value/value.go b/pkg/lang/vm/value/value.go
index b051f04..5ef3f07 100644
--- a/pkg/lang/vm/value/value.go
+++ b/pkg/lang/vm/value/value.go
@@ -6,17 +6,17 @@ import (
 )
 
 type Value struct {
-	t      mem.Ptr
+	t      TypeKind
 	d      Data
 	outlet mem.Ptr
 }
 
 func NewInt(x int64) Value {
-	return Value{t: CORE_TYPE_INT, d: IntData(x)}
+	return Value{t: IntType, d: IntData(x)}
 }
 
 func NewFloat(x float64) Value {
-	return Value{t: CORE_TYPE_FLOAT, d: FloatData(x)}
+	return Value{t: FloatType, d: FloatData(x)}
 }
 
 func NewString(m mem.Mem, str string) (Value, error) {
@@ -29,11 +29,11 @@ func NewString(m mem.Mem, str string) (Value, error) {
 		return Value{}, err
 	}
 
-	return Value{t: CORE_TYPE_STRING, d: StringData{data: ptr}}, nil
+	return Value{t: StringType, d: StringData{data: ptr}}, nil
 }
 
 func NewBool(b bool) Value {
-	return Value{t: CORE_TYPE_BOOL, d: BoolData(b)}
+	return Value{t: BoolType, d: BoolData(b)}
 }
 
 func NewArray(m mem.Mem, arr []Value) (Value, error) {
@@ -46,19 +46,19 @@ func NewArray(m mem.Mem, arr []Value) (Value, error) {
 		return Value{}, err
 	}
 
-	return Value{t: CORE_TYPE_ARRAY, d: ArrayData{data: ptr}}, nil
+	return Value{t: ArrayType, d: ArrayData{data: ptr}}, nil
 }
 
 func NewNull() Value {
-	return Value{t: CORE_TYPE_NULL, d: NullData{}}
+	return Value{t: NullType, d: NullData{}}
 }
 
 func NewFunction(pos code.Pos, args uint) Value {
-	return Value{t: CORE_TYPE_FUNCTION, d: FunctionData{pos: pos, args: args}}
+	return Value{t: FunctionType, d: FunctionData{pos: pos, args: args}}
 }
 
 func NewNativeFunction(f NativeFunc, args uint) Value {
-	return Value{t: CORE_TYPE_FUNCTION, d: FunctionData{native: f, args: args}}
+	return Value{t: FunctionType, d: FunctionData{native: f, args: args}}
 }
 
 func NewObject(m mem.Mem, t mem.Ptr) (Value, error) {
@@ -71,7 +71,7 @@ func NewObject(m mem.Mem, t mem.Ptr) (Value, error) {
 		return Value{}, err
 	}
 
-	return Value{t: t, d: ObjectData{obj: ptr}}, nil
+	return Value{t: ObjectType, d: ObjectData{t: t, obj: ptr}}, nil
 }
 
 func NewType(m mem.Mem, name string) (Value, error) {
@@ -86,37 +86,39 @@ func NewType(m mem.Mem, name string) (Value, error) {
 		return Value{}, err
 	}
 
-	return Value{t: CORE_TYPE_TYPE_REF, d: TypeRefData{typeRef: ptr}}, nil
+	return Value{t: TypeRefType, d: TypeRefData{typeRef: ptr}}, nil
 }
 
-func (v Value) TypePtr() mem.Ptr {
+func (v Value) Type() TypeKind {
 	return v.t
 }
 
-func (v Value) Type() TypeKind {
+func (v Value) TypePtr() mem.Ptr {
 	switch v.t {
-	case CORE_TYPE_NULL:
-		return NullType
-	case CORE_TYPE_INT:
-		return IntType
-	case CORE_TYPE_FLOAT:
-		return FloatType
-	case CORE_TYPE_STRING:
-		return StringType
-	case CORE_TYPE_BOOL:
-		return BoolType
-	case CORE_TYPE_ARRAY:
-		return ArrayType
-	case CORE_TYPE_FUNCTION:
-		return FunctionType
-	case CORE_TYPE_TYPE_REF:
-		return TypeRefType
+	case IntType:
+		return CORE_TYPE_INT
+	case FloatType:
+		return CORE_TYPE_FLOAT
+	case StringType:
+		return CORE_TYPE_STRING
+	case BoolType:
+		return CORE_TYPE_BOOL
+	case ArrayType:
+		return CORE_TYPE_ARRAY
+	case NullType:
+		return CORE_TYPE_NULL
+	case FunctionType:
+		return CORE_TYPE_FUNCTION
+	case TypeRefType:
+		return CORE_TYPE_TYPE_REF
+	case ObjectType:
+		return v.d.(ObjectData).t
 	default:
-		return ObjectType
+		return mem.NullPtr
 	}
 }
 
-func (v Value) WithType(t mem.Ptr) Value {
+func (v Value) WithType(t TypeKind) Value {
 	return Value{t: t, d: v.d, outlet: v.outlet}
 }
 
@@ -137,21 +139,21 @@ func (v Value) WithOutlet(outlet mem.Ptr) Value {
 }
 
 func (v Value) IsEmpty() bool {
-	return v.t == mem.NullPtr
+	return v == Value{}
 }
 
 func (v Value) Clone(m mem.Mem) Value {
-	if v.t == CORE_TYPE_STRING {
+	if v.t == StringType {
 		str := v.d.(StringData)
 		m.Retain(str.data)
 	}
 
-	if v.t == CORE_TYPE_ARRAY {
+	if v.t == ArrayType {
 		arr := v.d.(ArrayData)
 		m.Retain(arr.data)
 	}
 
-	if v.t == CORE_TYPE_FUNCTION {
+	if v.t == FunctionType {
 		fn := v.d.(FunctionData)
 		m.Retain(fn.env)
 	}
@@ -171,17 +173,17 @@ func (v Value) Drop(m mem.Mem) {
 		return
 	}
 
-	if v.t == CORE_TYPE_STRING {
+	if v.t == StringType {
 		str := v.d.(StringData)
 		m.Release(str.data)
 	}
 
-	if v.t == CORE_TYPE_ARRAY {
+	if v.t == ArrayType {
 		arr := v.d.(ArrayData)
 		m.Release(arr.data)
 	}
 
-	if v.t == CORE_TYPE_FUNCTION {
+	if v.t == FunctionType {
 		f := v.d.(FunctionData)
 		m.Release(f.env)
 	}