github.com/goplusjs/gopherjs@v1.2.6-0.20211206034512-f187917453b8/compiler/natives/src/internal/reflectlite/swapper.go (about)

     1  // +build js
     2  
     3  package reflectlite
     4  
     5  import "github.com/gopherjs/gopherjs/js"
     6  
     7  func Swapper(slice interface{}) func(i, j int) {
     8  	v := ValueOf(slice)
     9  	if v.Kind() != Slice {
    10  		panic(&ValueError{Method: "Swapper", Kind: v.Kind()})
    11  	}
    12  	// Fast path for slices of size 0 and 1. Nothing to swap.
    13  	vLen := uint(v.Len())
    14  	switch vLen {
    15  	case 0:
    16  		return func(i, j int) { panic("reflect: slice index out of range") }
    17  	case 1:
    18  		return func(i, j int) {
    19  			if i != 0 || j != 0 {
    20  				panic("reflect: slice index out of range")
    21  			}
    22  		}
    23  	}
    24  	a := js.InternalObject(slice).Get("$array")
    25  	off := js.InternalObject(slice).Get("$offset").Int()
    26  	return func(i, j int) {
    27  		if uint(i) >= vLen || uint(j) >= vLen {
    28  			panic("reflect: slice index out of range")
    29  		}
    30  		i += off
    31  		j += off
    32  		tmp := a.Index(i)
    33  		a.SetIndex(i, a.Index(j))
    34  		a.SetIndex(j, tmp)
    35  	}
    36  }