add legacy variable name mapping

we are so fast now, we can burn a few cycles again ... :}

variable names are mapped as soon as they become known (and not when
using them). that sprinkles map() calls everywhere, but it's faster.
This commit is contained in:
Oswald Buddenhagen
2010-02-11 16:33:16 +01:00
parent 6060bb5b9e
commit 1d39b04041

View File

@@ -229,6 +229,7 @@ public:
void visitProOperator(ProOperator *oper); void visitProOperator(ProOperator *oper);
void visitProCondition(ProCondition *condition); void visitProCondition(ProCondition *condition);
static inline QString map(const QString &var);
QHash<QString, QStringList> *findValues(const QString &variableName, QHash<QString, QStringList> *findValues(const QString &variableName,
QHash<QString, QStringList>::Iterator *it); QHash<QString, QStringList>::Iterator *it);
QStringList &valuesRef(const QString &variableName); QStringList &valuesRef(const QString &variableName);
@@ -362,6 +363,7 @@ static struct {
QHash<QString, int> expands; QHash<QString, int> expands;
QHash<QString, int> functions; QHash<QString, int> functions;
QHash<QString, int> varList; QHash<QString, int> varList;
QHash<QString, QString> varMap;
QRegExp reg_variableName; QRegExp reg_variableName;
QStringList fakeValue; QStringList fakeValue;
} statics; } statics;
@@ -479,6 +481,38 @@ void ProFileEvaluator::Private::initStatics()
}; };
for (unsigned i = 0; i < sizeof(names)/sizeof(names[0]); ++i) for (unsigned i = 0; i < sizeof(names)/sizeof(names[0]); ++i)
statics.varList.insert(QLatin1String(names[i]), i); statics.varList.insert(QLatin1String(names[i]), i);
static const struct {
const char * const oldname, * const newname;
} mapInits[] = {
{ "INTERFACES", "FORMS" },
{ "QMAKE_POST_BUILD", "QMAKE_POST_LINK" },
{ "TARGETDEPS", "POST_TARGETDEPS" },
{ "LIBPATH", "QMAKE_LIBDIR" },
{ "QMAKE_EXT_MOC", "QMAKE_EXT_CPP_MOC" },
{ "QMAKE_MOD_MOC", "QMAKE_H_MOD_MOC" },
{ "QMAKE_LFLAGS_SHAPP", "QMAKE_LFLAGS_APP" },
{ "PRECOMPH", "PRECOMPILED_HEADER" },
{ "PRECOMPCPP", "PRECOMPILED_SOURCE" },
{ "INCPATH", "INCLUDEPATH" },
{ "QMAKE_EXTRA_WIN_COMPILERS", "QMAKE_EXTRA_COMPILERS" },
{ "QMAKE_EXTRA_UNIX_COMPILERS", "QMAKE_EXTRA_COMPILERS" },
{ "QMAKE_EXTRA_WIN_TARGETS", "QMAKE_EXTRA_TARGETS" },
{ "QMAKE_EXTRA_UNIX_TARGETS", "QMAKE_EXTRA_TARGETS" },
{ "QMAKE_EXTRA_UNIX_INCLUDES", "QMAKE_EXTRA_INCLUDES" },
{ "QMAKE_EXTRA_UNIX_VARIABLES", "QMAKE_EXTRA_VARIABLES" },
{ "QMAKE_RPATH", "QMAKE_LFLAGS_RPATH" },
{ "QMAKE_FRAMEWORKDIR", "QMAKE_FRAMEWORKPATH" },
{ "QMAKE_FRAMEWORKDIR_FLAGS", "QMAKE_FRAMEWORKPATH_FLAGS" }
};
for (unsigned i = 0; i < sizeof(mapInits)/sizeof(mapInits[0]); ++i)
statics.varMap.insert(QLatin1String(mapInits[i].oldname),
QLatin1String(mapInits[i].newname));
}
QString ProFileEvaluator::Private::map(const QString &var)
{
return statics.varMap.value(var, var);
} }
@@ -783,7 +817,7 @@ ProVariable *ProFileEvaluator::Private::startVariable(ushort *uc, ushort *ptr)
--ptr; --ptr;
skipTrunc: skipTrunc:
ProVariable *variable = new ProVariable(QString((QChar*)uc, ptr - uc)); ProVariable *variable = new ProVariable(map(QString((QChar*)uc, ptr - uc)));
variable->setLineNumber(m_lineNo); variable->setLineNumber(m_lineNo);
variable->setVariableOperator(opkind); variable->setVariableOperator(opkind);
return variable; return variable;
@@ -1746,7 +1780,7 @@ QStringList ProFileEvaluator::Private::expandVariableReferences(
} else if (var_type == FUNCTION) { } else if (var_type == FUNCTION) {
replacement << evaluateExpandFunction(var, args); replacement << evaluateExpandFunction(var, args);
} else if (var_type == VAR) { } else if (var_type == VAR) {
replacement = values(var); replacement = values(map(var));
} }
if (!replacement.isEmpty()) { if (!replacement.isEmpty()) {
if (quote) { if (quote) {
@@ -1952,10 +1986,10 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun
if (!var.isNull()) { if (!var.isNull()) {
if (regexp) { if (regexp) {
QRegExp sepRx(sep); QRegExp sepRx(sep);
foreach (const QString &str, values(var)) foreach (const QString &str, values(map(var)))
ret += str.section(sepRx, beg, end); ret += str.section(sepRx, beg, end);
} else { } else {
foreach (const QString &str, values(var)) foreach (const QString &str, values(map(var)))
ret += str.section(sep, beg, end); ret += str.section(sep, beg, end);
} }
} }
@@ -1982,7 +2016,7 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun
before = args[2]; before = args[2];
if (args.count() == 4) if (args.count() == 4)
after = args[3]; after = args[3];
const QStringList &var = values(args.first()); const QStringList &var = values(map(args.first()));
if (!var.isEmpty()) if (!var.isEmpty())
ret.append(before + var.join(glue) + after); ret.append(before + var.join(glue) + after);
} }
@@ -1993,7 +2027,7 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun
logMessage(format("split(var, sep) requires one or two arguments")); logMessage(format("split(var, sep) requires one or two arguments"));
} else { } else {
const QString &sep = (args.count() == 2) ? args[1] : statics.field_sep; const QString &sep = (args.count() == 2) ? args[1] : statics.field_sep;
foreach (const QString &var, values(args.first())) foreach (const QString &var, values(map(args.first())))
foreach (const QString &splt, var.split(sep)) foreach (const QString &splt, var.split(sep))
ret.append(splt); ret.append(splt);
} }
@@ -2003,7 +2037,7 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun
logMessage(format("member(var, start, end) requires one to three arguments.")); logMessage(format("member(var, start, end) requires one to three arguments."));
} else { } else {
bool ok = true; bool ok = true;
const QStringList var = values(args.first()); const QStringList &var = values(map(args.first()));
int start = 0, end = 0; int start = 0, end = 0;
if (args.count() >= 2) { if (args.count() >= 2) {
QString start_str = args[1]; QString start_str = args[1];
@@ -2051,7 +2085,7 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun
if (args.count() != 1) { if (args.count() != 1) {
logMessage(format("%1(var) requires one argument.").arg(func)); logMessage(format("%1(var) requires one argument.").arg(func));
} else { } else {
const QStringList var = values(args.first()); const QStringList var = values(map(args.first()));
if (!var.isEmpty()) { if (!var.isEmpty()) {
if (func_t == E_FIRST) if (func_t == E_FIRST)
ret.append(var[0]); ret.append(var[0]);
@@ -2095,7 +2129,7 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun
if (args.count() != 1) { if (args.count() != 1) {
logMessage(format("eval(variable) requires one argument")); logMessage(format("eval(variable) requires one argument"));
} else { } else {
ret += values(args.at(0)); ret += values(map(args.at(0)));
} }
break; break;
case E_LIST: { case E_LIST: {
@@ -2112,7 +2146,7 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun
logMessage(format("find(var, str) requires two arguments.")); logMessage(format("find(var, str) requires two arguments."));
} else { } else {
QRegExp regx(args[1]); QRegExp regx(args[1]);
foreach (const QString &val, values(args.first())) foreach (const QString &val, values(map(args.first())))
if (regx.indexIn(val) != -1) if (regx.indexIn(val) != -1)
ret += val; ret += val;
} }
@@ -2151,7 +2185,7 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun
if(args.count() != 1) { if(args.count() != 1) {
logMessage(format("unique(var) requires one argument.")); logMessage(format("unique(var) requires one argument."));
} else { } else {
ret = values(args.first()); ret = values(map(args.first()));
ret.removeDuplicates(); ret.removeDuplicates();
} }
break; break;
@@ -2250,7 +2284,7 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun
} else { } else {
const QRegExp before(args[1]); const QRegExp before(args[1]);
const QString after(args[2]); const QString after(args[2]);
foreach (QString val, values(args.first())) foreach (QString val, values(map(args.first())))
ret += val.replace(before, after); ret += val.replace(before, after);
} }
break; break;
@@ -2344,29 +2378,31 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction(
return ProItem::ReturnFalse; return ProItem::ReturnFalse;
} }
return ProItem::ReturnReturn; return ProItem::ReturnReturn;
case T_EXPORT: case T_EXPORT: {
if (m_skipLevel && !m_cumulative) if (m_skipLevel && !m_cumulative)
return ProItem::ReturnTrue; return ProItem::ReturnTrue;
if (args.count() != 1) { if (args.count() != 1) {
logMessage(format("export(variable) requires one argument.")); logMessage(format("export(variable) requires one argument."));
return ProItem::ReturnFalse; return ProItem::ReturnFalse;
} }
const QString &var = map(args.at(0));
for (int i = m_valuemapStack.size(); --i > 0; ) { for (int i = m_valuemapStack.size(); --i > 0; ) {
QHash<QString, QStringList>::Iterator it = m_valuemapStack[i].find(args.at(0)); QHash<QString, QStringList>::Iterator it = m_valuemapStack[i].find(var);
if (it != m_valuemapStack.at(i).end()) { if (it != m_valuemapStack.at(i).end()) {
if (it->constBegin() == statics.fakeValue.constBegin()) { if (it->constBegin() == statics.fakeValue.constBegin()) {
// This is stupid, but qmake doesn't propagate deletions // This is stupid, but qmake doesn't propagate deletions
m_valuemapStack[0][args.at(0)] = QStringList(); m_valuemapStack[0][var] = QStringList();
} else { } else {
m_valuemapStack[0][args.at(0)] = *it; m_valuemapStack[0][var] = *it;
} }
m_valuemapStack[i].erase(it); m_valuemapStack[i].erase(it);
while (--i) while (--i)
m_valuemapStack[i].remove(args.at(0)); m_valuemapStack[i].remove(var);
break; break;
} }
} }
return ProItem::ReturnTrue; return ProItem::ReturnTrue;
}
case T_INFILE: case T_INFILE:
if (args.count() < 2 || args.count() > 3) { if (args.count() < 2 || args.count() > 3) {
logMessage(format("infile(file, var, [values]) requires two or three arguments.")); logMessage(format("infile(file, var, [values]) requires two or three arguments."));
@@ -2423,10 +2459,10 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction(
} }
it_list = statics.strforever; it_list = statics.strforever;
} else { } else {
loop.variable = args[0]; loop.variable = map(args.at(0));
loop.oldVarVal = valuesDirect(loop.variable); loop.oldVarVal = valuesDirect(loop.variable);
doVariableReplace(&args[1]); doVariableReplace(&args[1]);
it_list = args[1]; it_list = map(args.at(1));
} }
loop.list = valuesDirect(it_list); loop.list = valuesDirect(it_list);
if (loop.list.isEmpty()) { if (loop.list.isEmpty()) {
@@ -2581,7 +2617,7 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction(
QRegExp regx; QRegExp regx;
if (qry != QRegExp::escape(qry)) if (qry != QRegExp::escape(qry))
regx.setPattern(qry); regx.setPattern(qry);
const QStringList &l = values(args.first()); const QStringList &l = values(map(args.first()));
if (args.count() == 2) { if (args.count() == 2) {
for (int i = 0; i < l.size(); ++i) { for (int i = 0; i < l.size(); ++i) {
const QString val = l[i]; const QString val = l[i];
@@ -2607,7 +2643,7 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction(
logMessage(format("count(var, count, op=\"equals\") requires two or three arguments.")); logMessage(format("count(var, count, op=\"equals\") requires two or three arguments."));
return ProItem::ReturnFalse; return ProItem::ReturnFalse;
} }
int cnt = values(args.first()).count(); int cnt = values(map(args.first())).count();
if (args.count() == 3) { if (args.count() == 3) {
QString comp = args[2]; QString comp = args[2];
if (comp == QLatin1String(">") || comp == QLatin1String("greaterThan")) { if (comp == QLatin1String(">") || comp == QLatin1String("greaterThan")) {
@@ -2634,7 +2670,7 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction(
logMessage(format("%1(variable, value) requires two arguments.").arg(function)); logMessage(format("%1(variable, value) requires two arguments.").arg(function));
return ProItem::ReturnFalse; return ProItem::ReturnFalse;
} }
QString rhs(args[1]), lhs(values(args[0]).join(statics.field_sep)); QString rhs(args[1]), lhs(values(map(args.at(0))).join(statics.field_sep));
bool ok; bool ok;
int rhs_int = rhs.toInt(&ok); int rhs_int = rhs.toInt(&ok);
if (ok) { // do integer compare if (ok) { // do integer compare
@@ -2654,7 +2690,7 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction(
logMessage(format("%1(variable, value) requires two arguments.").arg(function)); logMessage(format("%1(variable, value) requires two arguments.").arg(function));
return ProItem::ReturnFalse; return ProItem::ReturnFalse;
} }
return returnBool(values(args[0]).join(statics.field_sep) == args[1]); return returnBool(values(map(args.at(0))).join(statics.field_sep) == args.at(1));
case T_CLEAR: { case T_CLEAR: {
if (m_skipLevel && !m_cumulative) if (m_skipLevel && !m_cumulative)
return ProItem::ReturnFalse; return ProItem::ReturnFalse;
@@ -2664,12 +2700,13 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction(
} }
QHash<QString, QStringList> *hsh; QHash<QString, QStringList> *hsh;
QHash<QString, QStringList>::Iterator it; QHash<QString, QStringList>::Iterator it;
if (!(hsh = findValues(args.at(0), &it))) const QString &var = map(args.at(0));
if (!(hsh = findValues(var, &it)))
return ProItem::ReturnFalse; return ProItem::ReturnFalse;
if (hsh == &m_valuemapStack.top()) if (hsh == &m_valuemapStack.top())
it->clear(); it->clear();
else else
m_valuemapStack.top()[args.at(0)].clear(); m_valuemapStack.top()[var].clear();
return ProItem::ReturnTrue; return ProItem::ReturnTrue;
} }
case T_UNSET: { case T_UNSET: {
@@ -2681,14 +2718,15 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction(
} }
QHash<QString, QStringList> *hsh; QHash<QString, QStringList> *hsh;
QHash<QString, QStringList>::Iterator it; QHash<QString, QStringList>::Iterator it;
if (!(hsh = findValues(args.at(0), &it))) const QString &var = map(args.at(0));
if (!(hsh = findValues(var, &it)))
return ProItem::ReturnFalse; return ProItem::ReturnFalse;
if (m_valuemapStack.size() == 1) if (m_valuemapStack.size() == 1)
hsh->erase(it); hsh->erase(it);
else if (hsh == &m_valuemapStack.top()) else if (hsh == &m_valuemapStack.top())
*it = statics.fakeValue; *it = statics.fakeValue;
else else
m_valuemapStack.top()[args.at(0)] = statics.fakeValue; m_valuemapStack.top()[var] = statics.fakeValue;
return ProItem::ReturnTrue; return ProItem::ReturnTrue;
} }
case T_INCLUDE: { case T_INCLUDE: {
@@ -2763,7 +2801,7 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction(
logMessage(format("isEmpty(var) requires one argument.")); logMessage(format("isEmpty(var) requires one argument."));
return ProItem::ReturnFalse; return ProItem::ReturnFalse;
} }
QStringList sl = values(args.first()); QStringList sl = values(map(args.first()));
if (sl.count() == 0) { if (sl.count() == 0) {
return ProItem::ReturnTrue; return ProItem::ReturnTrue;
} else if (sl.count() > 0) { } else if (sl.count() > 0) {