about summary refs log tree commit diff
path: root/pkg/lang/vm/value/value.go
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/value.go
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/value.go')
-rw-r--r--pkg/lang/vm/value/value.go35
1 files changed, 23 insertions, 12 deletions
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
 }