Project

General

Profile

Actions

Feature #10200

closed

Symbol list/count API with Symbol GC

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

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

Description

Abstract

We need to consider specification of "Symbol.all_symbols" method because of Symbol GC.

Backgraound

Symbol.all_symbols returns an array includes all symbols in this Ruby interpreter process.

"a#{1+2}b".to_sym
p Symbol.all_symbols.last #=> :a3b. Order of this array is implementation dependent.

However, Ruby 2.2 will introduce [symbol GC] (https://bugs.ruby-lang.org/issues/9634).
With symbol GC, dynamically created symbols can be collected like this:

"a#{1+2}b".to_sym
p Symbol.all_symbols.last #=> :a3b
GC.start
p Symbol.all_symbols.last #=> :$-a  <- :a3b is collected

Symbol class has another API Symbol.find() to get a symbol from a corresponding string object like that:

str = "a#{1+2}b"
str.to_sym
p Symbol.all_symbols.last #=> :a3b
p Symbol.find(str)        #=> :a3b
GC.start
p Symbol.all_symbols.last #=> :$-a  <- :a3b is collected
p Symbol.find(str)        #=> nil

Symbol GC separate all symbols into two types (because of implementaion details):

  • (1) Collecatable symbols
  • (2) Uncollectable symbols (we can not free even if there are no reference to these symbols)

Now, Symbol.all_symbols returns (1) + (2).

Symbol.all_symbols and Symbol.find methods assume that all symbols are immortal (assume only (2)). However, this assumption is changed ((1) is added).

[Symbol.count] (https://bugs.ruby-lang.org/issues/9963) is proposed to count (2) symbols.
Now, we don't have any way to count (2), because Symbol.all_symbols.size returns (1) and (2) symbols.

Discussion

Maybe there are several possibility:

(a) No change (Symbol.all_symbols and Symbol.find treat with (1) + (2) symbols)
(b) Symbol.all_symbols and Symbol.find treat with (2) symbols
(c) Add new parameter to Symbol.all_symbols and Symbol.find to specify (2) or (1)+(2)).

(b) and (c) is reasonable for recent usage for these API, to findout immortal objects.
However, Symbol GC reduces danger of DoS attack with huge number of immortal objects.

Thoughts?

Updated by ko1 (Koichi Sasada) over 9 years ago

  • Description updated (diff)

Updated by akr (Akira Tanaka) over 9 years ago

I feel ObjectSpace.count_objects can be extended to return number of symbols.

Updated by ko1 (Koichi Sasada) over 9 years ago

Akira Tanaka wrote:

I feel ObjectSpace.count_objects can be extended to return number of symbols.

Make a new method? Or return a hash object with new types like T_SYMBOL_MORTAL and T_SYMBOL_IMMORTAL?

Now, ObjectSpace.count_objects returns a number of (1) + (2) - [number of statically created symbol (immediate symbol values)].

Updated by akr (Akira Tanaka) over 9 years ago

New hash entries.

I'm not sure that "T_" prefix is appropriate here, though.

Updated by matz (Yukihiro Matsumoto) over 9 years ago

This request is bit vague.

As a result of the developers meething on 2014-09-04, we will:

  • keep Symbol.all_symbols as it is.
  • remove Symbol.find(name).

Matz.

Updated by matz (Yukihiro Matsumoto) over 9 years ago

  • Status changed from Open to Closed
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0