summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/ruby/test_super.rb31
-rw-r--r--version.h4
-rw-r--r--vm_insnhelper.c3
3 files changed, 35 insertions, 3 deletions
diff --git a/test/ruby/test_super.rb b/test/ruby/test_super.rb
index d94f4679d3..3afde9b0e3 100644
--- a/test/ruby/test_super.rb
+++ b/test/ruby/test_super.rb
@@ -521,6 +521,37 @@ class TestSuper < Test::Unit::TestCase
assert_equal(%w[B A], result, bug9721)
end
+ # [Bug #18329]
+ def test_super_missing_prepended_module
+ a = Module.new do
+ def probe(*methods)
+ prepend(probing_module(methods))
+ end
+
+ def probing_module(methods)
+ Module.new do
+ methods.each do |method|
+ define_method(method) do |*args, **kwargs, &block|
+ super(*args, **kwargs, &block)
+ end
+ end
+ end
+ end
+ end
+
+ b = Class.new do
+ extend a
+
+ probe :danger!, :missing
+
+ def danger!; end
+ end
+
+ o = b.new
+ o.danger!
+ 2.times { o.missing rescue NoMethodError }
+ end
+
def test_from_eval
bug10263 = '[ruby-core:65122] [Bug #10263a]'
a = Class.new do
diff --git a/version.h b/version.h
index 9303a7e6c3..5f7bdee1ca 100644
--- a/version.h
+++ b/version.h
@@ -12,11 +12,11 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 3
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 150
+#define RUBY_PATCHLEVEL 151
#define RUBY_RELEASE_YEAR 2021
#define RUBY_RELEASE_MONTH 11
-#define RUBY_RELEASE_DAY 22
+#define RUBY_RELEASE_DAY 23
#include "ruby/version.h"
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index fc2c7f8fca..757e75d66f 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1806,7 +1806,8 @@ vm_search_method_fastpath(VALUE cd_owner, struct rb_call_data *cd, VALUE klass)
#if OPT_INLINE_METHOD_CACHE
if (LIKELY(vm_cc_class_check(cc, klass))) {
- if (LIKELY(!METHOD_ENTRY_INVALIDATED(vm_cc_cme(cc)))) {
+ const struct rb_callable_method_entry_struct *cme = vm_cc_cme(cc);
+ if (LIKELY(cme && !METHOD_ENTRY_INVALIDATED(cme))) {
VM_ASSERT(callable_method_entry_p(vm_cc_cme(cc)));
RB_DEBUG_COUNTER_INC(mc_inline_hit);
VM_ASSERT(vm_cc_cme(cc) == NULL || // not found