From a24f19742bfa398a3b32c51df01133db7bcbc6e0 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Wed, 29 May 2024 15:40:49 -0700 Subject: [PATCH] merge revision(s) 58918788abd63901588e4aa1e39b5c057321c10a: [Backport #20342] [Bug #20342] Consider wrapped load in `main` methods --- eval.c | 18 +++++++++++------- internal/eval.h | 1 + proc.c | 12 +----------- test/ruby/test_require.rb | 20 ++++++++++++++++++++ version.h | 2 +- vm_method.c | 6 +++--- 6 files changed, 37 insertions(+), 22 deletions(-) diff --git a/eval.c b/eval.c index 15b6567aff..a8fc48daf5 100644 --- a/eval.c +++ b/eval.c @@ -1797,6 +1797,16 @@ rb_obj_extend(int argc, VALUE *argv, VALUE obj) return obj; } +VALUE +rb_top_main_class(const char *method) +{ + VALUE klass = GET_THREAD()->top_wrapper; + + if (!klass) return rb_cObject; + rb_warning("main.%s in the wrapped load is effective only in wrapper module", method); + return klass; +} + /* * call-seq: * include(module, ...) -> self @@ -1809,13 +1819,7 @@ rb_obj_extend(int argc, VALUE *argv, VALUE obj) static VALUE top_include(int argc, VALUE *argv, VALUE self) { - rb_thread_t *th = GET_THREAD(); - - if (th->top_wrapper) { - rb_warning("main.include in the wrapped load is effective only in wrapper module"); - return rb_mod_include(argc, argv, th->top_wrapper); - } - return rb_mod_include(argc, argv, rb_cObject); + return rb_mod_include(argc, argv, rb_top_main_class("include")); } /* diff --git a/internal/eval.h b/internal/eval.h index 73bb656d96..e594d8516d 100644 --- a/internal/eval.h +++ b/internal/eval.h @@ -21,6 +21,7 @@ extern ID ruby_static_id_status; VALUE rb_refinement_module_get_refined_class(VALUE module); void rb_class_modify_check(VALUE); NORETURN(VALUE rb_f_raise(int argc, VALUE *argv)); +VALUE rb_top_main_class(const char *method); /* eval_error.c */ VALUE rb_get_backtrace(VALUE info); diff --git a/proc.c b/proc.c index 29c16c9b65..54b6ce85c1 100644 --- a/proc.c +++ b/proc.c @@ -2326,17 +2326,7 @@ rb_obj_define_method(int argc, VALUE *argv, VALUE obj) static VALUE top_define_method(int argc, VALUE *argv, VALUE obj) { - rb_thread_t *th = GET_THREAD(); - VALUE klass; - - klass = th->top_wrapper; - if (klass) { - rb_warning("main.define_method in the wrapped load is effective only in wrapper module"); - } - else { - klass = rb_cObject; - } - return rb_mod_define_method(argc, argv, klass); + return rb_mod_define_method(argc, argv, rb_top_main_class("define_method")); } /* diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb index fd5092aaf0..871912e491 100644 --- a/test/ruby/test_require.rb +++ b/test/ruby/test_require.rb @@ -370,6 +370,26 @@ class TestRequire < Test::Unit::TestCase end end + def test_public_in_wrapped_load + Tempfile.create(["test_public_in_wrapped_load", ".rb"]) do |t| + t.puts "def foo; end", "public :foo" + t.close + assert_warning(/main\.public/) do + assert load(t.path, true) + end + end + end + + def test_private_in_wrapped_load + Tempfile.create(["test_private_in_wrapped_load", ".rb"]) do |t| + t.puts "def foo; end", "private :foo" + t.close + assert_warning(/main\.private/) do + assert load(t.path, true) + end + end + end + def test_load_scope bug1982 = '[ruby-core:25039] [Bug #1982]' Tempfile.create(["test_ruby_test_require", ".rb"]) {|t| diff --git a/version.h b/version.h index 1d227740ed..555f7a2f86 100644 --- a/version.h +++ b/version.h @@ -11,7 +11,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 1 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 67 +#define RUBY_PATCHLEVEL 68 #include "ruby/version.h" #include "ruby/internal/abi.h" diff --git a/vm_method.c b/vm_method.c index 6025da4dbd..232ba03e61 100644 --- a/vm_method.c +++ b/vm_method.c @@ -2684,7 +2684,7 @@ rb_mod_private_method(int argc, VALUE *argv, VALUE obj) static VALUE top_public(int argc, VALUE *argv, VALUE _) { - return rb_mod_public(argc, argv, rb_cObject); + return rb_mod_public(argc, argv, rb_top_main_class("public")); } /* @@ -2704,7 +2704,7 @@ top_public(int argc, VALUE *argv, VALUE _) static VALUE top_private(int argc, VALUE *argv, VALUE _) { - return rb_mod_private(argc, argv, rb_cObject); + return rb_mod_private(argc, argv, rb_top_main_class("private")); } /* @@ -2717,7 +2717,7 @@ top_private(int argc, VALUE *argv, VALUE _) static VALUE top_ruby2_keywords(int argc, VALUE *argv, VALUE module) { - return rb_mod_ruby2_keywords(argc, argv, rb_cObject); + return rb_mod_ruby2_keywords(argc, argv, rb_top_main_class("ruby2_keywords")); } /*