From ad3f7a3667d79a7d23c78e026d3eb5a42bd0b7b3 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 9 Aug 2019 00:06:08 +0900 Subject: Should require without wrapper module --- load.c | 7 +++++++ test/ruby/test_require.rb | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/load.c b/load.c index 8b872a81b7..c3d1d63aeb 100644 --- a/load.c +++ b/load.c @@ -978,6 +978,9 @@ static int require_internal(rb_execution_context_t *ec, VALUE fname, int safe, int exception) { volatile int result = -1; + rb_thread_t *th = rb_ec_thread_ptr(ec); + volatile VALUE wrapper = th->top_wrapper; + volatile VALUE self = th->top_self; volatile VALUE errinfo = ec->errinfo; enum ruby_tag_type state; struct { @@ -993,6 +996,7 @@ require_internal(rb_execution_context_t *ec, VALUE fname, int safe, int exceptio EC_PUSH_TAG(ec); saved.safe = rb_safe_level(); ec->errinfo = Qnil; /* ensure */ + th->top_wrapper = 0; if ((state = EC_EXEC_TAG()) == TAG_NONE) { long handle; int found; @@ -1029,6 +1033,9 @@ require_internal(rb_execution_context_t *ec, VALUE fname, int safe, int exceptio } } EC_POP_TAG(); + th = rb_ec_thread_ptr(ec); + th->top_self = self; + th->top_wrapper = wrapper; if (ftptr) load_unlock(RSTRING_PTR(path), !state); rb_set_safe_level_force(saved.safe); diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb index 2504b9e67c..6c4b97d08d 100644 --- a/test/ruby/test_require.rb +++ b/test/ruby/test_require.rb @@ -384,6 +384,19 @@ class TestRequire < Test::Unit::TestCase } end + def test_require_in_wrapped_load + Dir.mktmpdir do |tmp| + File.write("#{tmp}/1.rb", "require_relative '2'\n") + File.write("#{tmp}/2.rb", "class Foo\n""end\n") + assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}") + path = ""#{tmp.dump}"/1.rb" + begin; + load path, true + assert_instance_of(Class, Foo) + end; + end + end + def test_load_scope bug1982 = '[ruby-core:25039] [Bug #1982]' Tempfile.create(["test_ruby_test_require", ".rb"]) {|t| -- cgit v1.2.3