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