|
|
@@ -8,7 +8,6 @@ import (
|
|
|
"github.com/modern-go/test/must"
|
|
|
"unsafe"
|
|
|
"github.com/modern-go/test/should"
|
|
|
- "fmt"
|
|
|
"context"
|
|
|
)
|
|
|
|
|
|
@@ -16,17 +15,17 @@ func Test_slice_eface(t *testing.T) {
|
|
|
t.Run("MakeSlice", testOp(func(api reflect2.API) interface{} {
|
|
|
valType := api.TypeOf([]interface{}{}).(reflect2.SliceType)
|
|
|
obj := valType.MakeSlice(5, 10)
|
|
|
- obj.([]interface{})[0] = 100
|
|
|
- obj.([]interface{})[4] = 20
|
|
|
+ (*obj.(*[]interface{}))[0] = 100
|
|
|
+ (*obj.(*[]interface{}))[4] = 20
|
|
|
return obj
|
|
|
}))
|
|
|
t.Run("SetIndex", testOp(func(api reflect2.API) interface{} {
|
|
|
obj := []interface{}{1, nil}
|
|
|
valType := api.TypeOf(obj).(reflect2.SliceType)
|
|
|
elem0 := interface{}(100)
|
|
|
- valType.SetIndex(obj, 0, &elem0)
|
|
|
+ valType.SetIndex(&obj, 0, &elem0)
|
|
|
elem1 := interface{}(20)
|
|
|
- valType.SetIndex(obj, 1, &elem1)
|
|
|
+ valType.SetIndex(&obj, 1, &elem1)
|
|
|
return obj
|
|
|
}))
|
|
|
t.Run("UnsafeSetIndex", test.Case(func(ctx context.Context) {
|
|
|
@@ -41,16 +40,15 @@ func Test_slice_eface(t *testing.T) {
|
|
|
t.Run("GetIndex", testOp(func(api reflect2.API) interface{} {
|
|
|
obj := []interface{}{1, nil}
|
|
|
valType := api.TypeOf(obj).(reflect2.SliceType)
|
|
|
- fmt.Println(api, *valType.GetIndex(obj, 0).(*interface{}))
|
|
|
return []interface{}{
|
|
|
- valType.GetIndex(obj, 0),
|
|
|
- valType.GetIndex(obj, 1),
|
|
|
+ valType.GetIndex(&obj, 0),
|
|
|
+ valType.GetIndex(&obj, 1),
|
|
|
}
|
|
|
}))
|
|
|
t.Run("UnsafeGetIndex", test.Case(func(ctx context.Context) {
|
|
|
obj := []interface{}{1, nil}
|
|
|
valType := reflect2.TypeOf(obj).(reflect2.SliceType)
|
|
|
- elem0 := valType.UnsafeGetIndex(reflect2.PtrOf(obj), 0)
|
|
|
+ elem0 := valType.UnsafeGetIndex(unsafe.Pointer(&obj), 0)
|
|
|
must.Equal(1, *(*interface{})(elem0))
|
|
|
}))
|
|
|
t.Run("Append", testOp(func(api reflect2.API) interface{} {
|
|
|
@@ -58,9 +56,11 @@ func Test_slice_eface(t *testing.T) {
|
|
|
obj[0] = 1
|
|
|
obj[1] = 2
|
|
|
valType := api.TypeOf(obj).(reflect2.SliceType)
|
|
|
- valType.Append(&obj, 3)
|
|
|
+ elem1 := interface{}(3)
|
|
|
+ valType.Append(&obj, &elem1)
|
|
|
// will trigger grow
|
|
|
- valType.Append(&obj, 4)
|
|
|
+ elem2 := interface{}(4)
|
|
|
+ valType.Append(&obj, &elem2)
|
|
|
return obj
|
|
|
}))
|
|
|
t.Run("UnsafeAppend", test.Case(func(ctx context.Context) {
|
|
|
@@ -68,11 +68,10 @@ func Test_slice_eface(t *testing.T) {
|
|
|
obj[0] = 1
|
|
|
obj[1] = 2
|
|
|
valType := reflect2.TypeOf(obj).(reflect2.SliceType)
|
|
|
- ptr := reflect2.PtrOf(obj)
|
|
|
var elem2 interface{} = 3
|
|
|
- valType.UnsafeAppend(ptr, unsafe.Pointer(&elem2))
|
|
|
+ valType.UnsafeAppend(unsafe.Pointer(&obj), unsafe.Pointer(&elem2))
|
|
|
var elem3 interface{} = 4
|
|
|
- valType.UnsafeAppend(ptr, unsafe.Pointer(&elem3))
|
|
|
- should.Equal([]interface{}{1, 2, 3, 4}, valType.PackEFace(ptr))
|
|
|
+ valType.UnsafeAppend(unsafe.Pointer(&obj), unsafe.Pointer(&elem3))
|
|
|
+ should.Equal([]interface{}{1, 2, 3, 4}, valType.UnsafeIndirect(unsafe.Pointer(&obj)))
|
|
|
}))
|
|
|
}
|