@@ -37,7 +37,7 @@ typedef struct JSON_Generator_StateStruct {
3737 VALUE sort_keys ;
3838} JSON_Generator_State ;
3939
40- static VALUE mJSON , cState , cFragment , eGeneratorError , eNestingError , Encoding_UTF_8 ;
40+ static VALUE mJSON , cState , cFragment , eGeneratorError , eNestingError , Encoding_UTF_8 , default_sort_keys_proc ;
4141
4242static ID i_to_s , i_to_json , i_new , i_encode ;
4343static VALUE sym_indent , sym_space , sym_space_before , sym_object_nl , sym_array_nl , sym_max_nesting , sym_allow_nan , sym_allow_duplicate_key ,
@@ -1732,12 +1732,25 @@ static VALUE cState_ascii_only_set(VALUE self, VALUE enable)
17321732 return Qnil ;
17331733}
17341734
1735+ static VALUE cState_set_default_sort_keys_proc (VALUE self , VALUE proc )
1736+ {
1737+ if (!rb_obj_is_proc (proc )) {
1738+ rb_raise (rb_eTypeError , "sort_key_proc must be a Proc" );
1739+ }
1740+ return default_sort_keys_proc = proc ;
1741+ }
1742+
17351743static VALUE normalize_sort_keys (VALUE value )
17361744{
17371745 if (rb_obj_is_proc (value )) {
17381746 return value ;
1747+ } else if (value == Qtrue ) {
1748+ return default_sort_keys_proc ;
1749+ } else if (RTEST (value )) {
1750+ rb_raise (rb_eTypeError , "The `sort_keys` argument must be a boolean or a Proc" );
1751+ } else {
1752+ return Qfalse ;
17391753 }
1740- return RTEST (value ) ? rb_const_get_at (mJSON , rb_intern ("SORT_KEYS_PROC" )) : Qfalse ;
17411754}
17421755
17431756/*
@@ -1958,6 +1971,8 @@ void Init_generator(void)
19581971 VALUE mExt = rb_define_module_under (mJSON , "Ext" );
19591972 VALUE mGenerator = rb_define_module_under (mExt , "Generator" );
19601973
1974+ rb_global_variable (& default_sort_keys_proc );
1975+
19611976 rb_global_variable (& eGeneratorError );
19621977 eGeneratorError = rb_path2class ("JSON::GeneratorError" );
19631978
@@ -1967,6 +1982,8 @@ void Init_generator(void)
19671982 cState = rb_define_class_under (mGenerator , "State" , rb_cObject );
19681983 rb_define_alloc_func (cState , cState_s_allocate );
19691984 rb_define_singleton_method (cState , "from_state" , cState_from_state_s , 1 );
1985+ rb_define_singleton_method (cState , "default_sort_keys_proc=" , cState_set_default_sort_keys_proc , 1 );
1986+
19701987 rb_define_method (cState , "initialize" , cState_initialize , -1 );
19711988 rb_define_alias (cState , "initialize" , "initialize" ); // avoid method redefinition warnings
19721989 rb_define_private_method (cState , "_configure" , cState_configure , 1 );
0 commit comments