Implemented caching and fixed off by one error

This commit is contained in:
Michael Schmatz 2014-05-06 11:36:46 -07:00
parent dddd617a08
commit e8d26af985

View file

@ -176,7 +176,41 @@ self.stringifyValue = function(value, depth) {
return "" + prefix + brackets[0] + sep + " " + (values.join(sep + ' ')) + sep + brackets[1];
};
var cache = {};
self.invalidateCache = function () {
cache = {};
};
self.retrieveValueFromCache = function (thangID, spellID, variableChain, frame) {
var frameCache, thangCache, spellCache;
if ((frameCache = cache[frame]) && (thangCache = frameCache[thangID]) && (spellCache = thangCache[spellID]))
return spellCache[variableChain.join()];
return undefined;
};
self.updateCache = function (thangID, spellID, variableChain, frame, value) {
var key, keys, currentObject;
keys = [frame,thangID, spellID, variableChain.join()];
currentObject = cache;
for (var i = 0, len = keys.length - 1; i < len; i++)
{
key = keys[i];
if (!(key in currentObject))
currentObject[key] = {};
currentObject = currentObject[key];
}
currentObject[keys[keys.length - 1]] = value;
};
self.retrieveValueFromFrame = function retrieveValueFromFrame(args) {
var cacheValue;
if (cacheValue = self.retrieveValueFromCache(args.currentThangID, args.currentSpellID, args.variableChain, args.frame))
return self.postMessage({type: 'debug-value-return', serialized: {"key": args.variableChain.join(), "value": cacheValue}});
var retrieveProperty = function retrieveProperty(currentThangID, currentSpellID, variableChain)
{
var prop;
@ -226,12 +260,14 @@ self.retrieveValueFromFrame = function retrieveValueFromFrame(args) {
"key": keys.join("."),
"value": self.stringifyValue(value,0)
};
self.updateCache(currentThangID,currentSpellID,variableChain, args.frame, serializedProperty.value);
self.postMessage({type: 'debug-value-return', serialized: serializedProperty});
};
self.enableFlowOnThangSpell(args.currentThangID, args.currentSpellID, args.userCodeMap);
self.setupWorldToRunUntilFrame(args);
//You need to load until the very next frame, as the state is gathered at the next frame, this might be a source of bugs!
self.world.loadFramesUntilFrame(
args.frame,
args.frame + 1,
retrieveProperty.bind({},args.currentThangID, args.currentSpellID, args.variableChain),
self.onWorldError,
self.onWorldLoadProgress
@ -241,7 +277,7 @@ self.retrieveValueFromFrame = function retrieveValueFromFrame(args) {
self.enableFlowOnThangSpell = function enableFlowOnThang(thangID, spellID, userCodeMap) {
try {
if (userCodeMap[thangID][spellID].originalOptions.includeFlow === true &&
userCodeMap[thangID][spellID].originalOptions.noSerializationInFlow)
userCodeMap[thangID][spellID].originalOptions.noSerializationInFlow === true)
return;
else
{
@ -268,7 +304,7 @@ self.setupWorldToRunUntilFrame = function setupWorldToRunUntilFrame(args) {
var stringifiedUserCodeMap = JSON.stringify(args.userCodeMap);
var userCodeMapHasChanged = ! _.isEqual(self.currentUserCodeMapCopy, stringifiedUserCodeMap);
if (userCodeMapHasChanged) self.invalidateCache();
self.currentUserCodeMapCopy = stringifiedUserCodeMap;
try {
self.world = new World(args.worldName, args.userCodeMap);
@ -291,6 +327,7 @@ self.setupWorldToRunUntilFrame = function setupWorldToRunUntilFrame(args) {
};
self.runWorldUntilFrame = function runWorldUntilFrame(args) {
self.setupWorldToRunUntilFrame(args);
self.world.loadFramesUntilFrame(args.frame, self.onWorldLoaded, self.onWorldError, self.onWorldLoadProgress);
};