bool ArrayData::hasInternalReference(PointerSet &vars) const { if (supportValueRef()) { for (ArrayIter iter(this); iter; ++iter) { CVarRef var = iter.secondRef(); if (var.isReferenced()) { Variant *pvar = var.getVariantData(); if (vars.find(pvar) != vars.end()) { return true; } vars.insert(pvar); } if (var.isObject()) { ObjectData *pobj = var.getObjectData(); if (vars.find(pobj) != vars.end()) { return true; } vars.insert(pobj); if (pobj->o_toArray().get()->hasInternalReference(vars)) { return true; } } else if (var.isArray() && var.getArrayData()->hasInternalReference(vars)) { return true; } } } return false; }
void ArrayData::serialize(VariableSerializer *serializer) const { if (serializer->incNestedLevel((void*)this)) { serializer->writeOverflow((void*)this); } else { serializer->writeArrayHeader(this, size()); for (ArrayIter iter(this); iter; ++iter) { Variant key(iter.first()); if (key.isInteger()) { serializer->writeArrayKey(this, key.toInt64()); } else { serializer->writeArrayKey(this, key.toString()); } if (supportValueRef()) { serializer->writeArrayValue(this, iter.secondRef()); } else { serializer->writeArrayValue(this, iter.second()); } } serializer->writeArrayFooter(this); } serializer->decNestedLevel((void*)this); }