Source file src/pkg/reflect/value.go
     1	
     2	
     3	
     4	
     5	package reflect
     6	
     7	import (
     8		"math"
     9		"runtime"
    10		"unsafe"
    11	)
    12	
    13	const ptrSize = 4 << (^uintptr(0) >> 63) 
    14	
    15	
    16	
    17	
    18	
    19	
    20	
    21	
    22	
    23	
    24	
    25	
    26	
    27	
    28	
    29	
    30	
    31	
    32	
    33	
    34	
    35	
    36	type Value struct {
    37		
    38		typ *rtype
    39	
    40		
    41		
    42		ptr unsafe.Pointer
    43	
    44		
    45		
    46		
    47		
    48		
    49		
    50		
    51		
    52		
    53		
    54		
    55		
    56		flag
    57	
    58		
    59		
    60		
    61		
    62		
    63	}
    64	
    65	type flag uintptr
    66	
    67	const (
    68		flagKindWidth        = 5 
    69		flagKindMask    flag = 1<<flagKindWidth - 1
    70		flagStickyRO    flag = 1 << 5
    71		flagEmbedRO     flag = 1 << 6
    72		flagIndir       flag = 1 << 7
    73		flagAddr        flag = 1 << 8
    74		flagMethod      flag = 1 << 9
    75		flagMethodShift      = 10
    76		flagRO          flag = flagStickyRO | flagEmbedRO
    77	)
    78	
    79	func (f flag) kind() Kind {
    80		return Kind(f & flagKindMask)
    81	}
    82	
    83	func (f flag) ro() flag {
    84		if f&flagRO != 0 {
    85			return flagStickyRO
    86		}
    87		return 0
    88	}
    89	
    90	
    91	
    92	func (v Value) pointer() unsafe.Pointer {
    93		if v.typ.size != ptrSize || !v.typ.pointers() {
    94			panic("can't call pointer on a non-pointer Value")
    95		}
    96		if v.flag&flagIndir != 0 {
    97			return *(*unsafe.Pointer)(v.ptr)
    98		}
    99		return v.ptr
   100	}
   101	
   102	
   103	func packEface(v Value) interface{} {
   104		t := v.typ
   105		var i interface{}
   106		e := (*emptyInterface)(unsafe.Pointer(&i))
   107		
   108		switch {
   109		case ifaceIndir(t):
   110			if v.flag&flagIndir == 0 {
   111				panic("bad indir")
   112			}
   113			
   114			ptr := v.ptr
   115			if v.flag&flagAddr != 0 {
   116				
   117				
   118				c := unsafe_New(t)
   119				typedmemmove(t, c, ptr)
   120				ptr = c
   121			}
   122			e.word = ptr
   123		case v.flag&flagIndir != 0:
   124			
   125			
   126			e.word = *(*unsafe.Pointer)(v.ptr)
   127		default:
   128			
   129			e.word = v.ptr
   130		}
   131		
   132		
   133		
   134		
   135		e.typ = t
   136		return i
   137	}
   138	
   139	
   140	func unpackEface(i interface{}) Value {
   141		e := (*emptyInterface)(unsafe.Pointer(&i))
   142		
   143		t := e.typ
   144		if t == nil {
   145			return Value{}
   146		}
   147		f := flag(t.Kind())
   148		if ifaceIndir(t) {
   149			f |= flagIndir
   150		}
   151		return Value{t, e.word, f}
   152	}
   153	
   154	
   155	
   156	
   157	type ValueError struct {
   158		Method string
   159		Kind   Kind
   160	}
   161	
   162	func (e *ValueError) Error() string {
   163		if e.Kind == 0 {
   164			return "reflect: call of " + e.Method + " on zero Value"
   165		}
   166		return "reflect: call of " + e.Method + " on " + e.Kind.String() + " Value"
   167	}
   168	
   169	
   170	
   171	func methodName() string {
   172		pc, _, _, _ := runtime.Caller(2)
   173		f := runtime.FuncForPC(pc)
   174		if f == nil {
   175			return "unknown method"
   176		}
   177		return f.Name()
   178	}
   179	
   180	
   181	type emptyInterface struct {
   182		typ  *rtype
   183		word unsafe.Pointer
   184	}
   185	
   186	
   187	type nonEmptyInterface struct {
   188		
   189		itab *struct {
   190			ityp *rtype 
   191			typ  *rtype 
   192			hash uint32 
   193			_    [4]byte
   194			fun  [100000]unsafe.Pointer 
   195		}
   196		word unsafe.Pointer
   197	}
   198	
   199	
   200	
   201	
   202	
   203	
   204	
   205	func (f flag) mustBe(expected Kind) {
   206		
   207		if Kind(f&flagKindMask) != expected {
   208			panic(&ValueError{methodName(), f.kind()})
   209		}
   210	}
   211	
   212	
   213	
   214	func (f flag) mustBeExported() {
   215		if f == 0 || f&flagRO != 0 {
   216			f.mustBeExportedSlow()
   217		}
   218	}
   219	
   220	func (f flag) mustBeExportedSlow() {
   221		if f == 0 {
   222			panic(&ValueError{methodName(), Invalid})
   223		}
   224		if f&flagRO != 0 {
   225			panic("reflect: " + methodName() + " using value obtained using unexported field")
   226		}
   227	}
   228	
   229	
   230	
   231	
   232	func (f flag) mustBeAssignable() {
   233		if f&flagRO != 0 || f&flagAddr == 0 {
   234			f.mustBeAssignableSlow()
   235		}
   236	}
   237	
   238	func (f flag) mustBeAssignableSlow() {
   239		if f == 0 {
   240			panic(&ValueError{methodName(), Invalid})
   241		}
   242		
   243		if f&flagRO != 0 {
   244			panic("reflect: " + methodName() + " using value obtained using unexported field")
   245		}
   246		if f&flagAddr == 0 {
   247			panic("reflect: " + methodName() + " using unaddressable value")
   248		}
   249	}
   250	
   251	
   252	
   253	
   254	
   255	
   256	func (v Value) Addr() Value {
   257		if v.flag&flagAddr == 0 {
   258			panic("reflect.Value.Addr of unaddressable value")
   259		}
   260		return Value{v.typ.ptrTo(), v.ptr, v.flag.ro() | flag(Ptr)}
   261	}
   262	
   263	
   264	
   265	func (v Value) Bool() bool {
   266		v.mustBe(Bool)
   267		return *(*bool)(v.ptr)
   268	}
   269	
   270	
   271	
   272	func (v Value) Bytes() []byte {
   273		v.mustBe(Slice)
   274		if v.typ.Elem().Kind() != Uint8 {
   275			panic("reflect.Value.Bytes of non-byte slice")
   276		}
   277		
   278		return *(*[]byte)(v.ptr)
   279	}
   280	
   281	
   282	
   283	func (v Value) runes() []rune {
   284		v.mustBe(Slice)
   285		if v.typ.Elem().Kind() != Int32 {
   286			panic("reflect.Value.Bytes of non-rune slice")
   287		}
   288		
   289		return *(*[]rune)(v.ptr)
   290	}
   291	
   292	
   293	
   294	
   295	
   296	
   297	func (v Value) CanAddr() bool {
   298		return v.flag&flagAddr != 0
   299	}
   300	
   301	
   302	
   303	
   304	
   305	
   306	func (v Value) CanSet() bool {
   307		return v.flag&(flagAddr|flagRO) == flagAddr
   308	}
   309	
   310	
   311	
   312	
   313	
   314	
   315	
   316	
   317	
   318	func (v Value) Call(in []Value) []Value {
   319		v.mustBe(Func)
   320		v.mustBeExported()
   321		return v.call("Call", in)
   322	}
   323	
   324	
   325	
   326	
   327	
   328	
   329	
   330	
   331	func (v Value) CallSlice(in []Value) []Value {
   332		v.mustBe(Func)
   333		v.mustBeExported()
   334		return v.call("CallSlice", in)
   335	}
   336	
   337	var callGC bool 
   338	
   339	func (v Value) call(op string, in []Value) []Value {
   340		
   341		t := (*funcType)(unsafe.Pointer(v.typ))
   342		var (
   343			fn       unsafe.Pointer
   344			rcvr     Value
   345			rcvrtype *rtype
   346		)
   347		if v.flag&flagMethod != 0 {
   348			rcvr = v
   349			rcvrtype, t, fn = methodReceiver(op, v, int(v.flag)>>flagMethodShift)
   350		} else if v.flag&flagIndir != 0 {
   351			fn = *(*unsafe.Pointer)(v.ptr)
   352		} else {
   353			fn = v.ptr
   354		}
   355	
   356		if fn == nil {
   357			panic("reflect.Value.Call: call of nil function")
   358		}
   359	
   360		isSlice := op == "CallSlice"
   361		n := t.NumIn()
   362		if isSlice {
   363			if !t.IsVariadic() {
   364				panic("reflect: CallSlice of non-variadic function")
   365			}
   366			if len(in) < n {
   367				panic("reflect: CallSlice with too few input arguments")
   368			}
   369			if len(in) > n {
   370				panic("reflect: CallSlice with too many input arguments")
   371			}
   372		} else {
   373			if t.IsVariadic() {
   374				n--
   375			}
   376			if len(in) < n {
   377				panic("reflect: Call with too few input arguments")
   378			}
   379			if !t.IsVariadic() && len(in) > n {
   380				panic("reflect: Call with too many input arguments")
   381			}
   382		}
   383		for _, x := range in {
   384			if x.Kind() == Invalid {
   385				panic("reflect: " + op + " using zero Value argument")
   386			}
   387		}
   388		for i := 0; i < n; i++ {
   389			if xt, targ := in[i].Type(), t.In(i); !xt.AssignableTo(targ) {
   390				panic("reflect: " + op + " using " + xt.String() + " as type " + targ.String())
   391			}
   392		}
   393		if !isSlice && t.IsVariadic() {
   394			
   395			m := len(in) - n
   396			slice := MakeSlice(t.In(n), m, m)
   397			elem := t.In(n).Elem()
   398			for i := 0; i < m; i++ {
   399				x := in[n+i]
   400				if xt := x.Type(); !xt.AssignableTo(elem) {
   401					panic("reflect: cannot use " + xt.String() + " as type " + elem.String() + " in " + op)
   402				}
   403				slice.Index(i).Set(x)
   404			}
   405			origIn := in
   406			in = make([]Value, n+1)
   407			copy(in[:n], origIn)
   408			in[n] = slice
   409		}
   410	
   411		nin := len(in)
   412		if nin != t.NumIn() {
   413			panic("reflect.Value.Call: wrong argument count")
   414		}
   415		nout := t.NumOut()
   416	
   417		
   418		frametype, _, retOffset, _, framePool := funcLayout(t, rcvrtype)
   419	
   420		
   421		var args unsafe.Pointer
   422		if nout == 0 {
   423			args = framePool.Get().(unsafe.Pointer)
   424		} else {
   425			
   426			
   427			args = unsafe_New(frametype)
   428		}
   429		off := uintptr(0)
   430	
   431		
   432		if rcvrtype != nil {
   433			storeRcvr(rcvr, args)
   434			off = ptrSize
   435		}
   436		for i, v := range in {
   437			v.mustBeExported()
   438			targ := t.In(i).(*rtype)
   439			a := uintptr(targ.align)
   440			off = (off + a - 1) &^ (a - 1)
   441			n := targ.size
   442			if n == 0 {
   443				
   444				
   445				
   446				v.assignTo("reflect.Value.Call", targ, nil)
   447				continue
   448			}
   449			addr := add(args, off, "n > 0")
   450			v = v.assignTo("reflect.Value.Call", targ, addr)
   451			if v.flag&flagIndir != 0 {
   452				typedmemmove(targ, addr, v.ptr)
   453			} else {
   454				*(*unsafe.Pointer)(addr) = v.ptr
   455			}
   456			off += n
   457		}
   458	
   459		
   460		call(frametype, fn, args, uint32(frametype.size), uint32(retOffset))
   461	
   462		
   463		if callGC {
   464			runtime.GC()
   465		}
   466	
   467		var ret []Value
   468		if nout == 0 {
   469			typedmemclr(frametype, args)
   470			framePool.Put(args)
   471		} else {
   472			
   473			
   474			
   475			typedmemclrpartial(frametype, args, 0, retOffset)
   476	
   477			
   478			ret = make([]Value, nout)
   479			off = retOffset
   480			for i := 0; i < nout; i++ {
   481				tv := t.Out(i)
   482				a := uintptr(tv.Align())
   483				off = (off + a - 1) &^ (a - 1)
   484				if tv.Size() != 0 {
   485					fl := flagIndir | flag(tv.Kind())
   486					ret[i] = Value{tv.common(), add(args, off, "tv.Size() != 0"), fl}
   487					
   488					
   489					
   490					
   491				} else {
   492					
   493					
   494					ret[i] = Zero(tv)
   495				}
   496				off += tv.Size()
   497			}
   498		}
   499	
   500		return ret
   501	}
   502	
   503	
   504	
   505	
   506	
   507	
   508	
   509	
   510	
   511	
   512	
   513	
   514	
   515	
   516	
   517	
   518	
   519	
   520	func callReflect(ctxt *makeFuncImpl, frame unsafe.Pointer, retValid *bool) {
   521		ftyp := ctxt.ftyp
   522		f := ctxt.fn
   523	
   524		
   525		ptr := frame
   526		off := uintptr(0)
   527		in := make([]Value, 0, int(ftyp.inCount))
   528		for _, typ := range ftyp.in() {
   529			off += -off & uintptr(typ.align-1)
   530			v := Value{typ, nil, flag(typ.Kind())}
   531			if ifaceIndir(typ) {
   532				
   533				
   534				
   535				
   536				v.ptr = unsafe_New(typ)
   537				if typ.size > 0 {
   538					typedmemmove(typ, v.ptr, add(ptr, off, "typ.size > 0"))
   539				}
   540				v.flag |= flagIndir
   541			} else {
   542				v.ptr = *(*unsafe.Pointer)(add(ptr, off, "1-ptr"))
   543			}
   544			in = append(in, v)
   545			off += typ.size
   546		}
   547	
   548		
   549		out := f(in)
   550		numOut := ftyp.NumOut()
   551		if len(out) != numOut {
   552			panic("reflect: wrong return count from function created by MakeFunc")
   553		}
   554	
   555		
   556		if numOut > 0 {
   557			off += -off & (ptrSize - 1)
   558			if runtime.GOARCH == "amd64p32" {
   559				off = align(off, 8)
   560			}
   561			for i, typ := range ftyp.out() {
   562				v := out[i]
   563				if v.typ == nil {
   564					panic("reflect: function created by MakeFunc using " + funcName(f) +
   565						" returned zero Value")
   566				}
   567				if v.flag&flagRO != 0 {
   568					panic("reflect: function created by MakeFunc using " + funcName(f) +
   569						" returned value obtained from unexported field")
   570				}
   571				off += -off & uintptr(typ.align-1)
   572				if typ.size == 0 {
   573					continue
   574				}
   575				addr := add(ptr, off, "typ.size > 0")
   576	
   577				
   578				
   579				
   580				v = v.assignTo("reflect.MakeFunc", typ, addr)
   581	
   582				
   583				if v.flag&flagIndir != 0 {
   584					memmove(addr, v.ptr, typ.size)
   585				} else {
   586					*(*uintptr)(addr) = uintptr(v.ptr)
   587				}
   588				off += typ.size
   589			}
   590		}
   591	
   592		
   593		
   594		*retValid = true
   595	
   596		
   597		
   598		
   599		
   600		runtime.KeepAlive(out)
   601	
   602		
   603		
   604		
   605		runtime.KeepAlive(ctxt)
   606	}
   607	
   608	
   609	
   610	
   611	
   612	
   613	
   614	
   615	func methodReceiver(op string, v Value, methodIndex int) (rcvrtype *rtype, t *funcType, fn unsafe.Pointer) {
   616		i := methodIndex
   617		if v.typ.Kind() == Interface {
   618			tt := (*interfaceType)(unsafe.Pointer(v.typ))
   619			if uint(i) >= uint(len(tt.methods)) {
   620				panic("reflect: internal error: invalid method index")
   621			}
   622			m := &tt.methods[i]
   623			if !tt.nameOff(m.name).isExported() {
   624				panic("reflect: " + op + " of unexported method")
   625			}
   626			iface := (*nonEmptyInterface)(v.ptr)
   627			if iface.itab == nil {
   628				panic("reflect: " + op + " of method on nil interface value")
   629			}
   630			rcvrtype = iface.itab.typ
   631			fn = unsafe.Pointer(&iface.itab.fun[i])
   632			t = (*funcType)(unsafe.Pointer(tt.typeOff(m.typ)))
   633		} else {
   634			rcvrtype = v.typ
   635			ms := v.typ.exportedMethods()
   636			if uint(i) >= uint(len(ms)) {
   637				panic("reflect: internal error: invalid method index")
   638			}
   639			m := ms[i]
   640			if !v.typ.nameOff(m.name).isExported() {
   641				panic("reflect: " + op + " of unexported method")
   642			}
   643			ifn := v.typ.textOff(m.ifn)
   644			fn = unsafe.Pointer(&ifn)
   645			t = (*funcType)(unsafe.Pointer(v.typ.typeOff(m.mtyp)))
   646		}
   647		return
   648	}
   649	
   650	
   651	
   652	
   653	
   654	func storeRcvr(v Value, p unsafe.Pointer) {
   655		t := v.typ
   656		if t.Kind() == Interface {
   657			
   658			iface := (*nonEmptyInterface)(v.ptr)
   659			*(*unsafe.Pointer)(p) = iface.word
   660		} else if v.flag&flagIndir != 0 && !ifaceIndir(t) {
   661			*(*unsafe.Pointer)(p) = *(*unsafe.Pointer)(v.ptr)
   662		} else {
   663			*(*unsafe.Pointer)(p) = v.ptr
   664		}
   665	}
   666	
   667	
   668	
   669	func align(x, n uintptr) uintptr {
   670		return (x + n - 1) &^ (n - 1)
   671	}
   672	
   673	
   674	
   675	
   676	
   677	
   678	
   679	
   680	
   681	
   682	
   683	
   684	
   685	
   686	
   687	
   688	
   689	func callMethod(ctxt *methodValue, frame unsafe.Pointer, retValid *bool) {
   690		rcvr := ctxt.rcvr
   691		rcvrtype, t, fn := methodReceiver("call", rcvr, ctxt.method)
   692		frametype, argSize, retOffset, _, framePool := funcLayout(t, rcvrtype)
   693	
   694		
   695		
   696		scratch := framePool.Get().(unsafe.Pointer)
   697	
   698		
   699		storeRcvr(rcvr, scratch)
   700		
   701		
   702		argOffset := uintptr(ptrSize)
   703		if len(t.in()) > 0 {
   704			argOffset = align(argOffset, uintptr(t.in()[0].align))
   705		}
   706		
   707		if argSize-argOffset > 0 {
   708			typedmemmovepartial(frametype, add(scratch, argOffset, "argSize > argOffset"), frame, argOffset, argSize-argOffset)
   709		}
   710	
   711		
   712		
   713		
   714		call(frametype, fn, scratch, uint32(frametype.size), uint32(retOffset))
   715	
   716		
   717		
   718		
   719		
   720		
   721		
   722		if frametype.size-retOffset > 0 {
   723			callerRetOffset := retOffset - argOffset
   724			if runtime.GOARCH == "amd64p32" {
   725				callerRetOffset = align(argSize-argOffset, 8)
   726			}
   727			
   728			memmove(add(frame, callerRetOffset, "frametype.size > retOffset"),
   729				add(scratch, retOffset, "frametype.size > retOffset"),
   730				frametype.size-retOffset)
   731		}
   732	
   733		
   734		
   735		*retValid = true
   736	
   737		
   738		
   739		
   740		typedmemclr(frametype, scratch)
   741		framePool.Put(scratch)
   742	
   743		
   744		runtime.KeepAlive(ctxt)
   745	}
   746	
   747	
   748	func funcName(f func([]Value) []Value) string {
   749		pc := *(*uintptr)(unsafe.Pointer(&f))
   750		rf := runtime.FuncForPC(pc)
   751		if rf != nil {
   752			return rf.Name()
   753		}
   754		return "closure"
   755	}
   756	
   757	
   758	
   759	func (v Value) Cap() int {
   760		k := v.kind()
   761		switch k {
   762		case Array:
   763			return v.typ.Len()
   764		case Chan:
   765			return chancap(v.pointer())
   766		case Slice:
   767			
   768			return (*sliceHeader)(v.ptr).Cap
   769		}
   770		panic(&ValueError{"reflect.Value.Cap", v.kind()})
   771	}
   772	
   773	
   774	
   775	func (v Value) Close() {
   776		v.mustBe(Chan)
   777		v.mustBeExported()
   778		chanclose(v.pointer())
   779	}
   780	
   781	
   782	
   783	func (v Value) Complex() complex128 {
   784		k := v.kind()
   785		switch k {
   786		case Complex64:
   787			return complex128(*(*complex64)(v.ptr))
   788		case Complex128:
   789			return *(*complex128)(v.ptr)
   790		}
   791		panic(&ValueError{"reflect.Value.Complex", v.kind()})
   792	}
   793	
   794	
   795	
   796	
   797	
   798	func (v Value) Elem() Value {
   799		k := v.kind()
   800		switch k {
   801		case Interface:
   802			var eface interface{}
   803			if v.typ.NumMethod() == 0 {
   804				eface = *(*interface{})(v.ptr)
   805			} else {
   806				eface = (interface{})(*(*interface {
   807					M()
   808				})(v.ptr))
   809			}
   810			x := unpackEface(eface)
   811			if x.flag != 0 {
   812				x.flag |= v.flag.ro()
   813			}
   814			return x
   815		case Ptr:
   816			ptr := v.ptr
   817			if v.flag&flagIndir != 0 {
   818				ptr = *(*unsafe.Pointer)(ptr)
   819			}
   820			
   821			if ptr == nil {
   822				return Value{}
   823			}
   824			tt := (*ptrType)(unsafe.Pointer(v.typ))
   825			typ := tt.elem
   826			fl := v.flag&flagRO | flagIndir | flagAddr
   827			fl |= flag(typ.Kind())
   828			return Value{typ, ptr, fl}
   829		}
   830		panic(&ValueError{"reflect.Value.Elem", v.kind()})
   831	}
   832	
   833	
   834	
   835	func (v Value) Field(i int) Value {
   836		if v.kind() != Struct {
   837			panic(&ValueError{"reflect.Value.Field", v.kind()})
   838		}
   839		tt := (*structType)(unsafe.Pointer(v.typ))
   840		if uint(i) >= uint(len(tt.fields)) {
   841			panic("reflect: Field index out of range")
   842		}
   843		field := &tt.fields[i]
   844		typ := field.typ
   845	
   846		
   847		fl := v.flag&(flagStickyRO|flagIndir|flagAddr) | flag(typ.Kind())
   848		
   849		if !field.name.isExported() {
   850			if field.embedded() {
   851				fl |= flagEmbedRO
   852			} else {
   853				fl |= flagStickyRO
   854			}
   855		}
   856		
   857		
   858		
   859		
   860		
   861		ptr := add(v.ptr, field.offset(), "same as non-reflect &v.field")
   862		return Value{typ, ptr, fl}
   863	}
   864	
   865	
   866	
   867	func (v Value) FieldByIndex(index []int) Value {
   868		if len(index) == 1 {
   869			return v.Field(index[0])
   870		}
   871		v.mustBe(Struct)
   872		for i, x := range index {
   873			if i > 0 {
   874				if v.Kind() == Ptr && v.typ.Elem().Kind() == Struct {
   875					if v.IsNil() {
   876						panic("reflect: indirection through nil pointer to embedded struct")
   877					}
   878					v = v.Elem()
   879				}
   880			}
   881			v = v.Field(x)
   882		}
   883		return v
   884	}
   885	
   886	
   887	
   888	
   889	func (v Value) FieldByName(name string) Value {
   890		v.mustBe(Struct)
   891		if f, ok := v.typ.FieldByName(name); ok {
   892			return v.FieldByIndex(f.Index)
   893		}
   894		return Value{}
   895	}
   896	
   897	
   898	
   899	
   900	
   901	func (v Value) FieldByNameFunc(match func(string) bool) Value {
   902		if f, ok := v.typ.FieldByNameFunc(match); ok {
   903			return v.FieldByIndex(f.Index)
   904		}
   905		return Value{}
   906	}
   907	
   908	
   909	
   910	func (v Value) Float() float64 {
   911		k := v.kind()
   912		switch k {
   913		case Float32:
   914			return float64(*(*float32)(v.ptr))
   915		case Float64:
   916			return *(*float64)(v.ptr)
   917		}
   918		panic(&ValueError{"reflect.Value.Float", v.kind()})
   919	}
   920	
   921	var uint8Type = TypeOf(uint8(0)).(*rtype)
   922	
   923	
   924	
   925	func (v Value) Index(i int) Value {
   926		switch v.kind() {
   927		case Array:
   928			tt := (*arrayType)(unsafe.Pointer(v.typ))
   929			if uint(i) >= uint(tt.len) {
   930				panic("reflect: array index out of range")
   931			}
   932			typ := tt.elem
   933			offset := uintptr(i) * typ.size
   934	
   935			
   936			
   937			
   938			
   939			
   940			val := add(v.ptr, offset, "same as &v[i], i < tt.len")
   941			fl := v.flag&(flagIndir|flagAddr) | v.flag.ro() | flag(typ.Kind()) 
   942			return Value{typ, val, fl}
   943	
   944		case Slice:
   945			
   946			
   947			s := (*sliceHeader)(v.ptr)
   948			if uint(i) >= uint(s.Len) {
   949				panic("reflect: slice index out of range")
   950			}
   951			tt := (*sliceType)(unsafe.Pointer(v.typ))
   952			typ := tt.elem
   953			val := arrayAt(s.Data, i, typ.size, "i < s.Len")
   954			fl := flagAddr | flagIndir | v.flag.ro() | flag(typ.Kind())
   955			return Value{typ, val, fl}
   956	
   957		case String:
   958			s := (*stringHeader)(v.ptr)
   959			if uint(i) >= uint(s.Len) {
   960				panic("reflect: string index out of range")
   961			}
   962			p := arrayAt(s.Data, i, 1, "i < s.Len")
   963			fl := v.flag.ro() | flag(Uint8) | flagIndir
   964			return Value{uint8Type, p, fl}
   965		}
   966		panic(&ValueError{"reflect.Value.Index", v.kind()})
   967	}
   968	
   969	
   970	
   971	func (v Value) Int() int64 {
   972		k := v.kind()
   973		p := v.ptr
   974		switch k {
   975		case Int:
   976			return int64(*(*int)(p))
   977		case Int8:
   978			return int64(*(*int8)(p))
   979		case Int16:
   980			return int64(*(*int16)(p))
   981		case Int32:
   982			return int64(*(*int32)(p))
   983		case Int64:
   984			return *(*int64)(p)
   985		}
   986		panic(&ValueError{"reflect.Value.Int", v.kind()})
   987	}
   988	
   989	
   990	func (v Value) CanInterface() bool {
   991		if v.flag == 0 {
   992			panic(&ValueError{"reflect.Value.CanInterface", Invalid})
   993		}
   994		return v.flag&flagRO == 0
   995	}
   996	
   997	
   998	
   999	
  1000	
  1001	
  1002	func (v Value) Interface() (i interface{}) {
  1003		return valueInterface(v, true)
  1004	}
  1005	
  1006	func valueInterface(v Value, safe bool) interface{} {
  1007		if v.flag == 0 {
  1008			panic(&ValueError{"reflect.Value.Interface", Invalid})
  1009		}
  1010		if safe && v.flag&flagRO != 0 {
  1011			
  1012			
  1013			
  1014			panic("reflect.Value.Interface: cannot return value obtained from unexported field or method")
  1015		}
  1016		if v.flag&flagMethod != 0 {
  1017			v = makeMethodValue("Interface", v)
  1018		}
  1019	
  1020		if v.kind() == Interface {
  1021			
  1022			
  1023			
  1024			if v.NumMethod() == 0 {
  1025				return *(*interface{})(v.ptr)
  1026			}
  1027			return *(*interface {
  1028				M()
  1029			})(v.ptr)
  1030		}
  1031	
  1032		
  1033		return packEface(v)
  1034	}
  1035	
  1036	
  1037	
  1038	func (v Value) InterfaceData() [2]uintptr {
  1039		
  1040		v.mustBe(Interface)
  1041		
  1042		
  1043		
  1044		
  1045		
  1046		return *(*[2]uintptr)(v.ptr)
  1047	}
  1048	
  1049	
  1050	
  1051	
  1052	
  1053	
  1054	
  1055	
  1056	func (v Value) IsNil() bool {
  1057		k := v.kind()
  1058		switch k {
  1059		case Chan, Func, Map, Ptr, UnsafePointer:
  1060			if v.flag&flagMethod != 0 {
  1061				return false
  1062			}
  1063			ptr := v.ptr
  1064			if v.flag&flagIndir != 0 {
  1065				ptr = *(*unsafe.Pointer)(ptr)
  1066			}
  1067			return ptr == nil
  1068		case Interface, Slice:
  1069			
  1070			
  1071			return *(*unsafe.Pointer)(v.ptr) == nil
  1072		}
  1073		panic(&ValueError{"reflect.Value.IsNil", v.kind()})
  1074	}
  1075	
  1076	
  1077	
  1078	
  1079	
  1080	
  1081	func (v Value) IsValid() bool {
  1082		return v.flag != 0
  1083	}
  1084	
  1085	
  1086	
  1087	func (v Value) IsZero() bool {
  1088		switch v.kind() {
  1089		case Bool:
  1090			return !v.Bool()
  1091		case Int, Int8, Int16, Int32, Int64:
  1092			return v.Int() == 0
  1093		case Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
  1094			return v.Uint() == 0
  1095		case Float32, Float64:
  1096			return math.Float64bits(v.Float()) == 0
  1097		case Complex64, Complex128:
  1098			c := v.Complex()
  1099			return math.Float64bits(real(c)) == 0 && math.Float64bits(imag(c)) == 0
  1100		case Array:
  1101			for i := 0; i < v.Len(); i++ {
  1102				if !v.Index(i).IsZero() {
  1103					return false
  1104				}
  1105			}
  1106			return true
  1107		case Chan, Func, Interface, Map, Ptr, Slice, UnsafePointer:
  1108			return v.IsNil()
  1109		case String:
  1110			return v.Len() == 0
  1111		case Struct:
  1112			for i := 0; i < v.NumField(); i++ {
  1113				if !v.Field(i).IsZero() {
  1114					return false
  1115				}
  1116			}
  1117			return true
  1118		default:
  1119			
  1120			
  1121			panic(&ValueError{"reflect.Value.IsZero", v.Kind()})
  1122		}
  1123	}
  1124	
  1125	
  1126	
  1127	func (v Value) Kind() Kind {
  1128		return v.kind()
  1129	}
  1130	
  1131	
  1132	
  1133	func (v Value) Len() int {
  1134		k := v.kind()
  1135		switch k {
  1136		case Array:
  1137			tt := (*arrayType)(unsafe.Pointer(v.typ))
  1138			return int(tt.len)
  1139		case Chan:
  1140			return chanlen(v.pointer())
  1141		case Map:
  1142			return maplen(v.pointer())
  1143		case Slice:
  1144			
  1145			return (*sliceHeader)(v.ptr).Len
  1146		case String:
  1147			
  1148			return (*stringHeader)(v.ptr).Len
  1149		}
  1150		panic(&ValueError{"reflect.Value.Len", v.kind()})
  1151	}
  1152	
  1153	
  1154	
  1155	
  1156	
  1157	func (v Value) MapIndex(key Value) Value {
  1158		v.mustBe(Map)
  1159		tt := (*mapType)(unsafe.Pointer(v.typ))
  1160	
  1161		
  1162		
  1163		
  1164		
  1165		
  1166		
  1167		
  1168		key = key.assignTo("reflect.Value.MapIndex", tt.key, nil)
  1169	
  1170		var k unsafe.Pointer
  1171		if key.flag&flagIndir != 0 {
  1172			k = key.ptr
  1173		} else {
  1174			k = unsafe.Pointer(&key.ptr)
  1175		}
  1176		e := mapaccess(v.typ, v.pointer(), k)
  1177		if e == nil {
  1178			return Value{}
  1179		}
  1180		typ := tt.elem
  1181		fl := (v.flag | key.flag).ro()
  1182		fl |= flag(typ.Kind())
  1183		return copyVal(typ, fl, e)
  1184	}
  1185	
  1186	
  1187	
  1188	
  1189	
  1190	func (v Value) MapKeys() []Value {
  1191		v.mustBe(Map)
  1192		tt := (*mapType)(unsafe.Pointer(v.typ))
  1193		keyType := tt.key
  1194	
  1195		fl := v.flag.ro() | flag(keyType.Kind())
  1196	
  1197		m := v.pointer()
  1198		mlen := int(0)
  1199		if m != nil {
  1200			mlen = maplen(m)
  1201		}
  1202		it := mapiterinit(v.typ, m)
  1203		a := make([]Value, mlen)
  1204		var i int
  1205		for i = 0; i < len(a); i++ {
  1206			key := mapiterkey(it)
  1207			if key == nil {
  1208				
  1209				
  1210				
  1211				break
  1212			}
  1213			a[i] = copyVal(keyType, fl, key)
  1214			mapiternext(it)
  1215		}
  1216		return a[:i]
  1217	}
  1218	
  1219	
  1220	
  1221	type MapIter struct {
  1222		m  Value
  1223		it unsafe.Pointer
  1224	}
  1225	
  1226	
  1227	func (it *MapIter) Key() Value {
  1228		if it.it == nil {
  1229			panic("MapIter.Key called before Next")
  1230		}
  1231		if mapiterkey(it.it) == nil {
  1232			panic("MapIter.Key called on exhausted iterator")
  1233		}
  1234	
  1235		t := (*mapType)(unsafe.Pointer(it.m.typ))
  1236		ktype := t.key
  1237		return copyVal(ktype, it.m.flag.ro()|flag(ktype.Kind()), mapiterkey(it.it))
  1238	}
  1239	
  1240	
  1241	func (it *MapIter) Value() Value {
  1242		if it.it == nil {
  1243			panic("MapIter.Value called before Next")
  1244		}
  1245		if mapiterkey(it.it) == nil {
  1246			panic("MapIter.Value called on exhausted iterator")
  1247		}
  1248	
  1249		t := (*mapType)(unsafe.Pointer(it.m.typ))
  1250		vtype := t.elem
  1251		return copyVal(vtype, it.m.flag.ro()|flag(vtype.Kind()), mapiterelem(it.it))
  1252	}
  1253	
  1254	
  1255	
  1256	
  1257	func (it *MapIter) Next() bool {
  1258		if it.it == nil {
  1259			it.it = mapiterinit(it.m.typ, it.m.pointer())
  1260		} else {
  1261			if mapiterkey(it.it) == nil {
  1262				panic("MapIter.Next called on exhausted iterator")
  1263			}
  1264			mapiternext(it.it)
  1265		}
  1266		return mapiterkey(it.it) != nil
  1267	}
  1268	
  1269	
  1270	
  1271	
  1272	
  1273	
  1274	
  1275	
  1276	
  1277	
  1278	
  1279	
  1280	
  1281	
  1282	
  1283	
  1284	
  1285	func (v Value) MapRange() *MapIter {
  1286		v.mustBe(Map)
  1287		return &MapIter{m: v}
  1288	}
  1289	
  1290	
  1291	
  1292	func copyVal(typ *rtype, fl flag, ptr unsafe.Pointer) Value {
  1293		if ifaceIndir(typ) {
  1294			
  1295			
  1296			c := unsafe_New(typ)
  1297			typedmemmove(typ, c, ptr)
  1298			return Value{typ, c, fl | flagIndir}
  1299		}
  1300		return Value{typ, *(*unsafe.Pointer)(ptr), fl}
  1301	}
  1302	
  1303	
  1304	
  1305	
  1306	
  1307	func (v Value) Method(i int) Value {
  1308		if v.typ == nil {
  1309			panic(&ValueError{"reflect.Value.Method", Invalid})
  1310		}
  1311		if v.flag&flagMethod != 0 || uint(i) >= uint(v.typ.NumMethod()) {
  1312			panic("reflect: Method index out of range")
  1313		}
  1314		if v.typ.Kind() == Interface && v.IsNil() {
  1315			panic("reflect: Method on nil interface value")
  1316		}
  1317		fl := v.flag & (flagStickyRO | flagIndir) 
  1318		fl |= flag(Func)
  1319		fl |= flag(i)<<flagMethodShift | flagMethod
  1320		return Value{v.typ, v.ptr, fl}
  1321	}
  1322	
  1323	
  1324	func (v Value) NumMethod() int {
  1325		if v.typ == nil {
  1326			panic(&ValueError{"reflect.Value.NumMethod", Invalid})
  1327		}
  1328		if v.flag&flagMethod != 0 {
  1329			return 0
  1330		}
  1331		return v.typ.NumMethod()
  1332	}
  1333	
  1334	
  1335	
  1336	
  1337	
  1338	
  1339	func (v Value) MethodByName(name string) Value {
  1340		if v.typ == nil {
  1341			panic(&ValueError{"reflect.Value.MethodByName", Invalid})
  1342		}
  1343		if v.flag&flagMethod != 0 {
  1344			return Value{}
  1345		}
  1346		m, ok := v.typ.MethodByName(name)
  1347		if !ok {
  1348			return Value{}
  1349		}
  1350		return v.Method(m.Index)
  1351	}
  1352	
  1353	
  1354	
  1355	func (v Value) NumField() int {
  1356		v.mustBe(Struct)
  1357		tt := (*structType)(unsafe.Pointer(v.typ))
  1358		return len(tt.fields)
  1359	}
  1360	
  1361	
  1362	
  1363	func (v Value) OverflowComplex(x complex128) bool {
  1364		k := v.kind()
  1365		switch k {
  1366		case Complex64:
  1367			return overflowFloat32(real(x)) || overflowFloat32(imag(x))
  1368		case Complex128:
  1369			return false
  1370		}
  1371		panic(&ValueError{"reflect.Value.OverflowComplex", v.kind()})
  1372	}
  1373	
  1374	
  1375	
  1376	func (v Value) OverflowFloat(x float64) bool {
  1377		k := v.kind()
  1378		switch k {
  1379		case Float32:
  1380			return overflowFloat32(x)
  1381		case Float64:
  1382			return false
  1383		}
  1384		panic(&ValueError{"reflect.Value.OverflowFloat", v.kind()})
  1385	}
  1386	
  1387	func overflowFloat32(x float64) bool {
  1388		if x < 0 {
  1389			x = -x
  1390		}
  1391		return math.MaxFloat32 < x && x <= math.MaxFloat64
  1392	}
  1393	
  1394	
  1395	
  1396	func (v Value) OverflowInt(x int64) bool {
  1397		k := v.kind()
  1398		switch k {
  1399		case Int, Int8, Int16, Int32, Int64:
  1400			bitSize := v.typ.size * 8
  1401			trunc := (x << (64 - bitSize)) >> (64 - bitSize)
  1402			return x != trunc
  1403		}
  1404		panic(&ValueError{"reflect.Value.OverflowInt", v.kind()})
  1405	}
  1406	
  1407	
  1408	
  1409	func (v Value) OverflowUint(x uint64) bool {
  1410		k := v.kind()
  1411		switch k {
  1412		case Uint, Uintptr, Uint8, Uint16, Uint32, Uint64:
  1413			bitSize := v.typ.size * 8
  1414			trunc := (x << (64 - bitSize)) >> (64 - bitSize)
  1415			return x != trunc
  1416		}
  1417		panic(&ValueError{"reflect.Value.OverflowUint", v.kind()})
  1418	}
  1419	
  1420	
  1421	
  1422	
  1423	
  1424	
  1425	
  1426	
  1427	
  1428	
  1429	
  1430	
  1431	
  1432	
  1433	
  1434	func (v Value) Pointer() uintptr {
  1435		
  1436		k := v.kind()
  1437		switch k {
  1438		case Chan, Map, Ptr, UnsafePointer:
  1439			return uintptr(v.pointer())
  1440		case Func:
  1441			if v.flag&flagMethod != 0 {
  1442				
  1443				
  1444				
  1445				
  1446				
  1447				
  1448				f := methodValueCall
  1449				return **(**uintptr)(unsafe.Pointer(&f))
  1450			}
  1451			p := v.pointer()
  1452			
  1453			
  1454			if p != nil {
  1455				p = *(*unsafe.Pointer)(p)
  1456			}
  1457			return uintptr(p)
  1458	
  1459		case Slice:
  1460			return (*SliceHeader)(v.ptr).Data
  1461		}
  1462		panic(&ValueError{"reflect.Value.Pointer", v.kind()})
  1463	}
  1464	
  1465	
  1466	
  1467	
  1468	
  1469	
  1470	func (v Value) Recv() (x Value, ok bool) {
  1471		v.mustBe(Chan)
  1472		v.mustBeExported()
  1473		return v.recv(false)
  1474	}
  1475	
  1476	
  1477	
  1478	func (v Value) recv(nb bool) (val Value, ok bool) {
  1479		tt := (*chanType)(unsafe.Pointer(v.typ))
  1480		if ChanDir(tt.dir)&RecvDir == 0 {
  1481			panic("reflect: recv on send-only channel")
  1482		}
  1483		t := tt.elem
  1484		val = Value{t, nil, flag(t.Kind())}
  1485		var p unsafe.Pointer
  1486		if ifaceIndir(t) {
  1487			p = unsafe_New(t)
  1488			val.ptr = p
  1489			val.flag |= flagIndir
  1490		} else {
  1491			p = unsafe.Pointer(&val.ptr)
  1492		}
  1493		selected, ok := chanrecv(v.pointer(), nb, p)
  1494		if !selected {
  1495			val = Value{}
  1496		}
  1497		return
  1498	}
  1499	
  1500	
  1501	
  1502	
  1503	func (v Value) Send(x Value) {
  1504		v.mustBe(Chan)
  1505		v.mustBeExported()
  1506		v.send(x, false)
  1507	}
  1508	
  1509	
  1510	
  1511	func (v Value) send(x Value, nb bool) (selected bool) {
  1512		tt := (*chanType)(unsafe.Pointer(v.typ))
  1513		if ChanDir(tt.dir)&SendDir == 0 {
  1514			panic("reflect: send on recv-only channel")
  1515		}
  1516		x.mustBeExported()
  1517		x = x.assignTo("reflect.Value.Send", tt.elem, nil)
  1518		var p unsafe.Pointer
  1519		if x.flag&flagIndir != 0 {
  1520			p = x.ptr
  1521		} else {
  1522			p = unsafe.Pointer(&x.ptr)
  1523		}
  1524		return chansend(v.pointer(), p, nb)
  1525	}
  1526	
  1527	
  1528	
  1529	
  1530	func (v Value) Set(x Value) {
  1531		v.mustBeAssignable()
  1532		x.mustBeExported() 
  1533		var target unsafe.Pointer
  1534		if v.kind() == Interface {
  1535			target = v.ptr
  1536		}
  1537		x = x.assignTo("reflect.Set", v.typ, target)
  1538		if x.flag&flagIndir != 0 {
  1539			typedmemmove(v.typ, v.ptr, x.ptr)
  1540		} else {
  1541			*(*unsafe.Pointer)(v.ptr) = x.ptr
  1542		}
  1543	}
  1544	
  1545	
  1546	
  1547	func (v Value) SetBool(x bool) {
  1548		v.mustBeAssignable()
  1549		v.mustBe(Bool)
  1550		*(*bool)(v.ptr) = x
  1551	}
  1552	
  1553	
  1554	
  1555	func (v Value) SetBytes(x []byte) {
  1556		v.mustBeAssignable()
  1557		v.mustBe(Slice)
  1558		if v.typ.Elem().Kind() != Uint8 {
  1559			panic("reflect.Value.SetBytes of non-byte slice")
  1560		}
  1561		*(*[]byte)(v.ptr) = x
  1562	}
  1563	
  1564	
  1565	
  1566	func (v Value) setRunes(x []rune) {
  1567		v.mustBeAssignable()
  1568		v.mustBe(Slice)
  1569		if v.typ.Elem().Kind() != Int32 {
  1570			panic("reflect.Value.setRunes of non-rune slice")
  1571		}
  1572		*(*[]rune)(v.ptr) = x
  1573	}
  1574	
  1575	
  1576	
  1577	func (v Value) SetComplex(x complex128) {
  1578		v.mustBeAssignable()
  1579		switch k := v.kind(); k {
  1580		default:
  1581			panic(&ValueError{"reflect.Value.SetComplex", v.kind()})
  1582		case Complex64:
  1583			*(*complex64)(v.ptr) = complex64(x)
  1584		case Complex128:
  1585			*(*complex128)(v.ptr) = x
  1586		}
  1587	}
  1588	
  1589	
  1590	
  1591	func (v Value) SetFloat(x float64) {
  1592		v.mustBeAssignable()
  1593		switch k := v.kind(); k {
  1594		default:
  1595			panic(&ValueError{"reflect.Value.SetFloat", v.kind()})
  1596		case Float32:
  1597			*(*float32)(v.ptr) = float32(x)
  1598		case Float64:
  1599			*(*float64)(v.ptr) = x
  1600		}
  1601	}
  1602	
  1603	
  1604	
  1605	func (v Value) SetInt(x int64) {
  1606		v.mustBeAssignable()
  1607		switch k := v.kind(); k {
  1608		default:
  1609			panic(&ValueError{"reflect.Value.SetInt", v.kind()})
  1610		case Int:
  1611			*(*int)(v.ptr) = int(x)
  1612		case Int8:
  1613			*(*int8)(v.ptr) = int8(x)
  1614		case Int16:
  1615			*(*int16)(v.ptr) = int16(x)
  1616		case Int32:
  1617			*(*int32)(v.ptr) = int32(x)
  1618		case Int64:
  1619			*(*int64)(v.ptr) = x
  1620		}
  1621	}
  1622	
  1623	
  1624	
  1625	
  1626	func (v Value) SetLen(n int) {
  1627		v.mustBeAssignable()
  1628		v.mustBe(Slice)
  1629		s := (*sliceHeader)(v.ptr)
  1630		if uint(n) > uint(s.Cap) {
  1631			panic("reflect: slice length out of range in SetLen")
  1632		}
  1633		s.Len = n
  1634	}
  1635	
  1636	
  1637	
  1638	
  1639	func (v Value) SetCap(n int) {
  1640		v.mustBeAssignable()
  1641		v.mustBe(Slice)
  1642		s := (*sliceHeader)(v.ptr)
  1643		if n < s.Len || n > s.Cap {
  1644			panic("reflect: slice capacity out of range in SetCap")
  1645		}
  1646		s.Cap = n
  1647	}
  1648	
  1649	
  1650	
  1651	
  1652	
  1653	
  1654	
  1655	func (v Value) SetMapIndex(key, elem Value) {
  1656		v.mustBe(Map)
  1657		v.mustBeExported()
  1658		key.mustBeExported()
  1659		tt := (*mapType)(unsafe.Pointer(v.typ))
  1660		key = key.assignTo("reflect.Value.SetMapIndex", tt.key, nil)
  1661		var k unsafe.Pointer
  1662		if key.flag&flagIndir != 0 {
  1663			k = key.ptr
  1664		} else {
  1665			k = unsafe.Pointer(&key.ptr)
  1666		}
  1667		if elem.typ == nil {
  1668			mapdelete(v.typ, v.pointer(), k)
  1669			return
  1670		}
  1671		elem.mustBeExported()
  1672		elem = elem.assignTo("reflect.Value.SetMapIndex", tt.elem, nil)
  1673		var e unsafe.Pointer
  1674		if elem.flag&flagIndir != 0 {
  1675			e = elem.ptr
  1676		} else {
  1677			e = unsafe.Pointer(&elem.ptr)
  1678		}
  1679		mapassign(v.typ, v.pointer(), k, e)
  1680	}
  1681	
  1682	
  1683	
  1684	func (v Value) SetUint(x uint64) {
  1685		v.mustBeAssignable()
  1686		switch k := v.kind(); k {
  1687		default:
  1688			panic(&ValueError{"reflect.Value.SetUint", v.kind()})
  1689		case Uint:
  1690			*(*uint)(v.ptr) = uint(x)
  1691		case Uint8:
  1692			*(*uint8)(v.ptr) = uint8(x)
  1693		case Uint16:
  1694			*(*uint16)(v.ptr) = uint16(x)
  1695		case Uint32:
  1696			*(*uint32)(v.ptr) = uint32(x)
  1697		case Uint64:
  1698			*(*uint64)(v.ptr) = x
  1699		case Uintptr:
  1700			*(*uintptr)(v.ptr) = uintptr(x)
  1701		}
  1702	}
  1703	
  1704	
  1705	
  1706	func (v Value) SetPointer(x unsafe.Pointer) {
  1707		v.mustBeAssignable()
  1708		v.mustBe(UnsafePointer)
  1709		*(*unsafe.Pointer)(v.ptr) = x
  1710	}
  1711	
  1712	
  1713	
  1714	func (v Value) SetString(x string) {
  1715		v.mustBeAssignable()
  1716		v.mustBe(String)
  1717		*(*string)(v.ptr) = x
  1718	}
  1719	
  1720	
  1721	
  1722	
  1723	func (v Value) Slice(i, j int) Value {
  1724		var (
  1725			cap  int
  1726			typ  *sliceType
  1727			base unsafe.Pointer
  1728		)
  1729		switch kind := v.kind(); kind {
  1730		default:
  1731			panic(&ValueError{"reflect.Value.Slice", v.kind()})
  1732	
  1733		case Array:
  1734			if v.flag&flagAddr == 0 {
  1735				panic("reflect.Value.Slice: slice of unaddressable array")
  1736			}
  1737			tt := (*arrayType)(unsafe.Pointer(v.typ))
  1738			cap = int(tt.len)
  1739			typ = (*sliceType)(unsafe.Pointer(tt.slice))
  1740			base = v.ptr
  1741	
  1742		case Slice:
  1743			typ = (*sliceType)(unsafe.Pointer(v.typ))
  1744			s := (*sliceHeader)(v.ptr)
  1745			base = s.Data
  1746			cap = s.Cap
  1747	
  1748		case String:
  1749			s := (*stringHeader)(v.ptr)
  1750			if i < 0 || j < i || j > s.Len {
  1751				panic("reflect.Value.Slice: string slice index out of bounds")
  1752			}
  1753			var t stringHeader
  1754			if i < s.Len {
  1755				t = stringHeader{arrayAt(s.Data, i, 1, "i < s.Len"), j - i}
  1756			}
  1757			return Value{v.typ, unsafe.Pointer(&t), v.flag}
  1758		}
  1759	
  1760		if i < 0 || j < i || j > cap {
  1761			panic("reflect.Value.Slice: slice index out of bounds")
  1762		}
  1763	
  1764		
  1765		var x []unsafe.Pointer
  1766	
  1767		
  1768		s := (*sliceHeader)(unsafe.Pointer(&x))
  1769		s.Len = j - i
  1770		s.Cap = cap - i
  1771		if cap-i > 0 {
  1772			s.Data = arrayAt(base, i, typ.elem.Size(), "i < cap")
  1773		} else {
  1774			
  1775			s.Data = base
  1776		}
  1777	
  1778		fl := v.flag.ro() | flagIndir | flag(Slice)
  1779		return Value{typ.common(), unsafe.Pointer(&x), fl}
  1780	}
  1781	
  1782	
  1783	
  1784	
  1785	func (v Value) Slice3(i, j, k int) Value {
  1786		var (
  1787			cap  int
  1788			typ  *sliceType
  1789			base unsafe.Pointer
  1790		)
  1791		switch kind := v.kind(); kind {
  1792		default:
  1793			panic(&ValueError{"reflect.Value.Slice3", v.kind()})
  1794	
  1795		case Array:
  1796			if v.flag&flagAddr == 0 {
  1797				panic("reflect.Value.Slice3: slice of unaddressable array")
  1798			}
  1799			tt := (*arrayType)(unsafe.Pointer(v.typ))
  1800			cap = int(tt.len)
  1801			typ = (*sliceType)(unsafe.Pointer(tt.slice))
  1802			base = v.ptr
  1803	
  1804		case Slice:
  1805			typ = (*sliceType)(unsafe.Pointer(v.typ))
  1806			s := (*sliceHeader)(v.ptr)
  1807			base = s.Data
  1808			cap = s.Cap
  1809		}
  1810	
  1811		if i < 0 || j < i || k < j || k > cap {
  1812			panic("reflect.Value.Slice3: slice index out of bounds")
  1813		}
  1814	
  1815		
  1816		
  1817		var x []unsafe.Pointer
  1818	
  1819		
  1820		s := (*sliceHeader)(unsafe.Pointer(&x))
  1821		s.Len = j - i
  1822		s.Cap = k - i
  1823		if k-i > 0 {
  1824			s.Data = arrayAt(base, i, typ.elem.Size(), "i < k <= cap")
  1825		} else {
  1826			
  1827			s.Data = base
  1828		}
  1829	
  1830		fl := v.flag.ro() | flagIndir | flag(Slice)
  1831		return Value{typ.common(), unsafe.Pointer(&x), fl}
  1832	}
  1833	
  1834	
  1835	
  1836	
  1837	
  1838	
  1839	
  1840	func (v Value) String() string {
  1841		switch k := v.kind(); k {
  1842		case Invalid:
  1843			return "<invalid Value>"
  1844		case String:
  1845			return *(*string)(v.ptr)
  1846		}
  1847		
  1848		
  1849		return "<" + v.Type().String() + " Value>"
  1850	}
  1851	
  1852	
  1853	
  1854	
  1855	
  1856	
  1857	func (v Value) TryRecv() (x Value, ok bool) {
  1858		v.mustBe(Chan)
  1859		v.mustBeExported()
  1860		return v.recv(true)
  1861	}
  1862	
  1863	
  1864	
  1865	
  1866	
  1867	func (v Value) TrySend(x Value) bool {
  1868		v.mustBe(Chan)
  1869		v.mustBeExported()
  1870		return v.send(x, true)
  1871	}
  1872	
  1873	
  1874	func (v Value) Type() Type {
  1875		f := v.flag
  1876		if f == 0 {
  1877			panic(&ValueError{"reflect.Value.Type", Invalid})
  1878		}
  1879		if f&flagMethod == 0 {
  1880			
  1881			return v.typ
  1882		}
  1883	
  1884		
  1885		
  1886		i := int(v.flag) >> flagMethodShift
  1887		if v.typ.Kind() == Interface {
  1888			
  1889			tt := (*interfaceType)(unsafe.Pointer(v.typ))
  1890			if uint(i) >= uint(len(tt.methods)) {
  1891				panic("reflect: internal error: invalid method index")
  1892			}
  1893			m := &tt.methods[i]
  1894			return v.typ.typeOff(m.typ)
  1895		}
  1896		
  1897		ms := v.typ.exportedMethods()
  1898		if uint(i) >= uint(len(ms)) {
  1899			panic("reflect: internal error: invalid method index")
  1900		}
  1901		m := ms[i]
  1902		return v.typ.typeOff(m.mtyp)
  1903	}
  1904	
  1905	
  1906	
  1907	func (v Value) Uint() uint64 {
  1908		k := v.kind()
  1909		p := v.ptr
  1910		switch k {
  1911		case Uint:
  1912			return uint64(*(*uint)(p))
  1913		case Uint8:
  1914			return uint64(*(*uint8)(p))
  1915		case Uint16:
  1916			return uint64(*(*uint16)(p))
  1917		case Uint32:
  1918			return uint64(*(*uint32)(p))
  1919		case Uint64:
  1920			return *(*uint64)(p)
  1921		case Uintptr:
  1922			return uint64(*(*uintptr)(p))
  1923		}
  1924		panic(&ValueError{"reflect.Value.Uint", v.kind()})
  1925	}
  1926	
  1927	
  1928	
  1929	
  1930	func (v Value) UnsafeAddr() uintptr {
  1931		
  1932		if v.typ == nil {
  1933			panic(&ValueError{"reflect.Value.UnsafeAddr", Invalid})
  1934		}
  1935		if v.flag&flagAddr == 0 {
  1936			panic("reflect.Value.UnsafeAddr of unaddressable value")
  1937		}
  1938		return uintptr(v.ptr)
  1939	}
  1940	
  1941	
  1942	
  1943	
  1944	
  1945	
  1946	
  1947	type StringHeader struct {
  1948		Data uintptr
  1949		Len  int
  1950	}
  1951	
  1952	
  1953	type stringHeader struct {
  1954		Data unsafe.Pointer
  1955		Len  int
  1956	}
  1957	
  1958	
  1959	
  1960	
  1961	
  1962	
  1963	
  1964	type SliceHeader struct {
  1965		Data uintptr
  1966		Len  int
  1967		Cap  int
  1968	}
  1969	
  1970	
  1971	type sliceHeader struct {
  1972		Data unsafe.Pointer
  1973		Len  int
  1974		Cap  int
  1975	}
  1976	
  1977	func typesMustMatch(what string, t1, t2 Type) {
  1978		if t1 != t2 {
  1979			panic(what + ": " + t1.String() + " != " + t2.String())
  1980		}
  1981	}
  1982	
  1983	
  1984	
  1985	
  1986	
  1987	
  1988	
  1989	
  1990	func arrayAt(p unsafe.Pointer, i int, eltSize uintptr, whySafe string) unsafe.Pointer {
  1991		return add(p, uintptr(i)*eltSize, "i < len")
  1992	}
  1993	
  1994	
  1995	
  1996	func grow(s Value, extra int) (Value, int, int) {
  1997		i0 := s.Len()
  1998		i1 := i0 + extra
  1999		if i1 < i0 {
  2000			panic("reflect.Append: slice overflow")
  2001		}
  2002		m := s.Cap()
  2003		if i1 <= m {
  2004			return s.Slice(0, i1), i0, i1
  2005		}
  2006		if m == 0 {
  2007			m = extra
  2008		} else {
  2009			for m < i1 {
  2010				if i0 < 1024 {
  2011					m += m
  2012				} else {
  2013					m += m / 4
  2014				}
  2015			}
  2016		}
  2017		t := MakeSlice(s.Type(), i1, m)
  2018		Copy(t, s)
  2019		return t, i0, i1
  2020	}
  2021	
  2022	
  2023	
  2024	func Append(s Value, x ...Value) Value {
  2025		s.mustBe(Slice)
  2026		s, i0, i1 := grow(s, len(x))
  2027		for i, j := i0, 0; i < i1; i, j = i+1, j+1 {
  2028			s.Index(i).Set(x[j])
  2029		}
  2030		return s
  2031	}
  2032	
  2033	
  2034	
  2035	func AppendSlice(s, t Value) Value {
  2036		s.mustBe(Slice)
  2037		t.mustBe(Slice)
  2038		typesMustMatch("reflect.AppendSlice", s.Type().Elem(), t.Type().Elem())
  2039		s, i0, i1 := grow(s, t.Len())
  2040		Copy(s.Slice(i0, i1), t)
  2041		return s
  2042	}
  2043	
  2044	
  2045	
  2046	
  2047	
  2048	
  2049	
  2050	
  2051	func Copy(dst, src Value) int {
  2052		dk := dst.kind()
  2053		if dk != Array && dk != Slice {
  2054			panic(&ValueError{"reflect.Copy", dk})
  2055		}
  2056		if dk == Array {
  2057			dst.mustBeAssignable()
  2058		}
  2059		dst.mustBeExported()
  2060	
  2061		sk := src.kind()
  2062		var stringCopy bool
  2063		if sk != Array && sk != Slice {
  2064			stringCopy = sk == String && dst.typ.Elem().Kind() == Uint8
  2065			if !stringCopy {
  2066				panic(&ValueError{"reflect.Copy", sk})
  2067			}
  2068		}
  2069		src.mustBeExported()
  2070	
  2071		de := dst.typ.Elem()
  2072		if !stringCopy {
  2073			se := src.typ.Elem()
  2074			typesMustMatch("reflect.Copy", de, se)
  2075		}
  2076	
  2077		var ds, ss sliceHeader
  2078		if dk == Array {
  2079			ds.Data = dst.ptr
  2080			ds.Len = dst.Len()
  2081			ds.Cap = ds.Len
  2082		} else {
  2083			ds = *(*sliceHeader)(dst.ptr)
  2084		}
  2085		if sk == Array {
  2086			ss.Data = src.ptr
  2087			ss.Len = src.Len()
  2088			ss.Cap = ss.Len
  2089		} else if sk == Slice {
  2090			ss = *(*sliceHeader)(src.ptr)
  2091		} else {
  2092			sh := *(*stringHeader)(src.ptr)
  2093			ss.Data = sh.Data
  2094			ss.Len = sh.Len
  2095			ss.Cap = sh.Len
  2096		}
  2097	
  2098		return typedslicecopy(de.common(), ds, ss)
  2099	}
  2100	
  2101	
  2102	
  2103	type runtimeSelect struct {
  2104		dir SelectDir      
  2105		typ *rtype         
  2106		ch  unsafe.Pointer 
  2107		val unsafe.Pointer 
  2108	}
  2109	
  2110	
  2111	
  2112	
  2113	
  2114	
  2115	func rselect([]runtimeSelect) (chosen int, recvOK bool)
  2116	
  2117	
  2118	type SelectDir int
  2119	
  2120	
  2121	
  2122	const (
  2123		_             SelectDir = iota
  2124		SelectSend              
  2125		SelectRecv              
  2126		SelectDefault           
  2127	)
  2128	
  2129	
  2130	
  2131	
  2132	
  2133	
  2134	
  2135	
  2136	
  2137	
  2138	
  2139	
  2140	
  2141	
  2142	
  2143	
  2144	
  2145	
  2146	type SelectCase struct {
  2147		Dir  SelectDir 
  2148		Chan Value     
  2149		Send Value     
  2150	}
  2151	
  2152	
  2153	
  2154	
  2155	
  2156	
  2157	
  2158	
  2159	func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool) {
  2160		
  2161		
  2162		
  2163		runcases := make([]runtimeSelect, len(cases))
  2164		haveDefault := false
  2165		for i, c := range cases {
  2166			rc := &runcases[i]
  2167			rc.dir = c.Dir
  2168			switch c.Dir {
  2169			default:
  2170				panic("reflect.Select: invalid Dir")
  2171	
  2172			case SelectDefault: 
  2173				if haveDefault {
  2174					panic("reflect.Select: multiple default cases")
  2175				}
  2176				haveDefault = true
  2177				if c.Chan.IsValid() {
  2178					panic("reflect.Select: default case has Chan value")
  2179				}
  2180				if c.Send.IsValid() {
  2181					panic("reflect.Select: default case has Send value")
  2182				}
  2183	
  2184			case SelectSend:
  2185				ch := c.Chan
  2186				if !ch.IsValid() {
  2187					break
  2188				}
  2189				ch.mustBe(Chan)
  2190				ch.mustBeExported()
  2191				tt := (*chanType)(unsafe.Pointer(ch.typ))
  2192				if ChanDir(tt.dir)&SendDir == 0 {
  2193					panic("reflect.Select: SendDir case using recv-only channel")
  2194				}
  2195				rc.ch = ch.pointer()
  2196				rc.typ = &tt.rtype
  2197				v := c.Send
  2198				if !v.IsValid() {
  2199					panic("reflect.Select: SendDir case missing Send value")
  2200				}
  2201				v.mustBeExported()
  2202				v = v.assignTo("reflect.Select", tt.elem, nil)
  2203				if v.flag&flagIndir != 0 {
  2204					rc.val = v.ptr
  2205				} else {
  2206					rc.val = unsafe.Pointer(&v.ptr)
  2207				}
  2208	
  2209			case SelectRecv:
  2210				if c.Send.IsValid() {
  2211					panic("reflect.Select: RecvDir case has Send value")
  2212				}
  2213				ch := c.Chan
  2214				if !ch.IsValid() {
  2215					break
  2216				}
  2217				ch.mustBe(Chan)
  2218				ch.mustBeExported()
  2219				tt := (*chanType)(unsafe.Pointer(ch.typ))
  2220				if ChanDir(tt.dir)&RecvDir == 0 {
  2221					panic("reflect.Select: RecvDir case using send-only channel")
  2222				}
  2223				rc.ch = ch.pointer()
  2224				rc.typ = &tt.rtype
  2225				rc.val = unsafe_New(tt.elem)
  2226			}
  2227		}
  2228	
  2229		chosen, recvOK = rselect(runcases)
  2230		if runcases[chosen].dir == SelectRecv {
  2231			tt := (*chanType)(unsafe.Pointer(runcases[chosen].typ))
  2232			t := tt.elem
  2233			p := runcases[chosen].val
  2234			fl := flag(t.Kind())
  2235			if ifaceIndir(t) {
  2236				recv = Value{t, p, fl | flagIndir}
  2237			} else {
  2238				recv = Value{t, *(*unsafe.Pointer)(p), fl}
  2239			}
  2240		}
  2241		return chosen, recv, recvOK
  2242	}
  2243	
  2244	
  2247	
  2248	
  2249	func unsafe_New(*rtype) unsafe.Pointer
  2250	func unsafe_NewArray(*rtype, int) unsafe.Pointer
  2251	
  2252	
  2253	
  2254	func MakeSlice(typ Type, len, cap int) Value {
  2255		if typ.Kind() != Slice {
  2256			panic("reflect.MakeSlice of non-slice type")
  2257		}
  2258		if len < 0 {
  2259			panic("reflect.MakeSlice: negative len")
  2260		}
  2261		if cap < 0 {
  2262			panic("reflect.MakeSlice: negative cap")
  2263		}
  2264		if len > cap {
  2265			panic("reflect.MakeSlice: len > cap")
  2266		}
  2267	
  2268		s := sliceHeader{unsafe_NewArray(typ.Elem().(*rtype), cap), len, cap}
  2269		return Value{typ.(*rtype), unsafe.Pointer(&s), flagIndir | flag(Slice)}
  2270	}
  2271	
  2272	
  2273	func MakeChan(typ Type, buffer int) Value {
  2274		if typ.Kind() != Chan {
  2275			panic("reflect.MakeChan of non-chan type")
  2276		}
  2277		if buffer < 0 {
  2278			panic("reflect.MakeChan: negative buffer size")
  2279		}
  2280		if typ.ChanDir() != BothDir {
  2281			panic("reflect.MakeChan: unidirectional channel type")
  2282		}
  2283		t := typ.(*rtype)
  2284		ch := makechan(t, buffer)
  2285		return Value{t, ch, flag(Chan)}
  2286	}
  2287	
  2288	
  2289	func MakeMap(typ Type) Value {
  2290		return MakeMapWithSize(typ, 0)
  2291	}
  2292	
  2293	
  2294	
  2295	func MakeMapWithSize(typ Type, n int) Value {
  2296		if typ.Kind() != Map {
  2297			panic("reflect.MakeMapWithSize of non-map type")
  2298		}
  2299		t := typ.(*rtype)
  2300		m := makemap(t, n)
  2301		return Value{t, m, flag(Map)}
  2302	}
  2303	
  2304	
  2305	
  2306	
  2307	func Indirect(v Value) Value {
  2308		if v.Kind() != Ptr {
  2309			return v
  2310		}
  2311		return v.Elem()
  2312	}
  2313	
  2314	
  2315	
  2316	func ValueOf(i interface{}) Value {
  2317		if i == nil {
  2318			return Value{}
  2319		}
  2320	
  2321		
  2322		
  2323		
  2324		
  2325		escapes(i)
  2326	
  2327		return unpackEface(i)
  2328	}
  2329	
  2330	
  2331	
  2332	
  2333	
  2334	
  2335	func Zero(typ Type) Value {
  2336		if typ == nil {
  2337			panic("reflect: Zero(nil)")
  2338		}
  2339		t := typ.(*rtype)
  2340		fl := flag(t.Kind())
  2341		if ifaceIndir(t) {
  2342			return Value{t, unsafe_New(t), fl | flagIndir}
  2343		}
  2344		return Value{t, nil, fl}
  2345	}
  2346	
  2347	
  2348	
  2349	func New(typ Type) Value {
  2350		if typ == nil {
  2351			panic("reflect: New(nil)")
  2352		}
  2353		t := typ.(*rtype)
  2354		ptr := unsafe_New(t)
  2355		fl := flag(Ptr)
  2356		return Value{t.ptrTo(), ptr, fl}
  2357	}
  2358	
  2359	
  2360	
  2361	func NewAt(typ Type, p unsafe.Pointer) Value {
  2362		fl := flag(Ptr)
  2363		t := typ.(*rtype)
  2364		return Value{t.ptrTo(), p, fl}
  2365	}
  2366	
  2367	
  2368	
  2369	
  2370	func (v Value) assignTo(context string, dst *rtype, target unsafe.Pointer) Value {
  2371		if v.flag&flagMethod != 0 {
  2372			v = makeMethodValue(context, v)
  2373		}
  2374	
  2375		switch {
  2376		case directlyAssignable(dst, v.typ):
  2377			
  2378			
  2379			fl := v.flag&(flagAddr|flagIndir) | v.flag.ro()
  2380			fl |= flag(dst.Kind())
  2381			return Value{dst, v.ptr, fl}
  2382	
  2383		case implements(dst, v.typ):
  2384			if target == nil {
  2385				target = unsafe_New(dst)
  2386			}
  2387			if v.Kind() == Interface && v.IsNil() {
  2388				
  2389				
  2390				
  2391				return Value{dst, nil, flag(Interface)}
  2392			}
  2393			x := valueInterface(v, false)
  2394			if dst.NumMethod() == 0 {
  2395				*(*interface{})(target) = x
  2396			} else {
  2397				ifaceE2I(dst, x, target)
  2398			}
  2399			return Value{dst, target, flagIndir | flag(Interface)}
  2400		}
  2401	
  2402		
  2403		panic(context + ": value of type " + v.typ.String() + " is not assignable to type " + dst.String())
  2404	}
  2405	
  2406	
  2407	
  2408	
  2409	func (v Value) Convert(t Type) Value {
  2410		if v.flag&flagMethod != 0 {
  2411			v = makeMethodValue("Convert", v)
  2412		}
  2413		op := convertOp(t.common(), v.typ)
  2414		if op == nil {
  2415			panic("reflect.Value.Convert: value of type " + v.typ.String() + " cannot be converted to type " + t.String())
  2416		}
  2417		return op(v, t)
  2418	}
  2419	
  2420	
  2421	
  2422	func convertOp(dst, src *rtype) func(Value, Type) Value {
  2423		switch src.Kind() {
  2424		case Int, Int8, Int16, Int32, Int64:
  2425			switch dst.Kind() {
  2426			case Int, Int8, Int16, Int32, Int64, Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
  2427				return cvtInt
  2428			case Float32, Float64:
  2429				return cvtIntFloat
  2430			case String:
  2431				return cvtIntString
  2432			}
  2433	
  2434		case Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
  2435			switch dst.Kind() {
  2436			case Int, Int8, Int16, Int32, Int64, Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
  2437				return cvtUint
  2438			case Float32, Float64:
  2439				return cvtUintFloat
  2440			case String:
  2441				return cvtUintString
  2442			}
  2443	
  2444		case Float32, Float64:
  2445			switch dst.Kind() {
  2446			case Int, Int8, Int16, Int32, Int64:
  2447				return cvtFloatInt
  2448			case Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
  2449				return cvtFloatUint
  2450			case Float32, Float64:
  2451				return cvtFloat
  2452			}
  2453	
  2454		case Complex64, Complex128:
  2455			switch dst.Kind() {
  2456			case Complex64, Complex128:
  2457				return cvtComplex
  2458			}
  2459	
  2460		case String:
  2461			if dst.Kind() == Slice && dst.Elem().PkgPath() == "" {
  2462				switch dst.Elem().Kind() {
  2463				case Uint8:
  2464					return cvtStringBytes
  2465				case Int32:
  2466					return cvtStringRunes
  2467				}
  2468			}
  2469	
  2470		case Slice:
  2471			if dst.Kind() == String && src.Elem().PkgPath() == "" {
  2472				switch src.Elem().Kind() {
  2473				case Uint8:
  2474					return cvtBytesString
  2475				case Int32:
  2476					return cvtRunesString
  2477				}
  2478			}
  2479		}
  2480	
  2481		
  2482		if haveIdenticalUnderlyingType(dst, src, false) {
  2483			return cvtDirect
  2484		}
  2485	
  2486		
  2487		if dst.Kind() == Ptr && dst.Name() == "" &&
  2488			src.Kind() == Ptr && src.Name() == "" &&
  2489			haveIdenticalUnderlyingType(dst.Elem().common(), src.Elem().common(), false) {
  2490			return cvtDirect
  2491		}
  2492	
  2493		if implements(dst, src) {
  2494			if src.Kind() == Interface {
  2495				return cvtI2I
  2496			}
  2497			return cvtT2I
  2498		}
  2499	
  2500		return nil
  2501	}
  2502	
  2503	
  2504	
  2505	func makeInt(f flag, bits uint64, t Type) Value {
  2506		typ := t.common()
  2507		ptr := unsafe_New(typ)
  2508		switch typ.size {
  2509		case 1:
  2510			*(*uint8)(ptr) = uint8(bits)
  2511		case 2:
  2512			*(*uint16)(ptr) = uint16(bits)
  2513		case 4:
  2514			*(*uint32)(ptr) = uint32(bits)
  2515		case 8:
  2516			*(*uint64)(ptr) = bits
  2517		}
  2518		return Value{typ, ptr, f | flagIndir | flag(typ.Kind())}
  2519	}
  2520	
  2521	
  2522	
  2523	func makeFloat(f flag, v float64, t Type) Value {
  2524		typ := t.common()
  2525		ptr := unsafe_New(typ)
  2526		switch typ.size {
  2527		case 4:
  2528			*(*float32)(ptr) = float32(v)
  2529		case 8:
  2530			*(*float64)(ptr) = v
  2531		}
  2532		return Value{typ, ptr, f | flagIndir | flag(typ.Kind())}
  2533	}
  2534	
  2535	
  2536	
  2537	func makeComplex(f flag, v complex128, t Type) Value {
  2538		typ := t.common()
  2539		ptr := unsafe_New(typ)
  2540		switch typ.size {
  2541		case 8:
  2542			*(*complex64)(ptr) = complex64(v)
  2543		case 16:
  2544			*(*complex128)(ptr) = v
  2545		}
  2546		return Value{typ, ptr, f | flagIndir | flag(typ.Kind())}
  2547	}
  2548	
  2549	func makeString(f flag, v string, t Type) Value {
  2550		ret := New(t).Elem()
  2551		ret.SetString(v)
  2552		ret.flag = ret.flag&^flagAddr | f
  2553		return ret
  2554	}
  2555	
  2556	func makeBytes(f flag, v []byte, t Type) Value {
  2557		ret := New(t).Elem()
  2558		ret.SetBytes(v)
  2559		ret.flag = ret.flag&^flagAddr | f
  2560		return ret
  2561	}
  2562	
  2563	func makeRunes(f flag, v []rune, t Type) Value {
  2564		ret := New(t).Elem()
  2565		ret.setRunes(v)
  2566		ret.flag = ret.flag&^flagAddr | f
  2567		return ret
  2568	}
  2569	
  2570	
  2571	
  2572	
  2573	
  2574	
  2575	
  2576	func cvtInt(v Value, t Type) Value {
  2577		return makeInt(v.flag.ro(), uint64(v.Int()), t)
  2578	}
  2579	
  2580	
  2581	func cvtUint(v Value, t Type) Value {
  2582		return makeInt(v.flag.ro(), v.Uint(), t)
  2583	}
  2584	
  2585	
  2586	func cvtFloatInt(v Value, t Type) Value {
  2587		return makeInt(v.flag.ro(), uint64(int64(v.Float())), t)
  2588	}
  2589	
  2590	
  2591	func cvtFloatUint(v Value, t Type) Value {
  2592		return makeInt(v.flag.ro(), uint64(v.Float()), t)
  2593	}
  2594	
  2595	
  2596	func cvtIntFloat(v Value, t Type) Value {
  2597		return makeFloat(v.flag.ro(), float64(v.Int()), t)
  2598	}
  2599	
  2600	
  2601	func cvtUintFloat(v Value, t Type) Value {
  2602		return makeFloat(v.flag.ro(), float64(v.Uint()), t)
  2603	}
  2604	
  2605	
  2606	func cvtFloat(v Value, t Type) Value {
  2607		return makeFloat(v.flag.ro(), v.Float(), t)
  2608	}
  2609	
  2610	
  2611	func cvtComplex(v Value, t Type) Value {
  2612		return makeComplex(v.flag.ro(), v.Complex(), t)
  2613	}
  2614	
  2615	
  2616	func cvtIntString(v Value, t Type) Value {
  2617		return makeString(v.flag.ro(), string(v.Int()), t)
  2618	}
  2619	
  2620	
  2621	func cvtUintString(v Value, t Type) Value {
  2622		return makeString(v.flag.ro(), string(v.Uint()), t)
  2623	}
  2624	
  2625	
  2626	func cvtBytesString(v Value, t Type) Value {
  2627		return makeString(v.flag.ro(), string(v.Bytes()), t)
  2628	}
  2629	
  2630	
  2631	func cvtStringBytes(v Value, t Type) Value {
  2632		return makeBytes(v.flag.ro(), []byte(v.String()), t)
  2633	}
  2634	
  2635	
  2636	func cvtRunesString(v Value, t Type) Value {
  2637		return makeString(v.flag.ro(), string(v.runes()), t)
  2638	}
  2639	
  2640	
  2641	func cvtStringRunes(v Value, t Type) Value {
  2642		return makeRunes(v.flag.ro(), []rune(v.String()), t)
  2643	}
  2644	
  2645	
  2646	func cvtDirect(v Value, typ Type) Value {
  2647		f := v.flag
  2648		t := typ.common()
  2649		ptr := v.ptr
  2650		if f&flagAddr != 0 {
  2651			
  2652			c := unsafe_New(t)
  2653			typedmemmove(t, c, ptr)
  2654			ptr = c
  2655			f &^= flagAddr
  2656		}
  2657		return Value{t, ptr, v.flag.ro() | f} 
  2658	}
  2659	
  2660	
  2661	func cvtT2I(v Value, typ Type) Value {
  2662		target := unsafe_New(typ.common())
  2663		x := valueInterface(v, false)
  2664		if typ.NumMethod() == 0 {
  2665			*(*interface{})(target) = x
  2666		} else {
  2667			ifaceE2I(typ.(*rtype), x, target)
  2668		}
  2669		return Value{typ.common(), target, v.flag.ro() | flagIndir | flag(Interface)}
  2670	}
  2671	
  2672	
  2673	func cvtI2I(v Value, typ Type) Value {
  2674		if v.IsNil() {
  2675			ret := Zero(typ)
  2676			ret.flag |= v.flag.ro()
  2677			return ret
  2678		}
  2679		return cvtT2I(v.Elem(), typ)
  2680	}
  2681	
  2682	
  2683	func chancap(ch unsafe.Pointer) int
  2684	func chanclose(ch unsafe.Pointer)
  2685	func chanlen(ch unsafe.Pointer) int
  2686	
  2687	
  2688	
  2689	
  2690	
  2691	
  2692	
  2693	
  2694	
  2695	
  2696	func chanrecv(ch unsafe.Pointer, nb bool, val unsafe.Pointer) (selected, received bool)
  2697	
  2698	
  2699	func chansend(ch unsafe.Pointer, val unsafe.Pointer, nb bool) bool
  2700	
  2701	func makechan(typ *rtype, size int) (ch unsafe.Pointer)
  2702	func makemap(t *rtype, cap int) (m unsafe.Pointer)
  2703	
  2704	
  2705	func mapaccess(t *rtype, m unsafe.Pointer, key unsafe.Pointer) (val unsafe.Pointer)
  2706	
  2707	
  2708	func mapassign(t *rtype, m unsafe.Pointer, key, val unsafe.Pointer)
  2709	
  2710	
  2711	func mapdelete(t *rtype, m unsafe.Pointer, key unsafe.Pointer)
  2712	
  2713	
  2714	
  2715	
  2716	func mapiterinit(t *rtype, m unsafe.Pointer) unsafe.Pointer
  2717	
  2718	
  2719	func mapiterkey(it unsafe.Pointer) (key unsafe.Pointer)
  2720	
  2721	
  2722	func mapiterelem(it unsafe.Pointer) (elem unsafe.Pointer)
  2723	
  2724	
  2725	func mapiternext(it unsafe.Pointer)
  2726	
  2727	
  2728	func maplen(m unsafe.Pointer) int
  2729	
  2730	
  2731	
  2732	
  2733	
  2734	
  2735	
  2736	
  2737	func call(argtype *rtype, fn, arg unsafe.Pointer, n uint32, retoffset uint32)
  2738	
  2739	func ifaceE2I(t *rtype, src interface{}, dst unsafe.Pointer)
  2740	
  2741	
  2742	
  2743	func memmove(dst, src unsafe.Pointer, size uintptr)
  2744	
  2745	
  2746	
  2747	func typedmemmove(t *rtype, dst, src unsafe.Pointer)
  2748	
  2749	
  2750	
  2751	
  2752	func typedmemmovepartial(t *rtype, dst, src unsafe.Pointer, off, size uintptr)
  2753	
  2754	
  2755	
  2756	func typedmemclr(t *rtype, ptr unsafe.Pointer)
  2757	
  2758	
  2759	
  2760	
  2761	func typedmemclrpartial(t *rtype, ptr unsafe.Pointer, off, size uintptr)
  2762	
  2763	
  2764	
  2765	
  2766	func typedslicecopy(elemType *rtype, dst, src sliceHeader) int
  2767	
  2768	
  2769	
  2770	
  2771	func escapes(x interface{}) {
  2772		if dummy.b {
  2773			dummy.x = x
  2774		}
  2775	}
  2776	
  2777	var dummy struct {
  2778		b bool
  2779		x interface{}
  2780	}
  2781	
View as plain text