<html>
    <head>
      <base href="https://bugs.webkit.org/" />
    </head>
    <body><span class="vcard"><a class="email" href="mailto:gskachkov&#64;gmail.com" title="GSkachkov &lt;gskachkov&#64;gmail.com&gt;"> <span class="fn">GSkachkov</span></a>
</span> changed
              <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - [ES6] Implement ES6 arrow function syntax. Parser of arrow function with execution as common function"
   href="https://bugs.webkit.org/show_bug.cgi?id=144955">bug 144955</a>
        <br>
             <table border="1" cellspacing="0" cellpadding="8">
          <tr>
            <th>What</th>
            <th>Removed</th>
            <th>Added</th>
          </tr>

         <tr>
           <td style="text-align:right;">Attachment #255506 is obsolete</td>
           <td>1
           </td>
           <td>
               &nbsp;
           </td>
         </tr></table>
      <p>
        <div>
            <b><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - [ES6] Implement ES6 arrow function syntax. Parser of arrow function with execution as common function"
   href="https://bugs.webkit.org/show_bug.cgi?id=144955#c84">Comment # 84</a>
              on <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - [ES6] Implement ES6 arrow function syntax. Parser of arrow function with execution as common function"
   href="https://bugs.webkit.org/show_bug.cgi?id=144955">bug 144955</a>
              from <span class="vcard"><a class="email" href="mailto:gskachkov&#64;gmail.com" title="GSkachkov &lt;gskachkov&#64;gmail.com&gt;"> <span class="fn">GSkachkov</span></a>
</span></b>
        <pre>Comment on <span class=""><a href="attachment.cgi?id=255506&amp;action=diff" name="attach_255506" title="Patch">attachment 255506</a> <a href="attachment.cgi?id=255506&amp;action=edit" title="Patch">[details]</a></span>
Patch

View in context: <a href="https://bugs.webkit.org/attachment.cgi?id=255506&amp;action=review">https://bugs.webkit.org/attachment.cgi?id=255506&amp;action=review</a>

<span class="quote">&gt;&gt; Source/JavaScriptCore/parser/Parser.cpp:365
&gt;&gt; +        if ((functionParseType == ArrowFunctionParseType &amp;&amp; isEndOfArrowFunction()) || !arrowfunctionStatement) {
&gt; 
&gt; Why this branch is needed?
&gt; Is it possible to write just the following here?
&gt; 
&gt;         propagateError();
&gt;         return sourceElements;
&gt; 
&gt; Since this branch is only used for body = expr case. So if we parse one assignment expression in parseArrowFunctionSingleExpressionBody, no further parsing should not be allowed.</span >

Good shoot, before it was necessary. Done.

<span class="quote">&gt;&gt; Source/JavaScriptCore/parser/Parser.cpp:368
&gt;&gt; +        }
&gt; 
&gt; Is here's fall through correct?</span >

I've removed propagateError() statement

<span class="quote">&gt;&gt; Source/JavaScriptCore/parser/Parser.cpp:610
&gt;&gt; +        failDueToUnexpectedToken();
&gt; 
&gt; OK, please insert comment about reparsing phase and parseType relation like the following.
&gt; 
&gt; // When reparsing phase, parseType becomes StandardFunctionParseType even if the function is arrow function.
&gt; // This condition considers the following situations.
&gt; // (1): If we are in the reparsing phase, this arrow function is already parsed once, so there is no syntax error.
&gt; // (2): But if we are not in the reparsing phase, we should check this function is called in the context of the arrow function.</span >

Done

<span class="quote">&gt;&gt; Source/JavaScriptCore/parser/Parser.cpp:631
&gt;&gt; +    if (parseType == StandardFunctionParseType)
&gt; 
&gt; Change it to `m_lexer-&gt;isReparsing()`. `parseType == StandardFunctionParseType` is not essential.
&gt; 
&gt; BTW, this code path is a little bit complicated. I recommend to insert comment here.
&gt; 
&gt; // Only when reparsing phase, our parsing target contains the EndOfArrowFunction token at the end of the code.
&gt; // So consuming the last token here is needed.
&gt; 
&gt; Correct?</span >

I'm not sure. It is possible when state of lexer is reparsing because of reparsing of wrapped function, but not arrow function. For instance test with  (function funcSelfExecAE1(value) { var f = x =&gt; x+1; return f(value);})(123); fails because parser is reparsing funcSelfExecAE1 function.

Anyway I get rid of this condition, after refactoring of the endFunctionOffset calculation

<span class="quote">&gt;&gt; Source/JavaScriptCore/parser/Parser.cpp:1567
&gt;&gt; +        }
&gt; 
&gt; Drop them.</span >

Not sure that I need to do this.
I've made small refactoring those line possible it will be more clear what is going on in this lines.

<span class="quote">&gt;&gt; Source/JavaScriptCore/parser/Parser.cpp:1590
&gt;&gt; +            info.startFunctionOffset = m_token.m_data.offset;
&gt; 
&gt; This line is not needed since it's already set.
&gt; I think info.startFunctionOffset should be set before looking up the cache and should not be touched after that.</span >

The line above is moving to next token, so we need reset info.startFunctionOffset again.

I've made small refactoring of this conditions to avoid nested conditions, hope it will be more readable.

<span class="quote">&gt;&gt; Source/JavaScriptCore/parser/Parser.cpp:1625
&gt;&gt; +            info.endFunctionOffset = location.endOffset + 1;
&gt; 
&gt; Modifying offset is dangerous I think. It easily leads heap overflow.
&gt; And as described below, it leads `parameters.endFunctionStartOffset &gt; parameters.endFunctionEndOffset`.
&gt; 
&gt; I suggest always storing locationBeforeLastToken() in bodyexpression case. And drop prevTerminator information.
&gt; It ensures the following invariant.
&gt; 
&gt; 1. the stored token is always the last token in the function's body. if it using braces ({ ... }), closed brace is stored. And if it takes expr style ((x) =&gt; x), the last token `x` is stored.
&gt; 
&gt; And when recovering from it, always consume the token.</span >

OK. Agree, done

<span class="quote">&gt;&gt; Source/JavaScriptCore/parser/Parser.cpp:1629
&gt;&gt; +        info.isEndByTerminator = m_lexer-&gt;prevTerminator();
&gt; 
&gt; Drop isEndByTerminator information.</span >

Done

<span class="quote">&gt;&gt; Source/JavaScriptCore/parser/Parser.cpp:1647
&gt;&gt; +        parameters.endFunctionEndOffset = endFunctionEndOffset;
&gt; 
&gt; In `m_lexer-&gt;prevTerminator()` case, `info.endFunctionOffset` = `location.endOffset + 1`. And `endFunctionEndOffset` is `location.endOffset`.
&gt; So now, `parameters.endFunctionStartOffset &gt; parameters.endFunctionEndOffset`. Is it indended?</span >

Fixed and used endFunctionEndOffset variables.

<span class="quote">&gt;&gt; Source/JavaScriptCore/parser/Parser.cpp:1663
&gt;&gt; +    if ((parseType == ArrowFunctionParseType &amp;&amp; info.functionBodyType == ArrowFunctionBodyBlock) || parseType != ArrowFunctionParseType) {
&gt; 
&gt; Use `parseType == StandardFunctionParseType` instead of `parseType != ArrowFunctionParseType`.</span >

Done</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are the assignee for the bug.</li>
      </ul>
    </body>
</html>