bool Globals::isHead(ssize_t pos) const { if (staticSize() > 0) return pos == 0; if (pos < -1) { ArrayData *arr = Array::get(); ASSERT(arr); return !arr->empty() && wrapIter(pos) == arr->iter_begin(); } return false; }
bool Globals::isTail(ssize_t pos) const { ArrayData *arr = Array::get(); if (!arr || arr->empty()) { return staticSize() > 0 && pos == staticSize() - 1; } if (pos < -1) { return wrapIter(pos) == arr->iter_end(); } return false; }
String HHVM_FUNCTION(serialize, const Variant& value) { switch (value.getType()) { case KindOfUninit: case KindOfNull: return s_Null; case KindOfBoolean: return value.getBoolean() ? s_True : s_False; case KindOfInt64: { StringBuffer sb; sb.append("i:"); sb.append(value.getInt64()); sb.append(';'); return sb.detach(); } case KindOfPersistentString: case KindOfString: { StringData *str = value.getStringData(); StringBuffer sb; sb.append("s:"); sb.append(str->size()); sb.append(":\""); sb.append(str->data(), str->size()); sb.append("\";"); return sb.detach(); } case KindOfResource: return s_Res; case KindOfPersistentArray: case KindOfArray: { ArrayData *arr = value.getArrayData(); if (arr->empty()) { if (arr->isVecArray()) return s_EmptyVecArray; if (arr->isDict()) return s_EmptyDictArray; return s_EmptyArray; } // fall-through } case KindOfDouble: case KindOfObject: { VariableSerializer vs(VariableSerializer::Type::Serialize); return vs.serialize(value, true); } case KindOfRef: case KindOfClass: break; } not_reached(); }
String f_serialize(const Variant& value) { switch (value.getType()) { case KindOfUninit: case KindOfNull: return "N;"; case KindOfBoolean: return value.getBoolean() ? "b:1;" : "b:0;"; case KindOfInt64: { StringBuffer sb; sb.append("i:"); sb.append(value.getInt64()); sb.append(';'); return sb.detach(); } case KindOfStaticString: case KindOfString: { StringData *str = value.getStringData(); StringBuffer sb; sb.append("s:"); sb.append(str->size()); sb.append(":\""); sb.append(str->data(), str->size()); sb.append("\";"); return sb.detach(); } case KindOfArray: { ArrayData *arr = value.getArrayData(); if (arr->empty()) return "a:0:{}"; // fall-through } case KindOfObject: case KindOfResource: case KindOfDouble: { VariableSerializer vs(VariableSerializer::Type::Serialize); return vs.serialize(value, true); } default: assert(false); break; } return ""; }