Project

General

Profile

Actions

Bug #17841

closed

The first instance of SortedSet doesn't sort when rbtree is present

Added by joshc (Josh C) 7 months ago. Updated 4 months ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-linux]
[ruby-core:103664]

Description

If the rbtree gem is present, then in ruby 2.7, the first instance of SortedSet will return entries in insertion order. Future instances of SortedSet correctly return sorted entries.

Given:

require 'rbtree'
require 'set'

descending = [2, 1]

s1 = SortedSet.new
descending.each { |i| s1.add(i) }

s2 = SortedSet.new
descending.each { |i| s2.add(i) }

puts s1.to_a == s1.sort.to_a
puts s2.to_a == s2.sort.to_a

It prints:

false
true

It should print:

true
true

The reason for this is because the SortedSet#initialize method monkey patches itself. So the first instance of SortedSet uses the default @hash = {} instead of @hash = RBTree.new, and it doesn't monkey patch the to_a method to sort the hash keys.

This is an issue for anyone adding the sorted_set gem dependency to support both ruby 2 and 3, since the sorted_set gem depends on rbtree

Updated by jeremyevans0 (Jeremy Evans) 7 months ago

  • Backport changed from 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN to 2.6: DONTNEED, 2.7: REQUIRED, 3.0: DONTNEED
  • Status changed from Open to Closed

This is probably caused by the fix to #15830. Here's a pull request that should fix it: https://github.com/ruby/ruby/pull/4432, though I didn't test with rbtree. Closing and marking for backport.

Updated by usa (Usaku NAKAMURA) 4 months ago

  • Backport changed from 2.6: DONTNEED, 2.7: REQUIRED, 3.0: DONTNEED to 2.6: DONTNEED, 2.7: DONE, 3.0: DONTNEED

merged into ruby_2_7 at 2a7235421fcd59b449c84306d059f22b4c5f0865

Actions

Also available in: Atom PDF