mirror of
https://github.com/jashkenas/coffeescript.git
synced 2026-01-15 01:38:13 -05:00
Fixes #2773 -- tricky dependency ordering when overriding bound functions.
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
// Generated by CoffeeScript 1.6.1
|
// Generated by CoffeeScript 1.6.1
|
||||||
(function() {
|
(function() {
|
||||||
var Access, Arr, Assign, Base, Block, Call, Class, Closure, Code, CodeFragment, Comment, Existence, Extends, For, IDENTIFIER, IDENTIFIER_STR, IS_STRING, If, In, Index, LEVEL_ACCESS, LEVEL_COND, LEVEL_LIST, LEVEL_OP, LEVEL_PAREN, LEVEL_TOP, Literal, METHOD_DEF, NEGATE, NO, Obj, Op, Param, Parens, RESERVED, Range, Return, SIMPLENUM, STRICT_PROSCRIBED, Scope, Slice, Splat, Switch, TAB, THIS, Throw, Try, UTILITIES, Value, While, YES, addLocationDataFn, compact, del, ends, extend, flatten, fragmentsToText, last, locationDataToString, merge, multident, some, starts, unfoldSoak, utility, _ref, _ref1,
|
var Access, Arr, Assign, Base, Block, Call, Class, Closure, Code, CodeFragment, Comment, Existence, Extends, For, IDENTIFIER, IDENTIFIER_STR, IS_STRING, If, In, Index, LEVEL_ACCESS, LEVEL_COND, LEVEL_LIST, LEVEL_OP, LEVEL_PAREN, LEVEL_TOP, Literal, METHOD_DEF, NEGATE, NO, Obj, Op, Param, Parens, RESERVED, Range, Return, SIMPLENUM, STRICT_PROSCRIBED, Scope, Slice, Splat, Switch, TAB, THIS, Throw, Try, UTILITIES, Value, While, YES, addLocationDataFn, compact, del, ends, extend, flatten, fragmentsToText, last, locationDataToString, merge, multident, some, starts, unfoldSoak, utility, _ref, _ref1, _ref2, _ref3,
|
||||||
__hasProp = {}.hasOwnProperty,
|
__hasProp = {}.hasOwnProperty,
|
||||||
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
||||||
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
|
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
|
||||||
@@ -554,7 +554,8 @@
|
|||||||
__extends(Undefined, _super);
|
__extends(Undefined, _super);
|
||||||
|
|
||||||
function Undefined() {
|
function Undefined() {
|
||||||
return Undefined.__super__.constructor.apply(this, arguments);
|
_ref2 = Undefined.__super__.constructor.apply(this, arguments);
|
||||||
|
return _ref2;
|
||||||
}
|
}
|
||||||
|
|
||||||
Undefined.prototype.isAssignable = NO;
|
Undefined.prototype.isAssignable = NO;
|
||||||
@@ -574,7 +575,8 @@
|
|||||||
__extends(Null, _super);
|
__extends(Null, _super);
|
||||||
|
|
||||||
function Null() {
|
function Null() {
|
||||||
return Null.__super__.constructor.apply(this, arguments);
|
_ref3 = Null.__super__.constructor.apply(this, arguments);
|
||||||
|
return _ref3;
|
||||||
}
|
}
|
||||||
|
|
||||||
Null.prototype.isAssignable = NO;
|
Null.prototype.isAssignable = NO;
|
||||||
@@ -628,8 +630,8 @@
|
|||||||
Return.prototype.jumps = THIS;
|
Return.prototype.jumps = THIS;
|
||||||
|
|
||||||
Return.prototype.compileToFragments = function(o, level) {
|
Return.prototype.compileToFragments = function(o, level) {
|
||||||
var expr, _ref2;
|
var expr, _ref4;
|
||||||
expr = (_ref2 = this.expression) != null ? _ref2.makeReturn() : void 0;
|
expr = (_ref4 = this.expression) != null ? _ref4.makeReturn() : void 0;
|
||||||
if (expr && !(expr instanceof Return)) {
|
if (expr && !(expr instanceof Return)) {
|
||||||
return expr.compileToFragments(o, level);
|
return expr.compileToFragments(o, level);
|
||||||
} else {
|
} else {
|
||||||
@@ -700,10 +702,10 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Value.prototype.isAtomic = function() {
|
Value.prototype.isAtomic = function() {
|
||||||
var node, _i, _len, _ref2;
|
var node, _i, _len, _ref4;
|
||||||
_ref2 = this.properties.concat(this.base);
|
_ref4 = this.properties.concat(this.base);
|
||||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
|
||||||
node = _ref2[_i];
|
node = _ref4[_i];
|
||||||
if (node.soak || node instanceof Call) {
|
if (node.soak || node instanceof Call) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -780,17 +782,17 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Value.prototype.unfoldSoak = function(o) {
|
Value.prototype.unfoldSoak = function(o) {
|
||||||
var _ref2,
|
var _ref4,
|
||||||
_this = this;
|
_this = this;
|
||||||
return (_ref2 = this.unfoldedSoak) != null ? _ref2 : this.unfoldedSoak = (function() {
|
return (_ref4 = this.unfoldedSoak) != null ? _ref4 : this.unfoldedSoak = (function() {
|
||||||
var fst, i, ifn, prop, ref, snd, _i, _len, _ref3, _ref4;
|
var fst, i, ifn, prop, ref, snd, _i, _len, _ref5, _ref6;
|
||||||
if (ifn = _this.base.unfoldSoak(o)) {
|
if (ifn = _this.base.unfoldSoak(o)) {
|
||||||
(_ref3 = ifn.body.properties).push.apply(_ref3, _this.properties);
|
(_ref5 = ifn.body.properties).push.apply(_ref5, _this.properties);
|
||||||
return ifn;
|
return ifn;
|
||||||
}
|
}
|
||||||
_ref4 = _this.properties;
|
_ref6 = _this.properties;
|
||||||
for (i = _i = 0, _len = _ref4.length; _i < _len; i = ++_i) {
|
for (i = _i = 0, _len = _ref6.length; _i < _len; i = ++_i) {
|
||||||
prop = _ref4[i];
|
prop = _ref6[i];
|
||||||
if (!prop.soak) {
|
if (!prop.soak) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -854,8 +856,8 @@
|
|||||||
Call.prototype.children = ['variable', 'args'];
|
Call.prototype.children = ['variable', 'args'];
|
||||||
|
|
||||||
Call.prototype.newInstance = function() {
|
Call.prototype.newInstance = function() {
|
||||||
var base, _ref2;
|
var base, _ref4;
|
||||||
base = ((_ref2 = this.variable) != null ? _ref2.base : void 0) || this.variable;
|
base = ((_ref4 = this.variable) != null ? _ref4.base : void 0) || this.variable;
|
||||||
if (base instanceof Call && !base.isNew) {
|
if (base instanceof Call && !base.isNew) {
|
||||||
base.newInstance();
|
base.newInstance();
|
||||||
} else {
|
} else {
|
||||||
@@ -888,13 +890,13 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Call.prototype.unfoldSoak = function(o) {
|
Call.prototype.unfoldSoak = function(o) {
|
||||||
var call, ifn, left, list, rite, _i, _len, _ref2, _ref3;
|
var call, ifn, left, list, rite, _i, _len, _ref4, _ref5;
|
||||||
if (this.soak) {
|
if (this.soak) {
|
||||||
if (this.variable) {
|
if (this.variable) {
|
||||||
if (ifn = unfoldSoak(o, this, 'variable')) {
|
if (ifn = unfoldSoak(o, this, 'variable')) {
|
||||||
return ifn;
|
return ifn;
|
||||||
}
|
}
|
||||||
_ref2 = new Value(this.variable).cacheReference(o), left = _ref2[0], rite = _ref2[1];
|
_ref4 = new Value(this.variable).cacheReference(o), left = _ref4[0], rite = _ref4[1];
|
||||||
} else {
|
} else {
|
||||||
left = new Literal(this.superReference(o));
|
left = new Literal(this.superReference(o));
|
||||||
rite = new Value(left);
|
rite = new Value(left);
|
||||||
@@ -922,9 +924,9 @@
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ref3 = list.reverse();
|
_ref5 = list.reverse();
|
||||||
for (_i = 0, _len = _ref3.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref5.length; _i < _len; _i++) {
|
||||||
call = _ref3[_i];
|
call = _ref5[_i];
|
||||||
if (ifn) {
|
if (ifn) {
|
||||||
if (call.variable instanceof Call) {
|
if (call.variable instanceof Call) {
|
||||||
call.variable = ifn;
|
call.variable = ifn;
|
||||||
@@ -938,18 +940,18 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Call.prototype.compileNode = function(o) {
|
Call.prototype.compileNode = function(o) {
|
||||||
var arg, argIndex, compiledArgs, compiledArray, fragments, preface, _i, _len, _ref2, _ref3;
|
var arg, argIndex, compiledArgs, compiledArray, fragments, preface, _i, _len, _ref4, _ref5;
|
||||||
if ((_ref2 = this.variable) != null) {
|
if ((_ref4 = this.variable) != null) {
|
||||||
_ref2.front = this.front;
|
_ref4.front = this.front;
|
||||||
}
|
}
|
||||||
compiledArray = Splat.compileSplattedArray(o, this.args, true);
|
compiledArray = Splat.compileSplattedArray(o, this.args, true);
|
||||||
if (compiledArray.length) {
|
if (compiledArray.length) {
|
||||||
return this.compileSplat(o, compiledArray);
|
return this.compileSplat(o, compiledArray);
|
||||||
}
|
}
|
||||||
compiledArgs = [];
|
compiledArgs = [];
|
||||||
_ref3 = this.args;
|
_ref5 = this.args;
|
||||||
for (argIndex = _i = 0, _len = _ref3.length; _i < _len; argIndex = ++_i) {
|
for (argIndex = _i = 0, _len = _ref5.length; _i < _len; argIndex = ++_i) {
|
||||||
arg = _ref3[argIndex];
|
arg = _ref5[argIndex];
|
||||||
if (argIndex) {
|
if (argIndex) {
|
||||||
compiledArgs.push(this.makeCode(", "));
|
compiledArgs.push(this.makeCode(", "));
|
||||||
}
|
}
|
||||||
@@ -1093,23 +1095,23 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
Range.prototype.compileVariables = function(o) {
|
Range.prototype.compileVariables = function(o) {
|
||||||
var step, _ref2, _ref3, _ref4, _ref5;
|
var step, _ref4, _ref5, _ref6, _ref7;
|
||||||
o = merge(o, {
|
o = merge(o, {
|
||||||
top: true
|
top: true
|
||||||
});
|
});
|
||||||
_ref2 = this.cacheToCodeFragments(this.from.cache(o, LEVEL_LIST)), this.fromC = _ref2[0], this.fromVar = _ref2[1];
|
_ref4 = this.cacheToCodeFragments(this.from.cache(o, LEVEL_LIST)), this.fromC = _ref4[0], this.fromVar = _ref4[1];
|
||||||
_ref3 = this.cacheToCodeFragments(this.to.cache(o, LEVEL_LIST)), this.toC = _ref3[0], this.toVar = _ref3[1];
|
_ref5 = this.cacheToCodeFragments(this.to.cache(o, LEVEL_LIST)), this.toC = _ref5[0], this.toVar = _ref5[1];
|
||||||
if (step = del(o, 'step')) {
|
if (step = del(o, 'step')) {
|
||||||
_ref4 = this.cacheToCodeFragments(step.cache(o, LEVEL_LIST)), this.step = _ref4[0], this.stepVar = _ref4[1];
|
_ref6 = this.cacheToCodeFragments(step.cache(o, LEVEL_LIST)), this.step = _ref6[0], this.stepVar = _ref6[1];
|
||||||
}
|
}
|
||||||
_ref5 = [this.fromVar.match(SIMPLENUM), this.toVar.match(SIMPLENUM)], this.fromNum = _ref5[0], this.toNum = _ref5[1];
|
_ref7 = [this.fromVar.match(SIMPLENUM), this.toVar.match(SIMPLENUM)], this.fromNum = _ref7[0], this.toNum = _ref7[1];
|
||||||
if (this.stepVar) {
|
if (this.stepVar) {
|
||||||
return this.stepNum = this.stepVar.match(SIMPLENUM);
|
return this.stepNum = this.stepVar.match(SIMPLENUM);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Range.prototype.compileNode = function(o) {
|
Range.prototype.compileNode = function(o) {
|
||||||
var cond, condPart, from, gt, idx, idxName, known, lt, namedIndex, stepPart, to, varPart, _ref2, _ref3;
|
var cond, condPart, from, gt, idx, idxName, known, lt, namedIndex, stepPart, to, varPart, _ref4, _ref5;
|
||||||
if (!this.fromVar) {
|
if (!this.fromVar) {
|
||||||
this.compileVariables(o);
|
this.compileVariables(o);
|
||||||
}
|
}
|
||||||
@@ -1127,8 +1129,8 @@
|
|||||||
if (this.step !== this.stepVar) {
|
if (this.step !== this.stepVar) {
|
||||||
varPart += ", " + this.step;
|
varPart += ", " + this.step;
|
||||||
}
|
}
|
||||||
_ref2 = ["" + idx + " <" + this.equals, "" + idx + " >" + this.equals], lt = _ref2[0], gt = _ref2[1];
|
_ref4 = ["" + idx + " <" + this.equals, "" + idx + " >" + this.equals], lt = _ref4[0], gt = _ref4[1];
|
||||||
condPart = this.stepNum ? +this.stepNum > 0 ? "" + lt + " " + this.toVar : "" + gt + " " + this.toVar : known ? ((_ref3 = [+this.fromNum, +this.toNum], from = _ref3[0], to = _ref3[1], _ref3), from <= to ? "" + lt + " " + to : "" + gt + " " + to) : (cond = this.stepVar ? "" + this.stepVar + " > 0" : "" + this.fromVar + " <= " + this.toVar, "" + cond + " ? " + lt + " " + this.toVar + " : " + gt + " " + this.toVar);
|
condPart = this.stepNum ? +this.stepNum > 0 ? "" + lt + " " + this.toVar : "" + gt + " " + this.toVar : known ? ((_ref5 = [+this.fromNum, +this.toNum], from = _ref5[0], to = _ref5[1], _ref5), from <= to ? "" + lt + " " + to : "" + gt + " " + to) : (cond = this.stepVar ? "" + this.stepVar + " > 0" : "" + this.fromVar + " <= " + this.toVar, "" + cond + " ? " + lt + " " + this.toVar + " : " + gt + " " + this.toVar);
|
||||||
stepPart = this.stepVar ? "" + idx + " += " + this.stepVar : known ? namedIndex ? from <= to ? "++" + idx : "--" + idx : from <= to ? "" + idx + "++" : "" + idx + "--" : namedIndex ? "" + cond + " ? ++" + idx + " : --" + idx : "" + cond + " ? " + idx + "++ : " + idx + "--";
|
stepPart = this.stepVar ? "" + idx + " += " + this.stepVar : known ? namedIndex ? from <= to ? "++" + idx : "--" + idx : from <= to ? "" + idx + "++" : "" + idx + "--" : namedIndex ? "" + cond + " ? ++" + idx + " : --" + idx : "" + cond + " ? " + idx + "++ : " + idx + "--";
|
||||||
if (namedIndex) {
|
if (namedIndex) {
|
||||||
varPart = "" + idxName + " = " + varPart;
|
varPart = "" + idxName + " = " + varPart;
|
||||||
@@ -1140,11 +1142,11 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Range.prototype.compileArray = function(o) {
|
Range.prototype.compileArray = function(o) {
|
||||||
var args, body, cond, hasArgs, i, idt, post, pre, range, result, vars, _i, _ref2, _ref3, _results;
|
var args, body, cond, hasArgs, i, idt, post, pre, range, result, vars, _i, _ref4, _ref5, _results;
|
||||||
if (this.fromNum && this.toNum && Math.abs(this.fromNum - this.toNum) <= 20) {
|
if (this.fromNum && this.toNum && Math.abs(this.fromNum - this.toNum) <= 20) {
|
||||||
range = (function() {
|
range = (function() {
|
||||||
_results = [];
|
_results = [];
|
||||||
for (var _i = _ref2 = +this.fromNum, _ref3 = +this.toNum; _ref2 <= _ref3 ? _i <= _ref3 : _i >= _ref3; _ref2 <= _ref3 ? _i++ : _i--){ _results.push(_i); }
|
for (var _i = _ref4 = +this.fromNum, _ref5 = +this.toNum; _ref4 <= _ref5 ? _i <= _ref5 : _i >= _ref5; _ref4 <= _ref5 ? _i++ : _i--){ _results.push(_i); }
|
||||||
return _results;
|
return _results;
|
||||||
}).apply(this);
|
}).apply(this);
|
||||||
if (this.exclusive) {
|
if (this.exclusive) {
|
||||||
@@ -1192,8 +1194,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
Slice.prototype.compileNode = function(o) {
|
Slice.prototype.compileNode = function(o) {
|
||||||
var compiled, compiledText, from, fromCompiled, to, toStr, _ref2;
|
var compiled, compiledText, from, fromCompiled, to, toStr, _ref4;
|
||||||
_ref2 = this.range, to = _ref2.to, from = _ref2.from;
|
_ref4 = this.range, to = _ref4.to, from = _ref4.from;
|
||||||
fromCompiled = from && from.compileToFragments(o, LEVEL_PAREN) || [this.makeCode('0')];
|
fromCompiled = from && from.compileToFragments(o, LEVEL_PAREN) || [this.makeCode('0')];
|
||||||
if (to) {
|
if (to) {
|
||||||
compiled = to.compileToFragments(o, LEVEL_PAREN);
|
compiled = to.compileToFragments(o, LEVEL_PAREN);
|
||||||
@@ -1268,10 +1270,10 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Obj.prototype.assigns = function(name) {
|
Obj.prototype.assigns = function(name) {
|
||||||
var prop, _i, _len, _ref2;
|
var prop, _i, _len, _ref4;
|
||||||
_ref2 = this.properties;
|
_ref4 = this.properties;
|
||||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
|
||||||
prop = _ref2[_i];
|
prop = _ref4[_i];
|
||||||
if (prop.assigns(name)) {
|
if (prop.assigns(name)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1305,11 +1307,11 @@
|
|||||||
}
|
}
|
||||||
answer = [];
|
answer = [];
|
||||||
compiledObjs = (function() {
|
compiledObjs = (function() {
|
||||||
var _i, _len, _ref2, _results;
|
var _i, _len, _ref4, _results;
|
||||||
_ref2 = this.objects;
|
_ref4 = this.objects;
|
||||||
_results = [];
|
_results = [];
|
||||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
|
||||||
obj = _ref2[_i];
|
obj = _ref4[_i];
|
||||||
_results.push(obj.compileToFragments(o, LEVEL_LIST));
|
_results.push(obj.compileToFragments(o, LEVEL_LIST));
|
||||||
}
|
}
|
||||||
return _results;
|
return _results;
|
||||||
@@ -1332,10 +1334,10 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Arr.prototype.assigns = function(name) {
|
Arr.prototype.assigns = function(name) {
|
||||||
var obj, _i, _len, _ref2;
|
var obj, _i, _len, _ref4;
|
||||||
_ref2 = this.objects;
|
_ref4 = this.objects;
|
||||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
|
||||||
obj = _ref2[_i];
|
obj = _ref4[_i];
|
||||||
if (obj.assigns(name)) {
|
if (obj.assigns(name)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1390,17 +1392,17 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Class.prototype.addBoundFunctions = function(o) {
|
Class.prototype.addBoundFunctions = function(o) {
|
||||||
var body, bound, func, lhs, name, rhs, _i, _len, _ref2, _ref3;
|
var body, bound, func, lhs, name, rhs, _i, _len, _ref4, _ref5;
|
||||||
if (this.boundFuncs.length) {
|
if (this.boundFuncs.length) {
|
||||||
o.scope.assign('_this', 'this');
|
o.scope.assign('_this', 'this');
|
||||||
_ref2 = this.boundFuncs;
|
_ref4 = this.boundFuncs;
|
||||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
|
||||||
_ref3 = _ref2[_i], name = _ref3[0], func = _ref3[1];
|
_ref5 = _ref4[_i], name = _ref5[0], func = _ref5[1];
|
||||||
lhs = new Value(new Literal("this"), [new Access(name)]);
|
lhs = new Value(new Literal("this"), [new Access(name)]);
|
||||||
body = new Block([new Return(new Literal("" + this.ctor.name + ".prototype." + name.value + ".apply(_this, arguments)"))]);
|
body = new Block([new Return(new Literal("" + this.ctor.name + ".prototype." + name.value + ".apply(_this, arguments)"))]);
|
||||||
rhs = new Code(func.params, body, 'boundfunc');
|
rhs = new Code(func.params, body, 'boundfunc');
|
||||||
bound = new Assign(lhs, rhs);
|
bound = new Assign(lhs, rhs);
|
||||||
this.ctor.body.unshift(bound);
|
this.ctor.body.push(bound);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -1454,15 +1456,15 @@
|
|||||||
Class.prototype.walkBody = function(name, o) {
|
Class.prototype.walkBody = function(name, o) {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
return this.traverseChildren(false, function(child) {
|
return this.traverseChildren(false, function(child) {
|
||||||
var cont, exps, i, node, _i, _len, _ref2;
|
var cont, exps, i, node, _i, _len, _ref4;
|
||||||
cont = true;
|
cont = true;
|
||||||
if (child instanceof Class) {
|
if (child instanceof Class) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (child instanceof Block) {
|
if (child instanceof Block) {
|
||||||
_ref2 = exps = child.expressions;
|
_ref4 = exps = child.expressions;
|
||||||
for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) {
|
for (i = _i = 0, _len = _ref4.length; _i < _len; i = ++_i) {
|
||||||
node = _ref2[i];
|
node = _ref4[i];
|
||||||
if (node instanceof Value && node.isObject(true)) {
|
if (node instanceof Value && node.isObject(true)) {
|
||||||
cont = false;
|
cont = false;
|
||||||
exps[i] = _this.addProperties(node, name, o);
|
exps[i] = _this.addProperties(node, name, o);
|
||||||
@@ -1484,25 +1486,37 @@
|
|||||||
return this.directives = expressions.splice(0, index);
|
return this.directives = expressions.splice(0, index);
|
||||||
};
|
};
|
||||||
|
|
||||||
Class.prototype.ensureConstructor = function(name) {
|
Class.prototype.ensureConstructor = function(name, o) {
|
||||||
if (!this.ctor) {
|
var missing, ref, superCall;
|
||||||
this.ctor = new Code;
|
missing = !this.ctor;
|
||||||
if (this.parent) {
|
this.ctor || (this.ctor = new Code);
|
||||||
this.ctor.body.push(new Literal("" + name + ".__super__.constructor.apply(this, arguments)"));
|
|
||||||
}
|
|
||||||
if (this.externalCtor) {
|
|
||||||
this.ctor.body.push(new Literal("" + this.externalCtor + ".apply(this, arguments)"));
|
|
||||||
}
|
|
||||||
this.ctor.body.makeReturn();
|
|
||||||
this.body.expressions.unshift(this.ctor);
|
|
||||||
}
|
|
||||||
this.ctor.ctor = this.ctor.name = name;
|
this.ctor.ctor = this.ctor.name = name;
|
||||||
this.ctor.klass = null;
|
this.ctor.klass = null;
|
||||||
return this.ctor.noReturn = true;
|
this.ctor.noReturn = true;
|
||||||
|
if (missing) {
|
||||||
|
if (this.parent) {
|
||||||
|
superCall = new Literal("" + name + ".__super__.constructor.apply(this, arguments)");
|
||||||
|
}
|
||||||
|
if (this.externalCtor) {
|
||||||
|
superCall = new Literal("" + this.externalCtor + ".apply(this, arguments)");
|
||||||
|
}
|
||||||
|
if (superCall) {
|
||||||
|
ref = new Literal(o.scope.freeVariable('ref'));
|
||||||
|
this.ctor.body.unshift(new Assign(ref, superCall));
|
||||||
|
}
|
||||||
|
this.addBoundFunctions(o);
|
||||||
|
if (superCall) {
|
||||||
|
this.ctor.body.push(ref);
|
||||||
|
this.ctor.body.makeReturn();
|
||||||
|
}
|
||||||
|
return this.body.expressions.unshift(this.ctor);
|
||||||
|
} else {
|
||||||
|
return this.addBoundFunctions(o);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Class.prototype.compileNode = function(o) {
|
Class.prototype.compileNode = function(o) {
|
||||||
var call, decl, klass, lname, name, params, _ref2;
|
var call, decl, klass, lname, name, params, _ref4;
|
||||||
decl = this.determineName();
|
decl = this.determineName();
|
||||||
name = decl || '_Class';
|
name = decl || '_Class';
|
||||||
if (name.reserved) {
|
if (name.reserved) {
|
||||||
@@ -1512,14 +1526,13 @@
|
|||||||
this.hoistDirectivePrologue();
|
this.hoistDirectivePrologue();
|
||||||
this.setContext(name);
|
this.setContext(name);
|
||||||
this.walkBody(name, o);
|
this.walkBody(name, o);
|
||||||
this.ensureConstructor(name);
|
this.ensureConstructor(name, o);
|
||||||
this.body.spaced = true;
|
this.body.spaced = true;
|
||||||
if (!(this.ctor instanceof Code)) {
|
if (!(this.ctor instanceof Code)) {
|
||||||
this.body.expressions.unshift(this.ctor);
|
this.body.expressions.unshift(this.ctor);
|
||||||
}
|
}
|
||||||
this.body.expressions.push(lname);
|
this.body.expressions.push(lname);
|
||||||
(_ref2 = this.body.expressions).unshift.apply(_ref2, this.directives);
|
(_ref4 = this.body.expressions).unshift.apply(_ref4, this.directives);
|
||||||
this.addBoundFunctions(o);
|
|
||||||
call = Closure.wrap(this.body);
|
call = Closure.wrap(this.body);
|
||||||
if (this.parent) {
|
if (this.parent) {
|
||||||
this.superClass = new Literal(o.scope.freeVariable('super', false));
|
this.superClass = new Literal(o.scope.freeVariable('super', false));
|
||||||
@@ -1544,13 +1557,13 @@
|
|||||||
__extends(Assign, _super);
|
__extends(Assign, _super);
|
||||||
|
|
||||||
function Assign(variable, value, context, options) {
|
function Assign(variable, value, context, options) {
|
||||||
var forbidden, name, _ref2;
|
var forbidden, name, _ref4;
|
||||||
this.variable = variable;
|
this.variable = variable;
|
||||||
this.value = value;
|
this.value = value;
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.param = options && options.param;
|
this.param = options && options.param;
|
||||||
this.subpattern = options && options.subpattern;
|
this.subpattern = options && options.subpattern;
|
||||||
forbidden = (_ref2 = (name = this.variable.unwrapAll().value), __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0);
|
forbidden = (_ref4 = (name = this.variable.unwrapAll().value), __indexOf.call(STRICT_PROSCRIBED, _ref4) >= 0);
|
||||||
if (forbidden && this.context !== 'object') {
|
if (forbidden && this.context !== 'object') {
|
||||||
throw SyntaxError("variable name may not be \"" + name + "\"");
|
throw SyntaxError("variable name may not be \"" + name + "\"");
|
||||||
}
|
}
|
||||||
@@ -1571,7 +1584,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Assign.prototype.compileNode = function(o) {
|
Assign.prototype.compileNode = function(o) {
|
||||||
var answer, compiledName, isValue, match, name, val, varBase, _ref2, _ref3, _ref4, _ref5;
|
var answer, compiledName, isValue, match, name, val, varBase, _ref4, _ref5, _ref6, _ref7;
|
||||||
if (isValue = this.variable instanceof Value) {
|
if (isValue = this.variable instanceof Value) {
|
||||||
if (this.variable.isArray() || this.variable.isObject()) {
|
if (this.variable.isArray() || this.variable.isObject()) {
|
||||||
return this.compilePatternMatch(o);
|
return this.compilePatternMatch(o);
|
||||||
@@ -1579,7 +1592,7 @@
|
|||||||
if (this.variable.isSplice()) {
|
if (this.variable.isSplice()) {
|
||||||
return this.compileSplice(o);
|
return this.compileSplice(o);
|
||||||
}
|
}
|
||||||
if ((_ref2 = this.context) === '||=' || _ref2 === '&&=' || _ref2 === '?=') {
|
if ((_ref4 = this.context) === '||=' || _ref4 === '&&=' || _ref4 === '?=') {
|
||||||
return this.compileConditional(o);
|
return this.compileConditional(o);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1601,7 +1614,7 @@
|
|||||||
if (match[1]) {
|
if (match[1]) {
|
||||||
this.value.klass = match[1];
|
this.value.klass = match[1];
|
||||||
}
|
}
|
||||||
this.value.name = (_ref3 = (_ref4 = (_ref5 = match[2]) != null ? _ref5 : match[3]) != null ? _ref4 : match[4]) != null ? _ref3 : match[5];
|
this.value.name = (_ref5 = (_ref6 = (_ref7 = match[2]) != null ? _ref7 : match[3]) != null ? _ref6 : match[4]) != null ? _ref5 : match[5];
|
||||||
}
|
}
|
||||||
val = this.value.compileToFragments(o, LEVEL_LIST);
|
val = this.value.compileToFragments(o, LEVEL_LIST);
|
||||||
if (this.context === 'object') {
|
if (this.context === 'object') {
|
||||||
@@ -1616,7 +1629,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Assign.prototype.compilePatternMatch = function(o) {
|
Assign.prototype.compilePatternMatch = function(o) {
|
||||||
var acc, assigns, code, fragments, i, idx, isObject, ivar, name, obj, objects, olen, ref, rest, splat, top, val, value, vvar, vvarText, _i, _len, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7;
|
var acc, assigns, code, fragments, i, idx, isObject, ivar, name, obj, objects, olen, ref, rest, splat, top, val, value, vvar, vvarText, _i, _len, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9;
|
||||||
top = o.level === LEVEL_TOP;
|
top = o.level === LEVEL_TOP;
|
||||||
value = this.value;
|
value = this.value;
|
||||||
objects = this.variable.base.objects;
|
objects = this.variable.base.objects;
|
||||||
@@ -1631,14 +1644,14 @@
|
|||||||
isObject = this.variable.isObject();
|
isObject = this.variable.isObject();
|
||||||
if (top && olen === 1 && !((obj = objects[0]) instanceof Splat)) {
|
if (top && olen === 1 && !((obj = objects[0]) instanceof Splat)) {
|
||||||
if (obj instanceof Assign) {
|
if (obj instanceof Assign) {
|
||||||
_ref2 = obj, (_ref3 = _ref2.variable, idx = _ref3.base), obj = _ref2.value;
|
_ref4 = obj, (_ref5 = _ref4.variable, idx = _ref5.base), obj = _ref4.value;
|
||||||
} else {
|
} else {
|
||||||
idx = isObject ? obj["this"] ? obj.properties[0].name : obj : new Literal(0);
|
idx = isObject ? obj["this"] ? obj.properties[0].name : obj : new Literal(0);
|
||||||
}
|
}
|
||||||
acc = IDENTIFIER.test(idx.unwrap().value || 0);
|
acc = IDENTIFIER.test(idx.unwrap().value || 0);
|
||||||
value = new Value(value);
|
value = new Value(value);
|
||||||
value.properties.push(new (acc ? Access : Index)(idx));
|
value.properties.push(new (acc ? Access : Index)(idx));
|
||||||
if (_ref4 = obj.unwrap().value, __indexOf.call(RESERVED, _ref4) >= 0) {
|
if (_ref6 = obj.unwrap().value, __indexOf.call(RESERVED, _ref6) >= 0) {
|
||||||
throw new SyntaxError("assignment to a reserved word: " + (obj.compile(o)) + " = " + (value.compile(o)));
|
throw new SyntaxError("assignment to a reserved word: " + (obj.compile(o)) + " = " + (value.compile(o)));
|
||||||
}
|
}
|
||||||
return new Assign(obj, value, null, {
|
return new Assign(obj, value, null, {
|
||||||
@@ -1659,10 +1672,10 @@
|
|||||||
idx = i;
|
idx = i;
|
||||||
if (isObject) {
|
if (isObject) {
|
||||||
if (obj instanceof Assign) {
|
if (obj instanceof Assign) {
|
||||||
_ref5 = obj, (_ref6 = _ref5.variable, idx = _ref6.base), obj = _ref5.value;
|
_ref7 = obj, (_ref8 = _ref7.variable, idx = _ref8.base), obj = _ref7.value;
|
||||||
} else {
|
} else {
|
||||||
if (obj.base instanceof Parens) {
|
if (obj.base instanceof Parens) {
|
||||||
_ref7 = new Value(obj.unwrapAll()).cacheReference(o), obj = _ref7[0], idx = _ref7[1];
|
_ref9 = new Value(obj.unwrapAll()).cacheReference(o), obj = _ref9[0], idx = _ref9[1];
|
||||||
} else {
|
} else {
|
||||||
idx = obj["this"] ? obj.properties[0].name : obj;
|
idx = obj["this"] ? obj.properties[0].name : obj;
|
||||||
}
|
}
|
||||||
@@ -1714,8 +1727,8 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Assign.prototype.compileConditional = function(o) {
|
Assign.prototype.compileConditional = function(o) {
|
||||||
var left, right, _ref2;
|
var left, right, _ref4;
|
||||||
_ref2 = this.variable.cacheReference(o), left = _ref2[0], right = _ref2[1];
|
_ref4 = this.variable.cacheReference(o), left = _ref4[0], right = _ref4[1];
|
||||||
if (!left.properties.length && left.base instanceof Literal && left.base.value !== "this" && !o.scope.check(left.base.value)) {
|
if (!left.properties.length && left.base instanceof Literal && left.base.value !== "this" && !o.scope.check(left.base.value)) {
|
||||||
throw new Error("the variable \"" + left.base.value + "\" can't be assigned with " + this.context + " because it has not been defined.");
|
throw new Error("the variable \"" + left.base.value + "\" can't be assigned with " + this.context + " because it has not been defined.");
|
||||||
}
|
}
|
||||||
@@ -1726,11 +1739,11 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Assign.prototype.compileSplice = function(o) {
|
Assign.prototype.compileSplice = function(o) {
|
||||||
var answer, exclusive, from, fromDecl, fromRef, name, to, valDef, valRef, _ref2, _ref3, _ref4;
|
var answer, exclusive, from, fromDecl, fromRef, name, to, valDef, valRef, _ref4, _ref5, _ref6;
|
||||||
_ref2 = this.variable.properties.pop().range, from = _ref2.from, to = _ref2.to, exclusive = _ref2.exclusive;
|
_ref4 = this.variable.properties.pop().range, from = _ref4.from, to = _ref4.to, exclusive = _ref4.exclusive;
|
||||||
name = this.variable.compile(o);
|
name = this.variable.compile(o);
|
||||||
if (from) {
|
if (from) {
|
||||||
_ref3 = this.cacheToCodeFragments(from.cache(o, LEVEL_OP)), fromDecl = _ref3[0], fromRef = _ref3[1];
|
_ref5 = this.cacheToCodeFragments(from.cache(o, LEVEL_OP)), fromDecl = _ref5[0], fromRef = _ref5[1];
|
||||||
} else {
|
} else {
|
||||||
fromDecl = fromRef = '0';
|
fromDecl = fromRef = '0';
|
||||||
}
|
}
|
||||||
@@ -1749,7 +1762,7 @@
|
|||||||
} else {
|
} else {
|
||||||
to = "9e9";
|
to = "9e9";
|
||||||
}
|
}
|
||||||
_ref4 = this.value.cache(o, LEVEL_LIST), valDef = _ref4[0], valRef = _ref4[1];
|
_ref6 = this.value.cache(o, LEVEL_LIST), valDef = _ref6[0], valRef = _ref6[1];
|
||||||
answer = [].concat(this.makeCode("[].splice.apply(" + name + ", [" + fromDecl + ", " + to + "].concat("), valDef, this.makeCode(")), "), valRef);
|
answer = [].concat(this.makeCode("[].splice.apply(" + name + ", [" + fromDecl + ", " + to + "].concat("), valDef, this.makeCode(")), "), valRef);
|
||||||
if (o.level > LEVEL_TOP) {
|
if (o.level > LEVEL_TOP) {
|
||||||
return this.wrapInBraces(answer);
|
return this.wrapInBraces(answer);
|
||||||
@@ -1784,7 +1797,7 @@
|
|||||||
Code.prototype.jumps = NO;
|
Code.prototype.jumps = NO;
|
||||||
|
|
||||||
Code.prototype.compileNode = function(o) {
|
Code.prototype.compileNode = function(o) {
|
||||||
var answer, code, exprs, i, idt, lit, name, p, param, params, ref, splats, uniqs, val, wasEmpty, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _len6, _m, _n, _o, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8;
|
var answer, code, exprs, i, idt, lit, name, p, param, params, ref, splats, uniqs, val, wasEmpty, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _len6, _m, _n, _o, _ref10, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9;
|
||||||
o.scope = new Scope(o.scope, this.body, this);
|
o.scope = new Scope(o.scope, this.body, this);
|
||||||
o.scope.shared = del(o, 'sharedScope');
|
o.scope.shared = del(o, 'sharedScope');
|
||||||
o.indent += TAB;
|
o.indent += TAB;
|
||||||
@@ -1792,22 +1805,22 @@
|
|||||||
delete o.isExistentialEquals;
|
delete o.isExistentialEquals;
|
||||||
params = [];
|
params = [];
|
||||||
exprs = [];
|
exprs = [];
|
||||||
_ref2 = this.paramNames();
|
_ref4 = this.paramNames();
|
||||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
|
||||||
name = _ref2[_i];
|
name = _ref4[_i];
|
||||||
if (!o.scope.check(name)) {
|
if (!o.scope.check(name)) {
|
||||||
o.scope.parameter(name);
|
o.scope.parameter(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ref3 = this.params;
|
_ref5 = this.params;
|
||||||
for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {
|
for (_j = 0, _len1 = _ref5.length; _j < _len1; _j++) {
|
||||||
param = _ref3[_j];
|
param = _ref5[_j];
|
||||||
if (!param.splat) {
|
if (!param.splat) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
_ref4 = this.params;
|
_ref6 = this.params;
|
||||||
for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) {
|
for (_k = 0, _len2 = _ref6.length; _k < _len2; _k++) {
|
||||||
p = _ref4[_k].name;
|
p = _ref6[_k].name;
|
||||||
if (p["this"]) {
|
if (p["this"]) {
|
||||||
p = p.properties[0].name;
|
p = p.properties[0].name;
|
||||||
}
|
}
|
||||||
@@ -1816,20 +1829,20 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
splats = new Assign(new Value(new Arr((function() {
|
splats = new Assign(new Value(new Arr((function() {
|
||||||
var _l, _len3, _ref5, _results;
|
var _l, _len3, _ref7, _results;
|
||||||
_ref5 = this.params;
|
_ref7 = this.params;
|
||||||
_results = [];
|
_results = [];
|
||||||
for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) {
|
for (_l = 0, _len3 = _ref7.length; _l < _len3; _l++) {
|
||||||
p = _ref5[_l];
|
p = _ref7[_l];
|
||||||
_results.push(p.asReference(o));
|
_results.push(p.asReference(o));
|
||||||
}
|
}
|
||||||
return _results;
|
return _results;
|
||||||
}).call(this))), new Value(new Literal('arguments')));
|
}).call(this))), new Value(new Literal('arguments')));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
_ref5 = this.params;
|
_ref7 = this.params;
|
||||||
for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) {
|
for (_l = 0, _len3 = _ref7.length; _l < _len3; _l++) {
|
||||||
param = _ref5[_l];
|
param = _ref7[_l];
|
||||||
if (param.isComplex()) {
|
if (param.isComplex()) {
|
||||||
val = ref = param.asReference(o);
|
val = ref = param.asReference(o);
|
||||||
if (param.value) {
|
if (param.value) {
|
||||||
@@ -1855,7 +1868,7 @@
|
|||||||
exprs.unshift(splats);
|
exprs.unshift(splats);
|
||||||
}
|
}
|
||||||
if (exprs.length) {
|
if (exprs.length) {
|
||||||
(_ref6 = this.body.expressions).unshift.apply(_ref6, exprs);
|
(_ref8 = this.body.expressions).unshift.apply(_ref8, exprs);
|
||||||
}
|
}
|
||||||
for (i = _m = 0, _len4 = params.length; _m < _len4; i = ++_m) {
|
for (i = _m = 0, _len4 = params.length; _m < _len4; i = ++_m) {
|
||||||
p = params[i];
|
p = params[i];
|
||||||
@@ -1863,9 +1876,9 @@
|
|||||||
o.scope.parameter(fragmentsToText(params[i]));
|
o.scope.parameter(fragmentsToText(params[i]));
|
||||||
}
|
}
|
||||||
uniqs = [];
|
uniqs = [];
|
||||||
_ref7 = this.paramNames();
|
_ref9 = this.paramNames();
|
||||||
for (_n = 0, _len5 = _ref7.length; _n < _len5; _n++) {
|
for (_n = 0, _len5 = _ref9.length; _n < _len5; _n++) {
|
||||||
name = _ref7[_n];
|
name = _ref9[_n];
|
||||||
if (__indexOf.call(uniqs, name) >= 0) {
|
if (__indexOf.call(uniqs, name) >= 0) {
|
||||||
throw SyntaxError("multiple parameters named '" + name + "'");
|
throw SyntaxError("multiple parameters named '" + name + "'");
|
||||||
}
|
}
|
||||||
@@ -1875,7 +1888,7 @@
|
|||||||
this.body.makeReturn();
|
this.body.makeReturn();
|
||||||
}
|
}
|
||||||
if (this.bound) {
|
if (this.bound) {
|
||||||
if ((_ref8 = o.scope.parent.method) != null ? _ref8.bound : void 0) {
|
if ((_ref10 = o.scope.parent.method) != null ? _ref10.bound : void 0) {
|
||||||
this.bound = this.context = o.scope.parent.method.context;
|
this.bound = this.context = o.scope.parent.method.context;
|
||||||
} else if (!this["static"]) {
|
} else if (!this["static"]) {
|
||||||
o.scope.parent.assign('_this', 'this');
|
o.scope.parent.assign('_this', 'this');
|
||||||
@@ -1911,11 +1924,11 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Code.prototype.paramNames = function() {
|
Code.prototype.paramNames = function() {
|
||||||
var names, param, _i, _len, _ref2;
|
var names, param, _i, _len, _ref4;
|
||||||
names = [];
|
names = [];
|
||||||
_ref2 = this.params;
|
_ref4 = this.params;
|
||||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
|
||||||
param = _ref2[_i];
|
param = _ref4[_i];
|
||||||
names.push.apply(names, param.names());
|
names.push.apply(names, param.names());
|
||||||
}
|
}
|
||||||
return names;
|
return names;
|
||||||
@@ -1936,11 +1949,11 @@
|
|||||||
__extends(Param, _super);
|
__extends(Param, _super);
|
||||||
|
|
||||||
function Param(name, value, splat) {
|
function Param(name, value, splat) {
|
||||||
var _ref2;
|
var _ref4;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.value = value;
|
this.value = value;
|
||||||
this.splat = splat;
|
this.splat = splat;
|
||||||
if (_ref2 = (name = this.name.unwrapAll().value), __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0) {
|
if (_ref4 = (name = this.name.unwrapAll().value), __indexOf.call(STRICT_PROSCRIBED, _ref4) >= 0) {
|
||||||
throw SyntaxError("parameter name \"" + name + "\" is not allowed");
|
throw SyntaxError("parameter name \"" + name + "\" is not allowed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1977,7 +1990,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Param.prototype.names = function(name) {
|
Param.prototype.names = function(name) {
|
||||||
var atParam, names, obj, _i, _len, _ref2;
|
var atParam, names, obj, _i, _len, _ref4;
|
||||||
if (name == null) {
|
if (name == null) {
|
||||||
name = this.name;
|
name = this.name;
|
||||||
}
|
}
|
||||||
@@ -1997,9 +2010,9 @@
|
|||||||
return atParam(name);
|
return atParam(name);
|
||||||
}
|
}
|
||||||
names = [];
|
names = [];
|
||||||
_ref2 = name.objects;
|
_ref4 = name.objects;
|
||||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
|
||||||
obj = _ref2[_i];
|
obj = _ref4[_i];
|
||||||
if (obj instanceof Assign) {
|
if (obj instanceof Assign) {
|
||||||
names.push.apply(names, this.names(obj.value.unwrap()));
|
names.push.apply(names, this.names(obj.value.unwrap()));
|
||||||
} else if (obj instanceof Splat) {
|
} else if (obj instanceof Splat) {
|
||||||
@@ -2076,11 +2089,11 @@
|
|||||||
return args[0].concat(node.makeCode(".concat("), concatPart, node.makeCode(")"));
|
return args[0].concat(node.makeCode(".concat("), concatPart, node.makeCode(")"));
|
||||||
}
|
}
|
||||||
base = (function() {
|
base = (function() {
|
||||||
var _j, _len1, _ref2, _results;
|
var _j, _len1, _ref4, _results;
|
||||||
_ref2 = list.slice(0, index);
|
_ref4 = list.slice(0, index);
|
||||||
_results = [];
|
_results = [];
|
||||||
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
|
for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) {
|
||||||
node = _ref2[_j];
|
node = _ref4[_j];
|
||||||
_results.push(node.compileToFragments(o, LEVEL_LIST));
|
_results.push(node.compileToFragments(o, LEVEL_LIST));
|
||||||
}
|
}
|
||||||
return _results;
|
return _results;
|
||||||
@@ -2221,17 +2234,17 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Op.prototype.isComplex = function() {
|
Op.prototype.isComplex = function() {
|
||||||
var _ref2;
|
var _ref4;
|
||||||
return !(this.isUnary() && ((_ref2 = this.operator) === '+' || _ref2 === '-')) || this.first.isComplex();
|
return !(this.isUnary() && ((_ref4 = this.operator) === '+' || _ref4 === '-')) || this.first.isComplex();
|
||||||
};
|
};
|
||||||
|
|
||||||
Op.prototype.isChainable = function() {
|
Op.prototype.isChainable = function() {
|
||||||
var _ref2;
|
var _ref4;
|
||||||
return (_ref2 = this.operator) === '<' || _ref2 === '>' || _ref2 === '>=' || _ref2 === '<=' || _ref2 === '===' || _ref2 === '!==';
|
return (_ref4 = this.operator) === '<' || _ref4 === '>' || _ref4 === '>=' || _ref4 === '<=' || _ref4 === '===' || _ref4 === '!==';
|
||||||
};
|
};
|
||||||
|
|
||||||
Op.prototype.invert = function() {
|
Op.prototype.invert = function() {
|
||||||
var allInvertable, curr, fst, op, _ref2;
|
var allInvertable, curr, fst, op, _ref4;
|
||||||
if (this.isChainable() && this.first.isChainable()) {
|
if (this.isChainable() && this.first.isChainable()) {
|
||||||
allInvertable = true;
|
allInvertable = true;
|
||||||
curr = this;
|
curr = this;
|
||||||
@@ -2257,7 +2270,7 @@
|
|||||||
return this;
|
return this;
|
||||||
} else if (this.second) {
|
} else if (this.second) {
|
||||||
return new Parens(this).invert();
|
return new Parens(this).invert();
|
||||||
} else if (this.operator === '!' && (fst = this.first.unwrap()) instanceof Op && ((_ref2 = fst.operator) === '!' || _ref2 === 'in' || _ref2 === 'instanceof')) {
|
} else if (this.operator === '!' && (fst = this.first.unwrap()) instanceof Op && ((_ref4 = fst.operator) === '!' || _ref4 === 'in' || _ref4 === 'instanceof')) {
|
||||||
return fst;
|
return fst;
|
||||||
} else {
|
} else {
|
||||||
return new Op('!', this);
|
return new Op('!', this);
|
||||||
@@ -2265,17 +2278,17 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Op.prototype.unfoldSoak = function(o) {
|
Op.prototype.unfoldSoak = function(o) {
|
||||||
var _ref2;
|
var _ref4;
|
||||||
return ((_ref2 = this.operator) === '++' || _ref2 === '--' || _ref2 === 'delete') && unfoldSoak(o, this, 'first');
|
return ((_ref4 = this.operator) === '++' || _ref4 === '--' || _ref4 === 'delete') && unfoldSoak(o, this, 'first');
|
||||||
};
|
};
|
||||||
|
|
||||||
Op.prototype.generateDo = function(exp) {
|
Op.prototype.generateDo = function(exp) {
|
||||||
var call, func, param, passedParams, ref, _i, _len, _ref2;
|
var call, func, param, passedParams, ref, _i, _len, _ref4;
|
||||||
passedParams = [];
|
passedParams = [];
|
||||||
func = exp instanceof Assign && (ref = exp.value.unwrap()) instanceof Code ? ref : exp;
|
func = exp instanceof Assign && (ref = exp.value.unwrap()) instanceof Code ? ref : exp;
|
||||||
_ref2 = func.params || [];
|
_ref4 = func.params || [];
|
||||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
|
||||||
param = _ref2[_i];
|
param = _ref4[_i];
|
||||||
if (param.value) {
|
if (param.value) {
|
||||||
passedParams.push(param.value);
|
passedParams.push(param.value);
|
||||||
delete param.value;
|
delete param.value;
|
||||||
@@ -2289,7 +2302,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Op.prototype.compileNode = function(o) {
|
Op.prototype.compileNode = function(o) {
|
||||||
var answer, isChain, _ref2, _ref3;
|
var answer, isChain, _ref4, _ref5;
|
||||||
isChain = this.isChainable() && this.first.isChainable();
|
isChain = this.isChainable() && this.first.isChainable();
|
||||||
if (!isChain) {
|
if (!isChain) {
|
||||||
this.first.front = this.front;
|
this.first.front = this.front;
|
||||||
@@ -2297,7 +2310,7 @@
|
|||||||
if (this.operator === 'delete' && o.scope.check(this.first.unwrapAll().value)) {
|
if (this.operator === 'delete' && o.scope.check(this.first.unwrapAll().value)) {
|
||||||
throw SyntaxError('delete operand may not be argument or var');
|
throw SyntaxError('delete operand may not be argument or var');
|
||||||
}
|
}
|
||||||
if (((_ref2 = this.operator) === '--' || _ref2 === '++') && (_ref3 = this.first.unwrapAll().value, __indexOf.call(STRICT_PROSCRIBED, _ref3) >= 0)) {
|
if (((_ref4 = this.operator) === '--' || _ref4 === '++') && (_ref5 = this.first.unwrapAll().value, __indexOf.call(STRICT_PROSCRIBED, _ref5) >= 0)) {
|
||||||
throw SyntaxError('prefix increment/decrement may not have eval or arguments operand');
|
throw SyntaxError('prefix increment/decrement may not have eval or arguments operand');
|
||||||
}
|
}
|
||||||
if (this.isUnary()) {
|
if (this.isUnary()) {
|
||||||
@@ -2318,8 +2331,8 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Op.prototype.compileChain = function(o) {
|
Op.prototype.compileChain = function(o) {
|
||||||
var fragments, fst, shared, _ref2;
|
var fragments, fst, shared, _ref4;
|
||||||
_ref2 = this.first.second.cache(o), this.first.second = _ref2[0], shared = _ref2[1];
|
_ref4 = this.first.second.cache(o), this.first.second = _ref4[0], shared = _ref4[1];
|
||||||
fst = this.first.compileToFragments(o, LEVEL_OP);
|
fst = this.first.compileToFragments(o, LEVEL_OP);
|
||||||
fragments = fst.concat(this.makeCode(" " + (this.invert ? '&&' : '||') + " "), shared.compileToFragments(o), this.makeCode(" " + this.operator + " "), this.second.compileToFragments(o, LEVEL_OP));
|
fragments = fst.concat(this.makeCode(" " + (this.invert ? '&&' : '||') + " "), shared.compileToFragments(o), this.makeCode(" " + this.operator + " "), this.second.compileToFragments(o, LEVEL_OP));
|
||||||
return this.wrapInBraces(fragments);
|
return this.wrapInBraces(fragments);
|
||||||
@@ -2387,11 +2400,11 @@
|
|||||||
In.prototype.invert = NEGATE;
|
In.prototype.invert = NEGATE;
|
||||||
|
|
||||||
In.prototype.compileNode = function(o) {
|
In.prototype.compileNode = function(o) {
|
||||||
var hasSplat, obj, _i, _len, _ref2;
|
var hasSplat, obj, _i, _len, _ref4;
|
||||||
if (this.array instanceof Value && this.array.isArray()) {
|
if (this.array instanceof Value && this.array.isArray()) {
|
||||||
_ref2 = this.array.base.objects;
|
_ref4 = this.array.base.objects;
|
||||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
|
||||||
obj = _ref2[_i];
|
obj = _ref4[_i];
|
||||||
if (!(obj instanceof Splat)) {
|
if (!(obj instanceof Splat)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -2406,16 +2419,16 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
In.prototype.compileOrTest = function(o) {
|
In.prototype.compileOrTest = function(o) {
|
||||||
var cmp, cnj, i, item, ref, sub, tests, _i, _len, _ref2, _ref3, _ref4;
|
var cmp, cnj, i, item, ref, sub, tests, _i, _len, _ref4, _ref5, _ref6;
|
||||||
if (this.array.base.objects.length === 0) {
|
if (this.array.base.objects.length === 0) {
|
||||||
return [this.makeCode("" + (!!this.negated))];
|
return [this.makeCode("" + (!!this.negated))];
|
||||||
}
|
}
|
||||||
_ref2 = this.object.cache(o, LEVEL_OP), sub = _ref2[0], ref = _ref2[1];
|
_ref4 = this.object.cache(o, LEVEL_OP), sub = _ref4[0], ref = _ref4[1];
|
||||||
_ref3 = this.negated ? [' !== ', ' && '] : [' === ', ' || '], cmp = _ref3[0], cnj = _ref3[1];
|
_ref5 = this.negated ? [' !== ', ' && '] : [' === ', ' || '], cmp = _ref5[0], cnj = _ref5[1];
|
||||||
tests = [];
|
tests = [];
|
||||||
_ref4 = this.array.base.objects;
|
_ref6 = this.array.base.objects;
|
||||||
for (i = _i = 0, _len = _ref4.length; _i < _len; i = ++_i) {
|
for (i = _i = 0, _len = _ref6.length; _i < _len; i = ++_i) {
|
||||||
item = _ref4[i];
|
item = _ref6[i];
|
||||||
if (i) {
|
if (i) {
|
||||||
tests.push(this.makeCode(cnj));
|
tests.push(this.makeCode(cnj));
|
||||||
}
|
}
|
||||||
@@ -2429,8 +2442,8 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
In.prototype.compileLoopTest = function(o) {
|
In.prototype.compileLoopTest = function(o) {
|
||||||
var fragments, ref, sub, _ref2;
|
var fragments, ref, sub, _ref4;
|
||||||
_ref2 = this.object.cache(o, LEVEL_LIST), sub = _ref2[0], ref = _ref2[1];
|
_ref4 = this.object.cache(o, LEVEL_LIST), sub = _ref4[0], ref = _ref4[1];
|
||||||
fragments = [].concat(this.makeCode(utility('indexOf') + ".call("), this.array.compileToFragments(o, LEVEL_LIST), this.makeCode(", "), ref, this.makeCode(") " + (this.negated ? '< 0' : '>= 0')));
|
fragments = [].concat(this.makeCode(utility('indexOf') + ".call("), this.array.compileToFragments(o, LEVEL_LIST), this.makeCode(", "), ref, this.makeCode(") " + (this.negated ? '< 0' : '>= 0')));
|
||||||
if ((fragmentsToText(sub)) === (fragmentsToText(ref))) {
|
if ((fragmentsToText(sub)) === (fragmentsToText(ref))) {
|
||||||
return fragments;
|
return fragments;
|
||||||
@@ -2467,8 +2480,8 @@
|
|||||||
Try.prototype.isStatement = YES;
|
Try.prototype.isStatement = YES;
|
||||||
|
|
||||||
Try.prototype.jumps = function(o) {
|
Try.prototype.jumps = function(o) {
|
||||||
var _ref2;
|
var _ref4;
|
||||||
return this.attempt.jumps(o) || ((_ref2 = this.recovery) != null ? _ref2.jumps(o) : void 0);
|
return this.attempt.jumps(o) || ((_ref4 = this.recovery) != null ? _ref4.jumps(o) : void 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
Try.prototype.makeReturn = function(res) {
|
Try.prototype.makeReturn = function(res) {
|
||||||
@@ -2486,14 +2499,14 @@
|
|||||||
o.indent += TAB;
|
o.indent += TAB;
|
||||||
tryPart = this.attempt.compileToFragments(o, LEVEL_TOP);
|
tryPart = this.attempt.compileToFragments(o, LEVEL_TOP);
|
||||||
catchPart = (function() {
|
catchPart = (function() {
|
||||||
var _base, _ref2;
|
var _base, _ref4;
|
||||||
if (this.recovery) {
|
if (this.recovery) {
|
||||||
if (typeof (_base = this.error).isObject === "function" ? _base.isObject() : void 0) {
|
if (typeof (_base = this.error).isObject === "function" ? _base.isObject() : void 0) {
|
||||||
placeholder = new Literal('_error');
|
placeholder = new Literal('_error');
|
||||||
this.recovery.unshift(new Assign(this.error, placeholder));
|
this.recovery.unshift(new Assign(this.error, placeholder));
|
||||||
this.error = placeholder;
|
this.error = placeholder;
|
||||||
}
|
}
|
||||||
if (_ref2 = this.error.value, __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0) {
|
if (_ref4 = this.error.value, __indexOf.call(STRICT_PROSCRIBED, _ref4) >= 0) {
|
||||||
throw SyntaxError("catch variable may not be \"" + this.error.value + "\"");
|
throw SyntaxError("catch variable may not be \"" + this.error.value + "\"");
|
||||||
}
|
}
|
||||||
if (!o.scope.check(this.error.value)) {
|
if (!o.scope.check(this.error.value)) {
|
||||||
@@ -2551,11 +2564,11 @@
|
|||||||
Existence.prototype.invert = NEGATE;
|
Existence.prototype.invert = NEGATE;
|
||||||
|
|
||||||
Existence.prototype.compileNode = function(o) {
|
Existence.prototype.compileNode = function(o) {
|
||||||
var cmp, cnj, code, _ref2;
|
var cmp, cnj, code, _ref4;
|
||||||
this.expression.front = this.front;
|
this.expression.front = this.front;
|
||||||
code = this.expression.compile(o, LEVEL_OP);
|
code = this.expression.compile(o, LEVEL_OP);
|
||||||
if (IDENTIFIER.test(code) && !o.scope.check(code)) {
|
if (IDENTIFIER.test(code) && !o.scope.check(code)) {
|
||||||
_ref2 = this.negated ? ['===', '||'] : ['!==', '&&'], cmp = _ref2[0], cnj = _ref2[1];
|
_ref4 = this.negated ? ['===', '||'] : ['!==', '&&'], cmp = _ref4[0], cnj = _ref4[1];
|
||||||
code = "typeof " + code + " " + cmp + " \"undefined\" " + cnj + " " + code + " " + cmp + " null";
|
code = "typeof " + code + " " + cmp + " \"undefined\" " + cnj + " " + code + " " + cmp + " null";
|
||||||
} else {
|
} else {
|
||||||
code = "" + code + " " + (this.negated ? '==' : '!=') + " null";
|
code = "" + code + " " + (this.negated ? '==' : '!=') + " null";
|
||||||
@@ -2610,13 +2623,13 @@
|
|||||||
__extends(For, _super);
|
__extends(For, _super);
|
||||||
|
|
||||||
function For(body, source) {
|
function For(body, source) {
|
||||||
var _ref2;
|
var _ref4;
|
||||||
this.source = source.source, this.guard = source.guard, this.step = source.step, this.name = source.name, this.index = source.index;
|
this.source = source.source, this.guard = source.guard, this.step = source.step, this.name = source.name, this.index = source.index;
|
||||||
this.body = Block.wrap([body]);
|
this.body = Block.wrap([body]);
|
||||||
this.own = !!source.own;
|
this.own = !!source.own;
|
||||||
this.object = !!source.object;
|
this.object = !!source.object;
|
||||||
if (this.object) {
|
if (this.object) {
|
||||||
_ref2 = [this.index, this.name], this.name = _ref2[0], this.index = _ref2[1];
|
_ref4 = [this.index, this.name], this.name = _ref4[0], this.index = _ref4[1];
|
||||||
}
|
}
|
||||||
if (this.index instanceof Value) {
|
if (this.index instanceof Value) {
|
||||||
throw SyntaxError('index cannot be a pattern matching expression');
|
throw SyntaxError('index cannot be a pattern matching expression');
|
||||||
@@ -2635,9 +2648,9 @@
|
|||||||
For.prototype.children = ['body', 'source', 'guard', 'step'];
|
For.prototype.children = ['body', 'source', 'guard', 'step'];
|
||||||
|
|
||||||
For.prototype.compileNode = function(o) {
|
For.prototype.compileNode = function(o) {
|
||||||
var body, bodyFragments, compare, compareDown, declare, declareDown, defPart, defPartFragments, down, forPartFragments, guardPart, idt1, increment, index, ivar, kvar, kvarAssign, lastJumps, lvar, name, namePart, ref, resultPart, returnResult, rvar, scope, source, step, stepNum, stepVar, svar, varPart, _ref2, _ref3;
|
var body, bodyFragments, compare, compareDown, declare, declareDown, defPart, defPartFragments, down, forPartFragments, guardPart, idt1, increment, index, ivar, kvar, kvarAssign, lastJumps, lvar, name, namePart, ref, resultPart, returnResult, rvar, scope, source, step, stepNum, stepVar, svar, varPart, _ref4, _ref5;
|
||||||
body = Block.wrap([this.body]);
|
body = Block.wrap([this.body]);
|
||||||
lastJumps = (_ref2 = last(body.expressions)) != null ? _ref2.jumps() : void 0;
|
lastJumps = (_ref4 = last(body.expressions)) != null ? _ref4.jumps() : void 0;
|
||||||
if (lastJumps && lastJumps instanceof Return) {
|
if (lastJumps && lastJumps instanceof Return) {
|
||||||
this.returns = false;
|
this.returns = false;
|
||||||
}
|
}
|
||||||
@@ -2658,7 +2671,7 @@
|
|||||||
kvar = (this.range && name) || index || ivar;
|
kvar = (this.range && name) || index || ivar;
|
||||||
kvarAssign = kvar !== ivar ? "" + kvar + " = " : "";
|
kvarAssign = kvar !== ivar ? "" + kvar + " = " : "";
|
||||||
if (this.step && !this.range) {
|
if (this.step && !this.range) {
|
||||||
_ref3 = this.cacheToCodeFragments(this.step.cache(o, LEVEL_LIST)), step = _ref3[0], stepVar = _ref3[1];
|
_ref5 = this.cacheToCodeFragments(this.step.cache(o, LEVEL_LIST)), step = _ref5[0], stepVar = _ref5[1];
|
||||||
stepNum = stepVar.match(SIMPLENUM);
|
stepNum = stepVar.match(SIMPLENUM);
|
||||||
}
|
}
|
||||||
if (this.pattern) {
|
if (this.pattern) {
|
||||||
@@ -2748,24 +2761,24 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
For.prototype.pluckDirectCall = function(o, body) {
|
For.prototype.pluckDirectCall = function(o, body) {
|
||||||
var base, defs, expr, fn, idx, ref, val, _i, _len, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7;
|
var base, defs, expr, fn, idx, ref, val, _i, _len, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9;
|
||||||
defs = [];
|
defs = [];
|
||||||
_ref2 = body.expressions;
|
_ref4 = body.expressions;
|
||||||
for (idx = _i = 0, _len = _ref2.length; _i < _len; idx = ++_i) {
|
for (idx = _i = 0, _len = _ref4.length; _i < _len; idx = ++_i) {
|
||||||
expr = _ref2[idx];
|
expr = _ref4[idx];
|
||||||
expr = expr.unwrapAll();
|
expr = expr.unwrapAll();
|
||||||
if (!(expr instanceof Call)) {
|
if (!(expr instanceof Call)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
val = expr.variable.unwrapAll();
|
val = expr.variable.unwrapAll();
|
||||||
if (!((val instanceof Code) || (val instanceof Value && ((_ref3 = val.base) != null ? _ref3.unwrapAll() : void 0) instanceof Code && val.properties.length === 1 && ((_ref4 = (_ref5 = val.properties[0].name) != null ? _ref5.value : void 0) === 'call' || _ref4 === 'apply')))) {
|
if (!((val instanceof Code) || (val instanceof Value && ((_ref5 = val.base) != null ? _ref5.unwrapAll() : void 0) instanceof Code && val.properties.length === 1 && ((_ref6 = (_ref7 = val.properties[0].name) != null ? _ref7.value : void 0) === 'call' || _ref6 === 'apply')))) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
fn = ((_ref6 = val.base) != null ? _ref6.unwrapAll() : void 0) || val;
|
fn = ((_ref8 = val.base) != null ? _ref8.unwrapAll() : void 0) || val;
|
||||||
ref = new Literal(o.scope.freeVariable('fn'));
|
ref = new Literal(o.scope.freeVariable('fn'));
|
||||||
base = new Value(ref);
|
base = new Value(ref);
|
||||||
if (val.base) {
|
if (val.base) {
|
||||||
_ref7 = [base, val], val.base = _ref7[0], base = _ref7[1];
|
_ref9 = [base, val], val.base = _ref9[0], base = _ref9[1];
|
||||||
}
|
}
|
||||||
body.expressions[idx] = new Call(base, expr.args);
|
body.expressions[idx] = new Call(base, expr.args);
|
||||||
defs = defs.concat(this.makeCode(this.tab), new Assign(ref, fn).compileToFragments(o, LEVEL_TOP), this.makeCode(';\n'));
|
defs = defs.concat(this.makeCode(this.tab), new Assign(ref, fn).compileToFragments(o, LEVEL_TOP), this.makeCode(';\n'));
|
||||||
@@ -2792,49 +2805,49 @@
|
|||||||
Switch.prototype.isStatement = YES;
|
Switch.prototype.isStatement = YES;
|
||||||
|
|
||||||
Switch.prototype.jumps = function(o) {
|
Switch.prototype.jumps = function(o) {
|
||||||
var block, conds, _i, _len, _ref2, _ref3, _ref4;
|
var block, conds, _i, _len, _ref4, _ref5, _ref6;
|
||||||
if (o == null) {
|
if (o == null) {
|
||||||
o = {
|
o = {
|
||||||
block: true
|
block: true
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
_ref2 = this.cases;
|
_ref4 = this.cases;
|
||||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
|
||||||
_ref3 = _ref2[_i], conds = _ref3[0], block = _ref3[1];
|
_ref5 = _ref4[_i], conds = _ref5[0], block = _ref5[1];
|
||||||
if (block.jumps(o)) {
|
if (block.jumps(o)) {
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (_ref4 = this.otherwise) != null ? _ref4.jumps(o) : void 0;
|
return (_ref6 = this.otherwise) != null ? _ref6.jumps(o) : void 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
Switch.prototype.makeReturn = function(res) {
|
Switch.prototype.makeReturn = function(res) {
|
||||||
var pair, _i, _len, _ref2, _ref3;
|
var pair, _i, _len, _ref4, _ref5;
|
||||||
_ref2 = this.cases;
|
_ref4 = this.cases;
|
||||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
|
||||||
pair = _ref2[_i];
|
pair = _ref4[_i];
|
||||||
pair[1].makeReturn(res);
|
pair[1].makeReturn(res);
|
||||||
}
|
}
|
||||||
if (res) {
|
if (res) {
|
||||||
this.otherwise || (this.otherwise = new Block([new Literal('void 0')]));
|
this.otherwise || (this.otherwise = new Block([new Literal('void 0')]));
|
||||||
}
|
}
|
||||||
if ((_ref3 = this.otherwise) != null) {
|
if ((_ref5 = this.otherwise) != null) {
|
||||||
_ref3.makeReturn(res);
|
_ref5.makeReturn(res);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
Switch.prototype.compileNode = function(o) {
|
Switch.prototype.compileNode = function(o) {
|
||||||
var block, body, cond, conditions, expr, fragments, i, idt1, idt2, _i, _j, _len, _len1, _ref2, _ref3, _ref4;
|
var block, body, cond, conditions, expr, fragments, i, idt1, idt2, _i, _j, _len, _len1, _ref4, _ref5, _ref6;
|
||||||
idt1 = o.indent + TAB;
|
idt1 = o.indent + TAB;
|
||||||
idt2 = o.indent = idt1 + TAB;
|
idt2 = o.indent = idt1 + TAB;
|
||||||
fragments = [].concat(this.makeCode(this.tab + "switch ("), (this.subject ? this.subject.compileToFragments(o, LEVEL_PAREN) : this.makeCode("false")), this.makeCode(") {\n"));
|
fragments = [].concat(this.makeCode(this.tab + "switch ("), (this.subject ? this.subject.compileToFragments(o, LEVEL_PAREN) : this.makeCode("false")), this.makeCode(") {\n"));
|
||||||
_ref2 = this.cases;
|
_ref4 = this.cases;
|
||||||
for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) {
|
for (i = _i = 0, _len = _ref4.length; _i < _len; i = ++_i) {
|
||||||
_ref3 = _ref2[i], conditions = _ref3[0], block = _ref3[1];
|
_ref5 = _ref4[i], conditions = _ref5[0], block = _ref5[1];
|
||||||
_ref4 = flatten([conditions]);
|
_ref6 = flatten([conditions]);
|
||||||
for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) {
|
for (_j = 0, _len1 = _ref6.length; _j < _len1; _j++) {
|
||||||
cond = _ref4[_j];
|
cond = _ref6[_j];
|
||||||
if (!this.subject) {
|
if (!this.subject) {
|
||||||
cond = cond.invert();
|
cond = cond.invert();
|
||||||
}
|
}
|
||||||
@@ -2881,13 +2894,13 @@
|
|||||||
If.prototype.children = ['condition', 'body', 'elseBody'];
|
If.prototype.children = ['condition', 'body', 'elseBody'];
|
||||||
|
|
||||||
If.prototype.bodyNode = function() {
|
If.prototype.bodyNode = function() {
|
||||||
var _ref2;
|
var _ref4;
|
||||||
return (_ref2 = this.body) != null ? _ref2.unwrap() : void 0;
|
return (_ref4 = this.body) != null ? _ref4.unwrap() : void 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
If.prototype.elseBodyNode = function() {
|
If.prototype.elseBodyNode = function() {
|
||||||
var _ref2;
|
var _ref4;
|
||||||
return (_ref2 = this.elseBody) != null ? _ref2.unwrap() : void 0;
|
return (_ref4 = this.elseBody) != null ? _ref4.unwrap() : void 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
If.prototype.addElse = function(elseBody) {
|
If.prototype.addElse = function(elseBody) {
|
||||||
@@ -2901,13 +2914,13 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
If.prototype.isStatement = function(o) {
|
If.prototype.isStatement = function(o) {
|
||||||
var _ref2;
|
var _ref4;
|
||||||
return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((_ref2 = this.elseBodyNode()) != null ? _ref2.isStatement(o) : void 0);
|
return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((_ref4 = this.elseBodyNode()) != null ? _ref4.isStatement(o) : void 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
If.prototype.jumps = function(o) {
|
If.prototype.jumps = function(o) {
|
||||||
var _ref2;
|
var _ref4;
|
||||||
return this.body.jumps(o) || ((_ref2 = this.elseBody) != null ? _ref2.jumps(o) : void 0);
|
return this.body.jumps(o) || ((_ref4 = this.elseBody) != null ? _ref4.jumps(o) : void 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
If.prototype.compileNode = function(o) {
|
If.prototype.compileNode = function(o) {
|
||||||
|
|||||||
@@ -989,15 +989,7 @@ exports.Class = class Class extends Base
|
|||||||
body = new Block [new Return new Literal "#{@ctor.name}.prototype.#{name.value}.apply(_this, arguments)"]
|
body = new Block [new Return new Literal "#{@ctor.name}.prototype.#{name.value}.apply(_this, arguments)"]
|
||||||
rhs = new Code func.params, body, 'boundfunc'
|
rhs = new Code func.params, body, 'boundfunc'
|
||||||
bound = new Assign lhs, rhs
|
bound = new Assign lhs, rhs
|
||||||
|
@ctor.body.push bound
|
||||||
@ctor.body.unshift bound
|
|
||||||
|
|
||||||
# {base} = assign.variable
|
|
||||||
# lhs = (new Value (new Literal "this"), [new Access base]).compile o
|
|
||||||
# @ctor.body.unshift new Literal """#{lhs} = function() {
|
|
||||||
# #{o.indent} return #{@ctor.name}.prototype.#{base.value}.apply(_this, arguments);
|
|
||||||
# #{o.indent}}\n
|
|
||||||
# """
|
|
||||||
return
|
return
|
||||||
|
|
||||||
# Merge the properties from a top-level object as prototypal properties
|
# Merge the properties from a top-level object as prototypal properties
|
||||||
@@ -1057,16 +1049,26 @@ exports.Class = class Class extends Base
|
|||||||
|
|
||||||
# Make sure that a constructor is defined for the class, and properly
|
# Make sure that a constructor is defined for the class, and properly
|
||||||
# configured.
|
# configured.
|
||||||
ensureConstructor: (name) ->
|
ensureConstructor: (name, o) ->
|
||||||
if not @ctor
|
missing = not @ctor
|
||||||
@ctor = new Code
|
@ctor or= new Code
|
||||||
@ctor.body.push new Literal "#{name}.__super__.constructor.apply(this, arguments)" if @parent
|
@ctor.ctor = @ctor.name = name
|
||||||
@ctor.body.push new Literal "#{@externalCtor}.apply(this, arguments)" if @externalCtor
|
@ctor.klass = null
|
||||||
@ctor.body.makeReturn()
|
|
||||||
@body.expressions.unshift @ctor
|
|
||||||
@ctor.ctor = @ctor.name = name
|
|
||||||
@ctor.klass = null
|
|
||||||
@ctor.noReturn = yes
|
@ctor.noReturn = yes
|
||||||
|
if missing
|
||||||
|
superCall = new Literal "#{name}.__super__.constructor.apply(this, arguments)" if @parent
|
||||||
|
superCall = new Literal "#{@externalCtor}.apply(this, arguments)" if @externalCtor
|
||||||
|
if superCall
|
||||||
|
ref = new Literal o.scope.freeVariable 'ref'
|
||||||
|
@ctor.body.unshift new Assign ref, superCall
|
||||||
|
@addBoundFunctions o
|
||||||
|
if superCall
|
||||||
|
@ctor.body.push ref
|
||||||
|
@ctor.body.makeReturn()
|
||||||
|
@body.expressions.unshift @ctor
|
||||||
|
else
|
||||||
|
@addBoundFunctions o
|
||||||
|
|
||||||
|
|
||||||
# Instead of generating the JavaScript string directly, we build up the
|
# Instead of generating the JavaScript string directly, we build up the
|
||||||
# equivalent syntax tree and compile that, in pieces. You can see the
|
# equivalent syntax tree and compile that, in pieces. You can see the
|
||||||
@@ -1080,12 +1082,11 @@ exports.Class = class Class extends Base
|
|||||||
@hoistDirectivePrologue()
|
@hoistDirectivePrologue()
|
||||||
@setContext name
|
@setContext name
|
||||||
@walkBody name, o
|
@walkBody name, o
|
||||||
@ensureConstructor name
|
@ensureConstructor name, o
|
||||||
@body.spaced = yes
|
@body.spaced = yes
|
||||||
@body.expressions.unshift @ctor unless @ctor instanceof Code
|
@body.expressions.unshift @ctor unless @ctor instanceof Code
|
||||||
@body.expressions.push lname
|
@body.expressions.push lname
|
||||||
@body.expressions.unshift @directives...
|
@body.expressions.unshift @directives...
|
||||||
@addBoundFunctions o
|
|
||||||
|
|
||||||
call = Closure.wrap @body
|
call = Closure.wrap @body
|
||||||
|
|
||||||
|
|||||||
@@ -740,3 +740,13 @@ test "#2489: removing __bind", ->
|
|||||||
|
|
||||||
eq thing.foo.length, 3
|
eq thing.foo.length, 3
|
||||||
eq thing.bar.length, 3
|
eq thing.bar.length, 3
|
||||||
|
|
||||||
|
|
||||||
|
test "#2773: overriding bound functions", ->
|
||||||
|
class Foo
|
||||||
|
method: => 'Foo'
|
||||||
|
|
||||||
|
class Bar extends Foo
|
||||||
|
method: => 'Bar'
|
||||||
|
|
||||||
|
eq (new Bar).method(), 'Bar'
|
||||||
|
|||||||
Reference in New Issue
Block a user