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