github.com/jd-ly/tools@v0.5.7/go/ssa/interp/value.go (about)

     1  // Copyright 2013 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package interp
     6  
     7  // Values
     8  //
     9  // All interpreter values are "boxed" in the empty interface, value.
    10  // The range of possible dynamic types within value are:
    11  //
    12  // - bool
    13  // - numbers (all built-in int/float/complex types are distinguished)
    14  // - string
    15  // - map[value]value --- maps for which  usesBuiltinMap(keyType)
    16  //   *hashmap        --- maps for which !usesBuiltinMap(keyType)
    17  // - chan value
    18  // - []value --- slices
    19  // - iface --- interfaces.
    20  // - structure --- structs.  Fields are ordered and accessed by numeric indices.
    21  // - array --- arrays.
    22  // - *value --- pointers.  Careful: *value is a distinct type from *array etc.
    23  // - *ssa.Function \
    24  //   *ssa.Builtin   } --- functions.  A nil 'func' is always of type *ssa.Function.
    25  //   *closure      /
    26  // - tuple --- as returned by Return, Next, "value,ok" modes, etc.
    27  // - iter --- iterators from 'range' over map or string.
    28  // - bad --- a poison pill for locals that have gone out of scope.
    29  // - rtype -- the interpreter's concrete implementation of reflect.Type
    30  //
    31  // Note that nil is not on this list.
    32  //
    33  // Pay close attention to whether or not the dynamic type is a pointer.
    34  // The compiler cannot help you since value is an empty interface.
    35  
    36  import (
    37  	"bytes"
    38  	"fmt"
    39  	"go/types"
    40  	"io"
    41  	"reflect"
    42  	"strings"
    43  	"sync"
    44  	"unsafe"
    45  
    46  	"github.com/jd-ly/tools/go/ssa"
    47  	"github.com/jd-ly/tools/go/types/typeutil"
    48  )
    49  
    50  type value interface{}
    51  
    52  type tuple []value
    53  
    54  type array []value
    55  
    56  type iface struct {
    57  	t types.Type // never an "untyped" type
    58  	v value
    59  }
    60  
    61  type structure []value
    62  
    63  // For map, array, *array, slice, string or channel.
    64  type iter interface {
    65  	// next returns a Tuple (key, value, ok).
    66  	// key and value are unaliased, e.g. copies of the sequence element.
    67  	next() tuple
    68  }
    69  
    70  type closure struct {
    71  	Fn  *ssa.Function
    72  	Env []value
    73  }
    74  
    75  type bad struct{}
    76  
    77  type rtype struct {
    78  	t types.Type
    79  }
    80  
    81  // Hash functions and equivalence relation:
    82  
    83  // hashString computes the FNV hash of s.
    84  func hashString(s string) int {
    85  	var h uint32
    86  	for i := 0; i < len(s); i++ {
    87  		h ^= uint32(s[i])
    88  		h *= 16777619
    89  	}
    90  	return int(h)
    91  }
    92  
    93  var (
    94  	mu     sync.Mutex
    95  	hasher = typeutil.MakeHasher()
    96  )
    97  
    98  // hashType returns a hash for t such that
    99  // types.Identical(x, y) => hashType(x) == hashType(y).
   100  func hashType(t types.Type) int {
   101  	mu.Lock()
   102  	h := int(hasher.Hash(t))
   103  	mu.Unlock()
   104  	return h
   105  }
   106  
   107  // usesBuiltinMap returns true if the built-in hash function and
   108  // equivalence relation for type t are consistent with those of the
   109  // interpreter's representation of type t.  Such types are: all basic
   110  // types (bool, numbers, string), pointers and channels.
   111  //
   112  // usesBuiltinMap returns false for types that require a custom map
   113  // implementation: interfaces, arrays and structs.
   114  //
   115  // Panic ensues if t is an invalid map key type: function, map or slice.
   116  func usesBuiltinMap(t types.Type) bool {
   117  	switch t := t.(type) {
   118  	case *types.Basic, *types.Chan, *types.Pointer:
   119  		return true
   120  	case *types.Named:
   121  		return usesBuiltinMap(t.Underlying())
   122  	case *types.Interface, *types.Array, *types.Struct:
   123  		return false
   124  	}
   125  	panic(fmt.Sprintf("invalid map key type: %T", t))
   126  }
   127  
   128  func (x array) eq(t types.Type, _y interface{}) bool {
   129  	y := _y.(array)
   130  	tElt := t.Underlying().(*types.Array).Elem()
   131  	for i, xi := range x {
   132  		if !equals(tElt, xi, y[i]) {
   133  			return false
   134  		}
   135  	}
   136  	return true
   137  }
   138  
   139  func (x array) hash(t types.Type) int {
   140  	h := 0
   141  	tElt := t.Underlying().(*types.Array).Elem()
   142  	for _, xi := range x {
   143  		h += hash(tElt, xi)
   144  	}
   145  	return h
   146  }
   147  
   148  func (x structure) eq(t types.Type, _y interface{}) bool {
   149  	y := _y.(structure)
   150  	tStruct := t.Underlying().(*types.Struct)
   151  	for i, n := 0, tStruct.NumFields(); i < n; i++ {
   152  		if f := tStruct.Field(i); !f.Anonymous() {
   153  			if !equals(f.Type(), x[i], y[i]) {
   154  				return false
   155  			}
   156  		}
   157  	}
   158  	return true
   159  }
   160  
   161  func (x structure) hash(t types.Type) int {
   162  	tStruct := t.Underlying().(*types.Struct)
   163  	h := 0
   164  	for i, n := 0, tStruct.NumFields(); i < n; i++ {
   165  		if f := tStruct.Field(i); !f.Anonymous() {
   166  			h += hash(f.Type(), x[i])
   167  		}
   168  	}
   169  	return h
   170  }
   171  
   172  // nil-tolerant variant of types.Identical.
   173  func sameType(x, y types.Type) bool {
   174  	if x == nil {
   175  		return y == nil
   176  	}
   177  	return y != nil && types.Identical(x, y)
   178  }
   179  
   180  func (x iface) eq(t types.Type, _y interface{}) bool {
   181  	y := _y.(iface)
   182  	return sameType(x.t, y.t) && (x.t == nil || equals(x.t, x.v, y.v))
   183  }
   184  
   185  func (x iface) hash(_ types.Type) int {
   186  	return hashType(x.t)*8581 + hash(x.t, x.v)
   187  }
   188  
   189  func (x rtype) hash(_ types.Type) int {
   190  	return hashType(x.t)
   191  }
   192  
   193  func (x rtype) eq(_ types.Type, y interface{}) bool {
   194  	return types.Identical(x.t, y.(rtype).t)
   195  }
   196  
   197  // equals returns true iff x and y are equal according to Go's
   198  // linguistic equivalence relation for type t.
   199  // In a well-typed program, the dynamic types of x and y are
   200  // guaranteed equal.
   201  func equals(t types.Type, x, y value) bool {
   202  	switch x := x.(type) {
   203  	case bool:
   204  		return x == y.(bool)
   205  	case int:
   206  		return x == y.(int)
   207  	case int8:
   208  		return x == y.(int8)
   209  	case int16:
   210  		return x == y.(int16)
   211  	case int32:
   212  		return x == y.(int32)
   213  	case int64:
   214  		return x == y.(int64)
   215  	case uint:
   216  		return x == y.(uint)
   217  	case uint8:
   218  		return x == y.(uint8)
   219  	case uint16:
   220  		return x == y.(uint16)
   221  	case uint32:
   222  		return x == y.(uint32)
   223  	case uint64:
   224  		return x == y.(uint64)
   225  	case uintptr:
   226  		return x == y.(uintptr)
   227  	case float32:
   228  		return x == y.(float32)
   229  	case float64:
   230  		return x == y.(float64)
   231  	case complex64:
   232  		return x == y.(complex64)
   233  	case complex128:
   234  		return x == y.(complex128)
   235  	case string:
   236  		return x == y.(string)
   237  	case *value:
   238  		return x == y.(*value)
   239  	case chan value:
   240  		return x == y.(chan value)
   241  	case structure:
   242  		return x.eq(t, y)
   243  	case array:
   244  		return x.eq(t, y)
   245  	case iface:
   246  		return x.eq(t, y)
   247  	case rtype:
   248  		return x.eq(t, y)
   249  	}
   250  
   251  	// Since map, func and slice don't support comparison, this
   252  	// case is only reachable if one of x or y is literally nil
   253  	// (handled in eqnil) or via interface{} values.
   254  	panic(fmt.Sprintf("comparing uncomparable type %s", t))
   255  }
   256  
   257  // Returns an integer hash of x such that equals(x, y) => hash(x) == hash(y).
   258  func hash(t types.Type, x value) int {
   259  	switch x := x.(type) {
   260  	case bool:
   261  		if x {
   262  			return 1
   263  		}
   264  		return 0
   265  	case int:
   266  		return x
   267  	case int8:
   268  		return int(x)
   269  	case int16:
   270  		return int(x)
   271  	case int32:
   272  		return int(x)
   273  	case int64:
   274  		return int(x)
   275  	case uint:
   276  		return int(x)
   277  	case uint8:
   278  		return int(x)
   279  	case uint16:
   280  		return int(x)
   281  	case uint32:
   282  		return int(x)
   283  	case uint64:
   284  		return int(x)
   285  	case uintptr:
   286  		return int(x)
   287  	case float32:
   288  		return int(x)
   289  	case float64:
   290  		return int(x)
   291  	case complex64:
   292  		return int(real(x))
   293  	case complex128:
   294  		return int(real(x))
   295  	case string:
   296  		return hashString(x)
   297  	case *value:
   298  		return int(uintptr(unsafe.Pointer(x)))
   299  	case chan value:
   300  		return int(uintptr(reflect.ValueOf(x).Pointer()))
   301  	case structure:
   302  		return x.hash(t)
   303  	case array:
   304  		return x.hash(t)
   305  	case iface:
   306  		return x.hash(t)
   307  	case rtype:
   308  		return x.hash(t)
   309  	}
   310  	panic(fmt.Sprintf("%T is unhashable", x))
   311  }
   312  
   313  // reflect.Value struct values don't have a fixed shape, since the
   314  // payload can be a scalar or an aggregate depending on the instance.
   315  // So store (and load) can't simply use recursion over the shape of the
   316  // rhs value, or the lhs, to copy the value; we need the static type
   317  // information.  (We can't make reflect.Value a new basic data type
   318  // because its "structness" is exposed to Go programs.)
   319  
   320  // load returns the value of type T in *addr.
   321  func load(T types.Type, addr *value) value {
   322  	switch T := T.Underlying().(type) {
   323  	case *types.Struct:
   324  		v := (*addr).(structure)
   325  		a := make(structure, len(v))
   326  		for i := range a {
   327  			a[i] = load(T.Field(i).Type(), &v[i])
   328  		}
   329  		return a
   330  	case *types.Array:
   331  		v := (*addr).(array)
   332  		a := make(array, len(v))
   333  		for i := range a {
   334  			a[i] = load(T.Elem(), &v[i])
   335  		}
   336  		return a
   337  	default:
   338  		return *addr
   339  	}
   340  }
   341  
   342  // store stores value v of type T into *addr.
   343  func store(T types.Type, addr *value, v value) {
   344  	switch T := T.Underlying().(type) {
   345  	case *types.Struct:
   346  		lhs := (*addr).(structure)
   347  		rhs := v.(structure)
   348  		for i := range lhs {
   349  			store(T.Field(i).Type(), &lhs[i], rhs[i])
   350  		}
   351  	case *types.Array:
   352  		lhs := (*addr).(array)
   353  		rhs := v.(array)
   354  		for i := range lhs {
   355  			store(T.Elem(), &lhs[i], rhs[i])
   356  		}
   357  	default:
   358  		*addr = v
   359  	}
   360  }
   361  
   362  // Prints in the style of built-in println.
   363  // (More or less; in gc println is actually a compiler intrinsic and
   364  // can distinguish println(1) from println(interface{}(1)).)
   365  func writeValue(buf *bytes.Buffer, v value) {
   366  	switch v := v.(type) {
   367  	case nil, bool, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr, float32, float64, complex64, complex128, string:
   368  		fmt.Fprintf(buf, "%v", v)
   369  
   370  	case map[value]value:
   371  		buf.WriteString("map[")
   372  		sep := ""
   373  		for k, e := range v {
   374  			buf.WriteString(sep)
   375  			sep = " "
   376  			writeValue(buf, k)
   377  			buf.WriteString(":")
   378  			writeValue(buf, e)
   379  		}
   380  		buf.WriteString("]")
   381  
   382  	case *hashmap:
   383  		buf.WriteString("map[")
   384  		sep := " "
   385  		for _, e := range v.entries() {
   386  			for e != nil {
   387  				buf.WriteString(sep)
   388  				sep = " "
   389  				writeValue(buf, e.key)
   390  				buf.WriteString(":")
   391  				writeValue(buf, e.value)
   392  				e = e.next
   393  			}
   394  		}
   395  		buf.WriteString("]")
   396  
   397  	case chan value:
   398  		fmt.Fprintf(buf, "%v", v) // (an address)
   399  
   400  	case *value:
   401  		if v == nil {
   402  			buf.WriteString("<nil>")
   403  		} else {
   404  			fmt.Fprintf(buf, "%p", v)
   405  		}
   406  
   407  	case iface:
   408  		fmt.Fprintf(buf, "(%s, ", v.t)
   409  		writeValue(buf, v.v)
   410  		buf.WriteString(")")
   411  
   412  	case structure:
   413  		buf.WriteString("{")
   414  		for i, e := range v {
   415  			if i > 0 {
   416  				buf.WriteString(" ")
   417  			}
   418  			writeValue(buf, e)
   419  		}
   420  		buf.WriteString("}")
   421  
   422  	case array:
   423  		buf.WriteString("[")
   424  		for i, e := range v {
   425  			if i > 0 {
   426  				buf.WriteString(" ")
   427  			}
   428  			writeValue(buf, e)
   429  		}
   430  		buf.WriteString("]")
   431  
   432  	case []value:
   433  		buf.WriteString("[")
   434  		for i, e := range v {
   435  			if i > 0 {
   436  				buf.WriteString(" ")
   437  			}
   438  			writeValue(buf, e)
   439  		}
   440  		buf.WriteString("]")
   441  
   442  	case *ssa.Function, *ssa.Builtin, *closure:
   443  		fmt.Fprintf(buf, "%p", v) // (an address)
   444  
   445  	case rtype:
   446  		buf.WriteString(v.t.String())
   447  
   448  	case tuple:
   449  		// Unreachable in well-formed Go programs
   450  		buf.WriteString("(")
   451  		for i, e := range v {
   452  			if i > 0 {
   453  				buf.WriteString(", ")
   454  			}
   455  			writeValue(buf, e)
   456  		}
   457  		buf.WriteString(")")
   458  
   459  	default:
   460  		fmt.Fprintf(buf, "<%T>", v)
   461  	}
   462  }
   463  
   464  // Implements printing of Go values in the style of built-in println.
   465  func toString(v value) string {
   466  	var b bytes.Buffer
   467  	writeValue(&b, v)
   468  	return b.String()
   469  }
   470  
   471  // ------------------------------------------------------------------------
   472  // Iterators
   473  
   474  type stringIter struct {
   475  	*strings.Reader
   476  	i int
   477  }
   478  
   479  func (it *stringIter) next() tuple {
   480  	okv := make(tuple, 3)
   481  	ch, n, err := it.ReadRune()
   482  	ok := err != io.EOF
   483  	okv[0] = ok
   484  	if ok {
   485  		okv[1] = it.i
   486  		okv[2] = ch
   487  	}
   488  	it.i += n
   489  	return okv
   490  }
   491  
   492  type mapIter struct {
   493  	iter *reflect.MapIter
   494  	ok   bool
   495  }
   496  
   497  func (it *mapIter) next() tuple {
   498  	it.ok = it.iter.Next()
   499  	if !it.ok {
   500  		return []value{false, nil, nil}
   501  	}
   502  	k, v := it.iter.Key().Interface(), it.iter.Value().Interface()
   503  	return []value{true, k, v}
   504  }
   505  
   506  type hashmapIter struct {
   507  	iter *reflect.MapIter
   508  	ok   bool
   509  	cur  *entry
   510  }
   511  
   512  func (it *hashmapIter) next() tuple {
   513  	for {
   514  		if it.cur != nil {
   515  			k, v := it.cur.key, it.cur.value
   516  			it.cur = it.cur.next
   517  			return []value{true, k, v}
   518  		}
   519  		it.ok = it.iter.Next()
   520  		if !it.ok {
   521  			return []value{false, nil, nil}
   522  		}
   523  		it.cur = it.iter.Value().Interface().(*entry)
   524  	}
   525  }