backport to ruby 1.8.x