[ragel-users] [PATCH] Fix generated code for Ruby 1.9 compatibility.

Adrian Thurston adrian.thurston at esentire.com
Thu Dec 16 18:30:51 UTC 2010


Thanks, in the queue for the next release.

-Adrian

On 10-12-15 10:52 PM, Diego Elio Pettenò wrote:
> In Ruby 1.9, the String class no longer works as a C-style array of (8-bit)
> characters, but supports multiple encoding. While it is obviously a task
> for the developer to ensure that the data array passed to the
> Ragel-generated code is in a compatible encoding, this also means that the
> simple dereference is not going to work:
>
> % ruby18 -e 'puts "foo"[0].class'
> Fixnum
> % ruby19 -e 'puts "foo"[0].class'
> String
>
> This is easily fixed by calling the #ord method on the dereferenced data,
> which will provide the ASCII ordinal (or UNICODE codepoint) for the single
> character.
>
> The produced code works correctly both on Ruby 1.8 and 1.9.2.
> ---
>   ragel/rubycodegen.cpp |    7 +++++--
>   1 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/ragel/rubycodegen.cpp b/ragel/rubycodegen.cpp
> index 5117823..f329587 100644
> --- a/ragel/rubycodegen.cpp
> +++ b/ragel/rubycodegen.cpp
> @@ -307,8 +307,11 @@ string RubyCodeGen::GET_KEY()
>   		ret<<  ")";
>   	}
>   	else {
> -		/* Expression for retrieving the key, use simple dereference. */
> -		ret<<  DATA()<<  "["<<  P()<<  "]";
> +		/* Expression for retrieving the key, use dereference
> +		 * and read ordinal, for compatibility with Ruby
> +		 * 1.9.
> +		 */
> +		ret<<  DATA()<<  "["<<  P()<<  "].ord";
>   	}
>   	return ret.str();
>   }

_______________________________________________
ragel-users mailing list
ragel-users at complang.org
http://www.complang.org/mailman/listinfo/ragel-users



More information about the ragel-users mailing list