Issue #15912 has been updated by deivid (David Rodr=EDguez).


Hi Koichi! Thanks for answering.

So, you mean to allow the reentrancy (TracePoint events being triggered fro=
m inside TracePoint handlers) if the TracePoint API user requests so? I gue=
ss that would work, I could call `tp.reopen {}` before giving a prompt to t=
he byebug user, so that zeitwerk events will trigger.

I wonder though whether it's better that this _just works_ when it could wo=
rk, and it ignores events when they would cause an infinite loop. I think m=
y suggestion of keeping a stack of events being handled would allow that an=
d would require no additions to the API.

----------------------------------------
Feature #15912: Allow some reentrancy during TracePoint events
https://bugs.ruby-lang.org/issues/15912#change-80301

* Author: deivid (David Rodr=EDguez)
* Status: Assigned
* Priority: Normal
* Assignee: ko1 (Koichi Sasada)
* Target version: =

----------------------------------------
I got a report in byebug about byebug being incompatible with zeitwerk. Thi=
s one: https://github.com/deivid-rodriguez/byebug/issues/564. This is a pro=
blem because zeitwerk is the default Rails code loader, and byebug is the d=
efault Rails debugger.

Both of these tools rely on the TracePoint API:

* Byebug uses a bunch of TracePoint events to stop execution at certain poi=
nts in your program.
* Zeitwek uses `:class` events to be able to resolve some circular edge cas=
es.

I investigated the problem and I think the issue is that while stopped at t=
he byebug prompt, we're actually in the middle of processing a TracePoint e=
vent. That means that further TracePoint events triggered at the byebug's p=
rompt will be ignored, because otherwise we could get into an infinite loop=
 where the handling of events would trigger more events that trigger themse=
lves the execution of handlers again.

I understand why the TracePoint API does this, but if we could allow some l=
evel of reentrancy here, we could probably make these tools play nice toget=
her. I figure if we kept a stack of TracePoint event handlers being run, an=
d check that the current event type is not already in the stack, we would a=
llow :class events to be triggered from :line events, and I think that woul=
d allow Zeitwerk to work within byebug.

What do you think about this, @ko1?



-- =

https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=3Dunsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>