@@ -3168,13 +3168,16 @@ rb_vm_insn_addr2insn(const void *addr)
3168
3168
}
3169
3169
3170
3170
static inline int
3171
- encoded_iseq_trace_instrument (VALUE * iseq_encoded_insn , rb_event_flag_t turnon )
3171
+ encoded_iseq_trace_instrument (VALUE * iseq_encoded_insn , rb_event_flag_t turnon , bool remain_current_trace )
3172
3172
{
3173
3173
st_data_t key = (st_data_t )* iseq_encoded_insn ;
3174
3174
st_data_t val ;
3175
3175
3176
3176
if (st_lookup (encoded_insn_data , key , & val )) {
3177
3177
insn_data_t * e = (insn_data_t * )val ;
3178
+ if (remain_current_trace && key == (st_data_t )e -> trace_encoded_insn ) {
3179
+ turnon = 1 ;
3180
+ }
3178
3181
* iseq_encoded_insn = (VALUE ) (turnon ? e -> trace_encoded_insn : e -> notrace_encoded_insn );
3179
3182
return e -> insn_len ;
3180
3183
}
@@ -3187,7 +3190,7 @@ rb_iseq_trace_flag_cleared(const rb_iseq_t *iseq, size_t pos)
3187
3190
{
3188
3191
const struct rb_iseq_constant_body * const body = iseq -> body ;
3189
3192
VALUE * iseq_encoded = (VALUE * )body -> iseq_encoded ;
3190
- encoded_iseq_trace_instrument (& iseq_encoded [pos ], 0 );
3193
+ encoded_iseq_trace_instrument (& iseq_encoded [pos ], 0 , false );
3191
3194
}
3192
3195
3193
3196
static int
@@ -3216,7 +3219,7 @@ iseq_add_local_tracepoint(const rb_iseq_t *iseq, rb_event_flag_t turnon_events,
3216
3219
if (pc_events & target_events ) {
3217
3220
n ++ ;
3218
3221
}
3219
- pc += encoded_iseq_trace_instrument (& iseq_encoded [pc ], pc_events & (target_events | iseq -> aux .exec .global_trace_events ));
3222
+ pc += encoded_iseq_trace_instrument (& iseq_encoded [pc ], pc_events & (target_events | iseq -> aux .exec .global_trace_events ), true );
3220
3223
}
3221
3224
3222
3225
if (n > 0 ) {
@@ -3281,7 +3284,7 @@ iseq_remove_local_tracepoint(const rb_iseq_t *iseq, VALUE tpval)
3281
3284
3282
3285
for (pc = 0 ; pc < body -> iseq_size ;) {
3283
3286
rb_event_flag_t pc_events = rb_iseq_event_flags (iseq , pc );
3284
- pc += encoded_iseq_trace_instrument (& iseq_encoded [pc ], pc_events & (local_events | iseq -> aux .exec .global_trace_events ));
3287
+ pc += encoded_iseq_trace_instrument (& iseq_encoded [pc ], pc_events & (local_events | iseq -> aux .exec .global_trace_events ), false );
3285
3288
}
3286
3289
}
3287
3290
return n ;
@@ -3333,7 +3336,7 @@ rb_iseq_trace_set(const rb_iseq_t *iseq, rb_event_flag_t turnon_events)
3333
3336
3334
3337
for (pc = 0 ; pc < body -> iseq_size ;) {
3335
3338
rb_event_flag_t pc_events = rb_iseq_event_flags (iseq , pc );
3336
- pc += encoded_iseq_trace_instrument (& iseq_encoded [pc ], pc_events & enabled_events );
3339
+ pc += encoded_iseq_trace_instrument (& iseq_encoded [pc ], pc_events & enabled_events , true );
3337
3340
}
3338
3341
}
3339
3342
}
0 commit comments