Project

General

Profile

Actions

Bug #11360

closed

Singleton class doesn't appear by ObjectSpace.each_object

Added by ko1 (Koichi Sasada) over 9 years ago. Updated over 9 years ago.

Status:
Closed
Target version:
-
[ruby-core:70006]

Description

Singleton class doesn't appear by ObjectSpace.each_object.

The following is reproducible code.

class C
  class << self
    p [self, self.class]
    $c = self
  end
end

ObjectSpace.each_object(Class){|o|
  exit if $c == o
}
raise "#{$c} is not found!"

This is because internal_object_p in gc.c skips singleton classes.

static int
internal_object_p(VALUE obj)
{
    RVALUE *p = (RVALUE *)obj;

    if (p->as.basic.flags) {
	switch (BUILTIN_TYPE(p)) {
	  case T_NONE:
	  case T_IMEMO:
	  case T_ICLASS:
	  case T_NODE:
	  case T_ZOMBIE:
	    break;
	  case T_CLASS:
	    if (FL_TEST(p, FL_SINGLETON))
	      break;
	  default:
	    if (!p->as.basic.klass) break;
	    return 0;
	}
    }
    return 1;
}

Updated by ko1 (Koichi Sasada) over 9 years ago

From Ruby 1.6, singleton classes are not appeared.
Is it intentional?

Updated by Eregon (Benoit Daloze) over 9 years ago

Koichi Sasada wrote:

From Ruby 1.6, singleton classes are not appeared.
Is it intentional?

I guess the reason is exposing the last layer of singleton classes would expose "VM-internal singleton classes/metaclasses".
The documentation of rb_singleton_class explains it a bit.
But basically the VM needs the metaclass of any class exposed to the user, and exposing them would require another layer, which if exposed as well would need another, etc.
Singleton classes which already have a metaclass could be iterated though.

Updated by matz (Yukihiro Matsumoto) over 9 years ago

It was intentional, since in the old days singleton classes are merely internal data structure. After intoduction of #singleton_class method, singleton classes are objects visible to Ruby world. In that sense, now it's natural for them to be visible from #each_object.

Matz.

Actions #4

Updated by ko1 (Koichi Sasada) over 9 years ago

  • Status changed from Open to Closed

Applied in changeset r51320.


  • gc.c (internal_object_p): Now a singleton classes appear by
    ObjectSpace.each_object. [Bug #11360]
  • test/ruby/test_objectspace.rb: add a test about it.
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0