Phase 1 of precompiled extraction:

Separate template logic from container construction.
This commit is contained in:
kpdecker
2011-07-30 11:10:13 -05:00
parent 542d64f0be
commit 74bd8cac60
2 changed files with 44 additions and 31 deletions
+5 -30
View File
@@ -345,7 +345,7 @@ Handlebars.JavaScriptCompiler = function() {};
}
}
return this.createFunction();
return this.createFunctionContext();
},
nextOpcode: function(n) {
@@ -388,25 +388,7 @@ Handlebars.JavaScriptCompiler = function() {};
this.source = out;
},
createFunction: function() {
var container = {
escapeExpression: Handlebars.Utils.escapeExpression,
invokePartial: Handlebars.VM.invokePartial,
programs: [],
program: function(i, helpers, partials, data) {
var programWrapper = this.programs[i];
if(data) {
return Handlebars.VM.program(this.children[i], helpers, partials, data);
} else if(programWrapper) {
return programWrapper;
} else {
programWrapper = this.programs[i] = Handlebars.VM.program(this.children[i], helpers, partials);
return programWrapper;
}
},
programWithDepth: Handlebars.VM.programWithDepth,
noop: Handlebars.VM.noop
};
createFunctionContext: function() {
var locals = this.stackVars.concat(this.registers.list);
if(locals.length > 0) {
@@ -434,16 +416,9 @@ Handlebars.JavaScriptCompiler = function() {};
Handlebars.log(Handlebars.logger.DEBUG, fn.toString() + "\n\n");
container.render = fn;
container.children = this.environment.children;
return function(context, options, $depth) {
options = options || {};
var args = [Handlebars, context, options.helpers, options.partials, options.data];
var depth = Array.prototype.slice.call(arguments, 2);
args = args.concat(depth);
return container.render.apply(container, args);
return {
fn: fn,
children: this.environment.children
};
},
+39 -1
View File
@@ -2,6 +2,43 @@ var Handlebars = require("handlebars");
// BEGIN(BROWSER)
Handlebars.VM = {
generateContainer: function(template) {
// Setup all children
for (var i = 0, len = template.children.length; i < len; i++) {
template.children[i] = this.generateContainer(template.children[i]);
}
// Just add water
var container = {
escapeExpression: Handlebars.Utils.escapeExpression,
invokePartial: Handlebars.VM.invokePartial,
programs: [],
program: function(i, helpers, partials, data) {
var programWrapper = this.programs[i];
if(data) {
return Handlebars.VM.program(this.children[i], helpers, partials, data);
} else if(programWrapper) {
return programWrapper;
} else {
programWrapper = this.programs[i] = Handlebars.VM.program(this.children[i], helpers, partials);
return programWrapper;
}
},
programWithDepth: Handlebars.VM.programWithDepth,
noop: Handlebars.VM.noop
};
container.render = template.fn;
container.children = template.children;
return function(context, options, $depth) {
options = options || {};
var args = [Handlebars, context, options.helpers, options.partials, options.data];
var depth = Array.prototype.slice.call(arguments, 2);
args = args.concat(depth);
return container.render.apply(container, args);
};
},
programWithDepth: function(fn, helpers, partials, data, $depth) {
var args = Array.prototype.slice.call(arguments, 4);
@@ -32,7 +69,8 @@ Handlebars.VM = {
compile: function(string, options) {
var ast = Handlebars.parse(string);
var environment = new Handlebars.Compiler().compile(ast, options);
return new Handlebars.JavaScriptCompiler().compile(environment, options);
var logic = new Handlebars.JavaScriptCompiler().compile(environment, options);
return Handlebars.VM.generateContainer(logic);
},
invokePartial: function(partial, name, context, helpers, partials) {
if(partial === undefined) {