/*********************************************************************** A JavaScript tokenizer / parser / beautifier / compressor. https://github.com/mishoo/UglifyJS2 -------------------------------- (C) --------------------------------- Author: Mihai Bazon http://mihai.bazon.net/blog Distributed under the BSD license: Copyright 2012 (c) Mihai Bazon Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
aboutsummaryrefslogtreecommitdiff

.name; try { throw err; } catch (e) { return e.stack; } } }); } function DefaultsError(msg, defs) { this.message = msg; this.defs = defs; } DefaultsError.prototype = Object.create(Error.prototype); DefaultsError.prototype.constructor = DefaultsError; DefaultsError.prototype.name = "DefaultsError"; configure_error_stack(DefaultsError); function defaults(args, defs, croak) { if (croak) for (var i in args) { if (HOP(args, i) && !HOP(defs, i)) throw new DefaultsError("`" + i + "` is not a supported option", defs); } for (var i in args) { if (HOP(args, i)) defs[i] = args[i]; } return defs; } function merge(obj, ext) { var count = 0; for (var i in ext) if (HOP(ext, i)) { obj[i] = ext[i]; count++; } return count; } function noop() {} function return_false() { return false; } function return_true() { return true; } function return_this() { return this; } function return_null() { return null; } var List = (function() { function List(a, f, backwards) { var ret = [], top = [], i; function doit() { var val = f(a[i], i); var is_last = val instanceof Last; if (is_last) val = val.v; if (val instanceof AtTop) { val = val.v; if (val instanceof Splice) { top.push.apply(top, backwards ? val.v.slice().reverse() : val.v); } else { top.push(val); } } else if (val !== skip) { if (val instanceof Splice) { ret.push.apply(ret, backwards ? val.v.slice().reverse() : val.v); } else { ret.push(val); } } return is_last; } if (Array.isArray(a)) { if (backwards) { for (i = a.length; --i >= 0;) if (doit()) break; ret.reverse(); top.reverse(); } else { for (i = 0; i < a.length; ++i) if (doit()) break; } } else { for (i in a) if (HOP(a, i)) if (doit()) break; } return top.concat(ret); } List.at_top = function(val) { return new AtTop(val); }; List.splice = function(val) { return new Splice(val); }; List.last = function(val) { return new Last(val); }; var skip = List.skip = {}; function AtTop(val) { this.v = val; } function Splice(val) { this.v = val; } function Last(val) { this.v = val; } return List; })(); function push_uniq(array, el) { if (array.indexOf(el) < 0) return array.push(el); } function string_template(text, props) { return text.replace(/\{(.+?)\}/g, function(str, p) { return props && props[p]; }); } function remove(array, el) { var index = array.indexOf(el); if (index >= 0) array.splice(index, 1); } function makePredicate(words) { if (!Array.isArray(words)) words = words.split(" "); var map = Object.create(null); words.forEach(function(word) { map[word] = true; }); return map; } function all(array, predicate) { for (var i = array.length; --i >= 0;) if (!predicate(array[i], i)) return false; return true; } function Dictionary() { this._values = Object.create(null); this._size = 0; } Dictionary.prototype = { set: function(key, val) { if (!this.has(key)) ++this._size; this._values["$" + key] = val; return this; }, add: function(key, val) { if (this.has(key)) { this.get(key).push(val); } else { this.set(key, [ val ]); } return this; }, get: function(key) { return this._values["$" + key] }, del: function(key) { if (this.has(key)) { --this._size; delete this._values["$" + key]; } return this; }, has: function(key) { return ("$" + key) in this._values }, all: function(predicate) { for (var i in this._values) if (!predicate(this._values[i], i.substr(1))) return false; return true; }, each: function(f) { for (var i in this._values) f(this._values[i], i.substr(1)); }, size: function() { return this._size; }, map: function(f) { var ret = []; for (var i in this._values) ret.push(f(this._values[i], i.substr(1))); return ret; }, clone: function() { var ret = new Dictionary(); for (var i in this._values) ret._values[i] = this._values[i]; ret._size = this._size; return ret; }, toObject: function() { return this._values } }; Dictionary.fromObject = function(obj) { var dict = new Dictionary(); dict._size = merge(dict._values, obj); return dict; }; function HOP(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } // return true if the node at the top of the stack (that means the // innermost node in the current output) is lexically the first in // a statement. function first_in_statement(stack) { var node = stack.parent(-1); for (var i = 0, p; p = stack.parent(i++); node = p) { if (p.TYPE == "Call") { if (p.expression === node) continue; } else if (p instanceof AST_Binary) { if (p.left === node) continue; } else if (p instanceof AST_Conditional) { if (p.condition === node) continue; } else if (p instanceof AST_PropAccess) { if (p.expression === node) continue; } else if (p instanceof AST_Sequence) { if (p.expressions[0] === node) continue; } else if (p instanceof AST_Statement) { return p.body === node; } else if (p instanceof AST_UnaryPostfix) { if (p.expression === node) continue; } return false; } }