BOOL ForInObjectEnumerator::GetCurrentEnumerator() { Assert(object); ScriptContext* scriptContext = GetScriptContext(); if (VirtualTableInfo<DynamicObject>::HasVirtualTable(object)) { DynamicObject* dynamicObject = (DynamicObject*)object; if (!dynamicObject->GetTypeHandler()->EnsureObjectReady(dynamicObject)) { return false; } dynamicObject->GetDynamicType()->PrepareForTypeSnapshotEnumeration(); embeddedEnumerator.Initialize(dynamicObject, true); currentEnumerator = &embeddedEnumerator; return true; } if (!object->GetEnumerator(TRUE /*enumNonEnumerable*/, (Var *)¤tEnumerator, scriptContext, true /*preferSnapshotSemantics */, enumSymbols)) { currentEnumerator = scriptContext->GetLibrary()->GetNullEnumerator(); return false; } return true; }
bool RecyclableObject::IsWritableDataOnlyDetectionBitSet() { if (DynamicType::Is(this->GetTypeId())) { DynamicObject* obj = DynamicObject::FromVar(this); return obj->GetTypeHandler()->IsWritableDataOnlyDetectionBitSet() || (obj->HasObjectArray() && obj->GetObjectArrayOrFlagsAsArray()->IsWritableDataOnlyDetectionBitSet()); } return false; }
bool RecyclableObject::HasOnlyWritableDataProperties() { if (DynamicType::Is(this->GetTypeId())) { DynamicObject* obj = DynamicObject::FromVar(this); return obj->GetTypeHandler()->GetHasOnlyWritableDataProperties() && (!obj->HasObjectArray() || obj->GetObjectArrayOrFlagsAsArray()->HasOnlyWritableDataProperties()); } return true; }
void RecyclableObject::ClearWritableDataOnlyDetectionBit() { if (DynamicType::Is(this->GetTypeId())) { DynamicObject* obj = DynamicObject::FromVar(this); obj->GetTypeHandler()->ClearWritableDataOnlyDetectionBit(); if (obj->HasObjectArray()) { obj->GetObjectArrayOrFlagsAsArray()->ClearWritableDataOnlyDetectionBit(); } } }