Issue #15912 has been updated by ko1 (Koichi Sasada).


Your proposal is, prohibit "same" tracepoint object, right? I misreading th=
at your suggestion is to prohibit same event (when line event handler is wo=
rking, other line event handler can't be fired, but :class event handler ca=
n fire).

----

If my understanding is correctly, while running `line_handler2`, `line_hand=
ler1` is invoked. right?

```
* main
  * :line event
    * line_handler1
      * :line event
        * line_handler2
      * :line event
        * line_handler2
    * line_handler2
      * :line event
        * line_handler1
      * :line event
        * line_handler1
    * finish all line hooks
* continue main
```

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

* 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>