internal/lib/reflect: Value.Len Value.Cap
This commit is contained in:
@@ -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,27 +979,24 @@ 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()))
|
return int(tt.Len)
|
||||||
return int(tt.Len)
|
case Chan:
|
||||||
case Chan:
|
return chanlen(v.pointer())
|
||||||
return chanlen(v.pointer())
|
case Map:
|
||||||
case Map:
|
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 (*unsafeheaderString)(v.ptr).Len
|
||||||
return (*unsafeheader.String)(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()
|
|
||||||
}
|
|
||||||
panic("reflect: call of reflect.Value.Len on ptr to non-array Value")
|
|
||||||
}
|
}
|
||||||
panic(&ValueError{"reflect.Value.Len", v.kind()})
|
panic("reflect: call of reflect.Value.Len on ptr to non-array Value")
|
||||||
*/
|
}
|
||||||
panic("todo: reflect.Value.lenNonSlice")
|
panic(&ValueError{"reflect.Value.Len", v.kind()})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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
|
||||||
|
|||||||
Reference in New Issue
Block a user