+ RELEASE_ASSERT(m_typeProfilingRareData);
+
+ auto iter = m_typeProfilingRareData->m_uniqueIDMap.find(key);
+ auto end = m_typeProfilingRareData->m_uniqueIDMap.end();
+ if (iter == end)
+ return TypeProfilerNoGlobalIDExists;
+
+ GlobalVariableID id = iter->value;
+ if (id == TypeProfilerNeedsUniqueIDGeneration) {
+ id = vm.typeProfiler()->getNextUniqueVariableID();
+ m_typeProfilingRareData->m_uniqueIDMap.set(key, id);
+ m_typeProfilingRareData->m_uniqueTypeSetMap.set(key, TypeSet::create()); // Make a new global typeset for this corresponding ID.
+ }
+
+ return id;
+}
+
+GlobalVariableID SymbolTable::uniqueIDForOffset(const ConcurrentJITLocker& locker, VarOffset offset, VM& vm)
+{
+ RELEASE_ASSERT(m_typeProfilingRareData);
+
+ auto iter = m_typeProfilingRareData->m_offsetToVariableMap.find(offset);
+ auto end = m_typeProfilingRareData->m_offsetToVariableMap.end();
+ if (iter == end)
+ return TypeProfilerNoGlobalIDExists;
+
+ return uniqueIDForVariable(locker, iter->value.get(), vm);
+}
+
+RefPtr<TypeSet> SymbolTable::globalTypeSetForOffset(const ConcurrentJITLocker& locker, VarOffset offset, VM& vm)
+{
+ RELEASE_ASSERT(m_typeProfilingRareData);
+
+ uniqueIDForOffset(locker, offset, vm); // Lazily create the TypeSet if necessary.
+
+ auto iter = m_typeProfilingRareData->m_offsetToVariableMap.find(offset);
+ auto end = m_typeProfilingRareData->m_offsetToVariableMap.end();
+ if (iter == end)
+ return nullptr;
+
+ return globalTypeSetForVariable(locker, iter->value.get(), vm);
+}
+
+RefPtr<TypeSet> SymbolTable::globalTypeSetForVariable(const ConcurrentJITLocker& locker, UniquedStringImpl* key, VM& vm)
+{
+ RELEASE_ASSERT(m_typeProfilingRareData);
+
+ uniqueIDForVariable(locker, key, vm); // Lazily create the TypeSet if necessary.
+
+ auto iter = m_typeProfilingRareData->m_uniqueTypeSetMap.find(key);
+ auto end = m_typeProfilingRareData->m_uniqueTypeSetMap.end();
+ if (iter == end)
+ return nullptr;
+
+ return iter->value;