• Leszek Swirski's avatar
    [parser] Add an n-ary node for large binop chains · 52ef2a1c
    Leszek Swirski authored
    Expressions of the form
    
        a_0 + a_1 + a_2 + a_3 + ... + a_n
    
    seem to be reasonably common for cases such as building templates.
    However, parsing these expressions results in a n-deep expression tree:
    
               ...
              /
             +
            / \
           +  a_2
          / \
        a_0 a_1
    
    Traversing this tree during compilation can cause a stack overflow when n is
    large.
    
    Instead, for left-associate operations such as add, we now build up an
    n-ary node in the parse tree, of the form
    
             n-ary +
           /  |      \
          /   |  ...  \
        a_0  a_1      a_n
    
    The bytecode compiler can now iterate through the child expressions
    rather than recursing.
    
    This patch only supports arithmetic operations -- subsequent patches
    will enable the same optimization for logical tests and comma
    expressions.
    
    Bug: v8:6964
    Bug: chromium:724961
    Bug: chromium:731861
    Bug: chromium:752081
    Bug: chromium:771653
    Bug: chromium:777302
    Change-Id: Ie97e4ce42506fe62a7bc4ffbdaa90a9f698352cb
    Reviewed-on: https://chromium-review.googlesource.com/733120
    Commit-Queue: Leszek Swirski <leszeks@chromium.org>
    Reviewed-by: 's avatarMarja Hölttä <marja@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#48920}
    52ef2a1c
Name
Last commit
Last update
..
ArrayLiterals.golden Loading commit data...
ArrayLiteralsWide.golden Loading commit data...
AssignmentsInBinaryExpression.golden Loading commit data...
AsyncGenerators.golden Loading commit data...
BasicBlockToBoolean.golden Loading commit data...
BasicLoops.golden Loading commit data...
BreakableBlocks.golden Loading commit data...
CallAndSpread.golden Loading commit data...
CallGlobal.golden Loading commit data...
CallLookupSlot.golden Loading commit data...
CallNew.golden Loading commit data...
CallRuntime.golden Loading commit data...
ClassAndSuperClass.golden Loading commit data...
ClassDeclarations.golden Loading commit data...
CompareNil.golden Loading commit data...
CompareTypeOf.golden Loading commit data...
CompoundExpressions.golden Loading commit data...
Conditional.golden Loading commit data...
ConstVariable.golden Loading commit data...
ConstVariableContextSlot.golden Loading commit data...
ContextParameters.golden Loading commit data...
ContextVariables.golden Loading commit data...
CountOperators.golden Loading commit data...
CreateArguments.golden Loading commit data...
CreateRestParameter.golden Loading commit data...
DeadCodeRemoval.golden Loading commit data...
DeclareGlobals.golden Loading commit data...
Delete.golden Loading commit data...
DeleteLookupSlotInEval.golden Loading commit data...
DoDebugger.golden Loading commit data...
DoExpression.golden Loading commit data...
Eval.golden Loading commit data...
ForAwaitOf.golden Loading commit data...
ForIn.golden Loading commit data...
ForOf.golden Loading commit data...
ForOfLoop.golden Loading commit data...
FunctionLiterals.golden Loading commit data...
GenerateTestUndetectable.golden Loading commit data...
Generators.golden Loading commit data...
GlobalCompoundExpressions.golden Loading commit data...
GlobalCountOperators.golden Loading commit data...
GlobalDelete.golden Loading commit data...
HeapNumberConstants.golden Loading commit data...
IfConditions.golden Loading commit data...
IntegerConstants.golden Loading commit data...
JumpsRequiringConstantWideOperands.golden Loading commit data...
LetVariable.golden Loading commit data...
LetVariableContextSlot.golden Loading commit data...
LoadGlobal.golden Loading commit data...
LogicalExpressions.golden Loading commit data...
LookupSlot.golden Loading commit data...
LookupSlotInEval.golden Loading commit data...
LookupSlotWideInEval.golden Loading commit data...
Modules.golden Loading commit data...
NewAndSpread.golden Loading commit data...
NewTarget.golden Loading commit data...
ObjectLiterals.golden Loading commit data...
ObjectLiteralsWide.golden Loading commit data...
OuterContextVariables.golden Loading commit data...
Parameters.golden Loading commit data...
PrimitiveExpressions.golden Loading commit data...
PrimitiveReturnStatements.golden Loading commit data...
PropertyCall.golden Loading commit data...
PropertyLoads.golden Loading commit data...
PropertyStores.golden Loading commit data...
RegExpLiterals.golden Loading commit data...
RegExpLiteralsWide.golden Loading commit data...
RemoveRedundantLdar.golden Loading commit data...
StandardForLoop.golden Loading commit data...
StoreGlobal.golden Loading commit data...
StringConcat.golden Loading commit data...
StringConstants.golden Loading commit data...
SuperCallAndSpread.golden Loading commit data...
Switch.golden Loading commit data...
ThisFunction.golden Loading commit data...
Throw.golden Loading commit data...
TopLevelObjectLiterals.golden Loading commit data...
TryCatch.golden Loading commit data...
TryFinally.golden Loading commit data...
Typeof.golden Loading commit data...
UnaryOperators.golden Loading commit data...
WideRegisters.golden Loading commit data...
WithStatement.golden Loading commit data...