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