Add support for depthed resolution of data fields

This commit is contained in:
kpdecker
2014-02-09 18:35:22 -06:00
parent fcec69ae2c
commit 16f135835e
6 changed files with 39 additions and 24 deletions
+3 -1
View File
@@ -223,5 +223,7 @@ export var logger = {
export function log(level, obj) { logger.log(level, obj); }
export var createFrame = function(object) {
return Utils.extend({}, object);
var frame = Utils.extend({}, object);
frame._parent = object;
return frame;
};
+1 -5
View File
@@ -310,11 +310,7 @@ Compiler.prototype = {
DATA: function(data) {
this.options.data = true;
if (data.id.isScoped || data.id.depth) {
throw new Exception('Scoped data references are not supported: ' + data.original, data);
}
this.opcode('lookupData');
this.opcode('lookupData', data.id.depth);
var parts = data.id.parts;
for(var i=0, l=parts.length; i<l; i++) {
this.opcode('lookup', parts[i]);
@@ -403,8 +403,12 @@ JavaScriptCompiler.prototype = {
// On stack, after: data, ...
//
// Push the data lookup operator
lookupData: function() {
this.pushStackLiteral('data');
lookupData: function(depth) {
if (!depth) {
this.pushStackLiteral('data');
} else {
this.pushStackLiteral('this.data(data, ' + depth + ')');
}
},
// [pushStringParam]
+6
View File
@@ -77,6 +77,12 @@ export function template(templateSpec, env) {
}
return data;
},
data: function(data, depth) {
while (data && depth--) {
data = data._parent;
}
return data;
},
merge: function(param, common) {
var ret = param || common;