github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/tools/go/ssa/interp/reflect.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  // +build go1.5
     6  
     7  package interp
     8  
     9  // Emulated "reflect" package.
    10  //
    11  // We completely replace the built-in "reflect" package.
    12  // The only thing clients can depend upon are that reflect.Type is an
    13  // interface and reflect.Value is an (opaque) struct.
    14  
    15  import (
    16  	"fmt"
    17  	"go/token"
    18  	"go/types"
    19  	"reflect"
    20  	"unsafe"
    21  
    22  	"golang.org/x/tools/go/ssa"
    23  )
    24  
    25  type opaqueType struct {
    26  	types.Type
    27  	name string
    28  }
    29  
    30  func (t *opaqueType) String() string { return t.name }
    31  
    32  // A bogus "reflect" type-checker package.  Shared across interpreters.
    33  var reflectTypesPackage = types.NewPackage("reflect", "reflect")
    34  
    35  // rtype is the concrete type the interpreter uses to implement the
    36  // reflect.Type interface.
    37  //
    38  // type rtype <opaque>
    39  var rtypeType = makeNamedType("rtype", &opaqueType{nil, "rtype"})
    40  
    41  // error is an (interpreted) named type whose underlying type is string.
    42  // The interpreter uses it for all implementations of the built-in error
    43  // interface that it creates.
    44  // We put it in the "reflect" package for expedience.
    45  //
    46  // type error string
    47  var errorType = makeNamedType("error", &opaqueType{nil, "error"})
    48  
    49  func makeNamedType(name string, underlying types.Type) *types.Named {
    50  	obj := types.NewTypeName(token.NoPos, reflectTypesPackage, name, nil)
    51  	return types.NewNamed(obj, underlying, nil)
    52  }
    53  
    54  func makeReflectValue(t types.Type, v value) value {
    55  	return structure{rtype{t}, v}
    56  }
    57  
    58  // Given a reflect.Value, returns its rtype.
    59  func rV2T(v value) rtype {
    60  	return v.(structure)[0].(rtype)
    61  }
    62  
    63  // Given a reflect.Value, returns the underlying interpreter value.
    64  func rV2V(v value) value {
    65  	return v.(structure)[1]
    66  }
    67  
    68  // makeReflectType boxes up an rtype in a reflect.Type interface.
    69  func makeReflectType(rt rtype) value {
    70  	return iface{rtypeType, rt}
    71  }
    72  
    73  func ext۰reflect۰Init(fr *frame, args []value) value {
    74  	// Signature: func()
    75  	return nil
    76  }
    77  
    78  func ext۰reflect۰rtype۰Bits(fr *frame, args []value) value {
    79  	// Signature: func (t reflect.rtype) int
    80  	rt := args[0].(rtype).t
    81  	basic, ok := rt.Underlying().(*types.Basic)
    82  	if !ok {
    83  		panic(fmt.Sprintf("reflect.Type.Bits(%T): non-basic type", rt))
    84  	}
    85  	return int(fr.i.sizes.Sizeof(basic)) * 8
    86  }
    87  
    88  func ext۰reflect۰rtype۰Elem(fr *frame, args []value) value {
    89  	// Signature: func (t reflect.rtype) reflect.Type
    90  	return makeReflectType(rtype{args[0].(rtype).t.Underlying().(interface {
    91  		Elem() types.Type
    92  	}).Elem()})
    93  }
    94  
    95  func ext۰reflect۰rtype۰Field(fr *frame, args []value) value {
    96  	// Signature: func (t reflect.rtype, i int) reflect.StructField
    97  	st := args[0].(rtype).t.Underlying().(*types.Struct)
    98  	i := args[1].(int)
    99  	f := st.Field(i)
   100  	return structure{
   101  		f.Name(),
   102  		f.Pkg().Path(),
   103  		makeReflectType(rtype{f.Type()}),
   104  		st.Tag(i),
   105  		0,         // TODO(adonovan): offset
   106  		[]value{}, // TODO(adonovan): indices
   107  		f.Anonymous(),
   108  	}
   109  }
   110  
   111  func ext۰reflect۰rtype۰In(fr *frame, args []value) value {
   112  	// Signature: func (t reflect.rtype, i int) int
   113  	i := args[1].(int)
   114  	return makeReflectType(rtype{args[0].(rtype).t.(*types.Signature).Params().At(i).Type()})
   115  }
   116  
   117  func ext۰reflect۰rtype۰Kind(fr *frame, args []value) value {
   118  	// Signature: func (t reflect.rtype) uint
   119  	return uint(reflectKind(args[0].(rtype).t))
   120  }
   121  
   122  func ext۰reflect۰rtype۰NumField(fr *frame, args []value) value {
   123  	// Signature: func (t reflect.rtype) int
   124  	return args[0].(rtype).t.Underlying().(*types.Struct).NumFields()
   125  }
   126  
   127  func ext۰reflect۰rtype۰NumIn(fr *frame, args []value) value {
   128  	// Signature: func (t reflect.rtype) int
   129  	return args[0].(rtype).t.(*types.Signature).Params().Len()
   130  }
   131  
   132  func ext۰reflect۰rtype۰NumMethod(fr *frame, args []value) value {
   133  	// Signature: func (t reflect.rtype) int
   134  	return fr.i.prog.MethodSets.MethodSet(args[0].(rtype).t).Len()
   135  }
   136  
   137  func ext۰reflect۰rtype۰NumOut(fr *frame, args []value) value {
   138  	// Signature: func (t reflect.rtype) int
   139  	return args[0].(rtype).t.(*types.Signature).Results().Len()
   140  }
   141  
   142  func ext۰reflect۰rtype۰Out(fr *frame, args []value) value {
   143  	// Signature: func (t reflect.rtype, i int) int
   144  	i := args[1].(int)
   145  	return makeReflectType(rtype{args[0].(rtype).t.(*types.Signature).Results().At(i).Type()})
   146  }
   147  
   148  func ext۰reflect۰rtype۰Size(fr *frame, args []value) value {
   149  	// Signature: func (t reflect.rtype) uintptr
   150  	return uintptr(fr.i.sizes.Sizeof(args[0].(rtype).t))
   151  }
   152  
   153  func ext۰reflect۰rtype۰String(fr *frame, args []value) value {
   154  	// Signature: func (t reflect.rtype) string
   155  	return args[0].(rtype).t.String()
   156  }
   157  
   158  func ext۰reflect۰New(fr *frame, args []value) value {
   159  	// Signature: func (t reflect.Type) reflect.Value
   160  	t := args[0].(iface).v.(rtype).t
   161  	alloc := zero(t)
   162  	return makeReflectValue(types.NewPointer(t), &alloc)
   163  }
   164  
   165  func ext۰reflect۰SliceOf(fr *frame, args []value) value {
   166  	// Signature: func (t reflect.rtype) Type
   167  	return makeReflectType(rtype{types.NewSlice(args[0].(iface).v.(rtype).t)})
   168  }
   169  
   170  func ext۰reflect۰TypeOf(fr *frame, args []value) value {
   171  	// Signature: func (t reflect.rtype) Type
   172  	return makeReflectType(rtype{args[0].(iface).t})
   173  }
   174  
   175  func ext۰reflect۰ValueOf(fr *frame, args []value) value {
   176  	// Signature: func (interface{}) reflect.Value
   177  	itf := args[0].(iface)
   178  	return makeReflectValue(itf.t, itf.v)
   179  }
   180  
   181  func ext۰reflect۰Zero(fr *frame, args []value) value {
   182  	// Signature: func (t reflect.Type) reflect.Value
   183  	t := args[0].(iface).v.(rtype).t
   184  	return makeReflectValue(t, zero(t))
   185  }
   186  
   187  func reflectKind(t types.Type) reflect.Kind {
   188  	switch t := t.(type) {
   189  	case *types.Named:
   190  		return reflectKind(t.Underlying())
   191  	case *types.Basic:
   192  		switch t.Kind() {
   193  		case types.Bool:
   194  			return reflect.Bool
   195  		case types.Int:
   196  			return reflect.Int
   197  		case types.Int8:
   198  			return reflect.Int8
   199  		case types.Int16:
   200  			return reflect.Int16
   201  		case types.Int32:
   202  			return reflect.Int32
   203  		case types.Int64:
   204  			return reflect.Int64
   205  		case types.Uint:
   206  			return reflect.Uint
   207  		case types.Uint8:
   208  			return reflect.Uint8
   209  		case types.Uint16:
   210  			return reflect.Uint16
   211  		case types.Uint32:
   212  			return reflect.Uint32
   213  		case types.Uint64:
   214  			return reflect.Uint64
   215  		case types.Uintptr:
   216  			return reflect.Uintptr
   217  		case types.Float32:
   218  			return reflect.Float32
   219  		case types.Float64:
   220  			return reflect.Float64
   221  		case types.Complex64:
   222  			return reflect.Complex64
   223  		case types.Complex128:
   224  			return reflect.Complex128
   225  		case types.String:
   226  			return reflect.String
   227  		case types.UnsafePointer:
   228  			return reflect.UnsafePointer
   229  		}
   230  	case *types.Array:
   231  		return reflect.Array
   232  	case *types.Chan:
   233  		return reflect.Chan
   234  	case *types.Signature:
   235  		return reflect.Func
   236  	case *types.Interface:
   237  		return reflect.Interface
   238  	case *types.Map:
   239  		return reflect.Map
   240  	case *types.Pointer:
   241  		return reflect.Ptr
   242  	case *types.Slice:
   243  		return reflect.Slice
   244  	case *types.Struct:
   245  		return reflect.Struct
   246  	}
   247  	panic(fmt.Sprint("unexpected type: ", t))
   248  }
   249  
   250  func ext۰reflect۰Value۰Kind(fr *frame, args []value) value {
   251  	// Signature: func (reflect.Value) uint
   252  	return uint(reflectKind(rV2T(args[0]).t))
   253  }
   254  
   255  func ext۰reflect۰Value۰String(fr *frame, args []value) value {
   256  	// Signature: func (reflect.Value) string
   257  	return toString(rV2V(args[0]))
   258  }
   259  
   260  func ext۰reflect۰Value۰Type(fr *frame, args []value) value {
   261  	// Signature: func (reflect.Value) reflect.Type
   262  	return makeReflectType(rV2T(args[0]))
   263  }
   264  
   265  func ext۰reflect۰Value۰Uint(fr *frame, args []value) value {
   266  	// Signature: func (reflect.Value) uint64
   267  	switch v := rV2V(args[0]).(type) {
   268  	case uint:
   269  		return uint64(v)
   270  	case uint8:
   271  		return uint64(v)
   272  	case uint16:
   273  		return uint64(v)
   274  	case uint32:
   275  		return uint64(v)
   276  	case uint64:
   277  		return uint64(v)
   278  	case uintptr:
   279  		return uint64(v)
   280  	}
   281  	panic("reflect.Value.Uint")
   282  }
   283  
   284  func ext۰reflect۰Value۰Len(fr *frame, args []value) value {
   285  	// Signature: func (reflect.Value) int
   286  	switch v := rV2V(args[0]).(type) {
   287  	case string:
   288  		return len(v)
   289  	case array:
   290  		return len(v)
   291  	case chan value:
   292  		return cap(v)
   293  	case []value:
   294  		return len(v)
   295  	case *hashmap:
   296  		return v.len()
   297  	case map[value]value:
   298  		return len(v)
   299  	default:
   300  		panic(fmt.Sprintf("reflect.(Value).Len(%v)", v))
   301  	}
   302  }
   303  
   304  func ext۰reflect۰Value۰MapIndex(fr *frame, args []value) value {
   305  	// Signature: func (reflect.Value) Value
   306  	tValue := rV2T(args[0]).t.Underlying().(*types.Map).Key()
   307  	k := rV2V(args[1])
   308  	switch m := rV2V(args[0]).(type) {
   309  	case map[value]value:
   310  		if v, ok := m[k]; ok {
   311  			return makeReflectValue(tValue, v)
   312  		}
   313  
   314  	case *hashmap:
   315  		if v := m.lookup(k.(hashable)); v != nil {
   316  			return makeReflectValue(tValue, v)
   317  		}
   318  
   319  	default:
   320  		panic(fmt.Sprintf("(reflect.Value).MapIndex(%T, %T)", m, k))
   321  	}
   322  	return makeReflectValue(nil, nil)
   323  }
   324  
   325  func ext۰reflect۰Value۰MapKeys(fr *frame, args []value) value {
   326  	// Signature: func (reflect.Value) []Value
   327  	var keys []value
   328  	tKey := rV2T(args[0]).t.Underlying().(*types.Map).Key()
   329  	switch v := rV2V(args[0]).(type) {
   330  	case map[value]value:
   331  		for k := range v {
   332  			keys = append(keys, makeReflectValue(tKey, k))
   333  		}
   334  
   335  	case *hashmap:
   336  		for _, e := range v.table {
   337  			for ; e != nil; e = e.next {
   338  				keys = append(keys, makeReflectValue(tKey, e.key))
   339  			}
   340  		}
   341  
   342  	default:
   343  		panic(fmt.Sprintf("(reflect.Value).MapKeys(%T)", v))
   344  	}
   345  	return keys
   346  }
   347  
   348  func ext۰reflect۰Value۰NumField(fr *frame, args []value) value {
   349  	// Signature: func (reflect.Value) int
   350  	return len(rV2V(args[0]).(structure))
   351  }
   352  
   353  func ext۰reflect۰Value۰NumMethod(fr *frame, args []value) value {
   354  	// Signature: func (reflect.Value) int
   355  	return fr.i.prog.MethodSets.MethodSet(rV2T(args[0]).t).Len()
   356  }
   357  
   358  func ext۰reflect۰Value۰Pointer(fr *frame, args []value) value {
   359  	// Signature: func (v reflect.Value) uintptr
   360  	switch v := rV2V(args[0]).(type) {
   361  	case *value:
   362  		return uintptr(unsafe.Pointer(v))
   363  	case chan value:
   364  		return reflect.ValueOf(v).Pointer()
   365  	case []value:
   366  		return reflect.ValueOf(v).Pointer()
   367  	case *hashmap:
   368  		return reflect.ValueOf(v.table).Pointer()
   369  	case map[value]value:
   370  		return reflect.ValueOf(v).Pointer()
   371  	case *ssa.Function:
   372  		return uintptr(unsafe.Pointer(v))
   373  	case *closure:
   374  		return uintptr(unsafe.Pointer(v))
   375  	default:
   376  		panic(fmt.Sprintf("reflect.(Value).Pointer(%T)", v))
   377  	}
   378  }
   379  
   380  func ext۰reflect۰Value۰Index(fr *frame, args []value) value {
   381  	// Signature: func (v reflect.Value, i int) Value
   382  	i := args[1].(int)
   383  	t := rV2T(args[0]).t.Underlying()
   384  	switch v := rV2V(args[0]).(type) {
   385  	case array:
   386  		return makeReflectValue(t.(*types.Array).Elem(), v[i])
   387  	case []value:
   388  		return makeReflectValue(t.(*types.Slice).Elem(), v[i])
   389  	default:
   390  		panic(fmt.Sprintf("reflect.(Value).Index(%T)", v))
   391  	}
   392  }
   393  
   394  func ext۰reflect۰Value۰Bool(fr *frame, args []value) value {
   395  	// Signature: func (reflect.Value) bool
   396  	return rV2V(args[0]).(bool)
   397  }
   398  
   399  func ext۰reflect۰Value۰CanAddr(fr *frame, args []value) value {
   400  	// Signature: func (v reflect.Value) bool
   401  	// Always false for our representation.
   402  	return false
   403  }
   404  
   405  func ext۰reflect۰Value۰CanInterface(fr *frame, args []value) value {
   406  	// Signature: func (v reflect.Value) bool
   407  	// Always true for our representation.
   408  	return true
   409  }
   410  
   411  func ext۰reflect۰Value۰Elem(fr *frame, args []value) value {
   412  	// Signature: func (v reflect.Value) reflect.Value
   413  	switch x := rV2V(args[0]).(type) {
   414  	case iface:
   415  		return makeReflectValue(x.t, x.v)
   416  	case *value:
   417  		return makeReflectValue(rV2T(args[0]).t.Underlying().(*types.Pointer).Elem(), *x)
   418  	default:
   419  		panic(fmt.Sprintf("reflect.(Value).Elem(%T)", x))
   420  	}
   421  }
   422  
   423  func ext۰reflect۰Value۰Field(fr *frame, args []value) value {
   424  	// Signature: func (v reflect.Value, i int) reflect.Value
   425  	v := args[0]
   426  	i := args[1].(int)
   427  	return makeReflectValue(rV2T(v).t.Underlying().(*types.Struct).Field(i).Type(), rV2V(v).(structure)[i])
   428  }
   429  
   430  func ext۰reflect۰Value۰Float(fr *frame, args []value) value {
   431  	// Signature: func (reflect.Value) float64
   432  	switch v := rV2V(args[0]).(type) {
   433  	case float32:
   434  		return float64(v)
   435  	case float64:
   436  		return float64(v)
   437  	}
   438  	panic("reflect.Value.Float")
   439  }
   440  
   441  func ext۰reflect۰Value۰Interface(fr *frame, args []value) value {
   442  	// Signature: func (v reflect.Value) interface{}
   443  	return ext۰reflect۰valueInterface(fr, args)
   444  }
   445  
   446  func ext۰reflect۰Value۰Int(fr *frame, args []value) value {
   447  	// Signature: func (reflect.Value) int64
   448  	switch x := rV2V(args[0]).(type) {
   449  	case int:
   450  		return int64(x)
   451  	case int8:
   452  		return int64(x)
   453  	case int16:
   454  		return int64(x)
   455  	case int32:
   456  		return int64(x)
   457  	case int64:
   458  		return x
   459  	default:
   460  		panic(fmt.Sprintf("reflect.(Value).Int(%T)", x))
   461  	}
   462  }
   463  
   464  func ext۰reflect۰Value۰IsNil(fr *frame, args []value) value {
   465  	// Signature: func (reflect.Value) bool
   466  	switch x := rV2V(args[0]).(type) {
   467  	case *value:
   468  		return x == nil
   469  	case chan value:
   470  		return x == nil
   471  	case map[value]value:
   472  		return x == nil
   473  	case *hashmap:
   474  		return x == nil
   475  	case iface:
   476  		return x.t == nil
   477  	case []value:
   478  		return x == nil
   479  	case *ssa.Function:
   480  		return x == nil
   481  	case *ssa.Builtin:
   482  		return x == nil
   483  	case *closure:
   484  		return x == nil
   485  	default:
   486  		panic(fmt.Sprintf("reflect.(Value).IsNil(%T)", x))
   487  	}
   488  }
   489  
   490  func ext۰reflect۰Value۰IsValid(fr *frame, args []value) value {
   491  	// Signature: func (reflect.Value) bool
   492  	return rV2V(args[0]) != nil
   493  }
   494  
   495  func ext۰reflect۰Value۰Set(fr *frame, args []value) value {
   496  	// TODO(adonovan): implement.
   497  	return nil
   498  }
   499  
   500  func ext۰reflect۰valueInterface(fr *frame, args []value) value {
   501  	// Signature: func (v reflect.Value, safe bool) interface{}
   502  	v := args[0].(structure)
   503  	return iface{rV2T(v).t, rV2V(v)}
   504  }
   505  
   506  func ext۰reflect۰error۰Error(fr *frame, args []value) value {
   507  	return args[0]
   508  }
   509  
   510  // newMethod creates a new method of the specified name, package and receiver type.
   511  func newMethod(pkg *ssa.Package, recvType types.Type, name string) *ssa.Function {
   512  	// TODO(adonovan): fix: hack: currently the only part of Signature
   513  	// that is needed is the "pointerness" of Recv.Type, and for
   514  	// now, we'll set it to always be false since we're only
   515  	// concerned with rtype.  Encapsulate this better.
   516  	sig := types.NewSignature(types.NewVar(token.NoPos, nil, "recv", recvType), nil, nil, false)
   517  	fn := pkg.Prog.NewFunction(name, sig, "fake reflect method")
   518  	fn.Pkg = pkg
   519  	return fn
   520  }
   521  
   522  func initReflect(i *interpreter) {
   523  	i.reflectPackage = &ssa.Package{
   524  		Prog:    i.prog,
   525  		Pkg:     reflectTypesPackage,
   526  		Members: make(map[string]ssa.Member),
   527  	}
   528  
   529  	// Clobber the type-checker's notion of reflect.Value's
   530  	// underlying type so that it more closely matches the fake one
   531  	// (at least in the number of fields---we lie about the type of
   532  	// the rtype field).
   533  	//
   534  	// We must ensure that calls to (ssa.Value).Type() return the
   535  	// fake type so that correct "shape" is used when allocating
   536  	// variables, making zero values, loading, and storing.
   537  	//
   538  	// TODO(adonovan): obviously this is a hack.  We need a cleaner
   539  	// way to fake the reflect package (almost---DeepEqual is fine).
   540  	// One approach would be not to even load its source code, but
   541  	// provide fake source files.  This would guarantee that no bad
   542  	// information leaks into other packages.
   543  	if r := i.prog.ImportedPackage("reflect"); r != nil {
   544  		rV := r.Pkg.Scope().Lookup("Value").Type().(*types.Named)
   545  
   546  		// delete bodies of the old methods
   547  		mset := i.prog.MethodSets.MethodSet(rV)
   548  		for j := 0; j < mset.Len(); j++ {
   549  			i.prog.MethodValue(mset.At(j)).Blocks = nil
   550  		}
   551  
   552  		tEface := types.NewInterface(nil, nil).Complete()
   553  		rV.SetUnderlying(types.NewStruct([]*types.Var{
   554  			types.NewField(token.NoPos, r.Pkg, "t", tEface, false), // a lie
   555  			types.NewField(token.NoPos, r.Pkg, "v", tEface, false),
   556  		}, nil))
   557  	}
   558  
   559  	i.rtypeMethods = methodSet{
   560  		"Bits":      newMethod(i.reflectPackage, rtypeType, "Bits"),
   561  		"Elem":      newMethod(i.reflectPackage, rtypeType, "Elem"),
   562  		"Field":     newMethod(i.reflectPackage, rtypeType, "Field"),
   563  		"In":        newMethod(i.reflectPackage, rtypeType, "In"),
   564  		"Kind":      newMethod(i.reflectPackage, rtypeType, "Kind"),
   565  		"NumField":  newMethod(i.reflectPackage, rtypeType, "NumField"),
   566  		"NumIn":     newMethod(i.reflectPackage, rtypeType, "NumIn"),
   567  		"NumMethod": newMethod(i.reflectPackage, rtypeType, "NumMethod"),
   568  		"NumOut":    newMethod(i.reflectPackage, rtypeType, "NumOut"),
   569  		"Out":       newMethod(i.reflectPackage, rtypeType, "Out"),
   570  		"Size":      newMethod(i.reflectPackage, rtypeType, "Size"),
   571  		"String":    newMethod(i.reflectPackage, rtypeType, "String"),
   572  	}
   573  	i.errorMethods = methodSet{
   574  		"Error": newMethod(i.reflectPackage, errorType, "Error"),
   575  	}
   576  }