Skip to content

Commit 9ff255a

Browse files
committed
[GR-19220] Add Module#undefined_instance_methods
PullRequest: truffleruby/3923
2 parents 6554576 + 9d42b24 commit 9ff255a

File tree

5 files changed

+30
-0
lines changed

5 files changed

+30
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ Compatibility:
3131
* Add `Refinement#refined_class` (#3039, @itarato).
3232
* Add `rb_hash_new_capa` function (#3039, @itarato).
3333
* Fix `Encoding::Converter#primitive_convert` and raise `FrozenError` when a destination buffer argument is frozen (@andrykonchin).
34+
* Add `Module#undefined_instance_methods` (#3039, @itarato).
3435

3536
Performance:
3637

spec/tags/truffle/methods_tags.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,4 @@ fails:Public methods on UnboundMethod should include protected?
115115
fails:Public methods on UnboundMethod should include public?
116116
fails:Public methods on String should not include bytesplice
117117
fails:Public methods on Module should not include refinements
118+
fails:Public methods on Module should not include undefined_instance_methods

spec/truffleruby.next-specs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ spec/ruby/core/sizedqueue/pop_spec.rb
3131
spec/ruby/core/sizedqueue/shift_spec.rb
3232

3333
spec/ruby/core/module/refinements_spec.rb
34+
spec/ruby/core/module/undefined_instance_methods_spec.rb
3435
spec/ruby/core/refinement/refined_class_spec.rb
3536
spec/ruby/core/module/used_refinements_spec.rb
3637
spec/ruby/optional/capi/hash_spec.rb

src/main/java/org/truffleruby/core/module/ModuleNodes.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2356,4 +2356,22 @@ protected Object doClass(RubyClass rubyClass) {
23562356
return rubyClass.isSingleton;
23572357
}
23582358
}
2359+
2360+
@CoreMethod(names = "undefined_instance_methods")
2361+
public abstract static class UndefinedInstanceMethodsNode extends CoreMethodArrayArgumentsNode {
2362+
2363+
@Specialization
2364+
@TruffleBoundary
2365+
protected RubyArray undefinedInstanceMethods(RubyModule module) {
2366+
List<RubySymbol> methodNames = new ArrayList<>();
2367+
2368+
for (InternalMethod methodEntry : module.fields.getMethods()) {
2369+
if (methodEntry.isUndefined()) {
2370+
methodNames.add(getLanguage().getSymbol(methodEntry.getName()));
2371+
}
2372+
}
2373+
2374+
return createArray(methodNames.toArray());
2375+
}
2376+
}
23592377
}

test/mri/tests/ruby/test_module.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -955,6 +955,15 @@ def test_public_instance_methods
955955
assert_equal([:bClass1], BClass.public_instance_methods(false))
956956
end
957957

958+
def test_undefined_instance_methods
959+
assert_equal([], AClass.undefined_instance_methods)
960+
assert_equal([], BClass.undefined_instance_methods)
961+
c = Class.new(AClass) {undef aClass}
962+
assert_equal([:aClass], c.undefined_instance_methods)
963+
c = Class.new(c)
964+
assert_equal([], c.undefined_instance_methods)
965+
end
966+
958967
def test_s_public
959968
o = (c = Class.new(AClass)).new
960969
assert_raise(NoMethodError, /private method/) {o.aClass1}

0 commit comments

Comments
 (0)