예제 #1
0
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;
}
예제 #2
0
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);
}