Skip to content

Commit

Permalink
Showing 3 changed files with 28 additions and 4 deletions.
2 changes: 1 addition & 1 deletion core/src/main/java/org/jruby/java/proxies/JavaProxy.java
Original file line number Diff line number Diff line change
@@ -501,7 +501,7 @@ private void confirmCachedProxy(String message) {
public static class ClassMethods {

// handling non-public inner classes retrieval ... like private constants
@JRubyMethod(name = "const_missing", required = 1, meta = true, visibility = Visibility.PRIVATE)
@JRubyMethod(name = "const_missing", required = 1, meta = true, visibility = Visibility.PRIVATE, frame = true)
public static IRubyObject const_missing(ThreadContext context, IRubyObject self, IRubyObject name) {
return Java.get_inner_class(context, (RubyModule) self, name);
}
5 changes: 2 additions & 3 deletions core/src/main/java/org/jruby/javasupport/Java.java
Original file line number Diff line number Diff line change
@@ -1074,9 +1074,8 @@ public static IRubyObject get_inner_class(final ThreadContext context,
final String constName = name.asJavaString();

final RubyModule innerClass = getProxyUnderClass(context, self, constName);
if ( innerClass == null ) { // NOTE: probably better to just call super
final String fullName = self.getName() + "::" + constName;
throw context.runtime.newNameErrorObject("uninitialized constant " + fullName, context.runtime.newSymbol(fullName));
if ( innerClass == null ) {
return Helpers.invokeSuper(context, self, name, Block.NULL_BLOCK);
}
return cacheConstant(self, constName, innerClass, true); // hidden == true (private_constant)
}
25 changes: 25 additions & 0 deletions spec/java_integration/types/retrieval_spec.rb
Original file line number Diff line number Diff line change
@@ -153,6 +153,31 @@ class InnerClasses
end
end

it "delegates const_missing" do # crucial for ActiveSupport::Dependencies
const_missing = Module.instance_method(:const_missing)
begin
Module.module_eval do
remove_method(:const_missing)
def const_missing(name)
@_const_missing_names ||= []
@_const_missing_names << name
end
end

InnerClasses::MissingInner
InnerClasses::AnotherMissingInner
InnerClasses::MissingInner

missing_names = InnerClasses.instance_variable_get(:@_const_missing_names)
expect( missing_names ).to eql [ :MissingInner, :AnotherMissingInner, :MissingInner ]

ensure
Module.module_eval do
define_method :const_missing, const_missing
end
end
end

it "raises error importing lower-case names" do
expect do
java_import InnerClasses::lowerInnerClass

0 comments on commit de96f4f

Please sign in to comment.