Phase 1 of precompiled extraction:
Separate template logic from container construction.
This commit is contained in:
@@ -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
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user