Report abuse

Sample code causes leaks in 1.8.6p238 and p265, but not p111ubuntu

# Helpers
def vsz
  File.open("/proc/#{Process.pid}/status"){|h| h.read[/VmSize:\s+(\d+)\s/, 1]}.to_i
end

def measure(title, count=100_000, &block)
  puts "# %s" % title
  puts "before: %i" % vsz
  count.times{yield}
  puts "after:  %i" % vsz
end

# Does leak
measure("String#=~"){"" =~ //}
measure("String#sub string"){"".sub("", "")}
measure("String#sub regexp"){"".sub(//, "")}
measure("String#[Regexp, Fixnum]"){""[//, 0]}
measure("String#match"){"".match(//)}
measure("Regexp#match"){Regexp.new(//).match("")}
measure("Regexp#~"){$_ = ""; ~ //} # Leaks very fast!

# Doesn't leak
measure("String.new"){""}
measure("String#[]="){"a"[0]="b"}
measure("String#+"){"a"+"b"}
measure("String interpolation"){"#{1/2}"}
measure("String#upcase"){"foo".upcase}
measure("Regexp#new"){Regexp.new("")}