internal/lib/reflect: Value.Slice Value.Slice3

This commit is contained in:
visualfc
2024-11-14 09:55:56 +08:00
parent e242e65569
commit b8a185c112

View File

@@ -1347,7 +1347,6 @@ func (v Value) SetString(x string) {
// It panics if v's Kind is not Array, Slice or String, or if v is an unaddressable array, // It panics if v's Kind is not Array, Slice or String, or if v is an unaddressable array,
// or if the indexes are out of bounds. // or if the indexes are out of bounds.
func (v Value) Slice(i, j int) Value { func (v Value) Slice(i, j int) Value {
/* TODO(xsw):
var ( var (
cap int cap int
typ *sliceType typ *sliceType
@@ -1368,18 +1367,18 @@ func (v Value) Slice(i, j int) Value {
case Slice: case Slice:
typ = (*sliceType)(unsafe.Pointer(v.typ())) typ = (*sliceType)(unsafe.Pointer(v.typ()))
s := (*unsafeheader.Slice)(v.ptr) s := (*unsafeheaderSlice)(v.ptr)
base = s.Data base = s.Data
cap = s.Cap cap = s.Cap
case String: case String:
s := (*unsafeheader.String)(v.ptr) s := (*unsafeheaderString)(v.ptr)
if i < 0 || j < i || j > s.Len { if i < 0 || j < i || j > s.Len {
panic("reflect.Value.Slice: string slice index out of bounds") panic("reflect.Value.Slice: string slice index out of bounds")
} }
var t unsafeheader.String var t unsafeheaderString
if i < s.Len { if i < s.Len {
t = unsafeheader.String{Data: arrayAt(s.Data, i, 1, "i < s.Len"), Len: j - i} t = unsafeheaderString{Data: arrayAt(s.Data, i, 1, "i < s.Len"), Len: j - i}
} }
return Value{v.typ(), unsafe.Pointer(&t), v.flag} return Value{v.typ(), unsafe.Pointer(&t), v.flag}
} }
@@ -1392,7 +1391,7 @@ func (v Value) Slice(i, j int) Value {
var x []unsafe.Pointer var x []unsafe.Pointer
// Reinterpret as *unsafeheader.Slice to edit. // Reinterpret as *unsafeheader.Slice to edit.
s := (*unsafeheader.Slice)(unsafe.Pointer(&x)) s := (*unsafeheaderSlice)(unsafe.Pointer(&x))
s.Len = j - i s.Len = j - i
s.Cap = cap - i s.Cap = cap - i
if cap-i > 0 { if cap-i > 0 {
@@ -1404,15 +1403,12 @@ func (v Value) Slice(i, j int) Value {
fl := v.flag.ro() | flagIndir | flag(Slice) fl := v.flag.ro() | flagIndir | flag(Slice)
return Value{typ.Common(), unsafe.Pointer(&x), fl} return Value{typ.Common(), unsafe.Pointer(&x), fl}
*/
panic("todo: reflect.Value.Slice")
} }
// Slice3 is the 3-index form of the slice operation: it returns v[i:j:k]. // Slice3 is the 3-index form of the slice operation: it returns v[i:j:k].
// It panics if v's Kind is not Array or Slice, or if v is an unaddressable array, // It panics if v's Kind is not Array or Slice, or if v is an unaddressable array,
// or if the indexes are out of bounds. // or if the indexes are out of bounds.
func (v Value) Slice3(i, j, k int) Value { func (v Value) Slice3(i, j, k int) Value {
/* TODO(xsw):
var ( var (
cap int cap int
typ *sliceType typ *sliceType
@@ -1433,7 +1429,7 @@ func (v Value) Slice3(i, j, k int) Value {
case Slice: case Slice:
typ = (*sliceType)(unsafe.Pointer(v.typ())) typ = (*sliceType)(unsafe.Pointer(v.typ()))
s := (*unsafeheader.Slice)(v.ptr) s := (*unsafeheaderSlice)(v.ptr)
base = s.Data base = s.Data
cap = s.Cap cap = s.Cap
} }
@@ -1447,7 +1443,7 @@ func (v Value) Slice3(i, j, k int) Value {
var x []unsafe.Pointer var x []unsafe.Pointer
// Reinterpret as *unsafeheader.Slice to edit. // Reinterpret as *unsafeheader.Slice to edit.
s := (*unsafeheader.Slice)(unsafe.Pointer(&x)) s := (*unsafeheaderSlice)(unsafe.Pointer(&x))
s.Len = j - i s.Len = j - i
s.Cap = k - i s.Cap = k - i
if k-i > 0 { if k-i > 0 {
@@ -1459,8 +1455,6 @@ func (v Value) Slice3(i, j, k int) Value {
fl := v.flag.ro() | flagIndir | flag(Slice) fl := v.flag.ro() | flagIndir | flag(Slice)
return Value{typ.Common(), unsafe.Pointer(&x), fl} return Value{typ.Common(), unsafe.Pointer(&x), fl}
*/
panic("todo: reflect.Value.Slice3")
} }
// String returns the string v's underlying value, as a string. // String returns the string v's underlying value, as a string.