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

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:
Chris Salzberg 2022-08-09 22:22:23 +09:00 committed by Shugo Maeda
parent a74f4cded2
commit 82ac4a2399
Notes: git 2022-09-24 09:41:38 +09:00
5 changed files with 35 additions and 2 deletions

6
eval.c
View file

@ -1792,10 +1792,12 @@ top_include(int argc, VALUE *argv, VALUE self)
static VALUE
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_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");
}
if (rb_block_given_p()) {

View file

@ -0,0 +1 @@
using Module.new

View file

@ -0,0 +1,5 @@
MAIN = self
module X
MAIN.send(:using, Module.new)
end

View file

@ -0,0 +1,5 @@
def foo
using Module.new
end
foo

View file

@ -129,4 +129,24 @@ describe "main.using" do
x.call_bar(cls2.new).should == 'bar'
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