diff --git a/bin/uglifyjs b/bin/uglifyjs index 8cbb3cadd87..8f1587121e4 100755 --- a/bin/uglifyjs +++ b/bin/uglifyjs @@ -232,9 +232,12 @@ function run() { var result = { _class: "AST_" + value.TYPE }; - value.CTOR.PROPS.forEach(function(prop) { - result[prop] = value[prop]; - }); + var ctor = value.CTOR; + do { + ctor.SELF_PROPS.forEach(function(prop) { + result[prop] = value[prop]; + }); + } while (ctor = ctor.BASE); return result; } return value; diff --git a/lib/ast.js b/lib/ast.js index 0918574d11c..4d8b1431ed0 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -47,31 +47,35 @@ function DEFNODE(type, props, methods, base) { if (arguments.length < 4) base = AST_Node; if (!props) props = []; else 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] + ";"; - } - var proto = base && new base; - if (proto && proto.initialize || (methods && methods.initialize)) - code += "this.initialize();"; - code += "}}"; + var code = "return function AST_" + type + "(props) {\ + if (props) {\ + var ctor = this.CTOR;\ + do {\ + var self_props = ctor.SELF_PROPS;\ + for (var i = self_props.length; i;) {\ + var k = self_props[--i];\ + this[k] = props[k];\ + }\ + } while (ctor = ctor.BASE);\ + if (this.initialize) {\ + this.initialize();\ + }\ + }\ + }"; var ctor = new Function(code)(); + var proto = base && new base; if (proto) { ctor.prototype = proto; ctor.BASE = base; } if (base) base.SUBCLASSES.push(ctor); ctor.prototype.CTOR = ctor; - ctor.PROPS = props || null; - ctor.SELF_PROPS = self_props; + ctor.SELF_PROPS = props; ctor.SUBCLASSES = []; if (type) { ctor.prototype.TYPE = ctor.TYPE = type; } - if (methods) for (i in methods) if (HOP(methods, i)) { + if (methods) for (var i in methods) if (HOP(methods, i)) { if (/^\$/.test(i)) { ctor[i.substr(1)] = methods[i]; } else {