diff options
Diffstat (limited to 'pkg/lang/vm/value/value.go')
| -rw-r--r-- | pkg/lang/vm/value/value.go | 35 |
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 } |
