go/ssa/interp: handle nil *hashmap cleanly
Change-Id: I2cb8eef79bc011b209b3df0b859bcddefd4c8337
Reviewed-on: https://go-review.googlesource.com/32818
Reviewed-by: Robert Griesemer <gri@golang.org>
diff --git a/go/ssa/interp/map.go b/go/ssa/interp/map.go
index 4c092b3..577526f 100644
--- a/go/ssa/interp/map.go
+++ b/go/ssa/interp/map.go
@@ -113,3 +113,11 @@
}
return 0
}
+
+// entries returns a rangeable map of entries.
+func (m *hashmap) entries() map[int]*entry {
+ if m != nil {
+ return m.table
+ }
+ return nil
+}
diff --git a/go/ssa/interp/ops.go b/go/ssa/interp/ops.go
index c7a0a40..2de2fa8 100644
--- a/go/ssa/interp/ops.go
+++ b/go/ssa/interp/ops.go
@@ -1098,7 +1098,7 @@
// reflect.(Value).MapKeys machinery.
it := make(mapIter)
go func() {
- for _, e := range x.table {
+ for _, e := range x.entries() {
for e != nil {
it <- [2]value{e.key, e.value}
e = e.next
diff --git a/go/ssa/interp/reflect.go b/go/ssa/interp/reflect.go
index 48bb911..688f737 100644
--- a/go/ssa/interp/reflect.go
+++ b/go/ssa/interp/reflect.go
@@ -333,7 +333,7 @@
}
case *hashmap:
- for _, e := range v.table {
+ for _, e := range v.entries() {
for ; e != nil; e = e.next {
keys = append(keys, makeReflectValue(tKey, e.key))
}
@@ -365,7 +365,7 @@
case []value:
return reflect.ValueOf(v).Pointer()
case *hashmap:
- return reflect.ValueOf(v.table).Pointer()
+ return reflect.ValueOf(v.entries()).Pointer()
case map[value]value:
return reflect.ValueOf(v).Pointer()
case *ssa.Function:
diff --git a/go/ssa/interp/value.go b/go/ssa/interp/value.go
index 2194b01..4f5a705 100644
--- a/go/ssa/interp/value.go
+++ b/go/ssa/interp/value.go
@@ -384,7 +384,7 @@
case *hashmap:
buf.WriteString("map[")
sep := " "
- for _, e := range v.table {
+ for _, e := range v.entries() {
for e != nil {
buf.WriteString(sep)
sep = " "