StringData* insertStaticString(StringSlice slice) { auto const sd = StringData::MakeStatic(slice); auto pair = s_stringDataMap->insert( make_intern_key(sd), RDS::Link<TypedValue>(RDS::kInvalidHandle) ); if (!pair.second) { sd->destructStatic(); } assert(to_sdata(pair.first->first) != nullptr); return const_cast<StringData*>(to_sdata(pair.first->first)); }
StringData* insertStaticString(StringData* sd) { auto pair = s_stringDataMap->insert( make_intern_key(sd), rds::Link<TypedValue>(rds::kInvalidHandle) ); if (!pair.second) { sd->destructStatic(); } else { MemoryStats::GetInstance()->LogStaticStringAlloc(sd->size() + sizeof(StringData)); } assert(to_sdata(pair.first->first) != nullptr); return const_cast<StringData*>(to_sdata(pair.first->first)); }
// If a string is static it better be the one in the table. DEBUG_ONLY bool checkStaticStr(const StringData* s) { assert(s->isStatic()); auto DEBUG_ONLY const it = s_stringDataMap->find(make_intern_key(s)); assert(it != s_stringDataMap->end()); assert(to_sdata(it->first) == s); return true; }
size_t operator()(StrInternKey k) const { assert(k > 0 || k < kAhmMagicThreshold); if (LIKELY(k > 0)) { return to_sdata(k)->hash(); } auto const slice = *to_sslice(k); return hash_string(slice.ptr, slice.len); }
StringData* makeStaticString(StringSlice slice) { if (UNLIKELY(!s_stringDataMap)) { create_string_data_map(); } auto const it = s_stringDataMap->find(make_intern_key(&slice)); if (it != s_stringDataMap->end()) { return const_cast<StringData*>(to_sdata(it->first)); } return insertStaticString(slice); }
bool operator()(StrInternKey k1, StrInternKey k2) const { if (k1 < 0) { // AHM only gives lookup keys on the rhs of the equal operator assert(k1 >= kAhmMagicThreshold); return false; } assert(k2 >= 0 || k2 < kAhmMagicThreshold); auto const sd1 = to_sdata(k1); auto const len1 = sd1->size(); const char* const* ptr2; if (UNLIKELY(k2 < 0)) { auto slice2 = to_sslice(k2); if (len1 != slice2->len) return false; ptr2 = reinterpret_cast<const char* const*>(slice2); } else { auto string2 = to_sdata(k2); if (len1 != string2->size()) return false; ptr2 = reinterpret_cast<const char* const*>(string2); } return wordsame(sd1->data(), *ptr2, len1); }
StringData* lookupStaticString(const StringData *str) { if (UNLIKELY(!s_stringDataMap)) return nullptr; if (str->isStatic()) { assert(checkStaticStr(str)); return const_cast<StringData*>(str); } auto const it = s_stringDataMap->find(make_intern_key(str)); if (it != s_stringDataMap->end()) { return const_cast<StringData*>(to_sdata(it->first)); } return nullptr; }
bool operator()(StrInternKey k1, StrInternKey k2) const { if (k1 < 0) { // AHM only gives lookup keys on the rhs of the equal operator assert(k1 >= kAhmMagicThreshold); return false; } assert(k2 >= 0 || k2 < kAhmMagicThreshold); auto const sd1 = to_sdata(k1); auto const s2 = to_sslice_punned(k2); return sd1->size() == s2->len && wordsame(sd1->data(), s2->ptr, s2->len); }
StringData* makeStaticString(const StringData* str) { if (UNLIKELY(!s_stringDataMap)) { create_string_data_map(); } if (str->isStatic()) { assert(checkStaticStr(str)); return const_cast<StringData*>(str); } auto const it = s_stringDataMap->find(make_intern_key(str)); if (it != s_stringDataMap->end()) { return const_cast<StringData*>(to_sdata(it->first)); } return insertStaticString(str->slice()); }
Array lookupDefinedConstants(bool categorize /*= false */) { assert(s_stringDataMap); Array usr(RDS::s_constants()); Array sys; for (StringDataMap::const_iterator it = s_stringDataMap->begin(); it != s_stringDataMap->end(); ++it) { if (it->second.bound()) { Array *tbl = (categorize && RDS::isPersistentHandle(it->second.handle())) ? &sys : &usr; auto& tv = *it->second; if (tv.m_type != KindOfUninit) { StrNR key(const_cast<StringData*>(to_sdata(it->first))); tbl->set(key, tvAsVariant(&tv), true); } else if (tv.m_data.pref) { StrNR key(const_cast<StringData*>(to_sdata(it->first))); ClassInfo::ConstantInfo* ci = (ClassInfo::ConstantInfo*)(void*)tv.m_data.pref; auto cns = ci->getDeferredValue(); if (cns.isInitialized()) { tbl->set(key, cns, true); } } } } if (categorize) { Array ret; ret.set(s_user, usr); ret.set(s_Core, sys); return ret; } else { return usr; } }