about summary refs log tree commit diff
path: root/pkg/lang/vm/value/data.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/lang/vm/value/data.go')
-rw-r--r--pkg/lang/vm/value/data.go39
1 files changed, 39 insertions, 0 deletions
diff --git a/pkg/lang/vm/value/data.go b/pkg/lang/vm/value/data.go
index 9a8f7b6..e51904e 100644
--- a/pkg/lang/vm/value/data.go
+++ b/pkg/lang/vm/value/data.go
@@ -43,6 +43,14 @@ func (s StringData) String(m mem.Mem) (string, error) {
 	}
 }
 
+func (s StringData) RawString(m mem.Mem) (string, error) {
+	if data, err := m.Get(s.data); err == nil {
+		return data.(StringCell).Get(), nil
+	} else {
+		return "", err
+	}
+}
+
 type BoolData bool
 
 func (b BoolData) Get() bool {
@@ -114,6 +122,10 @@ func (a ArrayData) Push(m mem.Mem, v Value) error {
 
 type NullData struct{}
 
+func (n NullData) String(_ mem.Mem) (string, error) {
+	return "null", nil
+}
+
 type FunctionData struct {
 	pc     int
 	args   uint
@@ -151,6 +163,33 @@ func (f FunctionData) String(_ mem.Mem) (string, error) {
 	}
 }
 
+type TypeRefData struct {
+	typeRef mem.Ptr
+}
+
+func (t TypeRefData) String(_ mem.Mem) (string, error) {
+	return fmt.Sprintf("<type %v>", t.typeRef), nil
+}
+
+func (t TypeRefData) TypeRef() mem.Ptr {
+	return t.typeRef
+}
+
+func (t TypeRefData) AddMethod(m mem.Mem, name string, method FunctionData) error {
+	cell, err := m.Get(t.typeRef)
+	if err != nil {
+		return err
+	}
+
+	typ := cell.(TypeCell).Get()
+	typ.Methods[name] = method
+
+	if err := m.Set(t.typeRef, TypeCell(typ)); err != nil {
+		return err
+	}
+	return nil
+}
+
 type ObjectData struct {
 	obj mem.Ptr
 }