1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Should require without wrapper module

This commit is contained in:
Nobuyoshi Nakada 2019-08-09 00:06:08 +09:00
parent a206738762
commit ad3f7a3667
No known key found for this signature in database
GPG key ID: 4BC7D6DF58D8DF60
2 changed files with 20 additions and 0 deletions

7
load.c
View file

@ -978,6 +978,9 @@ static int
require_internal(rb_execution_context_t *ec, VALUE fname, int safe, int exception) require_internal(rb_execution_context_t *ec, VALUE fname, int safe, int exception)
{ {
volatile int result = -1; 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; volatile VALUE errinfo = ec->errinfo;
enum ruby_tag_type state; enum ruby_tag_type state;
struct { struct {
@ -993,6 +996,7 @@ require_internal(rb_execution_context_t *ec, VALUE fname, int safe, int exceptio
EC_PUSH_TAG(ec); EC_PUSH_TAG(ec);
saved.safe = rb_safe_level(); saved.safe = rb_safe_level();
ec->errinfo = Qnil; /* ensure */ ec->errinfo = Qnil; /* ensure */
th->top_wrapper = 0;
if ((state = EC_EXEC_TAG()) == TAG_NONE) { if ((state = EC_EXEC_TAG()) == TAG_NONE) {
long handle; long handle;
int found; int found;
@ -1029,6 +1033,9 @@ require_internal(rb_execution_context_t *ec, VALUE fname, int safe, int exceptio
} }
} }
EC_POP_TAG(); 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); if (ftptr) load_unlock(RSTRING_PTR(path), !state);
rb_set_safe_level_force(saved.safe); rb_set_safe_level_force(saved.safe);

View file

@ -384,6 +384,19 @@ class TestRequire < Test::Unit::TestCase
} }
end 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 def test_load_scope
bug1982 = '[ruby-core:25039] [Bug #1982]' bug1982 = '[ruby-core:25039] [Bug #1982]'
Tempfile.create(["test_ruby_test_require", ".rb"]) {|t| Tempfile.create(["test_ruby_test_require", ".rb"]) {|t|