void String::unserialize(VariableUnserializer *uns, char delimiter0 /* = '"' */, char delimiter1 /* = '"' */) { int64_t size = uns->readInt(); if (size >= RuntimeOption::MaxSerializedStringSize) { throw Exception("Size of serialized string (%d) exceeds max", int(size)); } if (size < 0) { throw Exception("Size of serialized string (%d) must not be negative", int(size)); } uns->expectChar(':'); uns->expectChar(delimiter0); StringData *px = StringData::Make(int(size)); auto const buf = px->bufferSlice(); assert(size <= buf.len); uns->read(buf.ptr, size); px->setSize(size); if (m_px) decRefStr(m_px); m_px = px; px->setRefCount(1); uns->expectChar(delimiter1); }
String concat3(const String& s1, const String& s2, const String& s3) { StringSlice r1 = s1.slice(); StringSlice r2 = s2.slice(); StringSlice r3 = s3.slice(); int len = r1.len + r2.len + r3.len; StringData* str = StringData::Make(len); auto const r = str->bufferSlice(); memcpy(r.ptr, r1.ptr, r1.len); memcpy(r.ptr + r1.len, r2.ptr, r2.len); memcpy(r.ptr + r1.len + r2.len, r3.ptr, r3.len); str->setSize(len); return str; }