Project

General

Profile

Actions

Feature #21637

open

Tracing global variable assignment

Added by viralpraxis (Iaroslav Kurbatov) about 16 hours ago. Updated about 15 hours ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:<unknown>]

Description

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 (Stan Lo), 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

# 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

Actions #1

Updated by viralpraxis (Iaroslav Kurbatov) about 16 hours ago

  • Description updated (diff)
Actions #2

Updated by alanwu (Alan Wu) about 15 hours ago ยท Edited

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

There is Kernel#trace_var.

Actions #3

Updated by viralpraxis (Iaroslav Kurbatov) about 15 hours ago

alanwu (Alan Wu) wrote in #note-2:

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

There is Kernel#trace_var.

I'm aware of Kernel#trace_var, but it does not cover cases where the global variables aren't known beforehand

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0