| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
c4b755e tracks the statements currently being stepped and rejects reentry into them, but the guard is established inside the execution helpers, after the entry point has already reset the statement and bound its parameters. Binding reads properties off the supplied object, so a named-parameter getter runs JavaScript in that window. Reentering the same statement there resets it a second time and, for iterate(), hands out a second iterator; both iterators record the same reset generation, so neither is invalidated and they interleave rows from one virtual machine. Establish the guard at the four StatementSync entry points instead, before the reset, so it spans binding as well as stepping. The existing guards inside the helpers are left in place; the stepping set is a stack, so the nested acquisition is balanced. Signed-off-by: Trevor Burnham <trevorburnham@gmail.com> Assisted-by: claude:opus-5
|
Review requested:
|
Sorry, something went wrong.
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## main #65294 +/- ##
==========================================
- Coverage 90.33% 90.30% -0.03%
==========================================
Files 751 751
Lines 250048 250239 +191
Branches 47254 47300 +46
==========================================
+ Hits 225877 225990 +113
- Misses 15553 15620 +67
- Partials 8618 8629 +11
... and 39 files with indirect coverage changes 🚀 New features to boost your workflow:
|
Sorry, something went wrong.
Sorry, something went wrong.
c4b755e tracks the statements currently being stepped and rejects reentry into them, but the guard is established inside the execution helpers, after the entry point has already reset the statement and bound its parameters. Binding reads properties off the supplied object, so a named-parameter getter runs JavaScript in that window. Reentering the same statement there resets it a second time and, for iterate(), hands out a second iterator; both iterators record the same reset generation, so neither is invalidated and they interleave rows from one virtual machine. Establish the guard at the four StatementSync entry points instead, before the reset, so it spans binding as well as stepping. The existing guards inside the helpers are left in place; the stepping set is a stack, so the nested acquisition is balanced. Signed-off-by: Trevor Burnham <trevorburnham@gmail.com> Assisted-by: claude:opus-5 PR-URL: #65294 Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
c4b755e tracks the statements currently being stepped and rejects reentry into them, but the guard is established inside the execution helpers, after the entry point has already reset the statement and bound its parameters. Binding reads properties off the supplied object, so a named-parameter getter runs JavaScript in that window. Reentering the same statement there resets it a second time and, for iterate(), hands out a second iterator; both iterators record the same reset generation, so neither is invalidated and they interleave rows from one virtual machine. Establish the guard at the four StatementSync entry points instead, before the reset, so it spans binding as well as stepping. The existing guards inside the helpers are left in place; the stepping set is a stack, so the nested acquisition is balanced. Signed-off-by: Trevor Burnham <trevorburnham@gmail.com> Assisted-by: claude:opus-5 PR-URL: #65294 Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
| Back | FazBrowse Home | New Git URL |
Follow-up for #65156. That PR added tracking for the statements currently being stepped and rejects reentry into them. The guard is established inside the execution helpers, though, which the entry points reach only after resetting the statement and binding its parameters.
Binding reads properties off the supplied object, so a named-parameter getter runs JavaScript in that window. On current main:
{ done: false, value: { value: 1 } } // outer { done: false, value: { value: 2 } } // inner { done: false, value: { value: 3 } } // outer { done: true, value: null } // innerTwo live iterators over one virtual machine. The reset-generation check does not catch it because the inner iterate() bumps the generation before the outer iterator is constructed, so both record the same value and neither is invalidated.
This PR hoists the guard to the four StatementSync entry points, before the reset, so it spans binding as well as stepping. The guards inside the helpers are left alone; stepping_statements_ is a stack, so the nested acquisition is balanced. It also adds test cases salvaged from #65106, which was superseded by #65156.