summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2024-10-25 09:55:25 +0200
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2024-10-26 18:44:15 +0900
commita5bd0c638a600a5cfb0d99ee64ba8172a9c66535 (patch)
treeff9d9c676a992d621ab027b1dfd171f58710d875
parent3daf16e51fcd21e964525d7e64cec646a49236ff (diff)
[ruby/json] Workaround rubygems $LOAD_PATH bug
Ref: https://github.com/ruby/json/issues/647 Ref: https://github.com/rubygems/rubygems/pull/6490 Older rubygems are executing `extconf.rb` with a broken `$LOAD_PATH` causing the `json` gem native extension to be loaded with the stdlib version of the `.rb` files. This fails with ``` json/common.rb:82:in `initialize': wrong number of arguments (given 1, expected 0) (ArgumentError) ``` Since this is just for `extconf.rb` we can probably just accept that extra argument and ignore it. The bug was fixed in rubygems 3.4.9 / 2023-03-20 https://github.com/ruby/json/commit/1f5e849fe0
-rw-r--r--ext/json/generator/generator.c9
-rwxr-xr-xtest/json/json_generator_test.rb24
2 files changed, 21 insertions, 12 deletions
diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c
index fbfa2c724e..8a94e2337b 100644
--- a/ext/json/generator/generator.c
+++ b/ext/json/generator/generator.c
@@ -977,6 +977,12 @@ static VALUE cState_generate(VALUE self, VALUE obj)
return result;
}
+static VALUE cState_initialize(int argc, VALUE *argv, VALUE self)
+{
+ rb_warn("The json gem extension was loaded with the stdlib ruby code. You should upgrade rubygems with `gem update --system`");
+ return self;
+}
+
/*
* call-seq: initialize_copy(orig)
*
@@ -1422,6 +1428,9 @@ void Init_generator(void)
cState = rb_define_class_under(mGenerator, "State", rb_cObject);
rb_define_alloc_func(cState, cState_s_allocate);
rb_define_singleton_method(cState, "from_state", cState_from_state_s, 1);
+ rb_define_method(cState, "initialize", cState_initialize, -1);
+ rb_define_alias(cState, "initialize", "initialize"); // avoid method redefinition warnings
+
rb_define_method(cState, "initialize_copy", cState_init_copy, 1);
rb_define_method(cState, "indent", cState_indent, 0);
rb_define_method(cState, "indent=", cState_indent_set, 1);
diff --git a/test/json/json_generator_test.rb b/test/json/json_generator_test.rb
index 01e412c960..1670445a7f 100755
--- a/test/json/json_generator_test.rb
+++ b/test/json/json_generator_test.rb
@@ -268,19 +268,19 @@ class JSONGeneratorTest < Test::Unit::TestCase
end
def test_gc
- if respond_to?(:assert_in_out_err) && !(RUBY_PLATFORM =~ /java/)
- assert_in_out_err(%w[-rjson -Ilib -Iext], <<-EOS, [], [])
- bignum_too_long_to_embed_as_string = 1234567890123456789012345
- expect = bignum_too_long_to_embed_as_string.to_s
- GC.stress = true
-
- 10.times do |i|
- tmp = bignum_too_long_to_embed_as_string.to_json
- raise "'\#{expect}' is expected, but '\#{tmp}'" unless tmp == expect
- end
- EOS
+ pid = fork do
+ bignum_too_long_to_embed_as_string = 1234567890123456789012345
+ expect = bignum_too_long_to_embed_as_string.to_s
+ GC.stress = true
+
+ 10.times do |i|
+ tmp = bignum_too_long_to_embed_as_string.to_json
+ raise "#{expect}' is expected, but '#{tmp}'" unless tmp == expect
+ end
end
- end if GC.respond_to?(:stress=)
+ _, status = Process.waitpid2(pid)
+ assert_predicate status, :success?
+ end if GC.respond_to?(:stress=) && Process.respond_to?(:fork)
def test_configure_using_configure_and_merge
numbered_state = {