Changeset 239575 in webkit


Ignore:
Timestamp:
Jan 2, 2019 1:09:13 PM (5 years ago)
Author:
Simon Fraser
Message:

Don't spin up a CalcParser if the current token is not a function token
https://bugs.webkit.org/show_bug.cgi?id=193067

Reviewed by Zalan Bujtas.

Various functions in CSSPropertyParserHelpers fall back to trying to parse
a calc expression if the normal parsing fails. Don't do this unless the
current token is a function token, which should be slightly more efficient.

  • css/parser/CSSPropertyParserHelpers.cpp:

(WebCore::CSSPropertyParserHelpers::consumeInteger):
(WebCore::CSSPropertyParserHelpers::consumePositiveIntegerRaw):
(WebCore::CSSPropertyParserHelpers::consumeNumberRaw):
(WebCore::CSSPropertyParserHelpers::consumeNumber):
(WebCore::CSSPropertyParserHelpers::consumeFontWeightNumber):
(WebCore::CSSPropertyParserHelpers::consumeLength):
(WebCore::CSSPropertyParserHelpers::consumePercent):
(WebCore::CSSPropertyParserHelpers::consumeLengthOrPercent):
(WebCore::CSSPropertyParserHelpers::consumeAngle):
(WebCore::CSSPropertyParserHelpers::consumeAngleOrPercent):
(WebCore::CSSPropertyParserHelpers::consumeTime):

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r239574 r239575  
     12019-01-02  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Don't spin up a CalcParser if the current token is not a function token
     4        https://bugs.webkit.org/show_bug.cgi?id=193067
     5
     6        Reviewed by Zalan Bujtas.
     7
     8        Various functions in CSSPropertyParserHelpers fall back to trying to parse
     9        a calc expression if the normal parsing fails. Don't do this unless the
     10        current token is a function token, which should be slightly more efficient.
     11
     12        * css/parser/CSSPropertyParserHelpers.cpp:
     13        (WebCore::CSSPropertyParserHelpers::consumeInteger):
     14        (WebCore::CSSPropertyParserHelpers::consumePositiveIntegerRaw):
     15        (WebCore::CSSPropertyParserHelpers::consumeNumberRaw):
     16        (WebCore::CSSPropertyParserHelpers::consumeNumber):
     17        (WebCore::CSSPropertyParserHelpers::consumeFontWeightNumber):
     18        (WebCore::CSSPropertyParserHelpers::consumeLength):
     19        (WebCore::CSSPropertyParserHelpers::consumePercent):
     20        (WebCore::CSSPropertyParserHelpers::consumeLengthOrPercent):
     21        (WebCore::CSSPropertyParserHelpers::consumeAngle):
     22        (WebCore::CSSPropertyParserHelpers::consumeAngleOrPercent):
     23        (WebCore::CSSPropertyParserHelpers::consumeTime):
     24
    1252019-01-02  Simon Fraser  <simon.fraser@apple.com>
    226
  • trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp

    r239574 r239575  
    139139        return CSSValuePool::singleton().createValue(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitType::CSS_NUMBER);
    140140    }
     141
     142    if (token.type() != FunctionToken)
     143        return nullptr;
     144
    141145    CalcParser calcParser(range, CalculationCategory::Number);
    142146    if (const CSSCalcValue* calculation = calcParser.value()) {
     
    148152        return calcParser.consumeNumber();
    149153    }
     154
    150155    return nullptr;
    151156}
     
    165170        return true;
    166171    }
     172
     173    if (token.type() != FunctionToken)
     174        return false;
     175
    167176    CalcParser calcParser(range, CalculationCategory::Number);
    168177    return calcParser.consumePositiveIntegerRaw(result);
     
    171180bool consumeNumberRaw(CSSParserTokenRange& range, double& result)
    172181{
    173     if (range.peek().type() == NumberToken) {
     182    const CSSParserToken& token = range.peek();
     183    if (token.type() == NumberToken) {
    174184        result = range.consumeIncludingWhitespace().numericValue();
    175185        return true;
    176186    }
     187
     188    if (token.type() != FunctionToken)
     189        return false;
     190
    177191    CalcParser calcParser(range, CalculationCategory::Number, ValueRangeAll);
    178192    return calcParser.consumeNumberRaw(result);
     
    188202        return CSSValuePool::singleton().createValue(range.consumeIncludingWhitespace().numericValue(), token.unitType());
    189203    }
     204
     205    if (token.type() != FunctionToken)
     206        return nullptr;
     207
    190208    CalcParser calcParser(range, CalculationCategory::Number, ValueRangeAll);
    191209    if (const CSSCalcValue* calculation = calcParser.value()) {
     
    196214        return calcParser.consumeNumber();
    197215    }
     216
    198217    return nullptr;
    199218}
     
    216235    )
    217236        return consumeNumber(range, ValueRangeAll);
     237
     238    if (token.type() != FunctionToken)
     239        return nullptr;
    218240
    219241    // "[For calc()], the used value resulting from an expression must be clamped to the range allowed in the target context."
     
    280302        return CSSValuePool::singleton().createValue(range.consumeIncludingWhitespace().numericValue(), unitType);
    281303    }
     304
     305    if (token.type() != FunctionToken)
     306        return nullptr;
     307
    282308    CalcParser calcParser(range, CalculationCategory::Length, valueRange);
    283309    if (calcParser.value() && calcParser.value()->category() == CalculationCategory::Length)
    284310        return calcParser.consumeValue();
     311
    285312    return nullptr;
    286313}
     
    294321        return CSSValuePool::singleton().createValue(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitType::CSS_PERCENTAGE);
    295322    }
     323
     324    if (token.type() != FunctionToken)
     325        return nullptr;
     326
    296327    CalcParser calcParser(range, CalculationCategory::Percent, valueRange);
    297328    if (const CSSCalcValue* calculation = calcParser.value()) {
     
    323354    if (token.type() == PercentageToken)
    324355        return consumePercent(range, valueRange);
     356
     357    if (token.type() != FunctionToken)
     358        return nullptr;
     359
    325360    CalcParser calcParser(range, CalculationCategory::Length, valueRange);
    326361    if (const CSSCalcValue* calculation = calcParser.value()) {
     
    345380        }
    346381    }
    347     if (token.type() == NumberToken && shouldAcceptUnitlessValue(token.numericValue(), cssParserMode, unitless)) {
     382
     383    if (token.type() == NumberToken && shouldAcceptUnitlessValue(token.numericValue(), cssParserMode, unitless))
    348384        return CSSValuePool::singleton().createValue(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitType::CSS_DEG);
    349     }
     385
     386    if (token.type() != FunctionToken)
     387        return nullptr;
    350388
    351389    CalcParser calcParser(range, CalculationCategory::Angle, ValueRangeAll);
     
    373411    if (token.type() == NumberToken && shouldAcceptUnitlessValue(token.numericValue(), cssParserMode, unitless))
    374412        return CSSValuePool::singleton().createValue(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitType::CSS_DEG);
     413
    375414    if (token.type() == PercentageToken)
    376415        return consumePercent(range, valueRange);
     416
     417     if (token.type() != FunctionToken)
     418         return nullptr;
    377419
    378420    CalcParser angleCalcParser(range, CalculationCategory::Angle, valueRange);
     
    389431    return nullptr;
    390432}
    391 
    392433
    393434RefPtr<CSSPrimitiveValue> consumeTime(CSSParserTokenRange& range, CSSParserMode cssParserMode, ValueRange valueRange, UnitlessQuirk unitless)
     
    405446        return nullptr;
    406447    }
     448
     449    if (token.type() != FunctionToken)
     450        return nullptr;
     451
    407452    CalcParser calcParser(range, CalculationCategory::Time, valueRange);
    408453    if (const CSSCalcValue* calculation = calcParser.value()) {
Note: See TracChangeset for help on using the changeset viewer.