1
2
3
4
5 package interp
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 import (
37 "bytes"
38 "fmt"
39 "go/types"
40 "io"
41 "reflect"
42 "strings"
43 "sync"
44 "unsafe"
45
46 "golang.org/x/tools/go/ssa"
47 "golang.org/x/tools/go/types/typeutil"
48 "golang.org/x/tools/internal/aliases"
49 )
50
51 type value interface{}
52
53 type tuple []value
54
55 type array []value
56
57 type iface struct {
58 t types.Type
59 v value
60 }
61
62 type structure []value
63
64
65 type iter interface {
66
67
68 next() tuple
69 }
70
71 type closure struct {
72 Fn *ssa.Function
73 Env []value
74 }
75
76 type bad struct{}
77
78 type rtype struct {
79 t types.Type
80 }
81
82
83
84
85 func hashString(s string) int {
86 var h uint32
87 for i := 0; i < len(s); i++ {
88 h ^= uint32(s[i])
89 h *= 16777619
90 }
91 return int(h)
92 }
93
94 var (
95 mu sync.Mutex
96 hasher = typeutil.MakeHasher()
97 )
98
99
100
101 func hashType(t types.Type) int {
102 mu.Lock()
103 h := int(hasher.Hash(t))
104 mu.Unlock()
105 return h
106 }
107
108
109
110
111
112
113
114
115
116
117 func usesBuiltinMap(t types.Type) bool {
118 switch t := t.(type) {
119 case *types.Basic, *types.Chan, *types.Pointer:
120 return true
121 case *types.Named, *aliases.Alias:
122 return usesBuiltinMap(t.Underlying())
123 case *types.Interface, *types.Array, *types.Struct:
124 return false
125 }
126 panic(fmt.Sprintf("invalid map key type: %T", t))
127 }
128
129 func (x array) eq(t types.Type, _y interface{}) bool {
130 y := _y.(array)
131 tElt := t.Underlying().(*types.Array).Elem()
132 for i, xi := range x {
133 if !equals(tElt, xi, y[i]) {
134 return false
135 }
136 }
137 return true
138 }
139
140 func (x array) hash(t types.Type) int {
141 h := 0
142 tElt := t.Underlying().(*types.Array).Elem()
143 for _, xi := range x {
144 h += hash(tElt, xi)
145 }
146 return h
147 }
148
149 func (x structure) eq(t types.Type, _y interface{}) bool {
150 y := _y.(structure)
151 tStruct := t.Underlying().(*types.Struct)
152 for i, n := 0, tStruct.NumFields(); i < n; i++ {
153 if f := tStruct.Field(i); !f.Anonymous() {
154 if !equals(f.Type(), x[i], y[i]) {
155 return false
156 }
157 }
158 }
159 return true
160 }
161
162 func (x structure) hash(t types.Type) int {
163 tStruct := t.Underlying().(*types.Struct)
164 h := 0
165 for i, n := 0, tStruct.NumFields(); i < n; i++ {
166 if f := tStruct.Field(i); !f.Anonymous() {
167 h += hash(f.Type(), x[i])
168 }
169 }
170 return h
171 }
172
173
174 func sameType(x, y types.Type) bool {
175 if x == nil {
176 return y == nil
177 }
178 return y != nil && types.Identical(x, y)
179 }
180
181 func (x iface) eq(t types.Type, _y interface{}) bool {
182 y := _y.(iface)
183 return sameType(x.t, y.t) && (x.t == nil || equals(x.t, x.v, y.v))
184 }
185
186 func (x iface) hash(_ types.Type) int {
187 return hashType(x.t)*8581 + hash(x.t, x.v)
188 }
189
190 func (x rtype) hash(_ types.Type) int {
191 return hashType(x.t)
192 }
193
194 func (x rtype) eq(_ types.Type, y interface{}) bool {
195 return types.Identical(x.t, y.(rtype).t)
196 }
197
198
199
200
201
202 func equals(t types.Type, x, y value) bool {
203 switch x := x.(type) {
204 case bool:
205 return x == y.(bool)
206 case int:
207 return x == y.(int)
208 case int8:
209 return x == y.(int8)
210 case int16:
211 return x == y.(int16)
212 case int32:
213 return x == y.(int32)
214 case int64:
215 return x == y.(int64)
216 case uint:
217 return x == y.(uint)
218 case uint8:
219 return x == y.(uint8)
220 case uint16:
221 return x == y.(uint16)
222 case uint32:
223 return x == y.(uint32)
224 case uint64:
225 return x == y.(uint64)
226 case uintptr:
227 return x == y.(uintptr)
228 case float32:
229 return x == y.(float32)
230 case float64:
231 return x == y.(float64)
232 case complex64:
233 return x == y.(complex64)
234 case complex128:
235 return x == y.(complex128)
236 case string:
237 return x == y.(string)
238 case *value:
239 return x == y.(*value)
240 case chan value:
241 return x == y.(chan value)
242 case structure:
243 return x.eq(t, y)
244 case array:
245 return x.eq(t, y)
246 case iface:
247 return x.eq(t, y)
248 case rtype:
249 return x.eq(t, y)
250 }
251
252
253
254
255 panic(fmt.Sprintf("comparing uncomparable type %s", t))
256 }
257
258
259 func hash(t types.Type, x value) int {
260 switch x := x.(type) {
261 case bool:
262 if x {
263 return 1
264 }
265 return 0
266 case int:
267 return x
268 case int8:
269 return int(x)
270 case int16:
271 return int(x)
272 case int32:
273 return int(x)
274 case int64:
275 return int(x)
276 case uint:
277 return int(x)
278 case uint8:
279 return int(x)
280 case uint16:
281 return int(x)
282 case uint32:
283 return int(x)
284 case uint64:
285 return int(x)
286 case uintptr:
287 return int(x)
288 case float32:
289 return int(x)
290 case float64:
291 return int(x)
292 case complex64:
293 return int(real(x))
294 case complex128:
295 return int(real(x))
296 case string:
297 return hashString(x)
298 case *value:
299 return int(uintptr(unsafe.Pointer(x)))
300 case chan value:
301 return int(uintptr(reflect.ValueOf(x).Pointer()))
302 case structure:
303 return x.hash(t)
304 case array:
305 return x.hash(t)
306 case iface:
307 return x.hash(t)
308 case rtype:
309 return x.hash(t)
310 }
311 panic(fmt.Sprintf("%T is unhashable", x))
312 }
313
314
315
316
317
318
319
320
321
322 func load(T types.Type, addr *value) value {
323 switch T := T.Underlying().(type) {
324 case *types.Struct:
325 v := (*addr).(structure)
326 a := make(structure, len(v))
327 for i := range a {
328 a[i] = load(T.Field(i).Type(), &v[i])
329 }
330 return a
331 case *types.Array:
332 v := (*addr).(array)
333 a := make(array, len(v))
334 for i := range a {
335 a[i] = load(T.Elem(), &v[i])
336 }
337 return a
338 default:
339 return *addr
340 }
341 }
342
343
344 func store(T types.Type, addr *value, v value) {
345 switch T := T.Underlying().(type) {
346 case *types.Struct:
347 lhs := (*addr).(structure)
348 rhs := v.(structure)
349 for i := range lhs {
350 store(T.Field(i).Type(), &lhs[i], rhs[i])
351 }
352 case *types.Array:
353 lhs := (*addr).(array)
354 rhs := v.(array)
355 for i := range lhs {
356 store(T.Elem(), &lhs[i], rhs[i])
357 }
358 default:
359 *addr = v
360 }
361 }
362
363
364
365
366 func writeValue(buf *bytes.Buffer, v value) {
367 switch v := v.(type) {
368 case nil, bool, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr, float32, float64, complex64, complex128, string:
369 fmt.Fprintf(buf, "%v", v)
370
371 case map[value]value:
372 buf.WriteString("map[")
373 sep := ""
374 for k, e := range v {
375 buf.WriteString(sep)
376 sep = " "
377 writeValue(buf, k)
378 buf.WriteString(":")
379 writeValue(buf, e)
380 }
381 buf.WriteString("]")
382
383 case *hashmap:
384 buf.WriteString("map[")
385 sep := " "
386 for _, e := range v.entries() {
387 for e != nil {
388 buf.WriteString(sep)
389 sep = " "
390 writeValue(buf, e.key)
391 buf.WriteString(":")
392 writeValue(buf, e.value)
393 e = e.next
394 }
395 }
396 buf.WriteString("]")
397
398 case chan value:
399 fmt.Fprintf(buf, "%v", v)
400
401 case *value:
402 if v == nil {
403 buf.WriteString("<nil>")
404 } else {
405 fmt.Fprintf(buf, "%p", v)
406 }
407
408 case iface:
409 fmt.Fprintf(buf, "(%s, ", v.t)
410 writeValue(buf, v.v)
411 buf.WriteString(")")
412
413 case structure:
414 buf.WriteString("{")
415 for i, e := range v {
416 if i > 0 {
417 buf.WriteString(" ")
418 }
419 writeValue(buf, e)
420 }
421 buf.WriteString("}")
422
423 case array:
424 buf.WriteString("[")
425 for i, e := range v {
426 if i > 0 {
427 buf.WriteString(" ")
428 }
429 writeValue(buf, e)
430 }
431 buf.WriteString("]")
432
433 case []value:
434 buf.WriteString("[")
435 for i, e := range v {
436 if i > 0 {
437 buf.WriteString(" ")
438 }
439 writeValue(buf, e)
440 }
441 buf.WriteString("]")
442
443 case *ssa.Function, *ssa.Builtin, *closure:
444 fmt.Fprintf(buf, "%p", v)
445
446 case rtype:
447 buf.WriteString(v.t.String())
448
449 case tuple:
450
451 buf.WriteString("(")
452 for i, e := range v {
453 if i > 0 {
454 buf.WriteString(", ")
455 }
456 writeValue(buf, e)
457 }
458 buf.WriteString(")")
459
460 default:
461 fmt.Fprintf(buf, "<%T>", v)
462 }
463 }
464
465
466 func toString(v value) string {
467 var b bytes.Buffer
468 writeValue(&b, v)
469 return b.String()
470 }
471
472
473
474
475 type stringIter struct {
476 *strings.Reader
477 i int
478 }
479
480 func (it *stringIter) next() tuple {
481 okv := make(tuple, 3)
482 ch, n, err := it.ReadRune()
483 ok := err != io.EOF
484 okv[0] = ok
485 if ok {
486 okv[1] = it.i
487 okv[2] = ch
488 }
489 it.i += n
490 return okv
491 }
492
493 type mapIter struct {
494 iter *reflect.MapIter
495 ok bool
496 }
497
498 func (it *mapIter) next() tuple {
499 it.ok = it.iter.Next()
500 if !it.ok {
501 return []value{false, nil, nil}
502 }
503 k, v := it.iter.Key().Interface(), it.iter.Value().Interface()
504 return []value{true, k, v}
505 }
506
507 type hashmapIter struct {
508 iter *reflect.MapIter
509 ok bool
510 cur *entry
511 }
512
513 func (it *hashmapIter) next() tuple {
514 for {
515 if it.cur != nil {
516 k, v := it.cur.key, it.cur.value
517 it.cur = it.cur.next
518 return []value{true, k, v}
519 }
520 it.ok = it.iter.Next()
521 if !it.ok {
522 return []value{false, nil, nil}
523 }
524 it.cur = it.iter.Value().Interface().(*entry)
525 }
526 }
527
View as plain text