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