示例#1
0
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);
    }
}