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  }