OSCollection * OSDictionary::copyCollection(OSDictionary *cycleDict) { bool allocDict = !cycleDict; OSCollection *ret = 0; OSDictionary *newDict = 0; if (allocDict) { cycleDict = OSDictionary::withCapacity(16); if (!cycleDict) return 0; } do { // Check for a cycle ret = super::copyCollection(cycleDict); if (ret) continue; newDict = OSDictionary::withDictionary(this); if (!newDict) continue; // Insert object into cycle Dictionary cycleDict->setObject((const OSSymbol *) this, newDict); for (unsigned int i = 0; i < count; i++) { const OSMetaClassBase *obj = dictionary[i].value; OSCollection *coll = OSDynamicCast(OSCollection, EXT_CAST(obj)); if (coll) { OSCollection *newColl = coll->copyCollection(cycleDict); if (!newColl) goto abortCopy; newDict->dictionary[i].value = newColl; coll->taggedRelease(OSTypeID(OSCollection)); newColl->taggedRetain(OSTypeID(OSCollection)); newColl->release(); }; } ret = newDict; newDict = 0; } while (false); abortCopy: if (newDict) newDict->release(); if (allocDict) cycleDict->release(); return ret; }