41 lines
754 B
Go
41 lines
754 B
Go
package otto
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"reflect"
|
|
"unicode/utf16"
|
|
)
|
|
|
|
func (v Value) bool() bool {
|
|
if v.kind == valueBoolean {
|
|
return v.value.(bool)
|
|
}
|
|
if v.IsUndefined() || v.IsNull() {
|
|
return false
|
|
}
|
|
switch value := v.value.(type) {
|
|
case bool:
|
|
return value
|
|
case int, int8, int16, int32, int64:
|
|
return reflect.ValueOf(value).Int() != 0
|
|
case uint, uint8, uint16, uint32, uint64:
|
|
return reflect.ValueOf(value).Uint() != 0
|
|
case float32:
|
|
return value != 0
|
|
case float64:
|
|
if math.IsNaN(value) || value == 0 {
|
|
return false
|
|
}
|
|
return true
|
|
case string:
|
|
return len(value) != 0
|
|
case []uint16:
|
|
return len(utf16.Decode(value)) != 0
|
|
}
|
|
if v.IsObject() {
|
|
return true
|
|
}
|
|
panic(fmt.Sprintf("unexpected boolean type %T", v.value))
|
|
}
|