aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--load.c7
-rw-r--r--test/ruby/test_require.rb13
2 files changed, 20 insertions, 0 deletions
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|