• marja@chromium.org's avatar
    Implement handling of arrow functions in the parser · 70da8959
    marja@chromium.org authored
    Arrow functions are parsed from ParseAssignmentExpression(). Handling the
    parameter list is done by letting ParseConditionalExpression() parse a comma
    separated list of identifiers, and it returns a tree of BinaryOperation nodes
    with VariableProxy leaves, or a single VariableProxy if there is only one
    parameter. When the arrow token "=>" is found, the VariableProxy nodes are
    passed to ParseArrowFunctionLiteral(), which will then skip parsing the
    paramaeter list. This avoids having to rewind when the arrow is found and
    restart parsing the parameter list.
    
    Note that the empty parameter list "()" is handled directly in
    ParsePrimaryExpression(): after is has consumed the opening parenthesis,
    if a closing parenthesis follows, then the only valid input is an arrow
    function. In this case, ParsePrimaryExpression() directly calls
    ParseArrowFunctionLiteral(), to avoid needing to return a sentinel value
    to signal the empty parameter list. Because it will consume the body of
    the arrow function, ParseAssignmentExpression() will not see the arrow
    "=>" token as next, and return the already-parser expression.
    
    The implementation is done in ParserBase, so it was needed to do some
    additions to ParserBase, ParserTraits and PreParserTraits. Some of the
    glue code can be removed later on when more more functionality is moved
    to ParserBase.
    
    Additionally, this adds a runtime flag "harmony_arrow_functions"
    (disabled by default); enabling "harmony" will enable it as well.
    
    BUG=v8:2700
    LOG=N
    R=marja@chromium.org
    
    Review URL: https://codereview.chromium.org/383983002
    
    Patch from Adrián Pérez de Castro <aperez@igalia.com>.
    
    git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22366 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
    70da8959
scanner.cc 39.3 KB