diff options
author | Florian Frank <flori@ping.de> | 2012-05-10 01:23:07 +0200 |
---|---|---|
committer | Florian Frank <flori@ping.de> | 2012-05-10 01:23:07 +0200 |
commit | 553b9b499fe7396b509fd607221d8c0ada8df67b (patch) | |
tree | d43b85a1c25b177ee06820b9be07774f047d820e | |
parent | 23ef680a3d43ed02d343611150d638d542c0190b (diff) | |
download | json-553b9b499fe7396b509fd607221d8c0ada8df67b.tar.gz |
Fix string/regexp encoding mismatch in jruby
-rw-r--r-- | lib/json/common.rb | 8 | ||||
-rw-r--r-- | lib/json/pure/generator.rb | 12 |
2 files changed, 13 insertions, 7 deletions
diff --git a/lib/json/common.rb b/lib/json/common.rb index a30e4ce..05eaf26 100644 --- a/lib/json/common.rb +++ b/lib/json/common.rb @@ -103,7 +103,13 @@ module JSON MinusInfinity = -Infinity # The base exception for JSON errors. - class JSONError < StandardError; end + class JSONError < StandardError + def self.wrap(exception) + obj = new("Wrapped(#{exception.class}): #{exception.message.inspect}") + obj.set_backtrace exception.backtrace + obj + end + end # This exception is raised if a parser error occurs. class ParserError < JSONError; end diff --git a/lib/json/pure/generator.rb b/lib/json/pure/generator.rb index 3d5f09f..3c81915 100644 --- a/lib/json/pure/generator.rb +++ b/lib/json/pure/generator.rb @@ -41,7 +41,6 @@ module JSON if defined?(::Encoding) def utf8_to_json(string) # :nodoc: string = string.dup - string << '' # XXX workaround: avoid buffer sharing string.force_encoding(::Encoding::ASCII_8BIT) string.gsub!(/["\\\x0-\x1f]/) { MAP[$&] } string.force_encoding(::Encoding::UTF_8) @@ -50,9 +49,8 @@ module JSON def utf8_to_json_ascii(string) # :nodoc: string = string.dup - string << '' # XXX workaround: avoid buffer sharing string.force_encoding(::Encoding::ASCII_8BIT) - string.gsub!(/["\\\x0-\x1f]/) { MAP[$&] } + string.gsub!(/["\\\x0-\x1f]/n) { MAP[$&] } string.gsub!(/( (?: [\xc2-\xdf][\x80-\xbf] | @@ -63,16 +61,18 @@ module JSON )/nx) { |c| c.size == 1 and raise GeneratorError, "invalid utf8 byte: '#{c}'" s = JSON.iconv('utf-16be', 'utf-8', c).unpack('H*')[0] + s.force_encoding(::Encoding::ASCII_8BIT) s.gsub!(/.{4}/n, '\\\\u\&') + s.force_encoding(::Encoding::UTF_8) } string.force_encoding(::Encoding::UTF_8) string rescue => e - raise GeneratorError, "Caught #{e.class}: #{e}" + raise GeneratorError.wrap(e) end else def utf8_to_json(string) # :nodoc: - string.gsub(/["\\\x0-\x1f]/) { MAP[$&] } + string.gsub(/["\\\x0-\x1f]/n) { MAP[$&] } end def utf8_to_json_ascii(string) # :nodoc: @@ -91,7 +91,7 @@ module JSON } string rescue => e - raise GeneratorError, "Caught #{e.class}: #{e}" + raise GeneratorError.wrap(e) end end module_function :utf8_to_json, :utf8_to_json_ascii |