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 }