Anatoly Vorobey (avva) wrote,
Anatoly Vorobey
avva

Category:

программистское (Мозилла)

Играюсь с исходниками Мозиллы (Firebird).

Какое ужасно запутанное, сложное дерево, сам чёрт голову сломит. Сгрузил самый свежий код из CVS, построил debug-версию. Запускается. Захотел сделать так, чтобы оно пользовалось не моей директорией профиля $HOME/.phoenix, а какой-нибудь другой, скажем, $HOME/.phoenix-devel . Довольно скромное пожелание, правда? Почти час провозился, пока заставил его. Главное, нашёл код, который открывает или создаёт директорию профиля. В Юниксе он берёт $HOME и добавляет к нему DEFAULT_PRODUCT_DIR, который устанавливается в MOZ_USER_DIR, который всегда ".mozilla", и в Firebird тоже. Но чёрт побери, оно ж использует директорию .phoenix всё-таки, и всё там создаёт/редактирует. Я туда, сюда, захожу в gdb, отлавливаю вызовы этой функции — ну да, исправно вызывается много раз и всем говорит "$HOME/.mozilla", а используется тем не менее .phoenix. Что за чёрт? Ну хорошо, делаю глобальный поиск ".phoenix" по всему дереву, ничего интересного не нахожу. Делаю поиск по "phoenix", тоже ничего интересного не нахожу. Мистика. Что он его, по буквам собирает?

Тут я заметил, что директорию $HOME/.mozilla он-таки исправно создаёт при каждом запуске, если я её удаляю. Но всё равно не использует, а испольует .phoenix. Я разозлился окончательно, удалил .phoenix, чтобы заставить его создать, запустил под gdb, и поставил breakpoint на mkdir(2). Вот это не обойдёшь, сволочь. И поймал-таки момент создания, проследил stack trace, и что оказывается? Это идёт от другой функции GetProductDirectory, в совершенно другом месте, классе, файле и модуле, но почти точной копии той, первой, которая, видимо, устарела (но почему вызывается двадцать раз во время работы?). Эта фунцкия, однако, не вставляет зафигаченное в compile-time значение ".mozilla", а добавляет к $HOME значение mProductDir, а его откуда берёт? А вот откуда:

mProductDir.Assign(NS_LITERAL_CSTRING(".") + aProductName);
ToLowerCase(mProductDir);


Естественно, aProductName в совсем другом месте определяется как "Phoenix", в результате выходит .Phoenix, а после вызова ToLowerCase — искомый .phoenix. Неудивительно, что я не смог это глобальным грепом найти!

Извращенцы чёртовы.


Главное, у них постоянно такое. Куча кода повторяется два раза, с какими-то мелкими изменениями, и поди разбери, какая из двух версий или какой из двух классов "настоящий", учитывая ещё, что оба компилируются и иногда оба вызываются во время работы программы, только один из них — "по историческим причинам". Необходима радикальная чистка авгиевых конюшен. And don't get me started on their build process.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 23 comments