ArrayData *ZendArray::addLval(CVarRef k, Variant *&ret, bool copy) { ASSERT(!exists(k)); TypedValueAccessor tva = k.getTypedAccessor(); if (isIntKey(tva)) return addLval(getIntKey(tva), ret, copy); ASSERT(k.isString()); return addLval(k.toStrNR(), ret, copy); }
void Array::unserialize(VariableUnserializer *uns) { int64 size = uns->readInt(); char sep = uns->readChar(); if (sep != ':') { throw Exception("Expected ':' but got '%c'", sep); } sep = uns->readChar(); if (sep != '{') { throw Exception("Expected '{' but got '%c'", sep); } if (size == 0) { operator=(Create()); } else { // Pre-allocate an ArrayData of the given size, to avoid escalation in // the middle, which breaks references. operator=(ArrayInit(size).create()); bool isAPC = (uns->getType() == VariableUnserializer::APCSerialize); for (int64 i = 0; i < size; i++) { Variant key(uns->unserializeKey()); if (!key.isString() && !key.isInteger()) { throw Exception("Invalid key"); } Variant &value = isAPC ? addLval(key, true) : lvalAt(key, AccessFlags::Key); value.unserialize(uns); } } sep = uns->readChar(); if (sep != '}') { throw Exception("Expected '}' but got '%c'", sep); } }