forked from qt-creator/qt-creator
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:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user