JavascriptString * DynamicObjectPropertyEnumerator::MoveAndGetNextWithCache(PropertyId& propertyId, PropertyAttributes* attributes) { #if ENABLE_TTD AssertMsg(!this->scriptContext->GetThreadContext()->IsRuntimeInTTDMode(), "We should always trap out to explicit enumeration in this case"); #endif Assert(enumeratedCount <= cachedData->cachedCount); JavascriptString* propertyStringName; PropertyAttributes propertyAttributes = PropertyNone; if (enumeratedCount < cachedData->cachedCount) { PropertyString * propertyString = cachedData->strings[enumeratedCount]; propertyStringName = propertyString; propertyId = propertyString->GetPropertyId(); #if DBG PropertyId tempPropertyId; /* JavascriptString * tempPropertyString = */ this->MoveAndGetNextNoCache(tempPropertyId, attributes); Assert(tempPropertyId == propertyId); Assert(this->objectIndex == cachedData->indexes[enumeratedCount]); #endif this->objectIndex = cachedData->indexes[enumeratedCount]; propertyAttributes = cachedData->attributes[enumeratedCount]; enumeratedCount++; } else if (!cachedData->completed) { propertyStringName = this->MoveAndGetNextNoCache(propertyId, &propertyAttributes); if (propertyStringName) { PropertyString* propertyString = PropertyString::TryFromVar(propertyStringName); if (propertyString != nullptr) { Assert(enumeratedCount < this->initialPropertyCount); cachedData->strings[enumeratedCount] = propertyString; cachedData->indexes[enumeratedCount] = this->objectIndex; cachedData->attributes[enumeratedCount] = propertyAttributes; cachedData->cachedCount = ++enumeratedCount; } } else { cachedData->completed = true; } } else { #if DBG PropertyId tempPropertyId; Assert(this->MoveAndGetNextNoCache(tempPropertyId, attributes) == nullptr); #endif propertyStringName = nullptr; } if (attributes != nullptr) { *attributes = propertyAttributes; } return propertyStringName; }