Cell lookupCnsHelper(const TypedValue* tv, StringData* nm, bool error) { assert(tv->m_type == KindOfUninit); // Deferred constants such as SID if (UNLIKELY(tv->m_data.pref != nullptr)) { ClassInfo::ConstantInfo* ci = (ClassInfo::ConstantInfo*)(void*)tv->m_data.pref; Cell *cns = const_cast<Variant&>(ci->getDeferredValue()).asTypedValue(); if (LIKELY(cns->m_type != KindOfUninit)) { Cell c1; cellDup(*cns, c1); return c1; } } Cell *cns = nullptr; if (UNLIKELY(TargetCache::s_constants().get() != nullptr)) { cns = TargetCache::s_constants()->nvGet(nm); } if (!cns) { cns = Unit::loadCns(const_cast<StringData*>(nm)); } if (LIKELY(cns != nullptr)) { Cell c1; c1.m_type = cns->m_type; c1.m_data = cns->m_data; return c1; } // Undefined constants if (error) { raise_error("Undefined constant '%s'", nm->data()); } else { raise_notice(Strings::UNDEFINED_CONSTANT, nm->data(), nm->data()); Cell c1; c1.m_data.pstr = const_cast<StringData*>(nm); c1.m_type = KindOfStaticString; return c1; } not_reached(); }
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; } }
Array StringData::GetConstants() { // Return an array of all defined constants. assert(s_stringDataMap); Array a(Transl::TargetCache::s_constants); for (StringDataMap::const_iterator it = s_stringDataMap->begin(); it != s_stringDataMap->end(); ++it) { if (it->second) { TypedValue& tv = Transl::TargetCache::handleToRef<TypedValue>(it->second); if (tv.m_type != KindOfUninit) { StrNR key(const_cast<StringData*>(it->first)); a.set(key, tvAsVariant(&tv), true); } else if (tv.m_data.pref) { StrNR key(const_cast<StringData*>(it->first)); ClassInfo::ConstantInfo* ci = (ClassInfo::ConstantInfo*)(void*)tv.m_data.pref; a.set(key, ci->getDeferredValue(), true); } } } return a; }