JS AST rewriter for tail call elimination
JavaScript
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
.gitignore
LICENSE.txt
README.md
index.js
main.js
package.json

README.md

Brushtail

Tail call optimisation for JavaScript.

Examples

example.js:

function count(from, to) {
    if(from >= to)
        return from;

    return count(from + 1, to);
}

console.log(count(0, 1000000));

Is rewritten into:

function count(from, to) {
    var __tcor;
    tco:
        while (true) {
            if (from >= to) {
                __tcor = from;
                break tco;
            }
            {
                var __from = from + 1, __to = to;
                from = __from;
                to = __to;
                continue tco;
            }
        }
    return __tcor;
}
console.log(count(0, 1000000));

Using the command-line tool:

$ brushtail example.js | node
1000000

For comparison, without the command-line tool:

$ node example.js

brushtail/example.js:1
n (exports, require, module, __filename, __dirname) { function count(from, to)
                                                                    ^
RangeError: Maximum call stack size exceeded

API

brushtail.tco(content)

Takes a JavaScript program as a String. Returns a String with a tail call optimised program.

brushtail.mutateAST(ast)

Takes a Mozilla Parser AST and mutates away tail calls.

brushtail.optimizeFunction(functionDeclaration)

Takes a function declaration in Mozilla Parser AST form and mutates away tail calls.

License

MIT