2016-07-20 06:42:19 +00:00
|
|
|
package otto
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"math"
|
|
|
|
"reflect"
|
2018-01-25 13:08:43 +00:00
|
|
|
"unicode/utf16"
|
2016-07-20 06:42:19 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func (value Value) bool() bool {
|
|
|
|
if value.kind == valueBoolean {
|
|
|
|
return value.value.(bool)
|
|
|
|
}
|
|
|
|
if value.IsUndefined() {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if value.IsNull() {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
switch value := value.value.(type) {
|
|
|
|
case bool:
|
|
|
|
return value
|
|
|
|
case int, int8, int16, int32, int64:
|
|
|
|
return 0 != reflect.ValueOf(value).Int()
|
|
|
|
case uint, uint8, uint16, uint32, uint64:
|
|
|
|
return 0 != reflect.ValueOf(value).Uint()
|
|
|
|
case float32:
|
|
|
|
return 0 != value
|
|
|
|
case float64:
|
|
|
|
if math.IsNaN(value) || value == 0 {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
case string:
|
|
|
|
return 0 != len(value)
|
2018-01-25 13:08:43 +00:00
|
|
|
case []uint16:
|
|
|
|
return 0 != len(utf16.Decode(value))
|
2016-07-20 06:42:19 +00:00
|
|
|
}
|
|
|
|
if value.IsObject() {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("toBoolean(%T)", value.value))
|
|
|
|
}
|