I’m getting crazy with this problem: strings loaded through yaml appear
different in MRI 1.9.2 and jruby with --1.9.
Have a look:
$ cat data_row.rb
class DataRow
def initialize(hash)
hash.each do |key, value|
# be sure values are not null
if is_not_null(value)
instance_variable_set("@#{key}", “#{value}”)
end
end
end
def is_not_null(v)
puts “#{v} = <#{v.strip}>” if v
v and !(v.strip.eql?(""))
end
end
$ cat test_data_row.rb
require ‘test/unit’
require ‘data_row’
require ‘yaml’
class TestDataRow < Test::Unit::TestCase
def test_empty_string
yamldata =<<YAML
empty:
broken: " "
not_empty: " ()"
YAML
yaml = YAML.load yamldata
d = DataRow.new(yaml)
assert_nil d.instance_eval {@broken}
end
end
test passes with jruby1.6.0, with plain ruby1.9.2, but fails with
jruby1.6.0 --1.9
It is definitely a yaml problem: as soon as I substitute the hash loaded
from yaml with a plain hash everything works.
Stanger still, if you uncomment debug line:
puts “#{v} = <#{v.strip}>” if v
and run under jruby1.6.0 --1.9 this error follows:
ArgumentError: negative string size (or size too big)
/homel/francesco/sviluppo/ruby/scratchbox/bug/data_row.rb:12:in
is_not_null' /homel/francesco/sviluppo/ruby/scratchbox/bug/data_row.rb:5:in
initialize’
org/jruby/RubyHash.java:1172:in each' /homel/francesco/sviluppo/ruby/scratchbox/bug/data_row.rb:3:in
initialize’
test_data_row.rb:17:in test_empty_string' org/jruby/RubyBasicObject.java:1665:in
send’
Pardon if I missed something, but I’m really upset and surprised by this
behaviour.
Thank you to all for this great jruby,
Francesco