If a hook_info hook uses entity_get_info() this will result in an incomplete module_implements() cache:
- _drupal_bootstrap_full() calls file_get_stream_wrappers()
- file_get_stream_wrappers() calls module_invoke_all()
- module_invoke_all() calls module_implements()
- module_implements() calls module_hook_info()
- module_hook_info() initializes a static $hook_info array and runs any X_hook_info() it can find
- some module's X_hook_info() uses entity_get_info()
- entity_get_info() calls module_invoke_all()
- module_invoke_all() calls module_implements()
- module_implements() (which caches its result) calls module_hook_info()
- module_hook_info() returns the empty static array because it was initialized
- module_implements() keeps a bad implementations cache
All of this can result in weird behavior. I found that after an apachesolr module update (which now uses entity_get_info in its hook_info) that my field labels all got the same translation as the first field in the form. This was caused by i18n not being able to find submodules which implement i18n_object_info hooks.
These issues are related:
http://drupal.org/node/968264
http://drupal.org/node/1410256
I think we simply can't allow any hook_hook_info() to use entity_get_info() or any other function which leads up to module_hook_info()?