Skip to content

Commit 2ecb368

Browse files
committed
Ensure default_sort_keys_proc isn't reassigned.
It's assignable from Ruby simply for the gem's own initialization, but it should never be re-assigned later. Fix: #1079
1 parent 099340c commit 2ecb368

3 files changed

Lines changed: 15 additions & 11 deletions

File tree

‎ext/json/ext/generator/generator.c‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1733,6 +1733,9 @@ static VALUE cState_set_default_sort_keys_proc(VALUE self, VALUE proc)
17331733
if (!rb_obj_is_proc(proc)) {
17341734
rb_raise(rb_eTypeError, "sort_key_proc must be a Proc");
17351735
}
1736+
if (default_sort_keys_proc) {
1737+
rb_raise(rb_eArgError, "sort_key_proc can only be set once");
1738+
}
17361739
return default_sort_keys_proc = proc;
17371740
}
17381741

‎lib/json/common.rb‎

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,6 @@ def parser=(parser) # :nodoc:
8080
def generator=(generator) # :nodoc:
8181
old, $VERBOSE = $VERBOSE, nil
8282

83-
# The default proc used when the +sort_keys+ generation option is +true+.
84-
# It returns a new hash with the entries sorted by their keys.
85-
sort_keys_proc = ->(hash) { hash.sort.to_h }
86-
if defined?(::Ractor) && Ractor.respond_to?(:shareable_lambda)
87-
sort_keys_proc = Ractor.shareable_lambda(&sort_keys_proc)
88-
end
89-
generator::State.default_sort_keys_proc = sort_keys_proc
90-
9183
@generator = generator
9284
if generator.const_defined?(:GeneratorMethods)
9385
generator_methods = generator::GeneratorMethods

‎lib/json/ext.rb‎

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,22 @@ def parse
3232
Ext::Parser::Config = Ext::ParserConfig
3333
JSON.parser = Ext::Parser
3434

35-
if RUBY_ENGINE == 'truffleruby'
35+
generator = if RUBY_ENGINE == 'truffleruby'
3636
require 'json/truffle_ruby/generator'
37-
JSON.generator = JSON::TruffleRuby::Generator
37+
JSON::TruffleRuby::Generator
3838
else
3939
require 'json/ext/generator'
40-
JSON.generator = Generator
40+
Generator
4141
end
42+
43+
# The default proc used when the +sort_keys+ generation option is +true+.
44+
# It returns a new hash with the entries sorted by their keys.
45+
sort_keys_proc = ->(hash) { hash.sort.to_h }
46+
if defined?(::Ractor) && Ractor.respond_to?(:shareable_lambda)
47+
sort_keys_proc = Ractor.shareable_lambda(&sort_keys_proc)
48+
end
49+
generator::State.default_sort_keys_proc = sort_keys_proc
50+
JSON.generator = generator
4251
end
4352

4453
if defined?(ResumableParser) # Not yet available on JRuby

0 commit comments

Comments
 (0)