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 = " "