diff --git a/Library/Homebrew/extend/pathname/eager_initialize_extension.rb b/Library/Homebrew/extend/pathname/eager_initialize_extension.rb index 14c689ebcf61e..ef63679eb2ec9 100644 --- a/Library/Homebrew/extend/pathname/eager_initialize_extension.rb +++ b/Library/Homebrew/extend/pathname/eager_initialize_extension.rb @@ -11,14 +11,22 @@ module EagerInitializeExtension requires_ancestor { Pathname } + # These aliases hoist the `T.nilable(...)` type objects out of the hot path. + # `#initialize` runs on every {Pathname} allocation, and with runtime + # checks disabled `T.let` discards its type argument, so evaluating + # `T.nilable(...)` inline would rebuild the same type objects each time. + NilableString = T.type_alias { T.nilable(String) } + NilableInteger = T.type_alias { T.nilable(Integer) } + NilableStringArray = T.type_alias { T.nilable(T::Array[String]) } + sig { params(args: T.untyped).void } def initialize(*args) - @magic_number = T.let(nil, T.nilable(String)) - @file_type = T.let(nil, T.nilable(String)) - @zipinfo = T.let(nil, T.nilable(T::Array[String])) - @which_install_info = T.let(nil, T.nilable(String)) - @disk_usage = T.let(nil, T.nilable(Integer)) - @file_count = T.let(nil, T.nilable(Integer)) + @magic_number = T.let(nil, NilableString) + @file_type = T.let(nil, NilableString) + @zipinfo = T.let(nil, NilableStringArray) + @which_install_info = T.let(nil, NilableString) + @disk_usage = T.let(nil, NilableInteger) + @file_count = T.let(nil, NilableInteger) super end end