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-05-28 01:22:17 +0000
committerGitHub <noreply@github.com>2022-05-28 01:22:17 +0000
commit0a7700112f82e634a957685bee0cbaa3458f4945 (patch)
tree847c397970d7d852bc988a7a01f4625eae443edb /pkg/lang/vm/value/value.go
parent83d1dc87f3336d70ccda476627c70c282b7b6e11 (diff)
downloadjinx-0a7700112f82e634a957685bee0cbaa3458f4945.tar.zst
jinx-0a7700112f82e634a957685bee0cbaa3458f4945.zip
Harden VM Mem
Diffstat (limited to 'pkg/lang/vm/value/value.go')
-rw-r--r--pkg/lang/vm/value/value.go26
1 files changed, 17 insertions, 9 deletions
diff --git a/pkg/lang/vm/value/value.go b/pkg/lang/vm/value/value.go
index d19bbd6..f98740e 100644
--- a/pkg/lang/vm/value/value.go
+++ b/pkg/lang/vm/value/value.go
@@ -20,13 +20,17 @@ func NewFloat(x float64) Value {
 	return Value{t: t, d: FloatData(x)}
 }
 
-func NewString(m *mem.Mem, str string) Value {
+func NewString(m *mem.Mem, str string) (Value, error) {
 	t := Type{Kind: StringType}
 
-	ptr := m.Allocate(mem.CellKindString)
-	m.Set(ptr, str)
+	ptr, err := m.Allocate(mem.CellKindString)
+	if err != nil {
+		return Value{}, err
+	}
+
+	m.Set(ptr, StringCell(str))
 
-	return Value{t: t, d: StringData{data: ptr}}
+	return Value{t: t, d: StringData{data: ptr}}, nil
 }
 
 func NewBool(b bool) Value {
@@ -34,13 +38,17 @@ func NewBool(b bool) Value {
 	return Value{t: t, d: BoolData(b)}
 }
 
-func NewArray(m *mem.Mem, arr []Value) Value {
+func NewArray(m *mem.Mem, arr []Value) (Value, error) {
 	t := Type{Kind: ArrayType}
 
-	ptr := m.Allocate(mem.CellKindArray)
-	m.Set(ptr, arr)
+	ptr, err := m.Allocate(mem.CellKindArray)
+	if err != nil {
+		return Value{}, err
+	}
+
+	m.Set(ptr, ArrayCell(arr))
 
-	return Value{t: t, d: ArrayData{data: ptr}}
+	return Value{t: t, d: ArrayData{data: ptr}}, nil
 }
 
 func NewNull() Value {
@@ -99,7 +107,7 @@ func (v Value) Clone(m *mem.Mem) Value {
 func (v Value) Drop(m *mem.Mem) {
 	// If value has an outlet, don't drop it and instead move it to the outlet.
 	if !v.outlet.IsNull() {
-		m.Set(v.outlet, v)
+		m.Set(v.outlet, OutletCell(v))
 		return
 	}