return closure.result;
PRInt32 len = aAttributeValue.Length(); for (PRInt32 i = 0; i < len; ++i) { PRInt32 backup = i;    PRBool isvar; if (aAttributeValue[i] == PRUnichar('?')) { isvar = PR_TRUE; } else if ((aAttributeValue[i] == PRUnichar('r') && ++i < len) && (aAttributeValue[i] == PRUnichar('d') && ++i < len) && (aAttributeValue[i] == PRUnichar('f') && ++i < len) && (aAttributeValue[i] == PRUnichar(':'))) { isvar = PR_TRUE; } else { isvar = PR_FALSE; }  if (! isvar || ++i >= len) {    i = backup; continue; }      PRInt32 first = backup;  while (i < len && aAttributeValue[i] != PRUnichar(' ')) ++i;  PRInt32 last = i;  nsPromiseSubstring<PRUnichar> symbol(aAttributeValue, first, last);  PRInt32 var; var = aMatch.mRule->LookupSymbol(symbol);    if (! var) continue;     if (aModifiedVars.Contains(var)) return PR_TRUE; }    return PR_FALSE;
nsXULTemplateBuilder::IsAttrImpactedByVars(nsTemplateMatch& aMatch,                                           const nsAString& aAttributeValue,                                           const VariableSet& aModifiedVars){    // XXX at some point, it might be good to remember what attributes    // are impacted by variable changes using information that we    // could get at rule compilation time, rather than grovelling over    // the attribute string.    IsVarInSetClosure closure(aMatch, aModifiedVars);    ParseAttribute(aAttributeValue, IsVarInSet, nsnull, &closure);    return closure.result;}