summaryrefslogtreecommitdiff
path: root/usr/austin/eval/value.go
diff options
context:
space:
mode:
Diffstat (limited to 'usr/austin/eval/value.go')
-rw-r--r--usr/austin/eval/value.go47
1 files changed, 45 insertions, 2 deletions
diff --git a/usr/austin/eval/value.go b/usr/austin/eval/value.go
index 7f6a36621..b3fd13876 100644
--- a/usr/austin/eval/value.go
+++ b/usr/austin/eval/value.go
@@ -479,6 +479,49 @@ func (t *ArrayType) Zero() Value {
}
/*
+ * Struct
+ */
+
+type structV []Value
+
+// TODO(austin) Should these methods (and arrayV's) be on structV
+// instead of *structV?
+func (v *structV) String() string {
+ res := "{";
+ for i, v := range *v {
+ if i > 0 {
+ res += "; ";
+ }
+ res += v.String();
+ }
+ return res + "}";
+}
+
+func (v *structV) Assign(o Value) {
+ oa := o.(StructValue);
+ l := len(*v);
+ for i := 0; i < l; i++ {
+ (*v)[i].Assign(oa.Field(i));
+ }
+}
+
+func (v *structV) Get() StructValue {
+ return v;
+}
+
+func (v *structV) Field(i int) Value {
+ return (*v)[i];
+}
+
+func (t *StructType) Zero() Value {
+ res := structV(make([]Value, len(t.Elems)));
+ for i, f := range t.Elems {
+ res[i] = f.Type.Zero();
+ }
+ return &res;
+}
+
+/*
* Pointer
*/
@@ -562,8 +605,8 @@ func (v multiV) Assign(o Value) {
func (t *MultiType) Zero() Value {
res := make([]Value, len(t.Elems));
- for i := 0; i < len(t.Elems); i++ {
- res[i] = t.Elems[i].Zero();
+ for i, t := range t.Elems {
+ res[i] = t.Zero();
}
return multiV(res);
}