From bbff7403fbf46f9ad92240ac213df8d30ef31b64 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 20 Sep 2018 02:56:13 +0200 Subject: update packages --- node_modules/uglify-js/lib/ast.js | 211 ++++++++++++++++++++++---------------- 1 file changed, 124 insertions(+), 87 deletions(-) (limited to 'node_modules/uglify-js/lib/ast.js') diff --git a/node_modules/uglify-js/lib/ast.js b/node_modules/uglify-js/lib/ast.js index 997486c29..09c29b416 100644 --- a/node_modules/uglify-js/lib/ast.js +++ b/node_modules/uglify-js/lib/ast.js @@ -44,21 +44,21 @@ "use strict"; function DEFNODE(type, props, methods, base) { - if (arguments.length < 4) base = AST_Node; - if (!props) props = []; - else props = props.split(/\s+/); + if (typeof base === "undefined") base = AST_Node; + props = props ? props.split(/\s+/) : []; var self_props = props; - if (base && base.PROPS) - props = props.concat(base.PROPS); - var code = "return function AST_" + type + "(props){ if (props) { "; - for (var i = props.length; --i >= 0;) { - code += "this." + props[i] + " = props." + props[i] + ";"; - } + if (base && base.PROPS) props = props.concat(base.PROPS); + var code = [ + "return function AST_", type, "(props){", + "if(props){", + ]; + props.forEach(function(prop) { + code.push("this.", prop, "=props.", prop, ";"); + }); var proto = base && new base; - if (proto && proto.initialize || (methods && methods.initialize)) - code += "this.initialize();"; - code += "}}"; - var ctor = new Function(code)(); + if (proto && proto.initialize || methods && methods.initialize) code.push("this.initialize();"); + code.push("}}"); + var ctor = new Function(code.join(""))(); if (proto) { ctor.prototype = proto; ctor.BASE = base; @@ -71,11 +71,11 @@ function DEFNODE(type, props, methods, base) { if (type) { ctor.prototype.TYPE = ctor.TYPE = type; } - if (methods) for (i in methods) if (HOP(methods, i)) { - if (/^\$/.test(i)) { - ctor[i.substr(1)] = methods[i]; + if (methods) for (var name in methods) if (HOP(methods, name)) { + if (/^\$/.test(name)) { + ctor[name.substr(1)] = methods[name]; } else { - ctor.prototype[i] = methods[i]; + ctor.prototype[name] = methods[name]; } } ctor.DEFMETHOD = function(name, method) { @@ -85,9 +85,9 @@ function DEFNODE(type, props, methods, base) { exports["AST_" + type] = ctor; } return ctor; -}; +} -var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before file raw", { +var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before comments_after file raw", { }, null); var AST_Node = DEFNODE("Node", "start end", { @@ -118,10 +118,8 @@ var AST_Node = DEFNODE("Node", "start end", { } }, null); -AST_Node.warn_function = null; AST_Node.warn = function(txt, props) { - if (AST_Node.warn_function) - AST_Node.warn_function(string_template(txt, props)); + if (AST_Node.warn_function) AST_Node.warn_function(string_template(txt, props)); }; /* -----[ statements ]----- */ @@ -148,7 +146,7 @@ var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", { body: "[AST_Node] an expression node (should not be instanceof AST_Statement)" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.body._walk(visitor); }); } @@ -158,19 +156,18 @@ function walk_body(node, visitor) { var body = node.body; if (body instanceof AST_Statement) { body._walk(visitor); - } - else for (var i = 0, len = body.length; i < len; i++) { - body[i]._walk(visitor); - } -}; + } else body.forEach(function(node) { + node._walk(visitor); + }); +} var AST_Block = DEFNODE("Block", "body", { - $documentation: "A body of statements (usually bracketed)", + $documentation: "A body of statements (usually braced)", $propdoc: { body: "[AST_Statement*] an array of statements" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { walk_body(this, visitor); }); } @@ -197,7 +194,7 @@ var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", { label: "[AST_Label] a label definition" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.label._walk(visitor); this.body._walk(visitor); }); @@ -208,8 +205,7 @@ var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", { var label = node.label; var def = this.label; node.walk(new TreeWalker(function(node) { - if (node instanceof AST_LoopControl - && node.label && node.label.thedef === def) { + if (node instanceof AST_LoopControl && node.label && node.label.thedef === def) { node.label.thedef = label; label.references.push(node); } @@ -233,7 +229,7 @@ var AST_DWLoop = DEFNODE("DWLoop", "condition", { var AST_Do = DEFNODE("Do", null, { $documentation: "A `do` statement", _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.body._walk(visitor); this.condition._walk(visitor); }); @@ -243,7 +239,7 @@ var AST_Do = DEFNODE("Do", null, { var AST_While = DEFNODE("While", null, { $documentation: "A `while` statement", _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.condition._walk(visitor); this.body._walk(visitor); }); @@ -258,7 +254,7 @@ var AST_For = DEFNODE("For", "init condition step", { step: "[AST_Node?] the `for` update clause, or null if empty" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { if (this.init) this.init._walk(visitor); if (this.condition) this.condition._walk(visitor); if (this.step) this.step._walk(visitor); @@ -267,15 +263,14 @@ var AST_For = DEFNODE("For", "init condition step", { } }, AST_IterationStatement); -var AST_ForIn = DEFNODE("ForIn", "init name object", { +var AST_ForIn = DEFNODE("ForIn", "init object", { $documentation: "A `for ... in` statement", $propdoc: { init: "[AST_Node] the `for/in` initialization code", - name: "[AST_SymbolRef?] the loop variable, only if `init` is AST_Var", object: "[AST_Node] the object that we're looping through" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.init._walk(visitor); this.object._walk(visitor); this.body._walk(visitor); @@ -289,7 +284,7 @@ var AST_With = DEFNODE("With", "expression", { expression: "[AST_Node] the `with` expression" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.expression._walk(visitor); this.body._walk(visitor); }); @@ -309,6 +304,16 @@ var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes", cname: "[integer/S] current index for mangling variables (used internally by the mangler)", }, + clone: function(deep) { + var node = this._clone(deep); + if (this.variables) node.variables = this.variables.clone(); + if (this.functions) node.functions = this.functions.clone(); + if (this.enclosed) node.enclosed = this.enclosed.slice(); + return node; + }, + pinned: function() { + return this.uses_eval || this.uses_with; + } }, AST_Block); var AST_Toplevel = DEFNODE("Toplevel", "globals", { @@ -320,12 +325,29 @@ var AST_Toplevel = DEFNODE("Toplevel", "globals", { var body = this.body; var wrapped_tl = "(function(exports){'$ORIG';})(typeof " + name + "=='undefined'?(" + name + "={}):" + name + ");"; wrapped_tl = parse(wrapped_tl); - wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){ + wrapped_tl = wrapped_tl.transform(new TreeTransformer(function(node) { if (node instanceof AST_Directive && node.value == "$ORIG") { return MAP.splice(body); } })); return wrapped_tl; + }, + wrap_enclose: function(args_values) { + if (typeof args_values != "string") args_values = ""; + var index = args_values.indexOf(":"); + if (index < 0) index = args_values.length; + var body = this.body; + return parse([ + "(function(", + args_values.slice(0, index), + '){"$ORIG"})(', + args_values.slice(index + 1), + ")" + ].join("")).transform(new TreeTransformer(function(node) { + if (node instanceof AST_Directive && node.value == "$ORIG") { + return MAP.splice(body); + } + })); } }, AST_Scope); @@ -337,12 +359,11 @@ var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments", { uses_arguments: "[boolean/S] tells whether this function accesses the arguments array" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { if (this.name) this.name._walk(visitor); - var argnames = this.argnames; - for (var i = 0, len = argnames.length; i < len; i++) { - argnames[i]._walk(visitor); - } + this.argnames.forEach(function(argname) { + argname._walk(visitor); + }); walk_body(this, visitor); }); } @@ -372,7 +393,7 @@ var AST_Exit = DEFNODE("Exit", "value", { value: "[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return" }, _walk: function(visitor) { - return visitor._visit(this, this.value && function(){ + return visitor._visit(this, this.value && function() { this.value._walk(visitor); }); } @@ -392,7 +413,7 @@ var AST_LoopControl = DEFNODE("LoopControl", "label", { label: "[AST_LabelRef?] the label, or null if none", }, _walk: function(visitor) { - return visitor._visit(this, this.label && function(){ + return visitor._visit(this, this.label && function() { this.label._walk(visitor); }); } @@ -415,7 +436,7 @@ var AST_If = DEFNODE("If", "condition alternative", { alternative: "[AST_Statement?] the `else` part, or null if not present" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.condition._walk(visitor); this.body._walk(visitor); if (this.alternative) this.alternative._walk(visitor); @@ -431,7 +452,7 @@ var AST_Switch = DEFNODE("Switch", "expression", { expression: "[AST_Node] the `switch` “discriminant”" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.expression._walk(visitor); walk_body(this, visitor); }); @@ -452,7 +473,7 @@ var AST_Case = DEFNODE("Case", "expression", { expression: "[AST_Node] the `case` expression" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.expression._walk(visitor); walk_body(this, visitor); }); @@ -468,7 +489,7 @@ var AST_Try = DEFNODE("Try", "bcatch bfinally", { bfinally: "[AST_Finally?] the finally block, or null if not present" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { walk_body(this, visitor); if (this.bcatch) this.bcatch._walk(visitor); if (this.bfinally) this.bfinally._walk(visitor); @@ -482,7 +503,7 @@ var AST_Catch = DEFNODE("Catch", "argname", { argname: "[AST_SymbolCatch] symbol for the exception" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.argname._walk(visitor); walk_body(this, visitor); }); @@ -501,11 +522,10 @@ var AST_Definitions = DEFNODE("Definitions", "definitions", { definitions: "[AST_VarDef*] array of variable definitions" }, _walk: function(visitor) { - return visitor._visit(this, function(){ - var definitions = this.definitions; - for (var i = 0, len = definitions.length; i < len; i++) { - definitions[i]._walk(visitor); - } + return visitor._visit(this, function() { + this.definitions.forEach(function(defn) { + defn._walk(visitor); + }); }); } }, AST_Statement); @@ -521,7 +541,7 @@ var AST_VarDef = DEFNODE("VarDef", "name value", { value: "[AST_Node?] initializer, or null of there's no initializer" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.name._walk(visitor); if (this.value) this.value._walk(visitor); }); @@ -537,12 +557,11 @@ var AST_Call = DEFNODE("Call", "expression args", { args: "[AST_Node*] array of arguments" }, _walk: function(visitor) { - return visitor._visit(this, function(){ - var args = this.args; - for (var i = 0, len = args.length; i < len; i++) { - args[i]._walk(visitor); - } + return visitor._visit(this, function() { this.expression._walk(visitor); + this.args.forEach(function(node) { + node._walk(visitor); + }); }); } }); @@ -557,7 +576,7 @@ var AST_Sequence = DEFNODE("Sequence", "expressions", { expressions: "[AST_Node*] array of expressions (at least two)" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.expressions.forEach(function(node) { node._walk(visitor); }); @@ -576,7 +595,7 @@ var AST_PropAccess = DEFNODE("PropAccess", "expression property", { var AST_Dot = DEFNODE("Dot", null, { $documentation: "A dotted property access expression", _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.expression._walk(visitor); }); } @@ -585,7 +604,7 @@ var AST_Dot = DEFNODE("Dot", null, { var AST_Sub = DEFNODE("Sub", null, { $documentation: "Index-style property access, i.e. `a[\"foo\"]`", _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.expression._walk(visitor); this.property._walk(visitor); }); @@ -599,7 +618,7 @@ var AST_Unary = DEFNODE("Unary", "operator expression", { expression: "[AST_Node] expression that this unary operator applies to" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.expression._walk(visitor); }); } @@ -621,7 +640,7 @@ var AST_Binary = DEFNODE("Binary", "operator left right", { right: "[AST_Node] right-hand side expression" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.left._walk(visitor); this.right._walk(visitor); }); @@ -636,7 +655,7 @@ var AST_Conditional = DEFNODE("Conditional", "condition consequent alternative", alternative: "[AST_Node]" }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.condition._walk(visitor); this.consequent._walk(visitor); this.alternative._walk(visitor); @@ -656,11 +675,10 @@ var AST_Array = DEFNODE("Array", "elements", { elements: "[AST_Node*] array of elements" }, _walk: function(visitor) { - return visitor._visit(this, function(){ - var elements = this.elements; - for (var i = 0, len = elements.length; i < len; i++) { - elements[i]._walk(visitor); - } + return visitor._visit(this, function() { + this.elements.forEach(function(element) { + element._walk(visitor); + }); }); } }); @@ -671,11 +689,10 @@ var AST_Object = DEFNODE("Object", "properties", { properties: "[AST_ObjectProperty*] array of properties" }, _walk: function(visitor) { - return visitor._visit(this, function(){ - var properties = this.properties; - for (var i = 0, len = properties.length; i < len; i++) { - properties[i]._walk(visitor); - } + return visitor._visit(this, function() { + this.properties.forEach(function(prop) { + prop._walk(visitor); + }); }); } }); @@ -683,11 +700,11 @@ var AST_Object = DEFNODE("Object", "properties", { var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", { $documentation: "Base class for literal object properties", $propdoc: { - key: "[string] the property name converted to a string for ObjectKeyVal. For setters and getters this is an AST_SymbolAccessor.", - value: "[AST_Node] property value. For setters and getters this is an AST_Accessor." + key: "[string|AST_SymbolAccessor] property name. For ObjectKeyVal this is a string. For getters and setters this is an AST_SymbolAccessor.", + value: "[AST_Node] property value. For getters and setters this is an AST_Accessor." }, _walk: function(visitor) { - return visitor._visit(this, function(){ + return visitor._visit(this, function() { this.value._walk(visitor); }); } @@ -814,12 +831,12 @@ var AST_NaN = DEFNODE("NaN", null, { var AST_Undefined = DEFNODE("Undefined", null, { $documentation: "The `undefined` value", - value: (function(){}()) + value: function(){}() }, AST_Atom); var AST_Hole = DEFNODE("Hole", null, { $documentation: "A hole in an array", - value: (function(){}()) + value: function(){}() }, AST_Atom); var AST_Infinity = DEFNODE("Infinity", null, { @@ -847,11 +864,11 @@ function TreeWalker(callback) { this.visit = callback; this.stack = []; this.directives = Object.create(null); -}; +} TreeWalker.prototype = { _visit: function(node, descend) { this.push(node); - var ret = this.visit(node, descend ? function(){ + var ret = this.visit(node, descend ? function() { descend.call(node); } : noop); if (!ret && descend) { @@ -910,5 +927,25 @@ TreeWalker.prototype = { || node instanceof AST_Break && x instanceof AST_Switch) return x; } + }, + in_boolean_context: function() { + var self = this.self(); + for (var i = 0, p; p = this.parent(i); i++) { + if (p instanceof AST_SimpleStatement + || p instanceof AST_Conditional && p.condition === self + || p instanceof AST_DWLoop && p.condition === self + || p instanceof AST_For && p.condition === self + || p instanceof AST_If && p.condition === self + || p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self) { + return true; + } + if (p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||") + || p instanceof AST_Conditional + || p.tail_node() === self) { + self = p; + } else { + return false; + } + } } }; -- cgit v1.2.3