public static Stack ( |
||
itemStorageType | ||
isCached | bool | |
return |
/// <summary> /// If the iterator has been fully cached, then iterate the values one-by-one. /// </summary> public void EnsureNoCache() { if (_storage.IsCached) { if (!HasLabelNext) { // If no Next label, this must be a singleton cache EnsureStack(); _helper.LoadInteger(0); _helper.CallCacheItem(_storage.ItemStorageType); _storage = StorageDescriptor.Stack(_storage.ItemStorageType, false); } else { // int idx; LocalBuilder locIdx = _helper.DeclareLocal("$$$idx", typeof(int)); Label lblNext; // Make sure cache is not on the stack EnsureNoStack("$$$cache"); // idx = -1; _helper.LoadInteger(-1); _helper.Emit(OpCodes.Stloc, locIdx); // LabelNext: lblNext = _helper.DefineLabel(); _helper.MarkLabel(lblNext); // idx++; _helper.Emit(OpCodes.Ldloc, locIdx); _helper.LoadInteger(1); _helper.Emit(OpCodes.Add); _helper.Emit(OpCodes.Stloc, locIdx); // if (idx >= cache.Count) goto LabelNextCtxt; _helper.Emit(OpCodes.Ldloc, locIdx); CacheCount(); _helper.Emit(OpCodes.Bge, GetLabelNext()); // item = cache[idx]; PushValue(); _helper.Emit(OpCodes.Ldloc, locIdx); _helper.CallCacheItem(_storage.ItemStorageType); SetIterator(lblNext, StorageDescriptor.Stack(_storage.ItemStorageType, false)); } } }