more AST_If optimizations

This commit is contained in:
Mihai Bazon
2012-09-12 16:10:03 +03:00
parent 2b1e4628e0
commit a132841fb9
2 changed files with 85 additions and 15 deletions

View File

@@ -113,6 +113,8 @@ var MAP = (function(){
var ret = [], top = [], i;
function doit() {
var val = f.call(o, 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) {
@@ -128,16 +130,23 @@ var MAP = (function(){
ret.push(val);
}
}
return is_last;
};
if (a instanceof Array) for (i = 0; i < a.length; ++i) doit();
else for (i in a) if (HOP(a, i)) doit();
if (a instanceof Array) {
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);
};
MAP.at_top = function(val) { return new AtTop(val) };
MAP.splice = function(val) { return new Splice(val) };
MAP.last = function(val) { return new Last(val) };
var skip = MAP.skip = {};
function AtTop(val) { this.v = val };
function Splice(val) { this.v = val };
function Last(val) { this.v = val };
return MAP;
})();