StringData *StringData::GetStaticString(const StringData *str) { if (UNLIKELY(!s_stringDataMap)) { StringDataMap::Config config; config.growthFactor = 1; s_stringDataMap = new StringDataMap(RuntimeOption::EvalInitialStaticStringTableSize, config); } if (str->isStatic()) { assert(checkStaticStr(str)); return const_cast<StringData*>(str); } StringDataMap::const_iterator it = s_stringDataMap->find(str); if (it != s_stringDataMap->end()) { return const_cast<StringData*>(it->first); } // Lookup failed, so do the hard work of creating a StringData with its own // copy of the key string, so that the atomic insert() has a permanent key. StringData *sd = (StringData*)Util::low_malloc(sizeof(StringData)); new (sd) StringData(str->data(), str->size(), CopyMalloc); sd->setStatic(); auto pair = s_stringDataMap->insert(sd, 0); if (!pair.second) { sd->~StringData(); Util::low_free(sd); } assert(pair.first->first != nullptr); return const_cast<StringData*>(pair.first->first); }
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; }
StringData *StringData::LookupStaticString(const StringData *str) { if (UNLIKELY(!s_stringDataMap)) return nullptr; if (str->isStatic()) { assert(checkStaticStr(str)); return const_cast<StringData*>(str); } StringDataMap::const_iterator it = s_stringDataMap->find(str); if (it != s_stringDataMap->end()) { return const_cast<StringData*>(it->first); } return nullptr; }
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()); }