From: fxn@...
Date: 2021-08-07T18:14:18+00:00
Subject: [ruby-core:104828] [Ruby master Bug#15790] Strange interaction between autoload and $LOADED_FEATURES

Issue #15790 has been updated by fxn (Xavier Noria).


Indeed, to me, this belongs to the contract of these APIs and should be documented.

The documentation of `Module#autoload` should say what happens if the file is not found, if the file is found but raises, if the file is found and is fine, but does not define the constant. It should also document that a constant for which by now you only have an autoload set is assumed to be a constant of the receiver, etc.

The whole constants API is public interface that needs clearly-defined contracts in the docs. In particular, as you can imagine, Zeitwerk uses these APIs extensively.

----------------------------------------
Bug #15790: Strange interaction between autoload and $LOADED_FEATURES
https://bugs.ruby-lang.org/issues/15790#change-93170

* Author: fxn (Xavier Noria)
* Status: Open
* Priority: Normal
* ruby -v: ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin18]
* Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
If an autoload fails and we remove its associated file from `$LOADED_FEATURES`, the autoload is back:

```
$ cat x.rb
Y = 1 # should be X, emulates a typo

$ cat test.rb
def au
  Object.autoload?(:X).inspect
end

x_rb = File.realpath("x.rb")
autoload :X, x_rb

puts "before failed autoload autoload path is #{au}"

X rescue nil

puts "after failed autoload autoload path is #{au}"

$LOADED_FEATURES.delete(x_rb)

puts "after $LOADED_FEATURES deletion autoload path is #{au}"
```

The output is

```
$ ruby -v test.rb
ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin18]
before failed autoload autoload path is "/Users/fxn/tmp/x.rb"
after failed autoload autoload path is nil
after $LOADED_FEATURES deletion autoload path is "/Users/fxn/tmp/x.rb"
```

See? Last line would be expected to print a `nil` autoload path.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>