コード例 #1
0
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));
}
コード例 #2
0
ファイル: static-string-table.cpp プロジェクト: 5heri/hhvm
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));
}
コード例 #3
0
ファイル: static-string-table.cpp プロジェクト: 5heri/hhvm
// 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;
}
コード例 #4
0
ファイル: static-string-table.cpp プロジェクト: 5heri/hhvm
 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);
 }
コード例 #5
0
ファイル: static-string-table.cpp プロジェクト: cdlewis/hhvm
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);
}
コード例 #6
0
ファイル: static-string-table.cpp プロジェクト: 5heri/hhvm
 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);
 }
コード例 #7
0
ファイル: static-string-table.cpp プロジェクト: cdlewis/hhvm
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;
}
コード例 #8
0
 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);
 }
コード例 #9
0
ファイル: static-string-table.cpp プロジェクト: cdlewis/hhvm
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());
}
コード例 #10
0
ファイル: static-string-table.cpp プロジェクト: cdlewis/hhvm
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;
  }
}