foop
Version:
interfaces that describe their intentions.
154 lines (145 loc) • 12.1 kB
JavaScript
/** @ignore 🚧 wip */
// https://github.com/qfox/Zeon/blob/master/Ast.js#L23
// https://github.com/qfox/Zeon/blob/master/fuzzing/fuzzRuderManEdited.js#L1414
var binaryOps = [
// Long-standing JavaScript operators, roughly in order from http://www.codehouse.com/javascript/precedence/
' * ', ' / ', ' % ', ' + ', ' - ', ' << ', ' >> ', ' >>> ', ' < ', ' > ', ' <= ', ' >= ', ' instanceof ', ' in ', ' == ', ' != ', ' === ', ' !== ',
' & ', ' | ', ' ^ ', ' && ', ' || ', ' = ', ' *= ', ' /= ', ' %= ', ' += ', ' -= ', ' <<= ', ' >>= ', ' >>>=', ' &= ', ' ^= ', ' |= ', ' , ',
// ,
// . is special, so test it as a group of right-unary ops, a special exprMaker for property access, and a special exprMaker for the xml filtering predicate operator
// " . ",
// Added by E4X
// " :: ", " .. ", " @ ",
// Frequent combinations of E4X things (and "*" namespace, which isn't produced by this fuzzer otherwise)
// " .@ ", " .@*:: ", " .@x:: ",
]
// http://heatfiler.qfox.nl/#run,code,here
// function _has(obj, path) {
// if (!Array.isArray(path)) {
// return obj != null && hasOwnProperty.call(obj, path)
// }
// var length = path.length
// for (var i = 0; i < length; i++) {
// var key = path[i]
// if (obj == null || !hasOwnProperty.call(obj, key)) {
// return false
// }
// obj = obj[key]
// }
// return !!length
// }
//
// _has({eh: true}, 'oh')
// _has({eh: true}, 'eh')
// _has({eh: true}, 'eh')
// _has({}, 'eh')
// _has({}, 'eh')
// _has({}, 'eh')
// * https://github.com/qfox/heatfiler/blob/master/lib/tok.js#L660
// * https://github.com/qfox/heatfiler/blob/master/lib/par.js#L1130
// https://github.com/the-grid/finitedomain/blob/master/src/trie.js#L481
// function bytes(b) {
// if (b < 1024) return b + ' b'
// b /= 1024
// if (b < 1024) return ~~(b * 100) / 100 + ' kb'
// b /= 1024
// if (b < 1024) return ~~(b * 100) / 100 + ' mb'
// b /= 1024
// return ~~(b * 100) / 100 + ' gb'
// }
// // diff but same name
// //
// // https://github.com/processing-js/processing-js/blob/master/src/P5Functions/JavaProxyFunctions.js
// // https://github.com/processing-js/processing-js/blob/master/src/Objects/webcolors.js
// // https://github.com/processing-js/processing-js/blob/master/src/Helpers/virtHashCode.js
// // https://github.com/processing-js/processing-js/blob/master/src/Objects/HashMap.js
//
// /** Used to stand-in for `undefined` hash values. */
// const HASH_UNDEFINED = '__lodash_hash_undefined__'
//
// class Hash {
// /**
// * Creates a hash object.
// *
// * @private
// * @constructor
// * @param {Array} [entries] The key-value pairs to cache.
// */
// constructor(entries) {
// let index = -1
// const length = entries == null ? 0 : entries.length
//
// this.clear()
// while (++index < length) {
// const entry = entries[index]
// this.set(entry[0], entry[1])
// }
// }
//
// /**
// * Removes all key-value entries from the hash.
// *
// * @memberOf Hash
// */
// clear() {
// this.__data__ = Object.create(null)
// this.size = 0
// }
//
// /**
// * Removes `key` and its value from the hash.
// *
// * @memberOf Hash
// * @param {Object} hash The hash to modify.
// * @param {string} key The key of the value to remove.
// * @returns {boolean} Returns `true` if the entry was removed, else `false`.
// */
// delete(key) {
// const result = this.has(key) && delete this.__data__[key]
// this.size -= result ? 1 : 0
// return result
// }
//
// /**
// * Gets the hash value for `key`.
// *
// * @memberOf Hash
// * @param {string} key The key of the value to get.
// * @returns {*} Returns the entry value.
// */
// get(key) {
// const data = this.__data__
// const result = data[key]
// return result === HASH_UNDEFINED ? undefined : result
// }
//
// /**
// * Checks if a hash value for `key` exists.
// *
// * @memberOf Hash
// * @param {string} key The key of the entry to check.
// * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
// */
// has(key) {
// const data = this.__data__
// return data[key] !== undefined
// }
//
// /**
// * Sets the hash `key` to `value`.
// *
// * @memberOf Hash
// * @param {string} key The key of the value to set.
// * @param {*} value The value to set.
// * @returns {Object} Returns the hash instance.
// */
// set(key, value) {
// const data = this.__data__
// this.size += this.has(key) ? 0 : 1
// data[key] = value === undefined ? HASH_UNDEFINED : value
// return this
// }
// }
//
// export default Hash
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGFzaC5qcyIsInNvdXJjZXMiOlsiSGFzaC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGlnbm9yZSDwn5qnIHdpcCAqL1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vcWZveC9aZW9uL2Jsb2IvbWFzdGVyL0FzdC5qcyNMMjNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9xZm94L1plb24vYmxvYi9tYXN0ZXIvZnV6emluZy9mdXp6UnVkZXJNYW5FZGl0ZWQuanMjTDE0MTRcbnZhciBiaW5hcnlPcHMgPSBbXG4gIC8vIExvbmctc3RhbmRpbmcgSmF2YVNjcmlwdCBvcGVyYXRvcnMsIHJvdWdobHkgaW4gb3JkZXIgZnJvbSBodHRwOi8vd3d3LmNvZGVob3VzZS5jb20vamF2YXNjcmlwdC9wcmVjZWRlbmNlL1xuICAnICogJywgJyAvICcsICcgJSAnLCAnICsgJywgJyAtICcsICcgPDwgJywgJyA+PiAnLCAnID4+PiAnLCAnIDwgJywgJyA+ICcsICcgPD0gJywgJyA+PSAnLCAnIGluc3RhbmNlb2YgJywgJyBpbiAnLCAnID09ICcsICcgIT0gJywgJyA9PT0gJywgJyAhPT0gJyxcbiAgJyAmICcsICcgfCAnLCAnIF4gJywgJyAmJiAnLCAnIHx8ICcsICcgPSAnLCAnICo9ICcsICcgLz0gJywgJyAlPSAnLCAnICs9ICcsICcgLT0gJywgJyA8PD0gJywgJyA+Pj0gJywgJyA+Pj49JywgJyAmPSAnLCAnIF49ICcsICcgfD0gJywgJyAsICcsXG4vLyAgLFxuXG4gIC8vIC4gaXMgc3BlY2lhbCwgc28gdGVzdCBpdCBhcyBhIGdyb3VwIG9mIHJpZ2h0LXVuYXJ5IG9wcywgYSBzcGVjaWFsIGV4cHJNYWtlciBmb3IgcHJvcGVydHkgYWNjZXNzLCBhbmQgYSBzcGVjaWFsIGV4cHJNYWtlciBmb3IgdGhlIHhtbCBmaWx0ZXJpbmcgcHJlZGljYXRlIG9wZXJhdG9yXG4gIC8vIFwiIC4gXCIsXG5cbiAgLy8gQWRkZWQgYnkgRTRYXG4vLyAgXCIgOjogXCIsIFwiIC4uIFwiLCBcIiBAIFwiLFxuICAvLyBGcmVxdWVudCBjb21iaW5hdGlvbnMgb2YgRTRYIHRoaW5ncyAoYW5kIFwiKlwiIG5hbWVzcGFjZSwgd2hpY2ggaXNuJ3QgcHJvZHVjZWQgYnkgdGhpcyBmdXp6ZXIgb3RoZXJ3aXNlKVxuLy8gIFwiIC5AIFwiLCBcIiAuQCo6OiBcIiwgXCIgLkB4OjogXCIsXG5dXG5cbi8vIGh0dHA6Ly9oZWF0ZmlsZXIucWZveC5ubC8jcnVuLGNvZGUsaGVyZVxuLy8gZnVuY3Rpb24gX2hhcyhvYmosIHBhdGgpIHtcbi8vICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGgpKSB7XG4vLyAgICAgcmV0dXJuIG9iaiAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwYXRoKVxuLy8gICB9XG4vLyAgIHZhciBsZW5ndGggPSBwYXRoLmxlbmd0aFxuLy8gICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4vLyAgICAgdmFyIGtleSA9IHBhdGhbaV1cbi8vICAgICBpZiAob2JqID09IG51bGwgfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4vLyAgICAgICByZXR1cm4gZmFsc2Vcbi8vICAgICB9XG4vLyAgICAgb2JqID0gb2JqW2tleV1cbi8vICAgfVxuLy8gICByZXR1cm4gISFsZW5ndGhcbi8vIH1cbi8vXG4vLyBfaGFzKHtlaDogdHJ1ZX0sICdvaCcpXG4vLyBfaGFzKHtlaDogdHJ1ZX0sICdlaCcpXG4vLyBfaGFzKHtlaDogdHJ1ZX0sICdlaCcpXG4vLyBfaGFzKHt9LCAnZWgnKVxuLy8gX2hhcyh7fSwgJ2VoJylcbi8vIF9oYXMoe30sICdlaCcpXG5cblxuLy8gKiBodHRwczovL2dpdGh1Yi5jb20vcWZveC9oZWF0ZmlsZXIvYmxvYi9tYXN0ZXIvbGliL3Rvay5qcyNMNjYwXG4vLyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9xZm94L2hlYXRmaWxlci9ibG9iL21hc3Rlci9saWIvcGFyLmpzI0wxMTMwXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGhlLWdyaWQvZmluaXRlZG9tYWluL2Jsb2IvbWFzdGVyL3NyYy90cmllLmpzI0w0ODFcbi8vIGZ1bmN0aW9uIGJ5dGVzKGIpIHtcbi8vICAgaWYgKGIgPCAxMDI0KSByZXR1cm4gYiArICcgYidcbi8vICAgYiAvPSAxMDI0XG4vLyAgIGlmIChiIDwgMTAyNCkgcmV0dXJuIH5+KGIgKiAxMDApIC8gMTAwICsgJyBrYidcbi8vICAgYiAvPSAxMDI0XG4vLyAgIGlmIChiIDwgMTAyNCkgcmV0dXJuIH5+KGIgKiAxMDApIC8gMTAwICsgJyBtYidcbi8vICAgYiAvPSAxMDI0XG4vLyAgIHJldHVybiB+fihiICogMTAwKSAvIDEwMCArICcgZ2InXG4vLyB9XG5cblxuLy8gLy8gZGlmZiBidXQgc2FtZSBuYW1lXG4vLyAvL1xuLy8gLy8gaHR0cHM6Ly9naXRodWIuY29tL3Byb2Nlc3NpbmctanMvcHJvY2Vzc2luZy1qcy9ibG9iL21hc3Rlci9zcmMvUDVGdW5jdGlvbnMvSmF2YVByb3h5RnVuY3Rpb25zLmpzXG4vLyAvLyBodHRwczovL2dpdGh1Yi5jb20vcHJvY2Vzc2luZy1qcy9wcm9jZXNzaW5nLWpzL2Jsb2IvbWFzdGVyL3NyYy9PYmplY3RzL3dlYmNvbG9ycy5qc1xuLy8gLy8gaHR0cHM6Ly9naXRodWIuY29tL3Byb2Nlc3NpbmctanMvcHJvY2Vzc2luZy1qcy9ibG9iL21hc3Rlci9zcmMvSGVscGVycy92aXJ0SGFzaENvZGUuanNcbi8vIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9jZXNzaW5nLWpzL3Byb2Nlc3NpbmctanMvYmxvYi9tYXN0ZXIvc3JjL09iamVjdHMvSGFzaE1hcC5qc1xuLy9cbi8vIC8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbi8vIGNvbnN0IEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nXG4vL1xuLy8gY2xhc3MgSGFzaCB7XG4vLyAgIC8qKlxuLy8gICAgKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuXG4vLyAgICAqXG4vLyAgICAqIEBwcml2YXRlXG4vLyAgICAqIEBjb25zdHJ1Y3RvclxuLy8gICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbi8vICAgICovXG4vLyAgIGNvbnN0cnVjdG9yKGVudHJpZXMpIHtcbi8vICAgICBsZXQgaW5kZXggPSAtMVxuLy8gICAgIGNvbnN0IGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aFxuLy9cbi8vICAgICB0aGlzLmNsZWFyKClcbi8vICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuLy8gICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2luZGV4XVxuLy8gICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKVxuLy8gICAgIH1cbi8vICAgfVxuLy9cbi8vICAgLyoqXG4vLyAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4vLyAgICAqXG4vLyAgICAqIEBtZW1iZXJPZiBIYXNoXG4vLyAgICAqL1xuLy8gICBjbGVhcigpIHtcbi8vICAgICB0aGlzLl9fZGF0YV9fID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuLy8gICAgIHRoaXMuc2l6ZSA9IDBcbi8vICAgfVxuLy9cbi8vICAgLyoqXG4vLyAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuLy8gICAgKlxuLy8gICAgKiBAbWVtYmVyT2YgSGFzaFxuLy8gICAgKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4vLyAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuLy8gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4vLyAgICAqL1xuLy8gICBkZWxldGUoa2V5KSB7XG4vLyAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldXG4vLyAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwXG4vLyAgICAgcmV0dXJuIHJlc3VsdFxuLy8gICB9XG4vL1xuLy8gICAvKipcbi8vICAgICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4vLyAgICAqXG4vLyAgICAqIEBtZW1iZXJPZiBIYXNoXG4vLyAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuLy8gICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4vLyAgICAqL1xuLy8gICBnZXQoa2V5KSB7XG4vLyAgICAgY29uc3QgZGF0YSA9IHRoaXMuX19kYXRhX19cbi8vICAgICBjb25zdCByZXN1bHQgPSBkYXRhW2tleV1cbi8vICAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdFxuLy8gICB9XG4vL1xuLy8gICAvKipcbi8vICAgICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuLy8gICAgKlxuLy8gICAgKiBAbWVtYmVyT2YgSGFzaFxuLy8gICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuLy8gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuLy8gICAgKi9cbi8vICAgaGFzKGtleSkge1xuLy8gICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9fZGF0YV9fXG4vLyAgICAgcmV0dXJuIGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkXG4vLyAgIH1cbi8vXG4vLyAgIC8qKlxuLy8gICAgKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4vLyAgICAqXG4vLyAgICAqIEBtZW1iZXJPZiBIYXNoXG4vLyAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuLy8gICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4vLyAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4vLyAgICAqL1xuLy8gICBzZXQoa2V5LCB2YWx1ZSkge1xuLy8gICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9fZGF0YV9fXG4vLyAgICAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMVxuLy8gICAgIGRhdGFba2V5XSA9IHZhbHVlID09PSB1bmRlZmluZWQgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlXG4vLyAgICAgcmV0dXJuIHRoaXNcbi8vICAgfVxuLy8gfVxuLy9cbi8vIGV4cG9ydCBkZWZhdWx0IEhhc2hcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLElBQUksU0FBUyxHQUFHOztFQUVkLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTztFQUNsSixLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUs7Ozs7Ozs7Ozs7Q0FVN0k7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsifQ==