aboutsummaryrefslogblamecommitdiffstats
path: root/vendor/github.com/robertkrimen/otto/otto_.go
blob: 304a831508ba275d191ee91e3f8943cf844e0d72 (plain) (tree)





















                                                                                         
                                                          



                                             
                                                       








































                                                                          
                             




                                                                                       
                                          






















































                                                                                       
                                                   













































                                                                           
package otto

import (
    "fmt"
    "regexp"
    runtime_ "runtime"
    "strconv"
    "strings"
)

var isIdentifier_Regexp *regexp.Regexp = regexp.MustCompile(`^[a-zA-Z\$][a-zA-Z0-9\$]*$`)

func isIdentifier(string_ string) bool {
    return isIdentifier_Regexp.MatchString(string_)
}

func (self *_runtime) toValueArray(arguments ...interface{}) []Value {
    length := len(arguments)
    if length == 1 {
        if valueArray, ok := arguments[0].([]Value); ok {
            return valueArray
        }
        return []Value{self.toValue(arguments[0])}
    }

    valueArray := make([]Value, length)
    for index, value := range arguments {
        valueArray[index] = self.toValue(value)
    }

    return valueArray
}

func stringToArrayIndex(name string) int64 {
    index, err := strconv.ParseInt(name, 10, 64)
    if err != nil {
        return -1
    }
    if index < 0 {
        return -1
    }
    if index >= maxUint32 {
        // The value 2^32 (or above) is not a valid index because
        // you cannot store a uint32 length for an index of uint32
        return -1
    }
    return index
}

func isUint32(value int64) bool {
    return value >= 0 && value <= maxUint32
}

func arrayIndexToString(index int64) string {
    return strconv.FormatInt(index, 10)
}

func valueOfArrayIndex(array []Value, index int) Value {
    value, _ := getValueOfArrayIndex(array, index)
    return value
}

func getValueOfArrayIndex(array []Value, index int) (Value, bool) {
    if index >= 0 && index < len(array) {
        value := array[index]
        if !value.isEmpty() {
            return value, true
        }
    }
    return Value{}, false
}

// A range index can be anything from 0 up to length. It is NOT safe to use as an index
// to an array, but is useful for slicing and in some ECMA algorithms.
func valueToRangeIndex(indexValue Value, length int64, negativeIsZero bool) int64 {
    index := indexValue.number().int64
    if negativeIsZero {
        if index < 0 {
            index = 0
        }
        // minimum(index, length)
        if index >= length {
            index = length
        }
        return index
    }

    if index < 0 {
        index += length
        if index < 0 {
            index = 0
        }
    } else {
        if index > length {
            index = length
        }
    }
    return index
}

func rangeStartEnd(array []Value, size int64, negativeIsZero bool) (start, end int64) {
    start = valueToRangeIndex(valueOfArrayIndex(array, 0), size, negativeIsZero)
    if len(array) == 1 {
        // If there is only the start argument, then end = size
        end = size
        return
    }

    // Assuming the argument is undefined...
    end = size
    endValue := valueOfArrayIndex(array, 1)
    if !endValue.IsUndefined() {
        // Which it is not, so get the value as an array index
        end = valueToRangeIndex(endValue, size, negativeIsZero)
    }
    return
}

func rangeStartLength(source []Value, size int64) (start, length int64) {
    start = valueToRangeIndex(valueOfArrayIndex(source, 0), size, false)

    // Assume the second argument is missing or undefined
    length = int64(size)
    if len(source) == 1 {
        // If there is only the start argument, then length = size
        return
    }

    lengthValue := valueOfArrayIndex(source, 1)
    if !lengthValue.IsUndefined() {
        // Which it is not, so get the value as an array index
        length = lengthValue.number().int64
    }
    return
}

func boolFields(input string) (result map[string]bool) {
    result = map[string]bool{}
    for _, word := range strings.Fields(input) {
        result[word] = true
    }
    return result
}

func hereBeDragons(arguments ...interface{}) string {
    pc, _, _, _ := runtime_.Caller(1)
    name := runtime_.FuncForPC(pc).Name()
    message := fmt.Sprintf("Here be dragons -- %s", name)
    if len(arguments) > 0 {
        message += ": "
        argument0 := fmt.Sprintf("%s", arguments[0])
        if len(arguments) == 1 {
            message += argument0
        } else {
            message += fmt.Sprintf(argument0, arguments[1:]...)
        }
    } else {
        message += "."
    }
    return message
}

func throwHereBeDragons(arguments ...interface{}) {
    panic(hereBeDragons(arguments...))
}

func eachPair(list []interface{}, fn func(_0, _1 interface{})) {
    for len(list) > 0 {
        var _0, _1 interface{}
        _0 = list[0]
        list = list[1:] // Pop off first
        if len(list) > 0 {
            _1 = list[0]
            list = list[1:] // Pop off second
        }
        fn(_0, _1)
    }
}