aboutsummaryrefslogtreecommitdiff
path: root/pkg/lang/vm/value
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-05-31 01:01:32 +0000
committerGitHub <noreply@github.com>2022-05-31 01:02:20 +0000
commit338744d066704e48e22d8ec56a43acb4b20da7f1 (patch)
treeb508eb6764efc64ac611b6ea063ab44d9e6b0a9c /pkg/lang/vm/value
parent78a29c41098db5e5f8291e0345a3cd443c52b329 (diff)
downloadjinx-338744d066704e48e22d8ec56a43acb4b20da7f1.tar.zst
jinx-338744d066704e48e22d8ec56a43acb4b20da7f1.zip
Add untyped Objects (for now)
Diffstat (limited to 'pkg/lang/vm/value')
-rw-r--r--pkg/lang/vm/value/cells.go18
-rw-r--r--pkg/lang/vm/value/data.go11
-rw-r--r--pkg/lang/vm/value/value.go21
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 {