Project

General

Profile

Actions

Bug #19345

closed

Class variable access from top-level inappropriate error

Added by luke-gru (Luke Gruber) over 2 years ago. Updated over 2 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:111822]

Description

I was looking at doing something like this:

set_cvar = EnvUtil.labeled_class("SetCVar") do
  def self.set(val)
    @@a = val
  end
end
set_cvar.set(1) # fill write cache
set_cvar.freeze
set_cvar.set(2) # hit write cache, but should check frozen status

while working on a ruby issue (https://github.com/ruby/ruby/pull/7124) and I ran into an issue.
This code above gives the error "class variable access from toplevel (RuntimeError)"

Is this a bug or how it's supposed to work? The error is being raised in function vm_get_cvar_base.

Updated by luke-gru (Luke Gruber) over 2 years ago

I just looked into this some more and if we want to allow the above code to work then we need to change the way the class variable cache works right now. Right now because the lookup of the class where we set the @@variables is static, it allows the class variable cache to cache the class. If we wanted it to be dynamic we would lose this cache.

Updated by Eregon (Benoit Daloze) over 2 years ago

  • Status changed from Open to Closed

Class variables work similar to constants in terms of lookup, they only use the scopes opened by class Name/module Name/class << expr.
module_{eval,exec}/class_{eval,exec} do not change that scope.
So this is expected, EnvUtil.labeled_class doesn't change the scope for constants & class variables.

Updated by luke-gru (Luke Gruber) over 2 years ago

Thanks for the explanation :) class_eval with string also works to change scope, apparently.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0