github.com/switchupcb/yaegi@v0.10.2/interp/value.go (about) 1 package interp 2 3 import ( 4 "go/constant" 5 "reflect" 6 ) 7 8 const ( 9 notInFrame = -1 // value of node.findex for literal values (not in frame) 10 globalFrame = -1 // value of node.level for global symbols 11 ) 12 13 func valueGenerator(n *node, i int) func(*frame) reflect.Value { 14 switch n.level { 15 case globalFrame: 16 return func(f *frame) reflect.Value { return valueOf(f.root.data, i) } 17 case 0: 18 return func(f *frame) reflect.Value { return valueOf(f.data, i) } 19 case 1: 20 return func(f *frame) reflect.Value { return valueOf(f.anc.data, i) } 21 case 2: 22 return func(f *frame) reflect.Value { return valueOf(f.anc.anc.data, i) } 23 default: 24 return func(f *frame) reflect.Value { 25 for level := n.level; level > 0; level-- { 26 f = f.anc 27 } 28 return valueOf(f.data, i) 29 } 30 } 31 } 32 33 // valueOf safely recovers the ith element of data. This is necessary 34 // because a cancellation prior to any evaluation result may leave 35 // the frame's data empty. 36 func valueOf(data []reflect.Value, i int) reflect.Value { 37 if i < len(data) { 38 return data[i] 39 } 40 return reflect.Value{} 41 } 42 43 func genValueBinMethodOnInterface(n *node, defaultGen func(*frame) reflect.Value) func(*frame) reflect.Value { 44 if n == nil || n.child == nil || n.child[0] == nil || 45 n.child[0].child == nil || n.child[0].child[0] == nil { 46 return defaultGen 47 } 48 c0 := n.child[0] 49 if c0.child[1] == nil || c0.child[1].ident == "" { 50 return defaultGen 51 } 52 value0 := genValue(c0.child[0]) 53 54 return func(f *frame) reflect.Value { 55 v := value0(f) 56 var nod *node 57 58 for v.IsValid() { 59 // Traverse interface indirections to find out concrete type. 60 vi, ok := v.Interface().(valueInterface) 61 if !ok { 62 break 63 } 64 v = vi.value 65 nod = vi.node 66 } 67 68 if nod == nil || nod.typ.rtype == nil { 69 return defaultGen(f) 70 } 71 72 // Try to get the bin method, if it doesnt exist, fall back to 73 // the default generator function. 74 meth, ok := nod.typ.rtype.MethodByName(c0.child[1].ident) 75 if !ok { 76 return defaultGen(f) 77 } 78 79 return meth.Func 80 } 81 } 82 83 func genValueRecvIndirect(n *node) func(*frame) reflect.Value { 84 vr := genValueRecv(n) 85 return func(f *frame) reflect.Value { 86 v := vr(f) 87 if vi, ok := v.Interface().(valueInterface); ok { 88 return vi.value 89 } 90 return v.Elem() 91 } 92 } 93 94 func genValueRecv(n *node) func(*frame) reflect.Value { 95 v := genValue(n.recv.node) 96 fi := n.recv.index 97 98 if len(fi) == 0 { 99 return v 100 } 101 102 return func(f *frame) reflect.Value { 103 r := v(f) 104 if r.Kind() == reflect.Ptr { 105 r = r.Elem() 106 } 107 return r.FieldByIndex(fi) 108 } 109 } 110 111 func genValueBinRecv(n *node, recv *receiver) func(*frame) reflect.Value { 112 value := genValue(n) 113 binValue := genValue(recv.node) 114 115 v := func(f *frame) reflect.Value { 116 if def, ok := value(f).Interface().(*node); ok { 117 if def != nil && def.recv != nil && def.recv.val.IsValid() { 118 return def.recv.val 119 } 120 } 121 122 ival, _ := binValue(f).Interface().(valueInterface) 123 return ival.value 124 } 125 126 fi := recv.index 127 if len(fi) == 0 { 128 return v 129 } 130 131 return func(f *frame) reflect.Value { 132 r := v(f) 133 if r.Kind() == reflect.Ptr { 134 r = r.Elem() 135 } 136 return r.FieldByIndex(fi) 137 } 138 } 139 140 func genValueAsFunctionWrapper(n *node) func(*frame) reflect.Value { 141 value := genValue(n) 142 typ := n.typ.TypeOf() 143 144 return func(f *frame) reflect.Value { 145 v := value(f) 146 if v.IsNil() { 147 return reflect.New(typ).Elem() 148 } 149 vn, ok := v.Interface().(*node) 150 if ok && vn.rval.IsValid() && vn.rval.Type().Kind() == reflect.Func { 151 // The node value is already a callable func, no need to wrap it. 152 return vn.rval 153 } 154 return genFunctionWrapper(vn)(f) 155 } 156 } 157 158 func genValueAs(n *node, t reflect.Type) func(*frame) reflect.Value { 159 value := genValue(n) 160 161 return func(f *frame) reflect.Value { 162 v := value(f) 163 switch v.Type().Kind() { 164 case reflect.Chan, reflect.Func, reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice, reflect.UnsafePointer: 165 if v.IsNil() { 166 return reflect.New(t).Elem() 167 } 168 } 169 return v.Convert(t) 170 } 171 } 172 173 func genValue(n *node) func(*frame) reflect.Value { 174 switch n.kind { 175 case basicLit: 176 convertConstantValue(n) 177 v := n.rval 178 if !v.IsValid() { 179 v = reflect.New(interf).Elem() 180 } 181 return func(f *frame) reflect.Value { return v } 182 case funcDecl: 183 var v reflect.Value 184 if w, ok := n.val.(reflect.Value); ok { 185 v = w 186 } else { 187 v = reflect.ValueOf(n.val) 188 } 189 return func(f *frame) reflect.Value { return v } 190 default: 191 if n.rval.IsValid() { 192 convertConstantValue(n) 193 v := n.rval 194 return func(f *frame) reflect.Value { return v } 195 } 196 if n.sym != nil { 197 i := n.sym.index 198 if i < 0 { 199 return genValue(n.sym.node) 200 } 201 if n.sym.global { 202 return func(f *frame) reflect.Value { return f.root.data[i] } 203 } 204 return valueGenerator(n, i) 205 } 206 if n.findex == notInFrame { 207 var v reflect.Value 208 if w, ok := n.val.(reflect.Value); ok { 209 v = w 210 } else { 211 v = reflect.ValueOf(n.val) 212 } 213 return func(f *frame) reflect.Value { return v } 214 } 215 return valueGenerator(n, n.findex) 216 } 217 } 218 219 func genDestValue(typ *itype, n *node) func(*frame) reflect.Value { 220 convertLiteralValue(n, typ.TypeOf()) 221 switch { 222 case isInterfaceSrc(typ) && !isEmptyInterface(typ): 223 return genValueInterface(n) 224 case isFuncSrc(typ) && (n.typ.cat == valueT || n.typ.cat == nilT): 225 return genValueNode(n) 226 case typ.cat == valueT && isFuncSrc(n.typ): 227 return genFunctionWrapper(n) 228 case isInterfaceBin(typ): 229 return genInterfaceWrapper(n, typ.rtype) 230 case n.kind == basicLit && n.val == nil: 231 return func(*frame) reflect.Value { return reflect.New(typ.rtype).Elem() } 232 case n.typ.untyped && isComplex(typ.TypeOf()): 233 return genValueComplex(n) 234 case n.typ.untyped && !typ.untyped: 235 return genValueAs(n, typ.TypeOf()) 236 } 237 return genValue(n) 238 } 239 240 func genValueArray(n *node) func(*frame) reflect.Value { 241 value := genValue(n) 242 // dereference array pointer, to support array operations on array pointer 243 if n.typ.TypeOf().Kind() == reflect.Ptr { 244 return func(f *frame) reflect.Value { 245 return value(f).Elem() 246 } 247 } 248 return value 249 } 250 251 func genValueRangeArray(n *node) func(*frame) reflect.Value { 252 value := genValue(n) 253 254 switch { 255 case n.typ.TypeOf().Kind() == reflect.Ptr: 256 // dereference array pointer, to support array operations on array pointer 257 return func(f *frame) reflect.Value { 258 return value(f).Elem() 259 } 260 case n.typ.val != nil && n.typ.val.cat == interfaceT: 261 if len(n.typ.val.field) > 0 { 262 return func(f *frame) reflect.Value { 263 val := value(f) 264 v := []valueInterface{} 265 for i := 0; i < val.Len(); i++ { 266 switch av := val.Index(i).Interface().(type) { 267 case []valueInterface: 268 v = append(v, av...) 269 case valueInterface: 270 v = append(v, av) 271 default: 272 panic(n.cfgErrorf("invalid type %v", val.Index(i).Type())) 273 } 274 } 275 return reflect.ValueOf(v) 276 } 277 } 278 // empty interface, do not wrap. 279 fallthrough 280 default: 281 return func(f *frame) reflect.Value { 282 // This is necessary to prevent changes in the returned 283 // reflect.Value being reflected back to the value used 284 // for the range expression. 285 return reflect.ValueOf(value(f).Interface()) 286 } 287 } 288 } 289 290 func genValueInterfaceArray(n *node) func(*frame) reflect.Value { 291 value := genValue(n) 292 return func(f *frame) reflect.Value { 293 vi := value(f).Interface().([]valueInterface) 294 v := reflect.MakeSlice(reflect.TypeOf([]interface{}{}), len(vi), len(vi)) 295 for i, vv := range vi { 296 v.Index(i).Set(vv.value) 297 } 298 299 return v 300 } 301 } 302 303 func genValueInterface(n *node) func(*frame) reflect.Value { 304 value := genValue(n) 305 306 return func(f *frame) reflect.Value { 307 v := value(f) 308 nod := n 309 310 for v.IsValid() { 311 // traverse interface indirections to find out concrete type 312 vi, ok := v.Interface().(valueInterface) 313 if !ok { 314 break 315 } 316 v = vi.value 317 nod = vi.node 318 } 319 320 // empty interface, do not wrap. 321 if nod != nil && isEmptyInterface(nod.typ) { 322 return v 323 } 324 325 return reflect.ValueOf(valueInterface{nod, v}) 326 } 327 } 328 329 func getConcreteValue(val reflect.Value) reflect.Value { 330 v := val 331 for { 332 vi, ok := v.Interface().(valueInterface) 333 if !ok { 334 break 335 } 336 v = vi.value 337 } 338 if v.NumMethod() > 0 { 339 return v 340 } 341 if v.Type().Kind() != reflect.Struct { 342 return v 343 } 344 // Search a concrete value in fields of an emulated interface. 345 for i := v.NumField() - 1; i >= 0; i-- { 346 vv := v.Field(i) 347 if vv.Type().Kind() == reflect.Interface { 348 vv = vv.Elem() 349 } 350 if vv.IsValid() { 351 return vv 352 } 353 } 354 return v 355 } 356 357 func zeroInterfaceValue() reflect.Value { 358 n := &node{kind: basicLit, typ: &itype{cat: nilT, untyped: true, str: "nil"}} 359 v := reflect.New(interf).Elem() 360 return reflect.ValueOf(valueInterface{n, v}) 361 } 362 363 func wantEmptyInterface(n *node) bool { 364 return isEmptyInterface(n.typ) || 365 n.anc.action == aAssign && n.anc.typ.cat == interfaceT && len(n.anc.typ.field) == 0 || 366 n.anc.kind == returnStmt && n.anc.val.(*node).typ.ret[0].cat == interfaceT && len(n.anc.val.(*node).typ.ret[0].field) == 0 367 } 368 369 func genValueOutput(n *node, t reflect.Type) func(*frame) reflect.Value { 370 value := genValue(n) 371 switch { 372 case n.anc.action == aAssign && n.anc.typ.cat == interfaceT: 373 if len(n.anc.typ.field) == 0 { 374 // empty interface, do not wrap 375 return value 376 } 377 fallthrough 378 case n.anc.kind == returnStmt && n.anc.val.(*node).typ.ret[0].cat == interfaceT: 379 if nod, ok := n.anc.val.(*node); !ok || len(nod.typ.ret[0].field) == 0 { 380 // empty interface, do not wrap 381 return value 382 } 383 // The result of the builtin has to be returned as an interface type. 384 // Wrap it in a valueInterface and return the dereferenced value. 385 return func(f *frame) reflect.Value { 386 d := value(f) 387 v := reflect.New(t).Elem() 388 d.Set(reflect.ValueOf(valueInterface{n, v})) 389 return v 390 } 391 } 392 return value 393 } 394 395 func valueInterfaceValue(v reflect.Value) reflect.Value { 396 for { 397 vv, ok := v.Interface().(valueInterface) 398 if !ok { 399 break 400 } 401 v = vv.value 402 } 403 return v 404 } 405 406 func genValueInterfaceValue(n *node) func(*frame) reflect.Value { 407 value := genValue(n) 408 409 return func(f *frame) reflect.Value { 410 v := value(f) 411 if v.Interface().(valueInterface).node == nil { 412 // Uninitialized interface value, set it to a correct zero value. 413 v.Set(zeroInterfaceValue()) 414 v = value(f) 415 } 416 return valueInterfaceValue(v) 417 } 418 } 419 420 func genValueNode(n *node) func(*frame) reflect.Value { 421 value := genValue(n) 422 423 return func(f *frame) reflect.Value { 424 return reflect.ValueOf(&node{rval: value(f)}) 425 } 426 } 427 428 func vInt(v reflect.Value) (i int64) { 429 if c := vConstantValue(v); c != nil { 430 i, _ = constant.Int64Val(constant.ToInt(c)) 431 return i 432 } 433 switch v.Type().Kind() { 434 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 435 i = v.Int() 436 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 437 i = int64(v.Uint()) 438 case reflect.Float32, reflect.Float64: 439 i = int64(v.Float()) 440 case reflect.Complex64, reflect.Complex128: 441 i = int64(real(v.Complex())) 442 } 443 return 444 } 445 446 func vUint(v reflect.Value) (i uint64) { 447 if c := vConstantValue(v); c != nil { 448 i, _ = constant.Uint64Val(constant.ToInt(c)) 449 return i 450 } 451 switch v.Type().Kind() { 452 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 453 i = uint64(v.Int()) 454 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 455 i = v.Uint() 456 case reflect.Float32, reflect.Float64: 457 i = uint64(v.Float()) 458 case reflect.Complex64, reflect.Complex128: 459 i = uint64(real(v.Complex())) 460 } 461 return 462 } 463 464 func vComplex(v reflect.Value) (c complex128) { 465 if c := vConstantValue(v); c != nil { 466 c = constant.ToComplex(c) 467 rel, _ := constant.Float64Val(constant.Real(c)) 468 img, _ := constant.Float64Val(constant.Imag(c)) 469 return complex(rel, img) 470 } 471 switch v.Type().Kind() { 472 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 473 c = complex(float64(v.Int()), 0) 474 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 475 c = complex(float64(v.Uint()), 0) 476 case reflect.Float32, reflect.Float64: 477 c = complex(v.Float(), 0) 478 case reflect.Complex64, reflect.Complex128: 479 c = v.Complex() 480 } 481 return 482 } 483 484 func vFloat(v reflect.Value) (i float64) { 485 if c := vConstantValue(v); c != nil { 486 i, _ = constant.Float64Val(constant.ToFloat(c)) 487 return i 488 } 489 switch v.Type().Kind() { 490 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 491 i = float64(v.Int()) 492 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 493 i = float64(v.Uint()) 494 case reflect.Float32, reflect.Float64: 495 i = v.Float() 496 case reflect.Complex64, reflect.Complex128: 497 i = real(v.Complex()) 498 } 499 return 500 } 501 502 func vString(v reflect.Value) (s string) { 503 if c := vConstantValue(v); c != nil { 504 s = constant.StringVal(c) 505 return s 506 } 507 return v.String() 508 } 509 510 func vConstantValue(v reflect.Value) (c constant.Value) { 511 if v.Type().Implements(constVal) { 512 c = v.Interface().(constant.Value) 513 } 514 return 515 } 516 517 func genValueInt(n *node) func(*frame) (reflect.Value, int64) { 518 value := genValue(n) 519 520 switch n.typ.TypeOf().Kind() { 521 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 522 return func(f *frame) (reflect.Value, int64) { v := value(f); return v, v.Int() } 523 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 524 return func(f *frame) (reflect.Value, int64) { v := value(f); return v, int64(v.Uint()) } 525 case reflect.Float32, reflect.Float64: 526 return func(f *frame) (reflect.Value, int64) { v := value(f); return v, int64(v.Float()) } 527 case reflect.Complex64, reflect.Complex128: 528 if n.typ.untyped && n.rval.IsValid() && imag(n.rval.Complex()) == 0 { 529 return func(f *frame) (reflect.Value, int64) { v := value(f); return v, int64(real(v.Complex())) } 530 } 531 } 532 return nil 533 } 534 535 func genValueUint(n *node) func(*frame) (reflect.Value, uint64) { 536 value := genValue(n) 537 538 switch n.typ.TypeOf().Kind() { 539 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 540 return func(f *frame) (reflect.Value, uint64) { v := value(f); return v, uint64(v.Int()) } 541 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 542 return func(f *frame) (reflect.Value, uint64) { v := value(f); return v, v.Uint() } 543 case reflect.Float32, reflect.Float64: 544 return func(f *frame) (reflect.Value, uint64) { v := value(f); return v, uint64(v.Float()) } 545 case reflect.Complex64, reflect.Complex128: 546 if n.typ.untyped && n.rval.IsValid() && imag(n.rval.Complex()) == 0 { 547 return func(f *frame) (reflect.Value, uint64) { v := value(f); return v, uint64(real(v.Complex())) } 548 } 549 } 550 return nil 551 } 552 553 func genValueFloat(n *node) func(*frame) (reflect.Value, float64) { 554 value := genValue(n) 555 556 switch n.typ.TypeOf().Kind() { 557 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 558 return func(f *frame) (reflect.Value, float64) { v := value(f); return v, float64(v.Int()) } 559 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 560 return func(f *frame) (reflect.Value, float64) { v := value(f); return v, float64(v.Uint()) } 561 case reflect.Float32, reflect.Float64: 562 return func(f *frame) (reflect.Value, float64) { v := value(f); return v, v.Float() } 563 case reflect.Complex64, reflect.Complex128: 564 if n.typ.untyped && n.rval.IsValid() && imag(n.rval.Complex()) == 0 { 565 return func(f *frame) (reflect.Value, float64) { v := value(f); return v, real(v.Complex()) } 566 } 567 } 568 return nil 569 } 570 571 func genValueComplex(n *node) func(*frame) reflect.Value { 572 vc := genComplex(n) 573 return func(f *frame) reflect.Value { return reflect.ValueOf(vc(f)) } 574 } 575 576 func genComplex(n *node) func(*frame) complex128 { 577 value := genValue(n) 578 579 switch n.typ.TypeOf().Kind() { 580 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 581 return func(f *frame) complex128 { return complex(float64(value(f).Int()), 0) } 582 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 583 return func(f *frame) complex128 { return complex(float64(value(f).Uint()), 0) } 584 case reflect.Float32, reflect.Float64: 585 return func(f *frame) complex128 { return complex(value(f).Float(), 0) } 586 case reflect.Complex64, reflect.Complex128: 587 return func(f *frame) complex128 { return value(f).Complex() } 588 } 589 return nil 590 } 591 592 func genValueString(n *node) func(*frame) (reflect.Value, string) { 593 value := genValue(n) 594 return func(f *frame) (reflect.Value, string) { v := value(f); return v, v.String() } 595 }