[Webkit-unassigned] [Bug 163663] RangeError with deep self recursion (Proper tail call)

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Wed Oct 19 13:36:21 PDT 2016


https://bugs.webkit.org/show_bug.cgi?id=163663

--- Comment #2 from Filip Pizlo <fpizlo at apple.com> ---
(In reply to comment #0)
> A RangeError is thrown during a deep self recursion. As stack frames are
> supposed to be reused if a function is called in tail position, this is
> unexpected.
> 
> ```
> function decToZero(n) {
>   return n>0 ? decToZero(n-1) : n;
> }
> 
> decToZero(42280) // yields "RangeError: Maximum call stack size exceeded."
> ```
> 
> The depth of recursion necessary to blow the stack is not consistent but
> I've always observed it when n >= 100000.
> 
> Hardware:
> MacBook Pro (Retina, 15-inch, Mid 2015)
> 2.5 GHz Intel Core i7
> 16 GB 1600 MHz DDR3
> 
> Webkit: Version 10.0 (11602.1.50.0.10, r207529)

Does it work if you write your code this way:

function decToZero(n) {
  if (n>0)
    return decToZero(n-1);
  return n;
}

The bug appears to be that we don't handle ternaries correctly for our evaluation of whether a call is in tail position. It took me a while, but by my reading of http://www.ecma-international.org/ecma-262/6.0/ECMA-262.pdf, on page 265 it appears to say that if the cases of the ternary are tail candidates.

-- 
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.webkit.org/pipermail/webkit-unassigned/attachments/20161019/4876f036/attachment.html>


More information about the webkit-unassigned mailing list