about summary refs log tree commit diff
path: root/pkg/lang/vm/value/value.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/lang/vm/value/value.go')
-rw-r--r--pkg/lang/vm/value/value.go21
1 files changed, 21 insertions, 0 deletions
diff --git a/pkg/lang/vm/value/value.go b/pkg/lang/vm/value/value.go
index f1ccc2d..953ac8b 100644
--- a/pkg/lang/vm/value/value.go
+++ b/pkg/lang/vm/value/value.go
@@ -73,6 +73,21 @@ func NewObject(m mem.Mem, t mem.Ptr) (Value, error) {
 	return Value{t: t, d: ObjectData{obj: ptr}}, nil
 }
 
+func NewType(m mem.Mem, name string) (Value, error) {
+	ptr, err := m.Allocate(mem.CellKindType)
+	if err != nil {
+		return Value{}, err
+	}
+
+	t := Type{Kind: ObjectType, Name: name, Methods: make(map[string]FunctionData), Statics: make(map[string]Value)}
+
+	if err = m.Set(ptr, TypeCell(t)); err != nil {
+		return Value{}, err
+	}
+
+	return Value{t: CORE_TYPE_TYPE_REF, d: TypeRefData{typeRef: ptr}}, nil
+}
+
 func (v Value) TypePtr() mem.Ptr {
 	return v.t
 }
@@ -93,11 +108,17 @@ func (v Value) Type() TypeKind {
 		return ArrayType
 	case CORE_TYPE_FUNCTION:
 		return FunctionType
+	case CORE_TYPE_TYPE_REF:
+		return TypeRefType
 	default:
 		return ObjectType
 	}
 }
 
+func (v Value) WithType(t mem.Ptr) Value {
+	return Value{t: t, d: v.d, outlet: v.outlet}
+}
+
 func (v Value) Data() Data {
 	return v.d
 }