aboutsummaryrefslogtreecommitdiff
path: root/pkg/lang/vm/value
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-05-20 00:01:11 +0200
committerMel <einebeere@gmail.com>2022-05-20 00:01:11 +0200
commitfe93d5c015e8e2c883d2c1e74f2e5ce071256cb5 (patch)
tree2d153d41fb5799828c8e8ebd8dc1158ddac9e9ac /pkg/lang/vm/value
parentbfa32b8b880b42eda6007ba81f8fbbd340009322 (diff)
downloadjinx-fe93d5c015e8e2c883d2c1e74f2e5ce071256cb5.tar.zst
jinx-fe93d5c015e8e2c883d2c1e74f2e5ce071256cb5.zip
Access methods for VM data and stop Array copying
Diffstat (limited to 'pkg/lang/vm/value')
-rw-r--r--pkg/lang/vm/value/data.go73
-rw-r--r--pkg/lang/vm/value/value.go6
2 files changed, 75 insertions, 4 deletions
diff --git a/pkg/lang/vm/value/data.go b/pkg/lang/vm/value/data.go
index 1d63d32..6365f45 100644
--- a/pkg/lang/vm/value/data.go
+++ b/pkg/lang/vm/value/data.go
@@ -1,14 +1,85 @@
package value
+import (
+ "fmt"
+ "strconv"
+ "strings"
+)
+
+type Data fmt.Stringer
+
type IntData int64
+func (i IntData) Get() int64 {
+ return int64(i)
+}
+
+func (i IntData) String() string {
+ return strconv.FormatInt(int64(i), 10)
+}
+
type FloatData float64
+func (f FloatData) Get() float64 {
+ return float64(f)
+}
+
+func (f FloatData) String() string {
+ return strconv.FormatFloat(float64(f), 'f', -1, 64)
+}
+
type StringData string
+func (s StringData) Get() string {
+ return string(s)
+}
+
+func (s StringData) String() string {
+ return "\"" + string(s) + "\""
+}
+
type BoolData bool
-type ArrayData []Value
+func (b BoolData) Get() bool {
+ return bool(b)
+}
+
+func (b BoolData) String() string {
+ return strconv.FormatBool(bool(b))
+}
+
+type ArrayData struct {
+ arr *[]Value
+}
+
+func (a ArrayData) Get() *[]Value {
+ return a.arr
+}
+
+func (a ArrayData) String() string {
+ builder := strings.Builder{}
+ builder.WriteString("[")
+ for i, v := range *a.arr {
+ if i > 0 {
+ builder.WriteString(", ")
+ }
+ builder.WriteString(v.Data().String())
+ }
+ builder.WriteString("]")
+ return builder.String()
+}
+
+func (a ArrayData) Len() int {
+ return len(*a.arr)
+}
+
+func (a ArrayData) At(i int) Value {
+ return (*a.arr)[i]
+}
+
+func (a ArrayData) Push(v Value) {
+ *a.arr = append(*a.arr, v)
+}
type NullData struct{}
diff --git a/pkg/lang/vm/value/value.go b/pkg/lang/vm/value/value.go
index e932ed3..daa17dd 100644
--- a/pkg/lang/vm/value/value.go
+++ b/pkg/lang/vm/value/value.go
@@ -2,7 +2,7 @@ package value
type Value struct {
t Type
- d any
+ d Data
}
func NewInt(x int64) Value {
@@ -27,7 +27,7 @@ func NewBool(b bool) Value {
func NewArray(arr []Value) Value {
t := Type{Kind: ArrayType}
- return Value{t: t, d: ArrayData(arr)}
+ return Value{t: t, d: ArrayData{arr: &arr}}
}
func NewNull() Value {
@@ -47,6 +47,6 @@ func (v Value) Type() Type {
return v.t
}
-func (v Value) Data() any {
+func (v Value) Data() Data {
return v.d
}