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 }