internal/lib/reflect: fix Int/Uint/Float flagIndir
This commit is contained in:
@@ -64,14 +64,14 @@ func CountString(s string, c byte) (n int) {
|
|||||||
// Requires 2 <= len(b) <= MaxLen.
|
// Requires 2 <= len(b) <= MaxLen.
|
||||||
func Index(a, b []byte) int {
|
func Index(a, b []byte) int {
|
||||||
for i := 0; i <= len(a)-len(b); i++ {
|
for i := 0; i <= len(a)-len(b); i++ {
|
||||||
if equal(a[i:i+len(b)], b) {
|
if Equal(a[i:i+len(b)], b) {
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
func equal(a, b []byte) bool {
|
func Equal(a, b []byte) bool {
|
||||||
if n := len(a); n == len(b) {
|
if n := len(a); n == len(b) {
|
||||||
return c.Memcmp(unsafe.Pointer(unsafe.SliceData(a)), unsafe.Pointer(unsafe.SliceData(b)), uintptr(n)) == 0
|
return c.Memcmp(unsafe.Pointer(unsafe.SliceData(a)), unsafe.Pointer(unsafe.SliceData(b)), uintptr(n)) == 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -623,7 +623,7 @@ func (v Value) CanFloat() bool {
|
|||||||
// It panics if v's Kind is not Float32 or Float64
|
// It panics if v's Kind is not Float32 or Float64
|
||||||
func (v Value) Float() float64 {
|
func (v Value) Float() float64 {
|
||||||
k := v.kind()
|
k := v.kind()
|
||||||
if v.flag&flagAddr != 0 {
|
if v.flag&flagIndir != 0 {
|
||||||
switch k {
|
switch k {
|
||||||
case Float32:
|
case Float32:
|
||||||
return float64(*(*float32)(v.ptr))
|
return float64(*(*float32)(v.ptr))
|
||||||
@@ -635,7 +635,11 @@ func (v Value) Float() float64 {
|
|||||||
case Float32:
|
case Float32:
|
||||||
return float64(bitcast.ToFloat32(uintptr(v.ptr)))
|
return float64(bitcast.ToFloat32(uintptr(v.ptr)))
|
||||||
case Float64:
|
case Float64:
|
||||||
|
if is64bit {
|
||||||
return bitcast.ToFloat64(uintptr(v.ptr))
|
return bitcast.ToFloat64(uintptr(v.ptr))
|
||||||
|
} else {
|
||||||
|
return *(*float64)(v.ptr)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
panic(&ValueError{"reflect.Value.Float", v.kind()})
|
panic(&ValueError{"reflect.Value.Float", v.kind()})
|
||||||
@@ -705,7 +709,7 @@ func (v Value) Int() int64 {
|
|||||||
f := v.flag
|
f := v.flag
|
||||||
k := f.kind()
|
k := f.kind()
|
||||||
p := v.ptr
|
p := v.ptr
|
||||||
if f&flagAddr != 0 {
|
if f&flagIndir != 0 {
|
||||||
switch k {
|
switch k {
|
||||||
case Int:
|
case Int:
|
||||||
return int64(*(*int)(p))
|
return int64(*(*int)(p))
|
||||||
@@ -718,18 +722,18 @@ func (v Value) Int() int64 {
|
|||||||
case Int64:
|
case Int64:
|
||||||
return *(*int64)(p)
|
return *(*int64)(p)
|
||||||
}
|
}
|
||||||
} else if unsafe.Sizeof(uintptr(0)) == 8 {
|
|
||||||
if k >= Int && k <= Int64 {
|
|
||||||
return int64(uintptr(p))
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if k >= Int && k <= Int32 {
|
switch k {
|
||||||
|
case Int, Int8, Int16, Int32:
|
||||||
return int64(uintptr(p))
|
return int64(uintptr(p))
|
||||||
}
|
case Int64:
|
||||||
if k == Int64 {
|
if is64bit {
|
||||||
|
return int64(uintptr(p))
|
||||||
|
} else {
|
||||||
return *(*int64)(p)
|
return *(*int64)(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
panic(&ValueError{"reflect.Value.Int", v.kind()})
|
panic(&ValueError{"reflect.Value.Int", v.kind()})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1558,7 +1562,7 @@ func (v Value) Uint() uint64 {
|
|||||||
f := v.flag
|
f := v.flag
|
||||||
k := v.kind()
|
k := v.kind()
|
||||||
p := v.ptr
|
p := v.ptr
|
||||||
if f&flagAddr != 0 {
|
if f&flagIndir != 0 {
|
||||||
switch k {
|
switch k {
|
||||||
case Uint:
|
case Uint:
|
||||||
return uint64(*(*uint)(p))
|
return uint64(*(*uint)(p))
|
||||||
@@ -1573,18 +1577,18 @@ func (v Value) Uint() uint64 {
|
|||||||
case Uintptr:
|
case Uintptr:
|
||||||
return uint64(*(*uintptr)(p))
|
return uint64(*(*uintptr)(p))
|
||||||
}
|
}
|
||||||
} else if unsafe.Sizeof(uintptr(0)) == 8 {
|
|
||||||
if k >= Uint && k <= Uintptr {
|
|
||||||
return uint64(uintptr(p))
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if k >= Uint && k <= Uint32 {
|
switch k {
|
||||||
|
case Uint, Uint8, Uint16, Uint32:
|
||||||
return uint64(uintptr(p))
|
return uint64(uintptr(p))
|
||||||
}
|
case Uint64, Uintptr:
|
||||||
if k == Uint64 || k == Uintptr {
|
if is64bit {
|
||||||
|
return uint64(uintptr(p))
|
||||||
|
} else {
|
||||||
return *(*uint64)(p)
|
return *(*uint64)(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
panic(&ValueError{"reflect.Value.Uint", v.kind()})
|
panic(&ValueError{"reflect.Value.Uint", v.kind()})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user