Merge duplicate programs
This commit is contained in:
@@ -38,6 +38,26 @@ Handlebars.JavaScriptCompiler = function() {};
|
|||||||
|
|
||||||
return out.join("\n");
|
return out.join("\n");
|
||||||
},
|
},
|
||||||
|
equals: function(other) {
|
||||||
|
var len = this.opcodes.length;
|
||||||
|
if (other.opcodes.length !== len) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < len; i++) {
|
||||||
|
var opcode = this.opcodes[i],
|
||||||
|
otherOpcode = other.opcodes[i];
|
||||||
|
if (opcode.opcode !== otherOpcode.opcode || opcode.args.length !== otherOpcode.args.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (var j = 0; j < opcode.args.length; j++) {
|
||||||
|
if (opcode.args[j] !== otherOpcode.args[j]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
guid: 0,
|
guid: 0,
|
||||||
|
|
||||||
@@ -417,6 +437,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|||||||
this.isChild = !!context;
|
this.isChild = !!context;
|
||||||
this.context = context || {
|
this.context = context || {
|
||||||
programs: [],
|
programs: [],
|
||||||
|
environments: [],
|
||||||
aliases: { }
|
aliases: { }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -452,7 +473,7 @@ Handlebars.JavaScriptCompiler = function() {};
|
|||||||
return opcodes[this.i + 1];
|
return opcodes[this.i + 1];
|
||||||
},
|
},
|
||||||
|
|
||||||
eat: function(opcode) {
|
eat: function() {
|
||||||
this.i = this.i + 1;
|
this.i = this.i + 1;
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -905,11 +926,27 @@ Handlebars.JavaScriptCompiler = function() {};
|
|||||||
child = children[i];
|
child = children[i];
|
||||||
compiler = new this.compiler();
|
compiler = new this.compiler();
|
||||||
|
|
||||||
this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children
|
var index = this.matchExistingProgram(child);
|
||||||
var index = this.context.programs.length;
|
|
||||||
child.index = index;
|
if (index == null) {
|
||||||
child.name = 'program' + index;
|
this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children
|
||||||
this.context.programs[index] = compiler.compile(child, options, this.context);
|
index = this.context.programs.length;
|
||||||
|
child.index = index;
|
||||||
|
child.name = 'program' + index;
|
||||||
|
this.context.programs[index] = compiler.compile(child, options, this.context);
|
||||||
|
this.context.environments[index] = child;
|
||||||
|
} else {
|
||||||
|
child.index = index;
|
||||||
|
child.name = 'program' + index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
matchExistingProgram: function(child) {
|
||||||
|
for (var i = 0, len = this.context.environments.length; i < len; i++) {
|
||||||
|
var environment = this.context.environments[i];
|
||||||
|
if (environment && environment.equals(child)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user