diff options
Diffstat (limited to 'pkg/lang/vm/value')
| -rw-r--r-- | pkg/lang/vm/value/cells.go | 18 | ||||
| -rw-r--r-- | pkg/lang/vm/value/data.go | 11 | ||||
| -rw-r--r-- | pkg/lang/vm/value/value.go | 21 |
3 files changed, 45 insertions, 5 deletions
diff --git a/pkg/lang/vm/value/cells.go b/pkg/lang/vm/value/cells.go index a700940..5abb032 100644 --- a/pkg/lang/vm/value/cells.go +++ b/pkg/lang/vm/value/cells.go @@ -31,6 +31,24 @@ func (s StringCell) Get() string { return string(s) } +type ObjectCell struct { + Members map[string]Value +} + +func (o ObjectCell) DropCell(m mem.Mem) { + for _, v := range o.Members { + v.Drop(m) + } +} + +func (o ObjectCell) MatchingCellKind() mem.CellKind { + return mem.CellKindObject +} + +func (o ObjectCell) Get() map[string]Value { + return o.Members +} + type TypeCell Type func (t TypeCell) DropCell(m mem.Mem) { diff --git a/pkg/lang/vm/value/data.go b/pkg/lang/vm/value/data.go index 13716fd..9a8f7b6 100644 --- a/pkg/lang/vm/value/data.go +++ b/pkg/lang/vm/value/data.go @@ -150,6 +150,15 @@ func (f FunctionData) String(_ mem.Mem) (string, error) { return fmt.Sprintf("<fn(%d) %d>", f.args, f.pc), nil } } + +type ObjectData struct { + obj mem.Ptr +} + +func (o ObjectData) String(_ mem.Mem) (string, error) { + return fmt.Sprintf("<object %v>", o.obj), nil } -type ObjectData struct{} // TODO +func (o ObjectData) Ptr() mem.Ptr { + return o.obj +} diff --git a/pkg/lang/vm/value/value.go b/pkg/lang/vm/value/value.go index 05d3f09..5e222a3 100644 --- a/pkg/lang/vm/value/value.go +++ b/pkg/lang/vm/value/value.go @@ -24,7 +24,9 @@ func NewString(m mem.Mem, str string) (Value, error) { return Value{}, err } - m.Set(ptr, StringCell(str)) + if err = m.Set(ptr, StringCell(str)); err != nil { + return Value{}, err + } return Value{t: CORE_TYPE_STRING, d: StringData{data: ptr}}, nil } @@ -39,7 +41,9 @@ func NewArray(m mem.Mem, arr []Value) (Value, error) { return Value{}, err } - m.Set(ptr, ArrayCell(arr)) + if err = m.Set(ptr, ArrayCell(arr)); err != nil { + return Value{}, err + } return Value{t: CORE_TYPE_ARRAY, d: ArrayData{data: ptr}}, nil } @@ -56,8 +60,17 @@ func NewNativeFunction(f NativeFunc, args uint) Value { return Value{t: CORE_TYPE_FUNCTION, d: FunctionData{native: f, args: args}} } -func NewObject() Value { - panic("not implemented") +func NewObject(m mem.Mem, t mem.Ptr) (Value, error) { + ptr, err := m.Allocate(mem.CellKindObject) + if err != nil { + return Value{}, err + } + + if err = m.Set(ptr, ObjectCell{make(map[string]Value)}); err != nil { + return Value{}, err + } + + return Value{t: t, d: ObjectData{obj: ptr}}, nil } func (v Value) TypePtr() mem.Ptr { |
