-
Notifications
You must be signed in to change notification settings - Fork 89
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
arrayBind
causes Maximum call stack size exceeded
#309
Comments
michaelficarra
added a commit
to michaelficarra/purescript-prelude
that referenced
this issue
Jan 25, 2024
4 tasks
pete-murphy
added a commit
to pete-murphy/purescript-prelude
that referenced
this issue
Feb 10, 2025
Demonstrating that the current implementation of `Array`'s `Bind` instance causes `RangeError: Maximum call stack size exceeded` when the output of `f` in `ma >>= f` is sufficiently large. This is due to usage of `Function.prototype.apply`. From [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply#using_apply_and_built-in_functions): > But beware: by using apply() (or the spread syntax) with an arbitrarily long arguments list, you run the risk of exceeding the JavaScript engine's argument length limit. > The consequences of calling a function with too many arguments (that is, more than tens of thousands of arguments) is unspecified and varies across engines. (The JavaScriptCore engine has a hard-coded [argument limit of 65536](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply#using_apply_and_built-in_functions).) Node v20.18.1 seems to have a higher limit around 106,000.
pete-murphy
added a commit
to pete-murphy/purescript-prelude
that referenced
this issue
Feb 10, 2025
pete-murphy
added a commit
to pete-murphy/purescript-prelude
that referenced
this issue
Feb 10, 2025
pete-murphy
added a commit
to pete-murphy/purescript-prelude
that referenced
this issue
Feb 10, 2025
Demonstrating that the current implementation of `Array`'s `Bind` instance causes `RangeError: Maximum call stack size exceeded` when the output of `f` in `ma >>= f` is sufficiently large. This is due to usage of `Function.prototype.apply`. From [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply#using_apply_and_built-in_functions): > But beware: by using apply() (or the spread syntax) with an arbitrarily long arguments list, you run the risk of exceeding the JavaScript engine's argument length limit. > The consequences of calling a function with too many arguments (that is, more than tens of thousands of arguments) is unspecified and varies across engines. (The JavaScriptCore engine has a hard-coded [argument limit of 65536](https://webkit.org/b/80797).) Node v20.18.1 seems to have a higher limit around 106,000.
pete-murphy
added a commit
to pete-murphy/purescript-prelude
that referenced
this issue
Feb 10, 2025
pete-murphy
added a commit
to pete-murphy/purescript-prelude
that referenced
this issue
Feb 10, 2025
4 tasks
pete-murphy
added a commit
to pete-murphy/purescript-prelude
that referenced
this issue
Feb 10, 2025
pete-murphy
added a commit
to pete-murphy/purescript-prelude
that referenced
this issue
Feb 15, 2025
Using static check to determine if `Array.prototype.flatMap` is available, and use `var` instead of `let` in for loop to match existing code style.
pete-murphy
added a commit
to pete-murphy/purescript-prelude
that referenced
this issue
Feb 15, 2025
Using static check to determine if `Array.prototype.flatMap` is available, and use `var` instead of `let` in for loop to match existing code style.
natefaubion
pushed a commit
that referenced
this issue
Feb 15, 2025
* test(#309): Failing test Demonstrating that the current implementation of `Array`'s `Bind` instance causes `RangeError: Maximum call stack size exceeded` when the output of `f` in `ma >>= f` is sufficiently large. This is due to usage of `Function.prototype.apply`. From [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply#using_apply_and_built-in_functions): > But beware: by using apply() (or the spread syntax) with an arbitrarily long arguments list, you run the risk of exceeding the JavaScript engine's argument length limit. > The consequences of calling a function with too many arguments (that is, more than tens of thousands of arguments) is unspecified and varies across engines. (The JavaScriptCore engine has a hard-coded [argument limit of 65536](https://webkit.org/b/80797).) Node v20.18.1 seems to have a higher limit around 106,000. * fix(#309): Use `flatMap` if supported by runtime * fix(#309): Use simple stack-safe fallback * chore(#309): Add to CHANGELOG.md * feat(#309): Address feedback from code review Using static check to determine if `Array.prototype.flatMap` is available, and use `var` instead of `let` in for loop to match existing code style. --------- Co-authored-by: Peter Murphy <[email protected]>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
In short,
When the return value is just a huge array, RangeError is raised immediately, by passing too many arguments to
Array.prototype.push
function.Of course this is very rare case but I think it should not be a purescript limitation.
Do someone know any solutions with minimum performance impact?
The text was updated successfully, but these errors were encountered: