A number of fixes in sandbox and declaration processing

This commit is contained in:
Zaid Abdulla committed 2016-11-10 07:07:51 -08:00
1 parent 3b987cc0cc
commit f9c5272ce0
5 files changed
+107 -119

No files matched your search

+59 -70
View File
@@ -132,34 +132,33 @@ function declare(path, timestamps, values) {
let parsedPath = common.parsePath(path);
sandbox.declarations[path] = sandbox.declarations[path] || [parsedPath, 1, {}, null, {}];
let declaration = [parsedPath, 1];
let attrs = {};
for (let attrName in timestamps) {
if (attrName === "path") {
if (timestamps.path > sandbox.declarations[path][1])
sandbox.declarations[path][1] = timestamps.path;
}
else {
attrs[attrName] = 1;
if (!(timestamps[attrName] <= sandbox.declarations[path][2][attrName]))
sandbox.declarations[path][2][attrName] = timestamps[attrName];
}
}
if (values) {
for (let attrName in values) {
if (timestamps)
for (let attrName in timestamps)
if (attrName === "path")
sandbox.declarations[path][3] = values.path;
declaration[1] = timestamps.path;
else {
attrs[attrName] = 1;
if (attrName === 'value' && !Array.isArray(values[attrName]))
sandbox.declarations[path][4].value = [values[attrName]];
else
sandbox.declarations[path][4].value = values[attrName];
declaration[2] = declaration[2] || {};
declaration[2][attrName] = timestamps[attrName];
}
}
}
if (values)
for (let attrName in values)
if (attrName === "path")
declaration[3] = values.path;
else {
attrs[attrName] = 1;
declaration[4] = declaration[4] || {};
if (attrName === "value" && !Array.isArray(values.value))
declaration[4].value = [values.value];
else
declaration[4][attrName] = values[attrName];
}
sandbox.declarations.push(declaration);
return new ParameterWrapper(parsedPath, Object.keys(attrs));
}
@@ -212,7 +211,7 @@ function run(script, globals, timestamp, deviceData, extensionsCache, startRevis
sandbox.revision = startRevision;
sandbox.maxRevision = maxRevision;
sandbox.uncommitted = false;
sandbox.declarations = {};
sandbox.declarations = [];
sandbox.extensions = {};
sandbox.clear = null;
@@ -222,59 +221,49 @@ function run(script, globals, timestamp, deviceData, extensionsCache, startRevis
for (let n in globals)
sandbox.context[n] = globals[n];
let ret, status;
try {
let ret = script.runInContext(sandbox.context, {displayErrors: false});
let declarations = [];
for (let p in sandbox.declarations)
declarations.push(sandbox.declarations[p]);
let counter = 1;
for (let key in sandbox.extensions) {
++ counter;
extensions.run(sandbox.extensions[key], function(err, res) {
sandbox.extensionsCache[key] = res;
if (-- counter === 0)
return callback(null, sandbox.clear, declarations, true, ret);
});
}
if (-- counter === 0)
return callback(null, sandbox.clear, declarations, true, ret);
ret = script.runInContext(sandbox.context, {displayErrors: false});
status = 0;
}
catch (err) {
if (err === COMMIT) {
let declarations = [];
for (let p in sandbox.declarations)
declarations.push(sandbox.declarations[p]);
let counter = 1;
for (let key in sandbox.extensions) {
++ counter;
extensions.run(sandbox.extensions[key], function(err, res) {
sandbox.extensionsCache[key] = res;
if (-- counter === 0)
return callback(null, sandbox.clear, declarations, false);
});
}
if (-- counter === 0)
return callback(null, sandbox.clear, declarations, false);
}
else if (err === EXT) {
let counter = 1;
for (let key in sandbox.extensions) {
++ counter;
extensions.run(sandbox.extensions[key], function(err, res) {
sandbox.extensionsCache[key] = res;
if (-- counter === 0)
return run(script, globals, timestamp, deviceData, extensionsCache, startRevision, maxRevision, callback);
});
}
if (-- counter === 0)
return run(script, globals, timestamp, deviceData, extensionsCache, startRevision, maxRevision, callback);
}
if (err === COMMIT)
status = 1;
else if (err === EXT)
status = 2;
else
return callback(err);
}
let ext = sandbox.extensions;
let decs = sandbox.declarations;
let clr = sandbox.clear;
let extCache = sandbox.extensionsCache;
let args = arguments;
let counter = 1;
for (let key in sandbox.extensions) {
++ counter;
extensions.run(sandbox.extensions[key], function(err, res) {
if (err && counter > 0) {
counter = 0;
return callback(err);
}
extCache[key] = res;
if (-- counter === 0)
if (status === 2)
return run.apply(null, args);
else
return callback(null, clr, decs, status === 0, ret);
});
}
if (-- counter === 0)
if (status === 2)
return run.apply(null, args);
else
return callback(null, clr, decs, status === 0, ret);
}