about summary refs log tree commit diff
path: root/pkg/lang/vm/value/cells.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/lang/vm/value/cells.go')
-rw-r--r--pkg/lang/vm/value/cells.go48
1 files changed, 34 insertions, 14 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 {