sinatra/mustermann

Fallback to Hash for Mustermann::EqualityMap produces warnings and seems incorrect

eregon opened this issue · 3 comments

Mustermann::EqualityMap falls back to Hash if ObjectSpace::WeakMap is not defined.

def self.new
defined?(ObjectSpace::WeakMap) ? super : {}
end

However, this fallback doesn't seem correct as then

@map ||= EqualityMap.new
@map.fetch(string, options) { super(string, options) { options } }

ends up calling Hash#fetch with both a default value argument and a block.
This produces the warning:

.../gems/mustermann-1.0.2/lib/mustermann/pattern.rb:59: warning: block supersedes default value argument

And it means the second argument options is therefore ignored.

Mustermann::EqualityMap#fetch, used only if ObjectSpace::WeakMap is defined, has a different signature:

I guess one easy fix is to define it like fetch(key) and in pattern.rb call it like

@map.fetch([string, options]) { super(string, options) { options } }

See oracle/truffleruby#1375 (comment) for the original report in TruffleRuby.

@namusyaka Hello, could you take a look at this issue?

@eregon Your fix looks reasonable to me. Could you send a patch?

@namusyaka Thank you for taking a look, I'll make a PR.