diff --git a/src/bindings/ruby/lib/hammer.rb b/src/bindings/ruby/lib/hammer.rb index 0f10ab182f82755f0488382d8e480967c336fff6..4b86690cfd6ddc7db8c132bf815cd83667109a1c 100644 --- a/src/bindings/ruby/lib/hammer.rb +++ b/src/bindings/ruby/lib/hammer.rb @@ -52,3 +52,9 @@ p parser.parse 'Hello Mom!' h = Hammer::Parser parser = h.sequence(h.token('Hello '), h.choice(h.token('Mom'), h.token('Dad')), h.token('!')) p parser.parse 'Hello Mom!' + +s = 'blah' +parser = h.token(s) +p parser.parse 'BLAH' # => false +s.upcase! +p parser.parse 'BLAH' # => false diff --git a/src/bindings/ruby/lib/hammer/parser.rb b/src/bindings/ruby/lib/hammer/parser.rb index 79e03705528d0d20a4fb35df4281f6dbb6220b81..defb776beaaee02251cf22df298cf322716803d7 100644 --- a/src/bindings/ruby/lib/hammer/parser.rb +++ b/src/bindings/ruby/lib/hammer/parser.rb @@ -17,11 +17,14 @@ module Hammer end def self.token(string) - h_parser = Hammer::Internal.h_token(string, string.length) + h_string = string.dup + h_parser = Hammer::Internal.h_token(h_string, h_string.length) - parser = Hammer::Parser.new - parser.instance_variable_set :@h_parser, h_parser - return parser + parser = Hammer::Parser.new + parser.instance_variable_set :@h_parser, h_parser + # prevent string from getting garbage-collected + parser.instance_variable_set :@h_string, h_string + return parser end def self.ch(char)