optimize values()

use a hash of magic variable names to ints, which allows fast lookup
followed by a jump table dispatch
This commit is contained in:
Oswald Buddenhagen
2010-02-02 19:01:23 +01:00
parent a05ba6fd17
commit b891afbe27

View File

@@ -2629,66 +2629,95 @@ QStringList ProFileEvaluator::Private::values(const QString &variableName,
const QHash<QString, QStringList> &place, const QHash<QString, QStringList> &place,
const ProFile *pro) const const ProFile *pro) const
{ {
if (variableName == QLatin1String("LITERAL_WHITESPACE")) //a real space in a token enum VarName {
return QStringList(QLatin1String("\t")); V_LITERAL_DOLLAR, V_LITERAL_HASH, V_LITERAL_WHITESPACE,
if (variableName == QLatin1String("LITERAL_DOLLAR")) //a real $ V_DIRLIST_SEPARATOR, V_DIR_SEPARATOR,
return QStringList(QLatin1String("$")); V_OUT_PWD, V_PWD, V_IN_PWD,
if (variableName == QLatin1String("LITERAL_HASH")) //a real # V__FILE_, V__LINE_, V__PRO_FILE_, V__PRO_FILE_PWD_,
return QStringList(QLatin1String("#")); V_QMAKE_HOST_arch, V_QMAKE_HOST_name, V_QMAKE_HOST_os,
if (variableName == QLatin1String("OUT_PWD")) //the out going dir V_QMAKE_HOST_version, V_QMAKE_HOST_version_string,
return QStringList(m_outputDir); V__DATE_, V__QMAKE_CACHE_
if (variableName == QLatin1String("PWD") || //current working dir (of _FILE_) };
variableName == QLatin1String("IN_PWD"))
return QStringList(currentDirectory()); static QHash<QString, int> varList;
if (variableName == QLatin1String("DIR_SEPARATOR")) if (varList.isEmpty()) {
return QStringList(m_option->dir_sep); static const char * const names[] = {
if (variableName == QLatin1String("DIRLIST_SEPARATOR")) "LITERAL_DOLLAR", "LITERAL_HASH", "LITERAL_WHITESPACE",
return QStringList(m_option->dirlist_sep); "DIRLIST_SEPARATOR", "DIR_SEPARATOR",
if (variableName == QLatin1String("_LINE_")) //parser line number "OUT_PWD", "PWD", "IN_PWD",
return QStringList(QString::number(m_lineNo)); "_FILE_", "_LINE_", "_PRO_FILE_", "_PRO_FILE_PWD_",
if (variableName == QLatin1String("_FILE_")) //parser file; qmake is a bit weird here "QMAKE_HOST.arch", "QMAKE_HOST.name", "QMAKE_HOST.os",
return QStringList(m_profileStack.size() == 1 ? pro->fileName() : QFileInfo(pro->fileName()).fileName()); "QMAKE_HOST.version", "QMAKE_HOST.version_string",
if (variableName == QLatin1String("_DATE_")) //current date/time "_DATE_", "_QMAKE_CACHE_"
return QStringList(QDateTime::currentDateTime().toString()); };
if (variableName == QLatin1String("_PRO_FILE_")) for (unsigned i = 0; i < sizeof(names)/sizeof(names[0]); ++i)
return QStringList(m_profileStack.first()->fileName()); varList.insert(QLatin1String(names[i]), i);
if (variableName == QLatin1String("_PRO_FILE_PWD_")) }
return QStringList(m_profileStack.first()->directoryName());
if (variableName == QLatin1String("_QMAKE_CACHE_")) QHash<QString, int>::ConstIterator vli = varList.find(variableName);
return QStringList(m_option->cachefile); if (vli != varList.constEnd()) {
if (variableName.startsWith(QLatin1String("QMAKE_HOST."))) { int vlidx = *vli;
QString ret, type = variableName.mid(11); QString ret;
switch ((VarName)vlidx) {
case V_LITERAL_WHITESPACE: ret = QLatin1String("\t"); break;
case V_LITERAL_DOLLAR: ret = QLatin1String("$"); break;
case V_LITERAL_HASH: ret = QLatin1String("#"); break;
case V_OUT_PWD: //the outgoing dir
ret = m_outputDir;
break;
case V_PWD: //current working dir (of _FILE_)
case V_IN_PWD:
ret = currentDirectory();
break;
case V_DIR_SEPARATOR:
ret = m_option->dir_sep;
break;
case V_DIRLIST_SEPARATOR:
ret = m_option->dirlist_sep;
break;
case V__LINE_: //parser line number
ret = QString::number(m_lineNo);
break;
case V__FILE_: //parser file; qmake is a bit weird here
ret = m_profileStack.size() == 1 ? pro->fileName() : QFileInfo(pro->fileName()).fileName();
break;
case V__DATE_: //current date/time
ret = QDateTime::currentDateTime().toString();
break;
case V__PRO_FILE_:
ret = m_profileStack.first()->fileName();
break;
case V__PRO_FILE_PWD_:
ret = m_profileStack.first()->directoryName();
break;
case V__QMAKE_CACHE_:
ret = m_option->cachefile;
break;
#if defined(Q_OS_WIN32) #if defined(Q_OS_WIN32)
if (type == QLatin1String("os")) { case V_QMAKE_HOST_os: ret = QLatin1String("Windows"); break;
ret = QLatin1String("Windows"); case V_QMAKE_HOST_name:
} else if (type == QLatin1String("name")) {
DWORD name_length = 1024; DWORD name_length = 1024;
TCHAR name[1024]; TCHAR name[1024];
if (GetComputerName(name, &name_length)) if (GetComputerName(name, &name_length))
ret = QString::fromUtf16((ushort*)name, name_length); ret = QString::fromUtf16((ushort*)name, name_length);
} else if (type == QLatin1String("version") || type == QLatin1String("version_string")) { break;
QSysInfo::WinVersion ver = QSysInfo::WindowsVersion; case V_QMAKE_HOST_version:
if (type == QLatin1String("version")) ret = QString::number(QSysInfo::WindowsVersion);
ret = QString::number(ver); break;
else if (ver == QSysInfo::WV_Me) case V_QMAKE_HOST_version_string:
ret = QLatin1String("WinMe"); switch (QSysInfo::WindowsVersion) {
else if (ver == QSysInfo::WV_95) case QSysInfo::WV_Me: ret = QLatin1String("WinMe"); break;
ret = QLatin1String("Win95"); case QSysInfo::WV_95: ret = QLatin1String("Win95"); break;
else if (ver == QSysInfo::WV_98) case QSysInfo::WV_98: ret = QLatin1String("Win98"); break;
ret = QLatin1String("Win98"); case QSysInfo::WV_NT: ret = QLatin1String("WinNT"); break;
else if (ver == QSysInfo::WV_NT) case QSysInfo::WV_2000: ret = QLatin1String("Win2000"); break;
ret = QLatin1String("WinNT"); case QSysInfo::WV_2003: ret = QLatin1String("Win2003"); break;
else if (ver == QSysInfo::WV_2000) case QSysInfo::WV_XP: ret = QLatin1String("WinXP"); break;
ret = QLatin1String("Win2000"); case QSysInfo::WV_VISTA: ret = QLatin1String("WinVista"); break;
else if (ver == QSysInfo::WV_2000) default: ret = QLatin1String("Unknown"); break;
ret = QLatin1String("Win2003"); }
else if (ver == QSysInfo::WV_XP) break;
ret = QLatin1String("WinXP"); case V_QMAKE_HOST_arch:
else if (ver == QSysInfo::WV_VISTA)
ret = QLatin1String("WinVista");
else
ret = QLatin1String("Unknown");
} else if (type == QLatin1String("arch")) {
SYSTEM_INFO info; SYSTEM_INFO info;
GetSystemInfo(&info); GetSystemInfo(&info);
switch(info.wProcessorArchitecture) { switch(info.wProcessorArchitecture) {
@@ -2710,22 +2739,29 @@ QStringList ProFileEvaluator::Private::values(const QString &variableName,
ret = QLatin1String("Unknown"); ret = QLatin1String("Unknown");
break; break;
} }
} break;
#elif defined(Q_OS_UNIX) #elif defined(Q_OS_UNIX)
struct utsname name; case V_QMAKE_HOST_os:
if (!uname(&name)) { case V_QMAKE_HOST_name:
if (type == QLatin1String("os")) case V_QMAKE_HOST_version:
ret = QString::fromLatin1(name.sysname); case V_QMAKE_HOST_version_string:
else if (type == QLatin1String("name")) case V_QMAKE_HOST_arch:
ret = QString::fromLatin1(name.nodename); {
else if (type == QLatin1String("version")) struct utsname name;
ret = QString::fromLatin1(name.release); const char *what;
else if (type == QLatin1String("version_string")) if (!uname(&name)) {
ret = QString::fromLatin1(name.version); switch (vlidx) {
else if (type == QLatin1String("arch")) case V_QMAKE_HOST_os: what = name.sysname; break;
ret = QString::fromLatin1(name.machine); case V_QMAKE_HOST_name: what = name.nodename; break;
} case V_QMAKE_HOST_version: what = name.release; break;
case V_QMAKE_HOST_version_string: what = name.version; break;
case V_QMAKE_HOST_arch: what = name.machine; break;
}
ret = QString::fromLatin1(what);
}
}
#endif #endif
}
return QStringList(ret); return QStringList(ret);
} }