fixing an improper-js-output bug when using a loop-compiled inarray clause as part of a larger expression

This commit is contained in:
Jeremy Ashkenas 2010-06-27 13:27:51 -04:00
parent 24676eea71
commit af3b356d70
3 changed files with 10 additions and 10 deletions

View File

@ -1222,7 +1222,7 @@
return "(" + (tests.join(' || ')) + ")";
};
InNode.prototype.compileLoopTest = function(o) {
var _b, _c, body, i, l;
var _b, _c, i, l, prefix;
_b = this.array.compileReference(o, {
precompile: true
});
@ -1231,12 +1231,8 @@
_c = [o.scope.freeVariable(), o.scope.freeVariable()];
i = _c[0];
l = _c[1];
body = ("!!(function(){ for (var " + i + "=0, " + l + "=" + (this.arr1) + ".length; " + i + "<" + l + "; " + i + "++) if (" + (this.arr2) + "[" + i + "] === " + this.obj2 + ") return true; })()");
if (this.obj1 !== this.obj2) {
return "" + this.obj1 + ";\n" + this.tab + body;
} else {
return body;
}
prefix = this.obj1 !== this.obj2 ? this.obj1 + '; ' : '';
return "!!(function(){ " + (prefix) + "for (var " + i + "=0, " + l + "=" + (this.arr1) + ".length; " + i + "<" + l + "; " + i + "++) if (" + (this.arr2) + "[" + i + "] === " + this.obj2 + ") return true; })()";
};
return InNode;
})();

View File

@ -1046,8 +1046,8 @@ exports.InNode: class InNode extends BaseNode
compileLoopTest: (o) ->
[@arr1, @arr2]: @array.compileReference o, {precompile: yes}
[i, l]: [o.scope.freeVariable(), o.scope.freeVariable()]
body: "!!(function(){ for (var $i=0, $l=${@arr1}.length; $i<$l; $i++) if (${@arr2}[$i] === $@obj2) return true; })()"
if @obj1 isnt @obj2 then "$@obj1;\n$@tab$body" else body
prefix: if @obj1 isnt @obj2 then @obj1 + '; ' else ''
"!!(function(){ ${prefix}for (var $i=0, $l=${@arr1}.length; $i<$l; $i++) if (${@arr2}[$i] === $@obj2) return true; })()"
#### TryNode

View File

@ -45,4 +45,8 @@ ok 'b' not of obj
ok 100 in [100, 200, 300]
array: [100, 200, 300]
ok 100 in array
ok 1 not in array
ok 1 not in array
list: [1, 2, 7]
result: if list[2] in [7, 10] then 100 else -1
ok result is 100