mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-24 06:19:04 +00:00
reflect: add OverflowFloat(), OverflowInt(), OverflowUint()
This commit is contained in:
committed by
Damian Gryski
parent
79930a209c
commit
0ff243e5e2
+36
-3
@@ -735,8 +735,24 @@ func (v Value) NumMethod() int {
|
|||||||
return v.typecode.NumMethod()
|
return v.typecode.NumMethod()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OverflowFloat reports whether the float64 x cannot be represented by v's type.
|
||||||
|
// It panics if v's Kind is not Float32 or Float64.
|
||||||
func (v Value) OverflowFloat(x float64) bool {
|
func (v Value) OverflowFloat(x float64) bool {
|
||||||
panic("unimplemented: (reflect.Value).OverflowFloat()")
|
k := v.Kind()
|
||||||
|
switch k {
|
||||||
|
case Float32:
|
||||||
|
return overflowFloat32(x)
|
||||||
|
case Float64:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
panic(&ValueError{"reflect.Value.OverflowFloat", v.Kind()})
|
||||||
|
}
|
||||||
|
|
||||||
|
func overflowFloat32(x float64) bool {
|
||||||
|
if x < 0 {
|
||||||
|
x = -x
|
||||||
|
}
|
||||||
|
return math.MaxFloat32 < x && x <= math.MaxFloat64
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v Value) MapKeys() []Value {
|
func (v Value) MapKeys() []Value {
|
||||||
@@ -977,12 +993,29 @@ func (v Value) checkAddressable() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OverflowInt reports whether the int64 x cannot be represented by v's type.
|
||||||
|
// It panics if v's Kind is not Int, Int8, Int16, Int32, or Int64.
|
||||||
func (v Value) OverflowInt(x int64) bool {
|
func (v Value) OverflowInt(x int64) bool {
|
||||||
panic("unimplemented: reflect.OverflowInt()")
|
switch v.Kind() {
|
||||||
|
case Int, Int8, Int16, Int32, Int64:
|
||||||
|
bitSize := v.typecode.Size() * 8
|
||||||
|
trunc := (x << (64 - bitSize)) >> (64 - bitSize)
|
||||||
|
return x != trunc
|
||||||
|
}
|
||||||
|
panic(&ValueError{"reflect.Value.OverflowInt", v.Kind()})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OverflowUint reports whether the uint64 x cannot be represented by v's type.
|
||||||
|
// It panics if v's Kind is not Uint, Uintptr, Uint8, Uint16, Uint32, or Uint64.
|
||||||
func (v Value) OverflowUint(x uint64) bool {
|
func (v Value) OverflowUint(x uint64) bool {
|
||||||
panic("unimplemented: reflect.OverflowUint()")
|
k := v.Kind()
|
||||||
|
switch k {
|
||||||
|
case Uint, Uintptr, Uint8, Uint16, Uint32, Uint64:
|
||||||
|
bitSize := v.typecode.Size() * 8
|
||||||
|
trunc := (x << (64 - bitSize)) >> (64 - bitSize)
|
||||||
|
return x != trunc
|
||||||
|
}
|
||||||
|
panic(&ValueError{"reflect.Value.OverflowUint", v.Kind()})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v Value) Convert(t Type) Value {
|
func (v Value) Convert(t Type) Value {
|
||||||
|
|||||||
Reference in New Issue
Block a user