rewrite handle_if_return

optimizations of if/return/continue seem to be even better now
This commit is contained in:
Mihai Bazon
2012-09-16 15:46:20 +03:00
parent 397bf56d25
commit 7b6a402916
4 changed files with 194 additions and 30 deletions

View File

@@ -109,23 +109,23 @@ function defaults(args, defs) {
function noop() {};
var MAP = (function(){
function MAP(a, f, o) {
function MAP(a, f, backwards) {
var ret = [], top = [], i;
function doit() {
var val = f.call(o, a[i], i);
var val = f(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) {
top.push.apply(top, val.v);
top.push.apply(top, backwards ? val.v.slice().reverse() : val.v);
} else {
top.push(val);
}
}
else if (val !== skip) {
if (val instanceof Splice) {
ret.push.apply(ret, val.v);
ret.push.apply(ret, backwards ? val.v.slice().reverse() : val.v);
} else {
ret.push(val);
}
@@ -133,7 +133,13 @@ var MAP = (function(){
return is_last;
};
if (a instanceof Array) {
for (i = 0; i < a.length; ++i) if (doit()) break;
if (backwards) {
for (i = a.length; --i >= 0;) if (doit()) break;
ret.reverse();
top.reverse();
} else {
for (i = 0; i < a.length; ++i) if (doit()) break;
}
}
else {
for (i in a) if (HOP(a, i)) if (doit()) break;