Support using at toplevel in wrapped script
Allow refinements to be used at the toplevel within a script that is loaded under a module. Fixes [Bug #18960]
This commit is contained in:
parent
a74f4cded2
commit
82ac4a2399
Notes:
git
2022-09-24 09:41:38 +09:00
6
eval.c
6
eval.c
@ -1792,10 +1792,12 @@ top_include(int argc, VALUE *argv, VALUE self)
|
|||||||
static VALUE
|
static VALUE
|
||||||
top_using(VALUE self, VALUE module)
|
top_using(VALUE self, VALUE module)
|
||||||
{
|
{
|
||||||
const rb_cref_t *cref = rb_vm_cref();
|
const rb_cref_t *cref = CREF_NEXT(rb_vm_cref());;
|
||||||
rb_control_frame_t *prev_cfp = previous_frame(GET_EC());
|
rb_control_frame_t *prev_cfp = previous_frame(GET_EC());
|
||||||
|
rb_thread_t *th = GET_THREAD();
|
||||||
|
|
||||||
if (CREF_NEXT(cref) || (prev_cfp && rb_vm_frame_method_entry(prev_cfp))) {
|
if ((th->top_wrapper ? CREF_NEXT(cref) : cref) ||
|
||||||
|
(prev_cfp && rb_vm_frame_method_entry(prev_cfp))) {
|
||||||
rb_raise(rb_eRuntimeError, "main.using is permitted only at toplevel");
|
rb_raise(rb_eRuntimeError, "main.using is permitted only at toplevel");
|
||||||
}
|
}
|
||||||
if (rb_block_given_p()) {
|
if (rb_block_given_p()) {
|
||||||
|
1
spec/ruby/core/main/fixtures/using.rb
Normal file
1
spec/ruby/core/main/fixtures/using.rb
Normal file
@ -0,0 +1 @@
|
|||||||
|
using Module.new
|
5
spec/ruby/core/main/fixtures/using_in_main.rb
Normal file
5
spec/ruby/core/main/fixtures/using_in_main.rb
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
MAIN = self
|
||||||
|
|
||||||
|
module X
|
||||||
|
MAIN.send(:using, Module.new)
|
||||||
|
end
|
5
spec/ruby/core/main/fixtures/using_in_method.rb
Normal file
5
spec/ruby/core/main/fixtures/using_in_method.rb
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
def foo
|
||||||
|
using Module.new
|
||||||
|
end
|
||||||
|
|
||||||
|
foo
|
@ -129,4 +129,24 @@ describe "main.using" do
|
|||||||
|
|
||||||
x.call_bar(cls2.new).should == 'bar'
|
x.call_bar(cls2.new).should == 'bar'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "raises error when called from method in wrapped script" do
|
||||||
|
-> do
|
||||||
|
load File.expand_path('../fixtures/using_in_method.rb', __FILE__), true
|
||||||
|
end.should raise_error(RuntimeError)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "raises error when called on toplevel from module" do
|
||||||
|
-> do
|
||||||
|
load File.expand_path('../fixtures/using_in_main.rb', __FILE__), true
|
||||||
|
end.should raise_error(RuntimeError)
|
||||||
|
end
|
||||||
|
|
||||||
|
ruby_version_is "3.2" do
|
||||||
|
it "does not raise error when wrapped with module" do
|
||||||
|
-> do
|
||||||
|
load File.expand_path('../fixtures/using.rb', __FILE__), true
|
||||||
|
end.should_not raise_error
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user