Skip to content

puffnfresh/brushtail

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

About

JS AST rewriter for tail call elimination

Resources

License

Stars

Watchers

Forks

Packages

No packages published