Project

General

Profile

Feature #21637

Updated by viralpraxis (Iaroslav Kurbatov) about 16 hours ago

## Motivation 

 Currently, there is no straightforward way to track global variable assignments at runtime. 

 The only workaround I am aware of involves using the `line` TracePoint event, combined with manipulation of the source code's AST, but this approach is extremely slow and impractical. 

 I'd like to propose a new `gvar_set` (and probably `gvar_get`, but that's out of the scope of this ticket) event which would fire whenever a global variable is written to. 

 ## Context 

 There's current an open https://bugs.ruby-lang.org/issues/15854 feature request with a PR by @st0012, but they currently do not address the global variables, so I've decided to open a new one and a new PR. 

 There's an open gvar-specific question: should "system" global variables like `$!` trigger the `gvar_set` event? (the current implementation does not) 

 ## Usage example 

 ```ruby 
 # frozen-string-literal: true 

 TracePoint.new(:gvar_set) { p [it.gvar_name, it.return_value] }.enable do 
   $G1 = 1 
   $G2 = 2 
   $G3 = 3 
 end 

 # [:$G1, 1] 
 # [:$G2, 2] 
 # [:$G3, 3] 
 ``` 

 PR: https://github.com/ruby/ruby/pull/14827 

Back