There is a discussion about SaffeBuffer#gsub in https://github.com/rails/rails/issues/1555
-- Guillermo Iguaran Sent with Sparrow (http://www.sparrowmailapp.com) On Saturday, August 13, 2011 at 12:42 PM, Andrew Kaspick wrote: > Hello, > > I've run into a bug with the implementation of gsub in > https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/string/output_safety.rb > > My code is essentially this... (my pattern captures values to the > global variables $1, $2) > > text.gsub(pattern) do |match| > # uses match, $1, $2 > end > > When running this, my match var is passed correctly, but $1 and $2 are > nil. If I remove gsub from the list of UNSAFE_STRING_METHODS gsub > works as expected, so gsub is currently broken in Rails as far as I > can see. > > To test this you can do the following (do this in Rails 3-1... Rails > 3-0 gsub is broken even more right now)... > > Broken (using SafeBuffer)... > ruby-1.9.2-p290 :001 > ActiveSupport::SafeBuffer.new("capture > this").gsub(/(capture) (this)/){|match| p match, $1, $2} > "capture this" > nil > nil > > Good (using String)... > ruby-1.9.2-p290 :004 > String.new("capture this").gsub(/(capture) > (this)/){|match| p match, $1, $2} > "capture this" > "capture" > "this" > > Basically the current code doesn't persist the values of the globals > $1, $2, etc. > > def #{unsafe_method}(*args, &block) # def gsub(*args, &block) > to_str.#{unsafe_method}(*args, &block) > end > > I did some testing to rewrite this method and $1 and $2 are in fact > set in the overridden method, but they are nil inside the block of the > method outside of the override. The actual fix for this is somewhat > beyond my knowledge of ruby, as I thought global variables would > remain global, but something else is going on here. I read that some > of the special global vars are in fact treated as locals, so I'm not > sure if this is the case here. > > Any ideas on how to fix this properly? Suggestions welcome so I can > submit a patch. > > Andrew > > -- > You received this message because you are subscribed to the Google Groups > "Ruby on Rails: Core" group. > To post to this group, send email to [email protected] > (mailto:[email protected]). > To unsubscribe from this group, send email to > [email protected] > (mailto:[email protected]). > For more options, visit this group at > http://groups.google.com/group/rubyonrails-core?hl=en. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
