private EffectBytecode LoadEffectBytecode(DatabaseFileProvider database, ObjectId bytecodeId) { EffectBytecode bytecode = null; if (!bytecodes.TryGetValue(bytecodeId, out bytecode)) { if (!bytecodesByPassingStorage.Contains(bytecodeId) && database.ObjectDatabase.Exists(bytecodeId)) { using (var stream = database.ObjectDatabase.OpenStream(bytecodeId)) { bytecode = EffectBytecode.FromStream(stream); } } if (bytecode != null) { bytecodes.Add(bytecodeId, bytecode); } } // Always check that the bytecode is in sync with hash sources on all platforms if (bytecode != null && IsBytecodeObsolete(bytecode)) { bytecodes.Remove(bytecodeId); bytecode = null; } return(bytecode); }
private KeyValuePair <EffectBytecode, EffectBytecodeCacheLoadSource> LoadEffectBytecode(DatabaseFileProvider database, ObjectId bytecodeId) { KeyValuePair <EffectBytecode, EffectBytecodeCacheLoadSource> bytecodePair; if (!bytecodes.TryGetValue(bytecodeId, out bytecodePair)) { if (!bytecodesByPassingStorage.Contains(bytecodeId) && database.ObjectDatabase.Exists(bytecodeId)) { using (var stream = database.ObjectDatabase.OpenStream(bytecodeId)) { var bytecode = EffectBytecode.FromStream(stream); // Try to read an integer that would specify what kind of cache it belongs to (if undefined because of old versions, mark it as dynamic cache) var cacheSource = EffectBytecodeCacheLoadSource.DynamicCache; if (stream.Position < stream.Length) { var binaryReader = new BinarySerializationReader(stream); cacheSource = (EffectBytecodeCacheLoadSource)binaryReader.ReadInt32(); } bytecodePair = new KeyValuePair <EffectBytecode, EffectBytecodeCacheLoadSource>(bytecode, cacheSource); } } if (bytecodePair.Key != null) { bytecodes.Add(bytecodeId, bytecodePair); } } // Always check that the bytecode is in sync with hash sources on all platforms if (bytecodePair.Key != null && IsBytecodeObsolete(bytecodePair.Key)) { bytecodes.Remove(bytecodeId); bytecodePair = new KeyValuePair <EffectBytecode, EffectBytecodeCacheLoadSource>(null, EffectBytecodeCacheLoadSource.JustCompiled); } return(bytecodePair); }