summaryrefslogtreecommitdiff
path: root/ext/-test-
diff options
context:
space:
mode:
Diffstat (limited to 'ext/-test-')
-rw-r--r--ext/-test-/asan/asan.c24
-rw-r--r--ext/-test-/asan/depend162
-rw-r--r--ext/-test-/asan/extconf.rb2
-rw-r--r--ext/-test-/bignum/depend12
-rw-r--r--ext/-test-/box/yay1/extconf.rb1
-rw-r--r--ext/-test-/box/yay1/yay1.c (renamed from ext/-test-/namespace/yay1/yay1.c)0
-rw-r--r--ext/-test-/box/yay1/yay1.def (renamed from ext/-test-/namespace/yay1/yay1.def)0
-rw-r--r--ext/-test-/box/yay1/yay1.h (renamed from ext/-test-/namespace/yay1/yay1.h)0
-rw-r--r--ext/-test-/box/yay2/extconf.rb1
-rw-r--r--ext/-test-/box/yay2/yay2.c (renamed from ext/-test-/namespace/yay2/yay2.c)0
-rw-r--r--ext/-test-/box/yay2/yay2.def (renamed from ext/-test-/namespace/yay2/yay2.def)0
-rw-r--r--ext/-test-/box/yay2/yay2.h (renamed from ext/-test-/namespace/yay2/yay2.h)0
-rw-r--r--ext/-test-/cxxanyargs/cxxanyargs.cpp26
-rw-r--r--ext/-test-/fatal/invalid.c6
-rw-r--r--ext/-test-/integer/depend3
-rw-r--r--ext/-test-/namespace/yay1/extconf.rb1
-rw-r--r--ext/-test-/namespace/yay2/extconf.rb1
-rw-r--r--ext/-test-/postponed_job/postponed_job.c80
-rw-r--r--ext/-test-/rational/depend3
-rw-r--r--ext/-test-/sanitizers/depend162
-rw-r--r--ext/-test-/sanitizers/extconf.rb2
-rw-r--r--ext/-test-/sanitizers/sanitizers.c36
-rw-r--r--ext/-test-/scheduler/extconf.rb2
-rw-r--r--ext/-test-/scheduler/scheduler.c92
-rw-r--r--ext/-test-/st/foreach/foreach.c12
-rw-r--r--ext/-test-/stack/depend1
-rw-r--r--ext/-test-/stack/stack.c4
-rw-r--r--ext/-test-/string/cstr.c3
-rw-r--r--ext/-test-/string/depend3
-rw-r--r--ext/-test-/string/fstring.c6
-rw-r--r--ext/-test-/time/leap_second.c15
-rw-r--r--ext/-test-/tracepoint/gc_hook.c26
-rw-r--r--ext/-test-/tracepoint/tracepoint.c10
33 files changed, 345 insertions, 351 deletions
diff --git a/ext/-test-/asan/asan.c b/ext/-test-/asan/asan.c
deleted file mode 100644
index 45b6253fda..0000000000
--- a/ext/-test-/asan/asan.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "ruby/ruby.h"
-
-static VALUE
-asan_enabled_p(VALUE self)
-{
-#if defined(__has_feature)
- /* clang uses __has_feature for determining asan */
- return __has_feature(address_sanitizer) ? Qtrue : Qfalse;
-#elif defined(__SANITIZE_ADDRESS__)
- /* GCC sets __SANITIZE_ADDRESS__ for determining asan */
- return Qtrue;
-#else
- return Qfalse;
-#endif
-}
-
-void
-Init_asan(void)
-{
- VALUE m = rb_define_module("Test");
- VALUE c = rb_define_class_under(m, "ASAN", rb_cObject);
- rb_define_singleton_method(c, "enabled?", asan_enabled_p, 0);
-}
-
diff --git a/ext/-test-/asan/depend b/ext/-test-/asan/depend
deleted file mode 100644
index 93cdc739ec..0000000000
--- a/ext/-test-/asan/depend
+++ /dev/null
@@ -1,162 +0,0 @@
-# AUTOGENERATED DEPENDENCIES START
-asan.o: $(RUBY_EXTCONF_H)
-asan.o: $(arch_hdrdir)/ruby/config.h
-asan.o: $(hdrdir)/ruby/assert.h
-asan.o: $(hdrdir)/ruby/backward.h
-asan.o: $(hdrdir)/ruby/backward/2/assume.h
-asan.o: $(hdrdir)/ruby/backward/2/attributes.h
-asan.o: $(hdrdir)/ruby/backward/2/bool.h
-asan.o: $(hdrdir)/ruby/backward/2/inttypes.h
-asan.o: $(hdrdir)/ruby/backward/2/limits.h
-asan.o: $(hdrdir)/ruby/backward/2/long_long.h
-asan.o: $(hdrdir)/ruby/backward/2/stdalign.h
-asan.o: $(hdrdir)/ruby/backward/2/stdarg.h
-asan.o: $(hdrdir)/ruby/defines.h
-asan.o: $(hdrdir)/ruby/intern.h
-asan.o: $(hdrdir)/ruby/internal/abi.h
-asan.o: $(hdrdir)/ruby/internal/anyargs.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/char.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/double.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/int.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/long.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/short.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h
-asan.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h
-asan.o: $(hdrdir)/ruby/internal/assume.h
-asan.o: $(hdrdir)/ruby/internal/attr/alloc_size.h
-asan.o: $(hdrdir)/ruby/internal/attr/artificial.h
-asan.o: $(hdrdir)/ruby/internal/attr/cold.h
-asan.o: $(hdrdir)/ruby/internal/attr/const.h
-asan.o: $(hdrdir)/ruby/internal/attr/constexpr.h
-asan.o: $(hdrdir)/ruby/internal/attr/deprecated.h
-asan.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h
-asan.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h
-asan.o: $(hdrdir)/ruby/internal/attr/error.h
-asan.o: $(hdrdir)/ruby/internal/attr/flag_enum.h
-asan.o: $(hdrdir)/ruby/internal/attr/forceinline.h
-asan.o: $(hdrdir)/ruby/internal/attr/format.h
-asan.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h
-asan.o: $(hdrdir)/ruby/internal/attr/noalias.h
-asan.o: $(hdrdir)/ruby/internal/attr/nodiscard.h
-asan.o: $(hdrdir)/ruby/internal/attr/noexcept.h
-asan.o: $(hdrdir)/ruby/internal/attr/noinline.h
-asan.o: $(hdrdir)/ruby/internal/attr/nonnull.h
-asan.o: $(hdrdir)/ruby/internal/attr/noreturn.h
-asan.o: $(hdrdir)/ruby/internal/attr/packed_struct.h
-asan.o: $(hdrdir)/ruby/internal/attr/pure.h
-asan.o: $(hdrdir)/ruby/internal/attr/restrict.h
-asan.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h
-asan.o: $(hdrdir)/ruby/internal/attr/warning.h
-asan.o: $(hdrdir)/ruby/internal/attr/weakref.h
-asan.o: $(hdrdir)/ruby/internal/cast.h
-asan.o: $(hdrdir)/ruby/internal/compiler_is.h
-asan.o: $(hdrdir)/ruby/internal/compiler_is/apple.h
-asan.o: $(hdrdir)/ruby/internal/compiler_is/clang.h
-asan.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h
-asan.o: $(hdrdir)/ruby/internal/compiler_is/intel.h
-asan.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h
-asan.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h
-asan.o: $(hdrdir)/ruby/internal/compiler_since.h
-asan.o: $(hdrdir)/ruby/internal/config.h
-asan.o: $(hdrdir)/ruby/internal/constant_p.h
-asan.o: $(hdrdir)/ruby/internal/core.h
-asan.o: $(hdrdir)/ruby/internal/core/rarray.h
-asan.o: $(hdrdir)/ruby/internal/core/rbasic.h
-asan.o: $(hdrdir)/ruby/internal/core/rbignum.h
-asan.o: $(hdrdir)/ruby/internal/core/rclass.h
-asan.o: $(hdrdir)/ruby/internal/core/rdata.h
-asan.o: $(hdrdir)/ruby/internal/core/rfile.h
-asan.o: $(hdrdir)/ruby/internal/core/rhash.h
-asan.o: $(hdrdir)/ruby/internal/core/robject.h
-asan.o: $(hdrdir)/ruby/internal/core/rregexp.h
-asan.o: $(hdrdir)/ruby/internal/core/rstring.h
-asan.o: $(hdrdir)/ruby/internal/core/rstruct.h
-asan.o: $(hdrdir)/ruby/internal/core/rtypeddata.h
-asan.o: $(hdrdir)/ruby/internal/ctype.h
-asan.o: $(hdrdir)/ruby/internal/dllexport.h
-asan.o: $(hdrdir)/ruby/internal/dosish.h
-asan.o: $(hdrdir)/ruby/internal/error.h
-asan.o: $(hdrdir)/ruby/internal/eval.h
-asan.o: $(hdrdir)/ruby/internal/event.h
-asan.o: $(hdrdir)/ruby/internal/fl_type.h
-asan.o: $(hdrdir)/ruby/internal/gc.h
-asan.o: $(hdrdir)/ruby/internal/glob.h
-asan.o: $(hdrdir)/ruby/internal/globals.h
-asan.o: $(hdrdir)/ruby/internal/has/attribute.h
-asan.o: $(hdrdir)/ruby/internal/has/builtin.h
-asan.o: $(hdrdir)/ruby/internal/has/c_attribute.h
-asan.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h
-asan.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h
-asan.o: $(hdrdir)/ruby/internal/has/extension.h
-asan.o: $(hdrdir)/ruby/internal/has/feature.h
-asan.o: $(hdrdir)/ruby/internal/has/warning.h
-asan.o: $(hdrdir)/ruby/internal/intern/array.h
-asan.o: $(hdrdir)/ruby/internal/intern/bignum.h
-asan.o: $(hdrdir)/ruby/internal/intern/class.h
-asan.o: $(hdrdir)/ruby/internal/intern/compar.h
-asan.o: $(hdrdir)/ruby/internal/intern/complex.h
-asan.o: $(hdrdir)/ruby/internal/intern/cont.h
-asan.o: $(hdrdir)/ruby/internal/intern/dir.h
-asan.o: $(hdrdir)/ruby/internal/intern/enum.h
-asan.o: $(hdrdir)/ruby/internal/intern/enumerator.h
-asan.o: $(hdrdir)/ruby/internal/intern/error.h
-asan.o: $(hdrdir)/ruby/internal/intern/eval.h
-asan.o: $(hdrdir)/ruby/internal/intern/file.h
-asan.o: $(hdrdir)/ruby/internal/intern/hash.h
-asan.o: $(hdrdir)/ruby/internal/intern/io.h
-asan.o: $(hdrdir)/ruby/internal/intern/load.h
-asan.o: $(hdrdir)/ruby/internal/intern/marshal.h
-asan.o: $(hdrdir)/ruby/internal/intern/numeric.h
-asan.o: $(hdrdir)/ruby/internal/intern/object.h
-asan.o: $(hdrdir)/ruby/internal/intern/parse.h
-asan.o: $(hdrdir)/ruby/internal/intern/proc.h
-asan.o: $(hdrdir)/ruby/internal/intern/process.h
-asan.o: $(hdrdir)/ruby/internal/intern/random.h
-asan.o: $(hdrdir)/ruby/internal/intern/range.h
-asan.o: $(hdrdir)/ruby/internal/intern/rational.h
-asan.o: $(hdrdir)/ruby/internal/intern/re.h
-asan.o: $(hdrdir)/ruby/internal/intern/ruby.h
-asan.o: $(hdrdir)/ruby/internal/intern/select.h
-asan.o: $(hdrdir)/ruby/internal/intern/select/largesize.h
-asan.o: $(hdrdir)/ruby/internal/intern/set.h
-asan.o: $(hdrdir)/ruby/internal/intern/signal.h
-asan.o: $(hdrdir)/ruby/internal/intern/sprintf.h
-asan.o: $(hdrdir)/ruby/internal/intern/string.h
-asan.o: $(hdrdir)/ruby/internal/intern/struct.h
-asan.o: $(hdrdir)/ruby/internal/intern/thread.h
-asan.o: $(hdrdir)/ruby/internal/intern/time.h
-asan.o: $(hdrdir)/ruby/internal/intern/variable.h
-asan.o: $(hdrdir)/ruby/internal/intern/vm.h
-asan.o: $(hdrdir)/ruby/internal/interpreter.h
-asan.o: $(hdrdir)/ruby/internal/iterator.h
-asan.o: $(hdrdir)/ruby/internal/memory.h
-asan.o: $(hdrdir)/ruby/internal/method.h
-asan.o: $(hdrdir)/ruby/internal/module.h
-asan.o: $(hdrdir)/ruby/internal/newobj.h
-asan.o: $(hdrdir)/ruby/internal/scan_args.h
-asan.o: $(hdrdir)/ruby/internal/special_consts.h
-asan.o: $(hdrdir)/ruby/internal/static_assert.h
-asan.o: $(hdrdir)/ruby/internal/stdalign.h
-asan.o: $(hdrdir)/ruby/internal/stdbool.h
-asan.o: $(hdrdir)/ruby/internal/stdckdint.h
-asan.o: $(hdrdir)/ruby/internal/symbol.h
-asan.o: $(hdrdir)/ruby/internal/value.h
-asan.o: $(hdrdir)/ruby/internal/value_type.h
-asan.o: $(hdrdir)/ruby/internal/variable.h
-asan.o: $(hdrdir)/ruby/internal/warning_push.h
-asan.o: $(hdrdir)/ruby/internal/xmalloc.h
-asan.o: $(hdrdir)/ruby/missing.h
-asan.o: $(hdrdir)/ruby/ruby.h
-asan.o: $(hdrdir)/ruby/st.h
-asan.o: $(hdrdir)/ruby/subst.h
-asan.o: asan.c
-# AUTOGENERATED DEPENDENCIES END
diff --git a/ext/-test-/asan/extconf.rb b/ext/-test-/asan/extconf.rb
deleted file mode 100644
index ec02742b81..0000000000
--- a/ext/-test-/asan/extconf.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-require 'mkmf'
-create_makefile('-test-/asan')
diff --git a/ext/-test-/bignum/depend b/ext/-test-/bignum/depend
index 049f0c7b52..82972f1032 100644
--- a/ext/-test-/bignum/depend
+++ b/ext/-test-/bignum/depend
@@ -6,6 +6,7 @@ big2str.o: $(hdrdir)/ruby/backward.h
big2str.o: $(hdrdir)/ruby/backward/2/assume.h
big2str.o: $(hdrdir)/ruby/backward/2/attributes.h
big2str.o: $(hdrdir)/ruby/backward/2/bool.h
+big2str.o: $(hdrdir)/ruby/backward/2/gcc_version_since.h
big2str.o: $(hdrdir)/ruby/backward/2/inttypes.h
big2str.o: $(hdrdir)/ruby/backward/2/limits.h
big2str.o: $(hdrdir)/ruby/backward/2/long_long.h
@@ -159,6 +160,7 @@ big2str.o: $(hdrdir)/ruby/ruby.h
big2str.o: $(hdrdir)/ruby/st.h
big2str.o: $(hdrdir)/ruby/subst.h
big2str.o: $(top_srcdir)/internal/bignum.h
+big2str.o: $(top_srcdir)/internal/compilers.h
big2str.o: big2str.c
bigzero.o: $(RUBY_EXTCONF_H)
bigzero.o: $(arch_hdrdir)/ruby/config.h
@@ -167,6 +169,7 @@ bigzero.o: $(hdrdir)/ruby/backward.h
bigzero.o: $(hdrdir)/ruby/backward/2/assume.h
bigzero.o: $(hdrdir)/ruby/backward/2/attributes.h
bigzero.o: $(hdrdir)/ruby/backward/2/bool.h
+bigzero.o: $(hdrdir)/ruby/backward/2/gcc_version_since.h
bigzero.o: $(hdrdir)/ruby/backward/2/inttypes.h
bigzero.o: $(hdrdir)/ruby/backward/2/limits.h
bigzero.o: $(hdrdir)/ruby/backward/2/long_long.h
@@ -320,6 +323,7 @@ bigzero.o: $(hdrdir)/ruby/ruby.h
bigzero.o: $(hdrdir)/ruby/st.h
bigzero.o: $(hdrdir)/ruby/subst.h
bigzero.o: $(top_srcdir)/internal/bignum.h
+bigzero.o: $(top_srcdir)/internal/compilers.h
bigzero.o: bigzero.c
div.o: $(RUBY_EXTCONF_H)
div.o: $(arch_hdrdir)/ruby/config.h
@@ -328,6 +332,7 @@ div.o: $(hdrdir)/ruby/backward.h
div.o: $(hdrdir)/ruby/backward/2/assume.h
div.o: $(hdrdir)/ruby/backward/2/attributes.h
div.o: $(hdrdir)/ruby/backward/2/bool.h
+div.o: $(hdrdir)/ruby/backward/2/gcc_version_since.h
div.o: $(hdrdir)/ruby/backward/2/inttypes.h
div.o: $(hdrdir)/ruby/backward/2/limits.h
div.o: $(hdrdir)/ruby/backward/2/long_long.h
@@ -481,6 +486,7 @@ div.o: $(hdrdir)/ruby/ruby.h
div.o: $(hdrdir)/ruby/st.h
div.o: $(hdrdir)/ruby/subst.h
div.o: $(top_srcdir)/internal/bignum.h
+div.o: $(top_srcdir)/internal/compilers.h
div.o: div.c
init.o: $(RUBY_EXTCONF_H)
init.o: $(arch_hdrdir)/ruby/config.h
@@ -650,6 +656,7 @@ intpack.o: $(hdrdir)/ruby/backward.h
intpack.o: $(hdrdir)/ruby/backward/2/assume.h
intpack.o: $(hdrdir)/ruby/backward/2/attributes.h
intpack.o: $(hdrdir)/ruby/backward/2/bool.h
+intpack.o: $(hdrdir)/ruby/backward/2/gcc_version_since.h
intpack.o: $(hdrdir)/ruby/backward/2/inttypes.h
intpack.o: $(hdrdir)/ruby/backward/2/limits.h
intpack.o: $(hdrdir)/ruby/backward/2/long_long.h
@@ -803,6 +810,7 @@ intpack.o: $(hdrdir)/ruby/ruby.h
intpack.o: $(hdrdir)/ruby/st.h
intpack.o: $(hdrdir)/ruby/subst.h
intpack.o: $(top_srcdir)/internal/bignum.h
+intpack.o: $(top_srcdir)/internal/compilers.h
intpack.o: intpack.c
mul.o: $(RUBY_EXTCONF_H)
mul.o: $(arch_hdrdir)/ruby/config.h
@@ -811,6 +819,7 @@ mul.o: $(hdrdir)/ruby/backward.h
mul.o: $(hdrdir)/ruby/backward/2/assume.h
mul.o: $(hdrdir)/ruby/backward/2/attributes.h
mul.o: $(hdrdir)/ruby/backward/2/bool.h
+mul.o: $(hdrdir)/ruby/backward/2/gcc_version_since.h
mul.o: $(hdrdir)/ruby/backward/2/inttypes.h
mul.o: $(hdrdir)/ruby/backward/2/limits.h
mul.o: $(hdrdir)/ruby/backward/2/long_long.h
@@ -964,6 +973,7 @@ mul.o: $(hdrdir)/ruby/ruby.h
mul.o: $(hdrdir)/ruby/st.h
mul.o: $(hdrdir)/ruby/subst.h
mul.o: $(top_srcdir)/internal/bignum.h
+mul.o: $(top_srcdir)/internal/compilers.h
mul.o: mul.c
str2big.o: $(RUBY_EXTCONF_H)
str2big.o: $(arch_hdrdir)/ruby/config.h
@@ -972,6 +982,7 @@ str2big.o: $(hdrdir)/ruby/backward.h
str2big.o: $(hdrdir)/ruby/backward/2/assume.h
str2big.o: $(hdrdir)/ruby/backward/2/attributes.h
str2big.o: $(hdrdir)/ruby/backward/2/bool.h
+str2big.o: $(hdrdir)/ruby/backward/2/gcc_version_since.h
str2big.o: $(hdrdir)/ruby/backward/2/inttypes.h
str2big.o: $(hdrdir)/ruby/backward/2/limits.h
str2big.o: $(hdrdir)/ruby/backward/2/long_long.h
@@ -1125,5 +1136,6 @@ str2big.o: $(hdrdir)/ruby/ruby.h
str2big.o: $(hdrdir)/ruby/st.h
str2big.o: $(hdrdir)/ruby/subst.h
str2big.o: $(top_srcdir)/internal/bignum.h
+str2big.o: $(top_srcdir)/internal/compilers.h
str2big.o: str2big.c
# AUTOGENERATED DEPENDENCIES END
diff --git a/ext/-test-/box/yay1/extconf.rb b/ext/-test-/box/yay1/extconf.rb
new file mode 100644
index 0000000000..54387cedf1
--- /dev/null
+++ b/ext/-test-/box/yay1/extconf.rb
@@ -0,0 +1 @@
+create_makefile('-test-/box/yay1')
diff --git a/ext/-test-/namespace/yay1/yay1.c b/ext/-test-/box/yay1/yay1.c
index 564a221c8c..564a221c8c 100644
--- a/ext/-test-/namespace/yay1/yay1.c
+++ b/ext/-test-/box/yay1/yay1.c
diff --git a/ext/-test-/namespace/yay1/yay1.def b/ext/-test-/box/yay1/yay1.def
index 510fbe7017..510fbe7017 100644
--- a/ext/-test-/namespace/yay1/yay1.def
+++ b/ext/-test-/box/yay1/yay1.def
diff --git a/ext/-test-/namespace/yay1/yay1.h b/ext/-test-/box/yay1/yay1.h
index c4dade928a..c4dade928a 100644
--- a/ext/-test-/namespace/yay1/yay1.h
+++ b/ext/-test-/box/yay1/yay1.h
diff --git a/ext/-test-/box/yay2/extconf.rb b/ext/-test-/box/yay2/extconf.rb
new file mode 100644
index 0000000000..850ef3edc9
--- /dev/null
+++ b/ext/-test-/box/yay2/extconf.rb
@@ -0,0 +1 @@
+create_makefile('-test-/box/yay2')
diff --git a/ext/-test-/namespace/yay2/yay2.c b/ext/-test-/box/yay2/yay2.c
index b632ae8495..b632ae8495 100644
--- a/ext/-test-/namespace/yay2/yay2.c
+++ b/ext/-test-/box/yay2/yay2.c
diff --git a/ext/-test-/namespace/yay2/yay2.def b/ext/-test-/box/yay2/yay2.def
index 163fc44c04..163fc44c04 100644
--- a/ext/-test-/namespace/yay2/yay2.def
+++ b/ext/-test-/box/yay2/yay2.def
diff --git a/ext/-test-/namespace/yay2/yay2.h b/ext/-test-/box/yay2/yay2.h
index c4dade928a..c4dade928a 100644
--- a/ext/-test-/namespace/yay2/yay2.h
+++ b/ext/-test-/box/yay2/yay2.h
diff --git a/ext/-test-/cxxanyargs/cxxanyargs.cpp b/ext/-test-/cxxanyargs/cxxanyargs.cpp
index eded13e2ee..c7df7f9038 100644
--- a/ext/-test-/cxxanyargs/cxxanyargs.cpp
+++ b/ext/-test-/cxxanyargs/cxxanyargs.cpp
@@ -97,31 +97,6 @@ struct test_rb_define_hooked_variable {
};
VALUE test_rb_define_hooked_variable::v = Qundef;
-namespace test_rb_iterate {
- VALUE
- iter(VALUE self)
- {
- return rb_funcall(self, rb_intern("yield"), 0);
- }
-
- VALUE
- block(RB_BLOCK_CALL_FUNC_ARGLIST(arg, param))
- {
- return rb_funcall(arg, rb_intern("=="), 1, param);
- }
-
- VALUE
- test(VALUE self)
- {
-#ifdef HAVE_NULLPTR
- rb_iterate(iter, self, nullptr, self);
-#endif
-
- rb_iterate(iter, self, RUBY_METHOD_FUNC(block), self); // old
- return rb_iterate(iter, self, block, self); // new
- }
-}
-
namespace test_rb_block_call {
VALUE
block(RB_BLOCK_CALL_FUNC_ARGLIST(arg, param))
@@ -936,7 +911,6 @@ Init_cxxanyargs(void)
test(rb_define_virtual_variable);
test(rb_define_hooked_variable);
- test(rb_iterate);
test(rb_block_call);
test(rb_rescue);
test(rb_rescue2);
diff --git a/ext/-test-/fatal/invalid.c b/ext/-test-/fatal/invalid.c
index 393465416a..6fd970b181 100644
--- a/ext/-test-/fatal/invalid.c
+++ b/ext/-test-/fatal/invalid.c
@@ -1,11 +1,5 @@
#include <ruby.h>
-#if SIZEOF_LONG == SIZEOF_VOIDP
-# define NUM2PTR(x) NUM2ULONG(x)
-#elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
-# define NUM2PTR(x) NUM2ULL(x)
-#endif
-
static VALUE
invalid_call(VALUE obj, VALUE address)
{
diff --git a/ext/-test-/integer/depend b/ext/-test-/integer/depend
index 0ea007e814..d0589b5e5d 100644
--- a/ext/-test-/integer/depend
+++ b/ext/-test-/integer/depend
@@ -159,8 +159,11 @@ core_ext.o: $(hdrdir)/ruby/missing.h
core_ext.o: $(hdrdir)/ruby/ruby.h
core_ext.o: $(hdrdir)/ruby/st.h
core_ext.o: $(hdrdir)/ruby/subst.h
+core_ext.o: $(top_srcdir)/internal.h
+core_ext.o: $(top_srcdir)/internal/basic_operators.h
core_ext.o: $(top_srcdir)/internal/bignum.h
core_ext.o: $(top_srcdir)/internal/bits.h
+core_ext.o: $(top_srcdir)/internal/compar.h
core_ext.o: $(top_srcdir)/internal/compilers.h
core_ext.o: $(top_srcdir)/internal/fixnum.h
core_ext.o: $(top_srcdir)/internal/numeric.h
diff --git a/ext/-test-/namespace/yay1/extconf.rb b/ext/-test-/namespace/yay1/extconf.rb
deleted file mode 100644
index 539e99ab09..0000000000
--- a/ext/-test-/namespace/yay1/extconf.rb
+++ /dev/null
@@ -1 +0,0 @@
-create_makefile('-test-/namespace/yay1')
diff --git a/ext/-test-/namespace/yay2/extconf.rb b/ext/-test-/namespace/yay2/extconf.rb
deleted file mode 100644
index 2027a42860..0000000000
--- a/ext/-test-/namespace/yay2/extconf.rb
+++ /dev/null
@@ -1 +0,0 @@
-create_makefile('-test-/namespace/yay2')
diff --git a/ext/-test-/postponed_job/postponed_job.c b/ext/-test-/postponed_job/postponed_job.c
index 9ac866ae77..4426fc3104 100644
--- a/ext/-test-/postponed_job/postponed_job.c
+++ b/ext/-test-/postponed_job/postponed_job.c
@@ -36,38 +36,6 @@ pjob_callback(void *data)
}
static VALUE
-pjob_register(VALUE self, VALUE obj)
-{
- counter = 0;
- rb_postponed_job_register(0, pjob_callback, (void *)obj);
- rb_gc_start();
- counter++;
- rb_gc_start();
- counter++;
- rb_gc_start();
- counter++;
- return self;
-}
-
-static void
-pjob_one_callback(void *data)
-{
- VALUE ary = (VALUE)data;
- Check_Type(ary, T_ARRAY);
-
- rb_ary_push(ary, INT2FIX(1));
-}
-
-static VALUE
-pjob_register_one(VALUE self, VALUE obj)
-{
- rb_postponed_job_register_one(0, pjob_one_callback, (void *)obj);
- rb_postponed_job_register_one(0, pjob_one_callback, (void *)obj);
- rb_postponed_job_register_one(0, pjob_one_callback, (void *)obj);
- return self;
-}
-
-static VALUE
pjob_call_direct(VALUE self, VALUE obj)
{
counter = 0;
@@ -83,48 +51,6 @@ pjob_call_direct(VALUE self, VALUE obj)
static void pjob_noop_callback(void *data) { }
-static VALUE
-pjob_register_one_same(VALUE self)
-{
- rb_gc_start();
- int r1 = rb_postponed_job_register_one(0, pjob_noop_callback, NULL);
- int r2 = rb_postponed_job_register_one(0, pjob_noop_callback, NULL);
- int r3 = rb_postponed_job_register_one(0, pjob_noop_callback, NULL);
- VALUE ary = rb_ary_new();
- rb_ary_push(ary, INT2FIX(r1));
- rb_ary_push(ary, INT2FIX(r2));
- rb_ary_push(ary, INT2FIX(r3));
- return ary;
-}
-
-#ifdef HAVE_PTHREAD_H
-#include <pthread.h>
-
-static void *
-pjob_register_in_c_thread_i(void *obj)
-{
- rb_postponed_job_register_one(0, pjob_one_callback, (void *)obj);
- rb_postponed_job_register_one(0, pjob_one_callback, (void *)obj);
- rb_postponed_job_register_one(0, pjob_one_callback, (void *)obj);
- return NULL;
-}
-
-static VALUE
-pjob_register_in_c_thread(VALUE self, VALUE obj)
-{
- pthread_t thread;
- if (pthread_create(&thread, NULL, pjob_register_in_c_thread_i, (void *)obj)) {
- return Qfalse;
- }
-
- if (pthread_join(thread, NULL)) {
- return Qfalse;
- }
-
- return Qtrue;
-}
-#endif
-
static void
pjob_preregistered_callback(void *data)
{
@@ -216,13 +142,7 @@ void
Init_postponed_job(VALUE self)
{
VALUE mBug = rb_define_module("Bug");
- rb_define_module_function(mBug, "postponed_job_register", pjob_register, 1);
- rb_define_module_function(mBug, "postponed_job_register_one", pjob_register_one, 1);
rb_define_module_function(mBug, "postponed_job_call_direct", pjob_call_direct, 1);
- rb_define_module_function(mBug, "postponed_job_register_one_same", pjob_register_one_same, 0);
-#ifdef HAVE_PTHREAD_H
- rb_define_module_function(mBug, "postponed_job_register_in_c_thread", pjob_register_in_c_thread, 1);
-#endif
rb_define_module_function(mBug, "postponed_job_preregister_and_call_with_sleep", pjob_preregister_and_call_with_sleep, 1);
rb_define_module_function(mBug, "postponed_job_preregister_and_call_without_sleep", pjob_preregister_and_call_without_sleep, 1);
rb_define_module_function(mBug, "postponed_job_preregister_multiple_times", pjob_preregister_multiple_times, 0);
diff --git a/ext/-test-/rational/depend b/ext/-test-/rational/depend
index 56d6ab77d6..d949fca66b 100644
--- a/ext/-test-/rational/depend
+++ b/ext/-test-/rational/depend
@@ -163,8 +163,11 @@ rat.o: $(hdrdir)/ruby/missing.h
rat.o: $(hdrdir)/ruby/ruby.h
rat.o: $(hdrdir)/ruby/st.h
rat.o: $(hdrdir)/ruby/subst.h
+rat.o: $(top_srcdir)/internal.h
+rat.o: $(top_srcdir)/internal/basic_operators.h
rat.o: $(top_srcdir)/internal/bignum.h
rat.o: $(top_srcdir)/internal/bits.h
+rat.o: $(top_srcdir)/internal/compar.h
rat.o: $(top_srcdir)/internal/compilers.h
rat.o: $(top_srcdir)/internal/fixnum.h
rat.o: $(top_srcdir)/internal/gc.h
diff --git a/ext/-test-/sanitizers/depend b/ext/-test-/sanitizers/depend
new file mode 100644
index 0000000000..0e6e632803
--- /dev/null
+++ b/ext/-test-/sanitizers/depend
@@ -0,0 +1,162 @@
+# AUTOGENERATED DEPENDENCIES START
+sanitizers.o: $(RUBY_EXTCONF_H)
+sanitizers.o: $(arch_hdrdir)/ruby/config.h
+sanitizers.o: $(hdrdir)/ruby/assert.h
+sanitizers.o: $(hdrdir)/ruby/backward.h
+sanitizers.o: $(hdrdir)/ruby/backward/2/assume.h
+sanitizers.o: $(hdrdir)/ruby/backward/2/attributes.h
+sanitizers.o: $(hdrdir)/ruby/backward/2/bool.h
+sanitizers.o: $(hdrdir)/ruby/backward/2/inttypes.h
+sanitizers.o: $(hdrdir)/ruby/backward/2/limits.h
+sanitizers.o: $(hdrdir)/ruby/backward/2/long_long.h
+sanitizers.o: $(hdrdir)/ruby/backward/2/stdalign.h
+sanitizers.o: $(hdrdir)/ruby/backward/2/stdarg.h
+sanitizers.o: $(hdrdir)/ruby/defines.h
+sanitizers.o: $(hdrdir)/ruby/intern.h
+sanitizers.o: $(hdrdir)/ruby/internal/abi.h
+sanitizers.o: $(hdrdir)/ruby/internal/anyargs.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/char.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/double.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/int.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/long.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/short.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h
+sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h
+sanitizers.o: $(hdrdir)/ruby/internal/assume.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/alloc_size.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/artificial.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/cold.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/const.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/constexpr.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/deprecated.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/error.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/flag_enum.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/forceinline.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/format.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/noalias.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/nodiscard.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/noexcept.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/noinline.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/nonnull.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/noreturn.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/packed_struct.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/pure.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/restrict.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/warning.h
+sanitizers.o: $(hdrdir)/ruby/internal/attr/weakref.h
+sanitizers.o: $(hdrdir)/ruby/internal/cast.h
+sanitizers.o: $(hdrdir)/ruby/internal/compiler_is.h
+sanitizers.o: $(hdrdir)/ruby/internal/compiler_is/apple.h
+sanitizers.o: $(hdrdir)/ruby/internal/compiler_is/clang.h
+sanitizers.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h
+sanitizers.o: $(hdrdir)/ruby/internal/compiler_is/intel.h
+sanitizers.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h
+sanitizers.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h
+sanitizers.o: $(hdrdir)/ruby/internal/compiler_since.h
+sanitizers.o: $(hdrdir)/ruby/internal/config.h
+sanitizers.o: $(hdrdir)/ruby/internal/constant_p.h
+sanitizers.o: $(hdrdir)/ruby/internal/core.h
+sanitizers.o: $(hdrdir)/ruby/internal/core/rarray.h
+sanitizers.o: $(hdrdir)/ruby/internal/core/rbasic.h
+sanitizers.o: $(hdrdir)/ruby/internal/core/rbignum.h
+sanitizers.o: $(hdrdir)/ruby/internal/core/rclass.h
+sanitizers.o: $(hdrdir)/ruby/internal/core/rdata.h
+sanitizers.o: $(hdrdir)/ruby/internal/core/rfile.h
+sanitizers.o: $(hdrdir)/ruby/internal/core/rhash.h
+sanitizers.o: $(hdrdir)/ruby/internal/core/robject.h
+sanitizers.o: $(hdrdir)/ruby/internal/core/rregexp.h
+sanitizers.o: $(hdrdir)/ruby/internal/core/rstring.h
+sanitizers.o: $(hdrdir)/ruby/internal/core/rstruct.h
+sanitizers.o: $(hdrdir)/ruby/internal/core/rtypeddata.h
+sanitizers.o: $(hdrdir)/ruby/internal/ctype.h
+sanitizers.o: $(hdrdir)/ruby/internal/dllexport.h
+sanitizers.o: $(hdrdir)/ruby/internal/dosish.h
+sanitizers.o: $(hdrdir)/ruby/internal/error.h
+sanitizers.o: $(hdrdir)/ruby/internal/eval.h
+sanitizers.o: $(hdrdir)/ruby/internal/event.h
+sanitizers.o: $(hdrdir)/ruby/internal/fl_type.h
+sanitizers.o: $(hdrdir)/ruby/internal/gc.h
+sanitizers.o: $(hdrdir)/ruby/internal/glob.h
+sanitizers.o: $(hdrdir)/ruby/internal/globals.h
+sanitizers.o: $(hdrdir)/ruby/internal/has/attribute.h
+sanitizers.o: $(hdrdir)/ruby/internal/has/builtin.h
+sanitizers.o: $(hdrdir)/ruby/internal/has/c_attribute.h
+sanitizers.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h
+sanitizers.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h
+sanitizers.o: $(hdrdir)/ruby/internal/has/extension.h
+sanitizers.o: $(hdrdir)/ruby/internal/has/feature.h
+sanitizers.o: $(hdrdir)/ruby/internal/has/warning.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/array.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/bignum.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/class.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/compar.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/complex.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/cont.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/dir.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/enum.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/enumerator.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/error.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/eval.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/file.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/hash.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/io.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/load.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/marshal.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/numeric.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/object.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/parse.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/proc.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/process.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/random.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/range.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/rational.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/re.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/ruby.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/select.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/select/largesize.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/set.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/signal.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/sprintf.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/string.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/struct.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/thread.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/time.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/variable.h
+sanitizers.o: $(hdrdir)/ruby/internal/intern/vm.h
+sanitizers.o: $(hdrdir)/ruby/internal/interpreter.h
+sanitizers.o: $(hdrdir)/ruby/internal/iterator.h
+sanitizers.o: $(hdrdir)/ruby/internal/memory.h
+sanitizers.o: $(hdrdir)/ruby/internal/method.h
+sanitizers.o: $(hdrdir)/ruby/internal/module.h
+sanitizers.o: $(hdrdir)/ruby/internal/newobj.h
+sanitizers.o: $(hdrdir)/ruby/internal/scan_args.h
+sanitizers.o: $(hdrdir)/ruby/internal/special_consts.h
+sanitizers.o: $(hdrdir)/ruby/internal/static_assert.h
+sanitizers.o: $(hdrdir)/ruby/internal/stdalign.h
+sanitizers.o: $(hdrdir)/ruby/internal/stdbool.h
+sanitizers.o: $(hdrdir)/ruby/internal/stdckdint.h
+sanitizers.o: $(hdrdir)/ruby/internal/symbol.h
+sanitizers.o: $(hdrdir)/ruby/internal/value.h
+sanitizers.o: $(hdrdir)/ruby/internal/value_type.h
+sanitizers.o: $(hdrdir)/ruby/internal/variable.h
+sanitizers.o: $(hdrdir)/ruby/internal/warning_push.h
+sanitizers.o: $(hdrdir)/ruby/internal/xmalloc.h
+sanitizers.o: $(hdrdir)/ruby/missing.h
+sanitizers.o: $(hdrdir)/ruby/ruby.h
+sanitizers.o: $(hdrdir)/ruby/st.h
+sanitizers.o: $(hdrdir)/ruby/subst.h
+sanitizers.o: sanitizers.c
+# AUTOGENERATED DEPENDENCIES END
diff --git a/ext/-test-/sanitizers/extconf.rb b/ext/-test-/sanitizers/extconf.rb
new file mode 100644
index 0000000000..c94a96de6c
--- /dev/null
+++ b/ext/-test-/sanitizers/extconf.rb
@@ -0,0 +1,2 @@
+require 'mkmf'
+create_makefile('-test-/sanitizers')
diff --git a/ext/-test-/sanitizers/sanitizers.c b/ext/-test-/sanitizers/sanitizers.c
new file mode 100644
index 0000000000..97a85b26ef
--- /dev/null
+++ b/ext/-test-/sanitizers/sanitizers.c
@@ -0,0 +1,36 @@
+#include "ruby/ruby.h"
+
+static VALUE
+asan_enabled_p(VALUE self)
+{
+#if defined(__has_feature)
+ /* clang uses __has_feature for determining asan */
+ return __has_feature(address_sanitizer) ? Qtrue : Qfalse;
+#elif defined(__SANITIZE_ADDRESS__)
+ /* GCC sets __SANITIZE_ADDRESS__ for determining asan */
+ return Qtrue;
+#else
+ return Qfalse;
+#endif
+}
+
+static VALUE
+lsan_enabled_p(VALUE self)
+{
+#if defined(__has_feature)
+ /* clang uses __has_feature for determining LSAN */
+ return __has_feature(leak_sanitizer) ? Qtrue : Qfalse;
+#else
+ return Qfalse;
+#endif
+}
+
+void
+Init_sanitizers(void)
+{
+ VALUE m = rb_define_module("Test");
+ VALUE c = rb_define_class_under(m, "Sanitizers", rb_cObject);
+ rb_define_singleton_method(c, "asan_enabled?", asan_enabled_p, 0);
+ rb_define_singleton_method(c, "lsan_enabled?", lsan_enabled_p, 0);
+}
+
diff --git a/ext/-test-/scheduler/extconf.rb b/ext/-test-/scheduler/extconf.rb
new file mode 100644
index 0000000000..159699bd8e
--- /dev/null
+++ b/ext/-test-/scheduler/extconf.rb
@@ -0,0 +1,2 @@
+# frozen_string_literal: false
+create_makefile("-test-/scheduler")
diff --git a/ext/-test-/scheduler/scheduler.c b/ext/-test-/scheduler/scheduler.c
new file mode 100644
index 0000000000..b742a5573b
--- /dev/null
+++ b/ext/-test-/scheduler/scheduler.c
@@ -0,0 +1,92 @@
+#include "ruby/ruby.h"
+#include "ruby/thread.h"
+#include "ruby/io.h"
+#include "ruby/fiber/scheduler.h"
+
+/*
+ * Test extension for reproducing the gRPC interrupt handling bug.
+ *
+ * This reproduces the exact issue from grpc/grpc commit 69f229e (June 2025):
+ * https://github.com/grpc/grpc/commit/69f229edd1d79ab7a7dfda98e3aef6fd807adcad
+ *
+ * The bug occurs when:
+ * 1. A fiber scheduler uses Thread.handle_interrupt(::SignalException => :never)
+ * (like Async::Scheduler does)
+ * 2. Native code uses rb_thread_call_without_gvl in a retry loop that checks
+ * the interrupted flag and retries (like gRPC's completion queue)
+ * 3. A signal (SIGINT/SIGTERM) is sent
+ * 4. The unblock_func sets interrupted=1, but Thread.handle_interrupt defers the signal
+ * 5. The loop sees interrupted=1 and retries without yielding to the scheduler
+ * 6. The deferred interrupt never gets processed -> infinite hang
+ *
+ * The fix is in vm_check_ints_blocking() in thread.c, which should yield to
+ * the fiber scheduler when interrupts are pending, allowing the scheduler to
+ * detect Thread.pending_interrupt? and exit its run loop.
+ */
+
+struct blocking_state {
+ int notify_descriptor;
+ volatile int interrupted;
+};
+
+static void
+unblock_callback(void *argument)
+{
+ struct blocking_state *blocking_state = (struct blocking_state *)argument;
+ blocking_state->interrupted = 1;
+}
+
+static void *
+blocking_operation(void *argument)
+{
+ struct blocking_state *blocking_state = (struct blocking_state *)argument;
+
+ ssize_t ret = write(blocking_state->notify_descriptor, "x", 1);
+ (void)ret; // ignore the result for now
+
+ while (!blocking_state->interrupted) {
+ struct timeval tv = {1, 0}; // 1 second timeout.
+ int result = select(0, NULL, NULL, NULL, &tv);
+
+ if (result == -1 && errno == EINTR) {
+ blocking_state->interrupted = 1;
+ }
+
+ // Otherwise, timeout -> loop again.
+ }
+
+ return NULL;
+}
+
+static VALUE
+scheduler_blocking_loop(VALUE self, VALUE notify)
+{
+ struct blocking_state blocking_state = {
+ .notify_descriptor = rb_io_descriptor(notify),
+ .interrupted = 0,
+ };
+
+ while (true) {
+ blocking_state.interrupted = 0;
+
+ rb_thread_call_without_gvl(
+ blocking_operation, &blocking_state,
+ unblock_callback, &blocking_state
+ );
+
+ // The bug: When interrupted, loop retries without yielding to scheduler.
+ // With Thread.handle_interrupt(:never), this causes an infinite hang,
+ // because the deferred interrupt never gets a chance to be processed.
+ } while (blocking_state.interrupted);
+
+ return Qnil;
+}
+
+void
+Init_scheduler(void)
+{
+ VALUE mBug = rb_define_module("Bug");
+ VALUE mScheduler = rb_define_module_under(mBug, "Scheduler");
+
+ rb_define_module_function(mScheduler, "blocking_loop", scheduler_blocking_loop, 1);
+}
diff --git a/ext/-test-/st/foreach/foreach.c b/ext/-test-/st/foreach/foreach.c
index 7fbf064694..5c1bfd1631 100644
--- a/ext/-test-/st/foreach/foreach.c
+++ b/ext/-test-/st/foreach/foreach.c
@@ -14,13 +14,9 @@ force_unpack_check(struct checker *c, st_data_t key, st_data_t val)
if (c->nr == 0) {
st_data_t i;
- if (c->tbl->bins != NULL) rb_bug("should be packed");
-
/* force unpacking during iteration: */
for (i = 1; i < expect_size; i++)
st_add_direct(c->tbl, i, i);
-
- if (c->tbl->bins == NULL) rb_bug("should be unpacked");
}
if (key != c->nr) {
@@ -84,8 +80,6 @@ unp_fec(VALUE self, VALUE test)
st_add_direct(tbl, 0, 0);
- if (tbl->bins != NULL) rb_bug("should still be packed");
-
st_foreach_check(tbl, unp_fec_i, (st_data_t)&c, -1);
if (c.test == ID2SYM(rb_intern("delete2"))) {
@@ -98,8 +92,6 @@ unp_fec(VALUE self, VALUE test)
(VALUE)c.nr, (VALUE)expect_size);
}
- if (tbl->bins == NULL) rb_bug("should be unpacked");
-
st_free_table(tbl);
return Qnil;
@@ -145,8 +137,6 @@ unp_fe(VALUE self, VALUE test)
st_add_direct(tbl, 0, 0);
- if (tbl->bins != NULL) rb_bug("should still be packed");
-
st_foreach(tbl, unp_fe_i, (st_data_t)&c);
if (c.test == ID2SYM(rb_intern("unpack_delete"))) {
@@ -159,8 +149,6 @@ unp_fe(VALUE self, VALUE test)
(VALUE)c.nr, (VALUE)expect_size);
}
- if (tbl->bins == NULL) rb_bug("should be unpacked");
-
st_free_table(tbl);
return Qnil;
diff --git a/ext/-test-/stack/depend b/ext/-test-/stack/depend
index 31571c882e..77e93bb201 100644
--- a/ext/-test-/stack/depend
+++ b/ext/-test-/stack/depend
@@ -172,6 +172,7 @@ stack.o: $(hdrdir)/ruby/oniguruma.h
stack.o: $(hdrdir)/ruby/ruby.h
stack.o: $(hdrdir)/ruby/st.h
stack.o: $(hdrdir)/ruby/subst.h
+stack.o: $(top_srcdir)/encindex.h
stack.o: $(top_srcdir)/internal/compilers.h
stack.o: $(top_srcdir)/internal/string.h
stack.o: stack.c
diff --git a/ext/-test-/stack/stack.c b/ext/-test-/stack/stack.c
index 8ff32f9737..f0e65e74b2 100644
--- a/ext/-test-/stack/stack.c
+++ b/ext/-test-/stack/stack.c
@@ -2,7 +2,7 @@
#include "internal/string.h"
static VALUE
-stack_alloca_overflow(VALUE self)
+stack_overflow(VALUE self)
{
size_t i = 0;
@@ -30,6 +30,6 @@ asan_p(VALUE klass)
void
Init_stack(VALUE klass)
{
- rb_define_singleton_method(rb_cThread, "alloca_overflow", stack_alloca_overflow, 0);
+ rb_define_singleton_method(rb_cThread, "stack_overflow", stack_overflow, 0);
rb_define_singleton_method(rb_cThread, "asan?", asan_p, 0);
}
diff --git a/ext/-test-/string/cstr.c b/ext/-test-/string/cstr.c
index b0b1ef5374..931220b46b 100644
--- a/ext/-test-/string/cstr.c
+++ b/ext/-test-/string/cstr.c
@@ -111,9 +111,10 @@ bug_str_s_cstr_noembed(VALUE self, VALUE str)
FL_SET((str2), STR_NOEMBED);
memcpy(buf, RSTRING_PTR(str), capacity);
RBASIC(str2)->flags &= ~(STR_SHARED | FL_USER5 | FL_USER6);
- RSTRING(str2)->as.heap.aux.capa = capacity;
+ RSTRING(str2)->as.heap.aux.capa = RSTRING_LEN(str);
RSTRING(str2)->as.heap.ptr = buf;
RSTRING(str2)->len = RSTRING_LEN(str);
+
TERM_FILL(RSTRING_END(str2), TERM_LEN(str));
return str2;
}
diff --git a/ext/-test-/string/depend b/ext/-test-/string/depend
index de6e775acc..478ae3b82b 100644
--- a/ext/-test-/string/depend
+++ b/ext/-test-/string/depend
@@ -172,6 +172,7 @@ capacity.o: $(hdrdir)/ruby/oniguruma.h
capacity.o: $(hdrdir)/ruby/ruby.h
capacity.o: $(hdrdir)/ruby/st.h
capacity.o: $(hdrdir)/ruby/subst.h
+capacity.o: $(top_srcdir)/encindex.h
capacity.o: $(top_srcdir)/internal/compilers.h
capacity.o: $(top_srcdir)/internal/string.h
capacity.o: capacity.c
@@ -679,6 +680,7 @@ cstr.o: $(hdrdir)/ruby/oniguruma.h
cstr.o: $(hdrdir)/ruby/ruby.h
cstr.o: $(hdrdir)/ruby/st.h
cstr.o: $(hdrdir)/ruby/subst.h
+cstr.o: $(top_srcdir)/encindex.h
cstr.o: $(top_srcdir)/internal.h
cstr.o: $(top_srcdir)/internal/compilers.h
cstr.o: $(top_srcdir)/internal/string.h
@@ -1535,6 +1537,7 @@ fstring.o: $(hdrdir)/ruby/oniguruma.h
fstring.o: $(hdrdir)/ruby/ruby.h
fstring.o: $(hdrdir)/ruby/st.h
fstring.o: $(hdrdir)/ruby/subst.h
+fstring.o: $(top_srcdir)/encindex.h
fstring.o: $(top_srcdir)/internal/compilers.h
fstring.o: $(top_srcdir)/internal/string.h
fstring.o: fstring.c
diff --git a/ext/-test-/string/fstring.c b/ext/-test-/string/fstring.c
index 71c4b7f97e..0b5940f28c 100644
--- a/ext/-test-/string/fstring.c
+++ b/ext/-test-/string/fstring.c
@@ -12,20 +12,20 @@ VALUE
bug_s_fstring_fake_str(VALUE self)
{
static const char literal[] = "abcdefghijklmnopqrstuvwxyz";
- struct RString fake_str;
+ struct RString fake_str = {RBASIC_INIT};
return rb_str_to_interned_str(rb_setup_fake_str(&fake_str, literal, sizeof(literal) - 1, 0));
}
VALUE
bug_s_rb_enc_interned_str(VALUE self, VALUE encoding)
{
- return rb_enc_interned_str("foo", 3, NIL_P(encoding) ? NULL : RDATA(encoding)->data);
+ return rb_enc_interned_str("foo", 3, NIL_P(encoding) ? NULL : RTYPEDDATA_GET_DATA(encoding));
}
VALUE
bug_s_rb_enc_str_new(VALUE self, VALUE encoding)
{
- return rb_enc_str_new("foo", 3, NIL_P(encoding) ? NULL : RDATA(encoding)->data);
+ return rb_enc_str_new("foo", 3, NIL_P(encoding) ? NULL : RTYPEDDATA_GET_DATA(encoding));
}
void
diff --git a/ext/-test-/time/leap_second.c b/ext/-test-/time/leap_second.c
deleted file mode 100644
index ee7011fa97..0000000000
--- a/ext/-test-/time/leap_second.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include "ruby.h"
-#include "internal/time.h"
-
-static VALUE
-bug_time_s_reset_leap_second_info(VALUE klass)
-{
- ruby_reset_leap_second_info();
- return Qnil;
-}
-
-void
-Init_time_leap_second(VALUE klass)
-{
- rb_define_singleton_method(klass, "reset_leap_second_info", bug_time_s_reset_leap_second_info, 0);
-}
diff --git a/ext/-test-/tracepoint/gc_hook.c b/ext/-test-/tracepoint/gc_hook.c
index 54c06c54a5..525be6da63 100644
--- a/ext/-test-/tracepoint/gc_hook.c
+++ b/ext/-test-/tracepoint/gc_hook.c
@@ -2,6 +2,7 @@
#include "ruby/debug.h"
static int invoking; /* TODO: should not be global variable */
+extern VALUE tp_mBug;
static VALUE
invoke_proc_ensure(VALUE _)
@@ -17,9 +18,9 @@ invoke_proc_begin(VALUE proc)
}
static void
-invoke_proc(void *data)
+invoke_proc(void *ivar_name)
{
- VALUE proc = (VALUE)data;
+ VALUE proc = rb_ivar_get(tp_mBug, rb_intern(ivar_name));
invoking += 1;
rb_ensure(invoke_proc_begin, proc, invoke_proc_ensure, 0);
}
@@ -40,16 +41,16 @@ gc_start_end_i(VALUE tpval, void *data)
}
static VALUE
-set_gc_hook(VALUE module, VALUE proc, rb_event_flag_t event, const char *tp_str, const char *proc_str)
+set_gc_hook(VALUE proc, rb_event_flag_t event, const char *tp_str, const char *proc_str)
{
VALUE tpval;
ID tp_key = rb_intern(tp_str);
/* disable previous keys */
- if (rb_ivar_defined(module, tp_key) != 0 &&
- RTEST(tpval = rb_ivar_get(module, tp_key))) {
+ if (rb_ivar_defined(tp_mBug, tp_key) != 0 &&
+ RTEST(tpval = rb_ivar_get(tp_mBug, tp_key))) {
rb_tracepoint_disable(tpval);
- rb_ivar_set(module, tp_key, Qnil);
+ rb_ivar_set(tp_mBug, tp_key, Qnil);
}
if (RTEST(proc)) {
@@ -57,8 +58,9 @@ set_gc_hook(VALUE module, VALUE proc, rb_event_flag_t event, const char *tp_str,
rb_raise(rb_eTypeError, "trace_func needs to be Proc");
}
- tpval = rb_tracepoint_new(0, event, gc_start_end_i, (void *)proc);
- rb_ivar_set(module, tp_key, tpval);
+ rb_ivar_set(tp_mBug, rb_intern(proc_str), proc);
+ tpval = rb_tracepoint_new(0, event, gc_start_end_i, (void *)proc_str);
+ rb_ivar_set(tp_mBug, tp_key, tpval);
rb_tracepoint_enable(tpval);
}
@@ -66,16 +68,16 @@ set_gc_hook(VALUE module, VALUE proc, rb_event_flag_t event, const char *tp_str,
}
static VALUE
-set_after_gc_start(VALUE module, VALUE proc)
+set_after_gc_start(VALUE _self, VALUE proc)
{
- return set_gc_hook(module, proc, RUBY_INTERNAL_EVENT_GC_START,
+ return set_gc_hook(proc, RUBY_INTERNAL_EVENT_GC_START,
"__set_after_gc_start_tpval__", "__set_after_gc_start_proc__");
}
static VALUE
-start_after_gc_exit(VALUE module, VALUE proc)
+start_after_gc_exit(VALUE _self, VALUE proc)
{
- return set_gc_hook(module, proc, RUBY_INTERNAL_EVENT_GC_EXIT,
+ return set_gc_hook(proc, RUBY_INTERNAL_EVENT_GC_EXIT,
"__set_after_gc_exit_tpval__", "__set_after_gc_exit_proc__");
}
diff --git a/ext/-test-/tracepoint/tracepoint.c b/ext/-test-/tracepoint/tracepoint.c
index 2826cc038c..001d9513b2 100644
--- a/ext/-test-/tracepoint/tracepoint.c
+++ b/ext/-test-/tracepoint/tracepoint.c
@@ -1,6 +1,8 @@
#include "ruby/ruby.h"
#include "ruby/debug.h"
+VALUE tp_mBug;
+
struct tracepoint_track {
size_t newobj_count;
size_t free_count;
@@ -89,8 +91,8 @@ void Init_gc_hook(VALUE);
void
Init_tracepoint(void)
{
- VALUE mBug = rb_define_module("Bug");
- Init_gc_hook(mBug);
- rb_define_module_function(mBug, "tracepoint_track_objspace_events", tracepoint_track_objspace_events, 0);
- rb_define_module_function(mBug, "tracepoint_specify_normal_and_internal_events", tracepoint_specify_normal_and_internal_events, 0);
+ tp_mBug = rb_define_module("Bug"); // GC root
+ Init_gc_hook(tp_mBug);
+ rb_define_module_function(tp_mBug, "tracepoint_track_objspace_events", tracepoint_track_objspace_events, 0);
+ rb_define_module_function(tp_mBug, "tracepoint_specify_normal_and_internal_events", tracepoint_specify_normal_and_internal_events, 0);
}