From 3f661b91e3eaaa51fa1dbc11a0345407a1862cba Mon Sep 17 00:00:00 2001
From: Jakob Rath <git@jakobrath.eu>
Date: Fri, 15 Nov 2013 14:49:18 +0100
Subject: [PATCH] Duplicate string argument to token parser.

---
 src/bindings/ruby/lib/hammer.rb        |  6 ++++++
 src/bindings/ruby/lib/hammer/parser.rb | 11 +++++++----
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/bindings/ruby/lib/hammer.rb b/src/bindings/ruby/lib/hammer.rb
index 0f10ab18..4b86690c 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 79e03705..defb776b 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)
-- 
GitLab