LOADED_FEATURES check should do .rb files and .so files separately
------------------------------------------------------------------
Key: JRUBY-4985
URL: http://jira.codehaus.org/browse/JRUBY-4985
Project: JRuby
Issue Type: Bug
Components: Core Classes/Modules
Affects Versions: JRuby 1.5.1
Reporter: Charles Oliver Nutter
Fix For: JRuby 1.6
In working on the C ext support for JRuby, Tim Felgentreff discovered that we
now fail a set of RubySpecs of the following form:
{noformat}
it "loads a .rb extensioned file when a complex-extensioned C-extension
file of the same name is loaded" do
$LOADED_FEATURES << File.expand_path("load_fixture.ext.bundle",
CODE_LOADING_DIR)
$LOADED_FEATURES << File.expand_path("load_fixture.ext.dylib",
CODE_LOADING_DIR)
$LOADED_FEATURES << File.expand_path("load_fixture.ext.so",
CODE_LOADING_DIR)
$LOADED_FEATURES << File.expand_path("load_fixture.ext.dll",
CODE_LOADING_DIR)
path = File.expand_path "load_fixture.ext", CODE_LOADING_DIR
@object.require(path).should be_true
ScratchPad.recorded.should == [:loaded]
end
{noformat}
The basic idea is that if you have already required x.bundle, you should be
able to require x and have it locate a .rb file. This fails in JRuby, but only
if there's an extension in LOADED_FEATURES that we support; the spec uses
bundle, dylib, so, and dll, none of which are supported in JRuby 1.5.1 so this
failure is hidden.
The problem is that in BailoutSearcher, which runs as an early phase of
LoadService searching, we try *all* extensions to see if any exist in
LOADED_FEATURES. Because on the cext branch we now support "bundle" and
friends, the specs fail; we see that there's a "load_fixture.ext.bundle"
already loaded and don't try to find a .rb file.
{noformat}
public class BailoutSearcher implements LoadSearcher {
public boolean shouldTrySearch(SearchState state) {
return true;
}
public void trySearch(SearchState state) throws AlreadyLoaded {
for (String suffix : state.suffixType.getSuffixes()) {
String searchName = state.searchFile + suffix;
RubyString searchNameString = RubyString.newString(runtime,
searchName);
if (featureAlreadyLoaded(searchNameString)) {
throw new AlreadyLoaded(searchNameString);
}
}
}
}
{noformat}
The correct behavior, it seems, would be to have the same two-phase searching
for LOADED_FEATURES that we do already for source versus extension-based
libraries. So we'd follow this sequence:
# check whether the file has been loaded already as a .rb form
# if not, try loading it as a .rb file
# if that fails, check whether the file has been loaded already as an extension
# if not, try loading that extension
This will probably affect actual applications once we land cext support, so
I've marked it for 1.6.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email