diff options
| author | Mel <einebeere@gmail.com> | 2022-06-01 19:51:40 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-01 19:51:40 +0000 |
| commit | edca72c160967f1918b65c91a40de89ecd8badda (patch) | |
| tree | b79feabc0889a3f6cfddf09906a486d09e5c60a1 /pkg/lang/vm/value/data.go | |
| parent | 33671436680e7922001df9921ee582c486c7c3f4 (diff) | |
| download | jinx-edca72c160967f1918b65c91a40de89ecd8badda.tar.zst jinx-edca72c160967f1918b65c91a40de89ecd8badda.zip | |
Implement proper object types
Diffstat (limited to 'pkg/lang/vm/value/data.go')
| -rw-r--r-- | pkg/lang/vm/value/data.go | 39 |
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 } |
