internal/lib/reflect: Value.Len Value.Cap

This commit is contained in:
visualfc
2024-11-13 21:39:31 +08:00
parent f403916ef8
commit 62ab33a434

View File

@@ -393,18 +393,14 @@ func (v Value) CanSet() bool {
// Cap returns v's capacity. // Cap returns v's capacity.
// It panics if v's Kind is not Array, Chan, Slice or pointer to Array. // It panics if v's Kind is not Array, Chan, Slice or pointer to Array.
func (v Value) Cap() int { func (v Value) Cap() int {
/* TODO(xsw):
// capNonSlice is split out to keep Cap inlineable for slice kinds. // capNonSlice is split out to keep Cap inlineable for slice kinds.
if v.kind() == Slice { if v.kind() == Slice {
return (*unsafeheader.Slice)(v.ptr).Cap return (*unsafeheaderSlice)(v.ptr).Cap
} }
return v.capNonSlice() return v.capNonSlice()
*/
panic("todo: reflect.Value.Cap")
} }
func (v Value) capNonSlice() int { func (v Value) capNonSlice() int {
/* TODO(xsw):
k := v.kind() k := v.kind()
switch k { switch k {
case Array: case Array:
@@ -418,8 +414,6 @@ func (v Value) capNonSlice() int {
panic("reflect: call of reflect.Value.Cap on ptr to non-array Value") panic("reflect: call of reflect.Value.Cap on ptr to non-array Value")
} }
panic(&ValueError{"reflect.Value.Cap", v.kind()}) panic(&ValueError{"reflect.Value.Cap", v.kind()})
*/
panic("todo: reflect.Value.capNonSlice")
} }
// Close closes the channel v. // Close closes the channel v.
@@ -985,7 +979,6 @@ func (v Value) Len() int {
} }
func (v Value) lenNonSlice() int { func (v Value) lenNonSlice() int {
/*
switch k := v.kind(); k { switch k := v.kind(); k {
case Array: case Array:
tt := (*arrayType)(unsafe.Pointer(v.typ())) tt := (*arrayType)(unsafe.Pointer(v.typ()))
@@ -996,7 +989,7 @@ func (v Value) lenNonSlice() int {
return maplen(v.pointer()) return maplen(v.pointer())
case String: case String:
// String is bigger than a word; assume flagIndir. // String is bigger than a word; assume flagIndir.
return (*unsafeheader.String)(v.ptr).Len return (*unsafeheaderString)(v.ptr).Len
case Ptr: case Ptr:
if v.typ().Elem().Kind() == abi.Array { if v.typ().Elem().Kind() == abi.Array {
return v.typ().Elem().Len() return v.typ().Elem().Len()
@@ -1004,8 +997,6 @@ func (v Value) lenNonSlice() int {
panic("reflect: call of reflect.Value.Len on ptr to non-array Value") panic("reflect: call of reflect.Value.Len on ptr to non-array Value")
} }
panic(&ValueError{"reflect.Value.Len", v.kind()}) panic(&ValueError{"reflect.Value.Len", v.kind()})
*/
panic("todo: reflect.Value.lenNonSlice")
} }
// Pointer returns v's value as a uintptr. // Pointer returns v's value as a uintptr.
@@ -2499,3 +2490,12 @@ func methodReceiver(op string, v Value, methodIndex int) (rcvrtype *abi.Type, t
} }
return return
} }
//go:linkname chancap github.com/goplus/llgo/internal/runtime.ChanCap
func chancap(ch unsafe.Pointer) int
//go:linkname chanlen github.com/goplus/llgo/internal/runtime.ChanLen
func chanlen(ch unsafe.Pointer) int
//go:linkname maplen github.com/goplus/llgo/internal/runtime.MapLen
func maplen(ch unsafe.Pointer) int