aboutsummaryrefslogtreecommitdiff
path: root/pkg/lang/vm/value
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-08-29 20:30:10 +0000
committerMel <einebeere@gmail.com>2022-08-29 20:40:44 +0000
commit1bc5eb0d13bb001b4ac7f456c6a61fedcd53f0c8 (patch)
tree336f8eb7e3e49cf647eec3abc4be18412bc0f684 /pkg/lang/vm/value
parent1f5a49151fc2f72932eedf8162b63af670556910 (diff)
downloadjinx-1bc5eb0d13bb001b4ac7f456c6a61fedcd53f0c8.tar.zst
jinx-1bc5eb0d13bb001b4ac7f456c6a61fedcd53f0c8.zip
Stop ignoring val.Drop and val.Clone memory errors
Diffstat (limited to 'pkg/lang/vm/value')
-rw-r--r--pkg/lang/vm/value/cells.go48
-rw-r--r--pkg/lang/vm/value/value.go35
2 files changed, 57 insertions, 26 deletions
diff --git a/pkg/lang/vm/value/cells.go b/pkg/lang/vm/value/cells.go
index 19ecfde..646f3c1 100644
--- a/pkg/lang/vm/value/cells.go
+++ b/pkg/lang/vm/value/cells.go
@@ -1,16 +1,21 @@
package value
import (
+ "fmt"
"jinx/pkg/lang/vm/code"
"jinx/pkg/lang/vm/mem"
)
type ArrayCell []Value
-func (a ArrayCell) DropCell(m mem.Mem) {
+func (a ArrayCell) DropCell(m mem.Mem) error {
for _, v := range a {
- v.Drop(m)
+ if err := v.Drop(m); err != nil {
+ return err
+ }
}
+
+ return nil
}
func (a ArrayCell) MatchingCellKind() mem.CellKind {
@@ -23,7 +28,8 @@ func (a ArrayCell) Get() []Value {
type StringCell string
-func (s StringCell) DropCell(m mem.Mem) {
+func (s StringCell) DropCell(m mem.Mem) error {
+ return nil
}
func (s StringCell) MatchingCellKind() mem.CellKind {
@@ -38,10 +44,14 @@ type ObjectCell struct {
Members map[string]Value
}
-func (o ObjectCell) DropCell(m mem.Mem) {
+func (o ObjectCell) DropCell(m mem.Mem) error {
for _, v := range o.Members {
- v.Drop(m)
+ if err := v.Drop(m); err != nil {
+ return err
+ }
}
+
+ return nil
}
func (o ObjectCell) MatchingCellKind() mem.CellKind {
@@ -54,17 +64,23 @@ func (o ObjectCell) Get() map[string]Value {
type TypeCell Type
-func (t TypeCell) DropCell(m mem.Mem) {
+func (t TypeCell) DropCell(m mem.Mem) error {
typ := t.Get()
for _, f := range typ.Methods {
// Wrap data in a Value to drop it.
val := NewFunction(code.Pos{}, 0).WithData(f)
- val.Drop(m)
+ if err := val.Drop(m); err != nil {
+ return err
+ }
}
for _, v := range typ.Statics {
- v.Drop(m)
+ if err := v.Drop(m); err != nil {
+ return err
+ }
}
+
+ return nil
}
func (t TypeCell) MatchingCellKind() mem.CellKind {
@@ -77,8 +93,8 @@ func (t TypeCell) Get() Type {
type OutletCell Value
-func (o OutletCell) DropCell(m mem.Mem) {
- Value(o).Drop(m)
+func (o OutletCell) DropCell(m mem.Mem) error {
+ return Value(o).Drop(m)
}
func (o OutletCell) MatchingCellKind() mem.CellKind {
@@ -91,10 +107,14 @@ func (o OutletCell) Get() Value {
type EnvCell Env
-func (e EnvCell) DropCell(m mem.Mem) {
+func (e EnvCell) DropCell(m mem.Mem) error {
for _, v := range e.references {
- m.Release(v.outlet)
+ if err := m.Release(v.outlet); err != nil {
+ return err
+ }
}
+
+ return nil
}
func (e EnvCell) MatchingCellKind() mem.CellKind {
@@ -107,8 +127,8 @@ func (e EnvCell) Get() Env {
type GlobalCell Value
-func (g GlobalCell) DropCell(m mem.Mem) {
- panic("global cell cannot be dropped")
+func (g GlobalCell) DropCell(m mem.Mem) error {
+ return fmt.Errorf("global cell cannot be dropped")
}
func (g GlobalCell) MatchingCellKind() mem.CellKind {
diff --git a/pkg/lang/vm/value/value.go b/pkg/lang/vm/value/value.go
index cce2f5e..e2750f4 100644
--- a/pkg/lang/vm/value/value.go
+++ b/pkg/lang/vm/value/value.go
@@ -142,20 +142,28 @@ func (v Value) IsEmpty() bool {
return v == Value{}
}
-func (v Value) Clone(m mem.Mem) Value {
+func (v Value) Clone(m mem.Mem) (Value, error) {
if v.t == StringType {
str := v.d.(StringData)
- m.Retain(str.data)
+ if err := m.Retain(str.data); err != nil {
+ return Value{}, err
+ }
}
if v.t == ArrayType {
arr := v.d.(ArrayData)
- m.Retain(arr.data)
+ if err := m.Retain(arr.data); err != nil {
+ return Value{}, err
+ }
}
if v.t == FunctionType {
fn := v.d.(FunctionData)
- m.Retain(fn.env)
+ if !fn.env.IsNull() {
+ if err := m.Retain(fn.env); err != nil {
+ return Value{}, err
+ }
+ }
}
// If value has an outlet don't copy it into the clone,
@@ -163,28 +171,31 @@ func (v Value) Clone(m mem.Mem) Value {
// I don't know if this fixes the entire problem, but it seems to work.
v.outlet = mem.NullPtr
- return v
+ return v, nil
}
-func (v Value) Drop(m mem.Mem) {
+func (v Value) Drop(m mem.Mem) error {
// If value has an outlet, don't drop it and instead move it to the outlet.
if !v.outlet.IsNull() {
- m.Set(v.outlet, OutletCell(v))
- return
+ return m.Set(v.outlet, OutletCell(v))
}
if v.t == StringType {
str := v.d.(StringData)
- m.Release(str.data)
+ return m.Release(str.data)
}
if v.t == ArrayType {
arr := v.d.(ArrayData)
- m.Release(arr.data)
+ return m.Release(arr.data)
}
if v.t == FunctionType {
- f := v.d.(FunctionData)
- m.Release(f.env)
+ fn := v.d.(FunctionData)
+ if !fn.env.IsNull() {
+ return m.Release(fn.env)
+ }
}
+
+ return nil
}