summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Frank <flori@ping.de>2012-05-10 01:23:07 +0200
committerFlorian Frank <flori@ping.de>2012-05-10 01:23:07 +0200
commit553b9b499fe7396b509fd607221d8c0ada8df67b (patch)
treed43b85a1c25b177ee06820b9be07774f047d820e
parent23ef680a3d43ed02d343611150d638d542c0190b (diff)
downloadjson-553b9b499fe7396b509fd607221d8c0ada8df67b.tar.gz
Fix string/regexp encoding mismatch in jruby
-rw-r--r--lib/json/common.rb8
-rw-r--r--lib/json/pure/generator.rb12
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