From 58918788abd63901588e4aa1e39b5c057321c10a Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 16 Mar 2024 19:29:57 +0900 Subject: [PATCH] [Bug #20342] Consider wrapped load in `main` methods --- eval.c | 18 +++++++++++------- internal/eval.h | 1 + proc.c | 12 +----------- test/ruby/test_require.rb | 20 ++++++++++++++++++++ vm_method.c | 6 +++--- 5 files changed, 36 insertions(+), 21 deletions(-) diff --git a/eval.c b/eval.c index 382d9fb5c8656e..e8da342ac66d75 100644 --- a/eval.c +++ b/eval.c @@ -1782,6 +1782,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 @@ -1794,13 +1804,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 73bb656d968078..e594d8516d4a74 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 a67fc64a32f8d6..bfde0d9abbb44c 100644 --- a/proc.c +++ b/proc.c @@ -2331,17 +2331,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 4f636fa1ba0a5a..ef339283765069 100644 --- a/test/ruby/test_require.rb +++ b/test/ruby/test_require.rb @@ -370,6 +370,26 @@ def test_require_in_wrapped_load 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/vm_method.c b/vm_method.c index d76a1c2352a5ec..5ca302a86a8c75 100644 --- a/vm_method.c +++ b/vm_method.c @@ -2685,7 +2685,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")); } /* @@ -2705,7 +2705,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")); } /* @@ -2718,7 +2718,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")); } /*