private ConstantLookupResult TryLookupConstantNoLock(bool included, bool inherited, RubyGlobalScope autoloadScope,
string/*!*/ name, out ConstantStorage value) {
Context.RequiresClassHierarchyLock();
Debug.Assert(included || !inherited);
value = default(ConstantStorage);
while (true) {
ConstantStorage result;
RubyModule owner = included ?
TryResolveConstantNoAutoloadCheck(inherited, name, out result) :
(TryGetConstantNoAutoloadCheck(name, out result) ? this : null);
if (owner == null) {
return ConstantLookupResult.NotFound;
}
var autoloaded = result.Value as AutoloadedConstant;
if (autoloaded == null) {
value = result;
return ConstantLookupResult.Found;
}
if (autoloadScope == null) {
return ConstantLookupResult.FoundAutoload;
}
if (autoloadScope.Context != Context) {
throw RubyExceptions.CreateTypeError(String.Format("Cannot autoload constants to a foreign runtime #{0}", autoloadScope.Context.RuntimeId));
}
// autoloaded constants are removed before the associated file is loaded:
object _;
owner.TryRemoveConstantNoLock(name, out _);
// load file and try lookup again (releases the class hierarchy lock when loading the file):
if (!autoloaded.Load(autoloadScope)) {
return ConstantLookupResult.NotFound;
}
}
}