Skip to content

Commit 45ba1f8

Browse files
authored
Merge pull request #616 from casperisfine/opt-small-hash
Optimize JSON.dump argument parsing
2 parents 02f79ef + b01d130 commit 45ba1f8

File tree

1 file changed

+29
-13
lines changed

1 file changed

+29
-13
lines changed

lib/json/common.rb

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -613,26 +613,42 @@ class << self
613613
# Output:
614614
# {"foo":[0,1],"bar":{"baz":2,"bat":3},"bam":"bad"}
615615
def dump(obj, anIO = nil, limit = nil, kwargs = nil)
616-
io_limit_opt = [anIO, limit, kwargs].compact
617-
kwargs = io_limit_opt.pop if io_limit_opt.last.is_a?(Hash)
618-
anIO, limit = io_limit_opt
619-
if anIO.respond_to?(:to_io)
620-
anIO = anIO.to_io
621-
elsif limit.nil? && !anIO.respond_to?(:write)
622-
anIO, limit = nil, anIO
616+
if kwargs.nil?
617+
if limit.nil?
618+
if anIO.is_a?(Hash)
619+
kwargs = anIO
620+
anIO = nil
621+
end
622+
elsif limit.is_a?(Hash)
623+
kwargs = limit
624+
limit = nil
625+
end
623626
end
627+
628+
unless anIO.nil?
629+
if anIO.respond_to?(:to_io)
630+
anIO = anIO.to_io
631+
elsif limit.nil? && !anIO.respond_to?(:write)
632+
anIO, limit = nil, anIO
633+
end
634+
end
635+
624636
opts = JSON.dump_default_options
625637
opts = opts.merge(:max_nesting => limit) if limit
626638
opts = merge_dump_options(opts, **kwargs) if kwargs
627-
result = generate(obj, opts)
628-
if anIO
639+
640+
result = begin
641+
generate(obj, opts)
642+
rescue JSON::NestingError
643+
raise ArgumentError, "exceed depth limit"
644+
end
645+
646+
if anIO.nil?
647+
result
648+
else
629649
anIO.write result
630650
anIO
631-
else
632-
result
633651
end
634-
rescue JSON::NestingError
635-
raise ArgumentError, "exceed depth limit"
636652
end
637653

638654
# Encodes string using String.encode.

0 commit comments

Comments
 (0)