From 77e1363be3a953a8899404cc89e6fa19d0b553c6 Mon Sep 17 00:00:00 2001 From: Peter Arato Date: Mon, 5 Jun 2023 16:08:41 -0400 Subject: [PATCH] Add Refinement#refined_class --- CHANGELOG.md | 1 + spec/truffleruby.next-specs | 2 ++ .../org/truffleruby/core/module/ModuleNodes.java | 9 +++++++++ src/main/ruby/truffleruby/core/refinement.rb | 4 ++++ test/mri/tests/ruby/test_refinement.rb | 14 ++++++++++++++ 5 files changed, 30 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6973d8b998f5..1d4ed180df4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ Compatibility: * Add `String#bytesplice` (#3039, @itarato). * Add `String#byteindex` and `String#byterindex` (#3039, @itarato). * Add implementations of `rb_proc_call_with_block`, `rb_proc_call_kw`, `rb_proc_call_with_block_kw` and `rb_funcall_with_block_kw` (#3068, @andrykonchin). +* Add `Refinement#refined_class` (#3039, @itarato). Performance: diff --git a/spec/truffleruby.next-specs b/spec/truffleruby.next-specs index 0f5e3e312239..c9895a6e7064 100644 --- a/spec/truffleruby.next-specs +++ b/spec/truffleruby.next-specs @@ -21,3 +21,5 @@ spec/ruby/core/string/bytesplice_spec.rb spec/ruby/core/string/byteindex_spec.rb spec/ruby/core/string/byterindex_spec.rb + +spec/ruby/core/refinement/refined_class_spec.rb diff --git a/src/main/java/org/truffleruby/core/module/ModuleNodes.java b/src/main/java/org/truffleruby/core/module/ModuleNodes.java index 24d8210ebdd1..b1b86e69c2bd 100644 --- a/src/main/java/org/truffleruby/core/module/ModuleNodes.java +++ b/src/main/java/org/truffleruby/core/module/ModuleNodes.java @@ -2584,4 +2584,13 @@ protected Object doClass(RubyClass rubyClass) { return rubyClass.isSingleton; } } + + @Primitive(name = "refined_class") + public abstract static class RefinedClassNode extends PrimitiveArrayArgumentsNode { + + @Specialization + protected RubyModule refinedClass(RubyModule refinement) { + return refinement.fields.getRefinedModule(); + } + } } diff --git a/src/main/ruby/truffleruby/core/refinement.rb b/src/main/ruby/truffleruby/core/refinement.rb index b32bd43b0d96..d59dfe4d68a2 100644 --- a/src/main/ruby/truffleruby/core/refinement.rb +++ b/src/main/ruby/truffleruby/core/refinement.rb @@ -25,4 +25,8 @@ def import_methods(*modules) end self end + + def refined_class + Primitive.refined_class(self) + end end diff --git a/test/mri/tests/ruby/test_refinement.rb b/test/mri/tests/ruby/test_refinement.rb index 9a153a0c25b4..6f6c9330b580 100644 --- a/test/mri/tests/ruby/test_refinement.rb +++ b/test/mri/tests/ruby/test_refinement.rb @@ -1835,6 +1835,20 @@ def test_used_modules assert_equal [ref::RefB, ref::RefA], ref::Combined::USED_MODS end + def test_refined_class + refinements = Module.new { + refine Integer do + int_refinement = self + end + + refine String do + str_refinement = self + end + }.refinements + assert_equal(Integer, refinements[0].refined_class) + assert_equal(String, refinements[1].refined_class) + end + def test_warn_setconst_in_refinmenet bug10103 = '[ruby-core:64143] [Bug #10103]' warnings = [