[前][次][番号順一覧][スレッド一覧]

ruby-changes:73712

From: Chris <ko1@a...>
Date: Sat, 24 Sep 2022 09:41:34 +0900 (JST)
Subject: [ruby-changes:73712] 82ac4a2399 (master): Support using at toplevel in wrapped script

https://git.ruby-lang.org/ruby.git/commit/?id=82ac4a2399

From 82ac4a2399516a3ffda750b815c244aad6d38277 Mon Sep 17 00:00:00 2001
From: Chris Salzberg <chris@d...>
Date: Tue, 9 Aug 2022 22:22:23 +0900
Subject: 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]
---
 eval.c                                          |  6 ++++--
 spec/ruby/core/main/fixtures/using.rb           |  1 +
 spec/ruby/core/main/fixtures/using_in_main.rb   |  5 +++++
 spec/ruby/core/main/fixtures/using_in_method.rb |  5 +++++
 spec/ruby/core/main/using_spec.rb               | 20 ++++++++++++++++++++
 5 files changed, 35 insertions(+), 2 deletions(-)
 create mode 100644 spec/ruby/core/main/fixtures/using.rb
 create mode 100644 spec/ruby/core/main/fixtures/using_in_main.rb
 create mode 100644 spec/ruby/core/main/fixtures/using_in_method.rb

diff --git a/eval.c b/eval.c
index cf32a82214..9567f80150 100644
--- a/eval.c
+++ b/eval.c
@@ -1792,10 +1792,12 @@ top_include(int argc, VALUE *argv, VALUE self) https://github.com/ruby/ruby/blob/trunk/eval.c#L1792
 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()) {
diff --git a/spec/ruby/core/main/fixtures/using.rb b/spec/ruby/core/main/fixtures/using.rb
new file mode 100644
index 0000000000..30713ef309
--- /dev/null
+++ b/spec/ruby/core/main/fixtures/using.rb
@@ -0,0 +1 @@
+using Module.new
diff --git a/spec/ruby/core/main/fixtures/using_in_main.rb b/spec/ruby/core/main/fixtures/using_in_main.rb
new file mode 100644
index 0000000000..a4a71c89cc
--- /dev/null
+++ b/spec/ruby/core/main/fixtures/using_in_main.rb
@@ -0,0 +1,5 @@ https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/main/fixtures/using_in_main.rb#L1
+MAIN = self
+
+module X
+  MAIN.send(:using, Module.new)
+end
diff --git a/spec/ruby/core/main/fixtures/using_in_method.rb b/spec/ruby/core/main/fixtures/using_in_method.rb
new file mode 100644
index 0000000000..d9ea2e9ef0
--- /dev/null
+++ b/spec/ruby/core/main/fixtures/using_in_method.rb
@@ -0,0 +1,5 @@ https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/main/fixtures/using_in_method.rb#L1
+def foo
+  using Module.new
+end
+
+foo
diff --git a/spec/ruby/core/main/using_spec.rb b/spec/ruby/core/main/using_spec.rb
index f9f709f7dc..8a23970c4b 100644
--- a/spec/ruby/core/main/using_spec.rb
+++ b/spec/ruby/core/main/using_spec.rb
@@ -129,4 +129,24 @@ describe "main.using" do https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/main/using_spec.rb#L129
 
     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
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]