Skip to content

Commit

Permalink
Merge pull request #674 from eregon/faster-checks-for-generate_json
Browse files Browse the repository at this point in the history
Speedup #generate_json by using case/when/end
  • Loading branch information
byroot authored Nov 4, 2024
2 parents a9bc48e + 82d21f0 commit 4af700e
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 16 deletions.
30 changes: 16 additions & 14 deletions lib/json/pure/generator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -307,20 +307,18 @@ def generate(obj)

# Handles @allow_nan, @buffer_initial_length, other ivars must be the default value (see above)
private def generate_json(obj, buf)
klass = obj.class
if klass == Hash
case obj
when Hash
buf << '{'
first = true
obj.each_pair do |k,v|
buf << ',' unless first

key_str = k.to_s
if key_str.is_a?(::String)
if key_str.class == ::String
fast_serialize_string(key_str, buf)
else
generate_json(key_str, buf)
end
if key_str.class == String
fast_serialize_string(key_str, buf)
elsif key_str.is_a?(String)
generate_json(key_str, buf)
else
raise TypeError, "#{k.class}#to_s returns an instance of #{key_str.class}, expected a String"
end
Expand All @@ -330,7 +328,7 @@ def generate(obj)
first = false
end
buf << '}'
elsif klass == Array
when Array
buf << '['
first = true
obj.each do |e|
Expand All @@ -339,9 +337,13 @@ def generate(obj)
first = false
end
buf << ']'
elsif klass == String
fast_serialize_string(obj, buf)
elsif klass == Integer
when String
if obj.class == String
fast_serialize_string(obj, buf)
else
buf << obj.to_json(self)
end
when Integer
buf << obj.to_s
else
# Note: Float is handled this way since Float#to_s is slow anyway
Expand Down Expand Up @@ -432,8 +434,8 @@ def json_transform(state)
result << state.indent * depth if indent

key_str = key.to_s
key_json = if key_str.is_a?(::String)
key_str = key_str.to_json(state)
if key_str.is_a?(String)
key_json = key_str.to_json(state)
else
raise TypeError, "#{key.class}#to_s returns an instance of #{key_str.class}, expected a String"
end
Expand Down
2 changes: 0 additions & 2 deletions test/json/json_parser_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,6 @@ def test_argument_encoding_for_binary_unmodified
end

def test_error_message_encoding
pend if RUBY_ENGINE == 'truffleruby'

bug10705 = '[ruby-core:67386] [Bug #10705]'
json = ".\"\xE2\x88\x9A\""
assert_equal(Encoding::UTF_8, json.encoding)
Expand Down

0 comments on commit 4af700e

Please sign in to comment.