| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
|
Review requested:
|
Sorry, something went wrong.
|
what's the benefit/performance diff? |
Sorry, something went wrong.
|
My benchmarks dont show regressions. The benefit is, that the stack trace will be generated propery, without the need to call captureLargerStackTrace. So we wont be forced to keep infinity amount of CallSites just to kick some. On the long run, i want to try to remove prepareStackTrace. Currently i investigate what this overrideStackTrace Map is doing, and how we can avoid it. |
Sorry, something went wrong.
There was a problem hiding this comment.
Won't this mess with the .name of the error and how stack traces look (vs the previous implementation)?
Sorry, something went wrong.
There was a problem hiding this comment.
The only reason i created this class, was because to avoid to patch everywhere the logic for Error.stackTraceLimit over and over.
The name should be the same imho. But i can tackle it.
Sorry, something went wrong.
There was a problem hiding this comment.
Thanks let me know when ready
Sorry, something went wrong.
There was a problem hiding this comment.
Does this test cover the issue?
Sorry, something went wrong.
|
The existing tests pass. Next step is to remove the captureLargerStackTrace function and ensure that the logic is equivalent. Imho this is an exciting PR for me. If done right, this should improve the performance of basically every error case. And tbh it seems to be a smart solution (patting on my own shoulder). Also it will cover all the validateX functions.so it should expose less unnecessary stacks. |
Sorry, something went wrong.
|
note to myself: Investigate https://docs.google.com/document/d/13Sy_kBIJGP0XT34V1CV3nkWya4TwYx9L3Yv45LdGB6Q/edit#heading=h.9ss45aibqpw2 |
Sorry, something went wrong.
|
@anonrig can you please add the author-ready tag? I would like to discuss this. |
Sorry, something went wrong.
author-ready requires at least 1 collaborator approval. I don't have enough knowledge to review this. I recommend @benjamingr or @mcollina to leave a review before adding author-ready |
Sorry, something went wrong.
Sorry, something went wrong.
There was a problem hiding this comment.
lgtm
Sorry, something went wrong.
|
You are correct |
Sorry, something went wrong.
| }); | ||
| if (otherClasses.includes(HideStackFramesError)) { | ||
| if (otherClasses.length !== 1) { | ||
| otherClasses.forEach((clazz) => { |
Sorry, something went wrong.
| otherClasses.forEach((clazz) => { | ||
| def[clazz.name] = makeNodeErrorWithCode(clazz, sym); | ||
| }); | ||
| if (otherClasses.includes(HideStackFramesError)) { |
Sorry, something went wrong.
There was a problem hiding this comment.
I would recommend we do.
Sorry, something went wrong.
|
@benjamingr |
Sorry, something went wrong.
There was a problem hiding this comment.
Don't have capacity, sorry, unblocking so others can progress
Sorry, something went wrong.
|
@anonrig |
Sorry, something went wrong.
Sorry, something went wrong.
|
@anonrig |
Sorry, something went wrong.
Sorry, something went wrong.
Sorry, something went wrong.
Sorry, something went wrong.
There was a problem hiding this comment.
lgtm
Sorry, something went wrong.
PR-URL: #49990 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: James M Snell <jasnell@gmail.com>
PR-URL: #49990 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: James M Snell <jasnell@gmail.com>
PR-URL: #49990 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: James M Snell <jasnell@gmail.com>
| Back | FazBrowse Home | New Git URL |
This PR improves the hideStackFrames logic.
hideStackFrames is used to hide function calls from stracktraces of Errors. E.g. we call Buffer.alloc(size), then we check if the parameter size is an integer and call validateNumber(size, 'size', 0, kMaxLength);.
then we get the following stacktrace:
TypeError [ERR_INVALID_ARG_TYPE]: The "size" argument must be of type number. Received type string ('1') at Function.alloc (node:buffer:393:3) at Object.<anonymous> (/home/aras/workspace/node/test.js:4:12) at Module._compile (node:internal/modules/cjs/loader:1369:14) at Module._extensions..js (node:internal/modules/cjs/loader:1427:10) at Module.load (node:internal/modules/cjs/loader:1201:32) at Module._load (node:internal/modules/cjs/loader:1017:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:104:12) at node:internal/main/run_main_module:23:47If we remove the hideStackFrame wrapping for demonstration purposes we get:
So we have the additional at validateNumber (node:internal/validators:177:11) entry.
We want to hide this frame, as it is some node internal information, and does not give any benefit for the developer.
Javascript has no inline specifier, so we have to hide it differently. In main branch this is solved by prefixing the function name with __node_internal_ and then generating the whole stacktrace with captureLargerStackTrace, which sets Error.stackTraceLimit = Infinity. When we then call Error.stack, prepareStackTrace will filter out the all frames, which start with __node_internal_.
But we dont need the whole stackTrace. We only need a limited number, by default 10 frames.
To achieve this we just generate the necessary stackTrace.
So hideStackFrames will wrap the original function and will capture the correct stack trace if an error is thrown. Functions which are wrapped have to call the HideStackFramesError Errors and wont have a Stack trace.
An edge case is when a function, which uses hideStackFrames calls another function which is wrapped with hideStackFrames. To avoid double generation of the stack, a function which is wrapped with hideStackFrames exposes a function as attribute of the wrapped function called .withoutStackTrace. The outer function will then get the necessary stack trace.
Usually double wrapped functions are validators. I would have liked to extract them all into validators.js or into module/validators.js. But this would have reduced the readability further.