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-27 00:09:27 +0000
committerGitHub <noreply@github.com>2022-05-27 00:09:27 +0000
commitc2d4bf51de9a2d721168c62b14b89f5281ed366e (patch)
tree09329cd24249e46fe6660fa9bd1f0efac29af38f /pkg/lang/vm/value/value.go
parent3f4efe745a0404953266476ec52db54b182de2f8 (diff)
downloadjinx-c2d4bf51de9a2d721168c62b14b89f5281ed366e.tar.zst
jinx-c2d4bf51de9a2d721168c62b14b89f5281ed366e.zip
VM ARC
Diffstat (limited to 'pkg/lang/vm/value/value.go')
-rw-r--r--pkg/lang/vm/value/value.go46
1 files changed, 42 insertions, 4 deletions
diff --git a/pkg/lang/vm/value/value.go b/pkg/lang/vm/value/value.go
index 93989cf..06306df 100644
--- a/pkg/lang/vm/value/value.go
+++ b/pkg/lang/vm/value/value.go
@@ -1,5 +1,9 @@
 package value
 
+import (
+	"jinx/pkg/lang/vm/mem"
+)
+
 type Value struct {
 	t Type
 	d Data
@@ -15,9 +19,13 @@ func NewFloat(x float64) Value {
 	return Value{t: t, d: FloatData(x)}
 }
 
-func NewString(str string) Value {
+func NewString(m *mem.Mem, str string) Value {
 	t := Type{Kind: StringType}
-	return Value{t: t, d: StringData(str)}
+
+	ptr := m.Allocate(mem.CellKindString)
+	m.Set(ptr, str)
+
+	return Value{t: t, d: StringData{data: ptr}}
 }
 
 func NewBool(b bool) Value {
@@ -25,9 +33,13 @@ func NewBool(b bool) Value {
 	return Value{t: t, d: BoolData(b)}
 }
 
-func NewArray(arr []Value) Value {
+func NewArray(m *mem.Mem, arr []Value) Value {
 	t := Type{Kind: ArrayType}
-	return Value{t: t, d: ArrayData{arr: &arr}}
+
+	ptr := m.Allocate(mem.CellKindArray)
+	m.Set(ptr, arr)
+
+	return Value{t: t, d: ArrayData{data: ptr}}
 }
 
 func NewNull() Value {
@@ -51,3 +63,29 @@ func (v Value) Type() Type {
 func (v Value) Data() Data {
 	return v.d
 }
+
+func (v Value) Clone(m *mem.Mem) Value {
+	if v.t.Kind == StringType {
+		str := v.d.(StringData)
+		m.Retain(str.data)
+	}
+
+	if v.t.Kind == ArrayType {
+		arr := v.d.(ArrayData)
+		m.Retain(arr.data)
+	}
+
+	return v
+}
+
+func (v Value) Drop(m *mem.Mem) {
+	if v.t.Kind == StringType {
+		str := v.d.(StringData)
+		m.Release(str.data)
+	}
+
+	if v.t.Kind == ArrayType {
+		arr := v.d.(ArrayData)
+		m.Release(arr.data)
+	}
+}